2013-04-17 15 views
6

最初に:一般的なコメント:生成されたファイルを追跡しないでください。gitでPDFファイルの日付を無視するようにする

私は、生成されたPDFを追跡し、gitにPDFに書き込まれた日付を無視したいとします。つまり、唯一の違いが日付情報であれば、2つのPDFを同じものとして扱うことを望みます。

私が試みたのは、クリーンな部分で日付を任意の値に設定するフィルタです。

(---コメント----
基本的に、フィルタはありません沿っSTH:

## dump the pdf metadata to a file and replace the dates 
pdftk "$FILENAME" dump_data | sed -e '{N;s/Date\nInfoValue: D:.*/Date\nInfoValue: D:19790101072619/}' > "$TMPFILE" 

## update the pdf metadata 
pdftk "$FILENAME" update_info "$TMPFILE" output "$TMPFILE2" 

)---エンドコメント----

フィルター作品(コミットpdfの日付は任意の値に設定されていますが、私はfiles re-checked out from git repository with 'clean' filter end up with modified status

と表示されていましたので、私のフィルタはここでやりたいことではありません。

私の質問は:
1)gitがPDFの日付値を完全に無視するように巧妙なフィルタ手法を使用できますか?そしてどうやって?
または
2)フィルタではない場合の正しいアプローチは何ですか?

答えて

1

最後に、gitメーリングリストの助けを借りてこれを解決しました。結局のところgitの問題ではありませんでしたが、pdftkについての私のフィルタの期待の問題はもっと深刻でした。 (多分エンコーディング事深く掘るませんでしたか?。)

Gitのメーリングリスト上の有用なメッセージはここにある: http://permalink.gmane.org/gmane.comp.version-control.git/224797

基本的に、私が書いたフィルタスクリプトは、同上、強力なされなかった、適用することを意味クリーンなフィルターを2回目にすると、ファイルが変更されます。

背景: pdftkを使用してpdfのメタデータをmetadateで更新すると、その正確なpdfから以前に抽出されたものですが、驚いたことにpdfファイルが変更されます。

私のフィルタには安全性チェックが含まれていて、問題はなくなりました。このアイデアのための

#!/bin/bash 

## use GNU coreutils on OS X explicitely 
## (install via homebrew, for instance: 
## > brew install coreutils 
## > brew install gnu-sed 
##) 
if [ ${OSTYPE:0:6} == "darwin" ]; then 
    MKTMP=gmktemp 
    SED=gsed 
else 
    MKTMP=mktemp 
    SED=sed 
fi 


FILEASARG=true 
if [ "$#" == 0 ]; then 
    FILEASARG=false 
fi 

if $FILEASARG ; then 
    FILENAME="$1" 
else 
    FILENAME=`$MKTMP` 
    cat /dev/stdin > "${FILENAME}" 
fi 

TMPFILE=`$MKTMP` 
TMPFILE2=`$MKTMP` 
TMPFILE3=`$MKTMP` 

## dump the pdf metadata to a file and replace the dates 
pdftk "$FILENAME" dump_data > "$TMPFILE3" 
$SED -e '/Date/{ N; s/Date\nInfoValue: D:.*/Date\nInfoValue: D:19790101072619/ }' < "$TMPFILE3" > "$TMPFILE" 

## if the metadata did not change, do nothing 
if diff "$TMPFILE3" "$TMPFILE"; then 
    rm "$TMPFILE3" 
    rm "$TMPFILE" 
    if [ -n $FILEASARG ] ; then 
    cat "$FILENAME" 
    fi 
    exit 0 
fi 

## update the pdf metadata 
pdftk "$FILENAME" update_info "$TMPFILE" output "$TMPFILE2" 

## overwrite the original pdf 
mv -f "$TMPFILE2" "$FILENAME" 

## clean up 
rm -f "$TMPFILE" 
rm -f "$TMPFILE2" 
if [ -n $FILEASARG ] ; then 
    cat "$FILENAME" 
fi 
+0

あなたはどのようにあなたのスクリプトを冪等にしましたか?私は同じ問題に直面しています。 – rodion

+0

私の単純な解決策は明示的なチェックでした: '##メタデータが変更されなかった場合、何もしません。 diff" $ TMPFILE3 "" $ TMPFILE ";次に rm "$ TMPFILE3"; rm "$ TMPFILE"; の場合[-n $ FILEASARG]; \t cat "$ FILENAME" fi exit 0 fi '(フォーマットが悪いのはごめんなさい...) – Andreas

0

PDF生成を制御している場合、生成時にPDFファイルの内容のハッシュをpdfキーワードに挿入することを検討することがあります。このハッシュは、日付フィールドを考慮せずにPDFファイルを一意に識別します。

次にgit側では、jury rig something in .gitattributesextract -p keywordsをpdfファイルで使用)を使用して、pdfファイルのバイナリ差分を行うことができます。

私はそれがうまくいくと思います。

+0

ありがとう:参考

は、ここに完全なフィルタです。これは堅牢なソリューションになります。私は確かにPDFの世代を制御していますが、私はそれを妨害したくない代わりにgitを構成したいと考えています。私がPDF生成を混乱させてしまった場合、PDF生成中に日付を設定する方がシンプルで(あまり強くない)アプローチになります。 – Andreas

+0

Hm。あなたのPDFが非常に標準的なものであれば、pdftotextから実際に使用可能な出力を得ることができます。そうであれば、gitのバイナリdiffをpdfのプレーンテキスト表現でsed smudge/cleanで使うことができます。私はgitattributesのバイナリ差分があなたの問題の解決策の中で最も有望な要素だと感じています。どちらか、またはあなたのPDF生成がテンプレートベースの場合は、テンプレートからテキストを抽出し、gitattributesフィルタで使用して、生成されたPDF(両方ともgitに格納されています)が変更されたかどうかを判断します。 – JosefAssad

関連する問題