首先:我知道一般性意见:不要跟踪生成的文件。
说,我想跟踪生成的PDF并让git忽略写入PDF的日期。这意味着,如果唯一的区别是日期信息,我希望git将两个PDF视为相同。
我尝试的是一个过滤器 - 在其干净的部分 - 将日期设置为某个任意值。
(---评论----
基本上,过滤器确实如此:
## 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)如果不是过滤器,那么正确的方法是什么?
答案 0 :(得分:1)
最后在git邮件列表的帮助下解决了这个问题。毕竟不是一个git问题,但更多的是我对pdftk的过滤期望的问题。 (也许是编码的东西?没有深入挖掘。)
git邮件列表上的有用信息如下: http://permalink.gmane.org/gmane.comp.version-control.git/224797
基本上,我写的过滤器脚本不具有同等效力,这意味着第二次将清洁过滤器应用于已清理的文件会改变文件。
背景: 当pdftk用于更新pdf的元数据时,其元数据从之前从那个确切的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
答案 1 :(得分:0)
如果您控制PDF生成,则可以考虑在生成时在pdf关键字中注入PDF文件内容的哈希值。此哈希将唯一标识PDF文件,而不考虑日期字段。
然后在git方面,你可以jury rig something in .gitattributes(在pdf文件上使用extract -p keywords)在pdf文件上进行二进制差异。
我想这可行。