最后在 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