7

首先:我知道一般评论:不要跟踪生成的文件。

说,我想跟踪生成的 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 将日期设置为我的任意值),但我遇到了从 git 存储库重新签出的文件,并使用“干净”过滤器结束了修改状态

所以,我的过滤器显然不是我想要在这里做的。

我的问题是:
1)我可以使用巧妙的过滤方法让 git 完全忽略 PDF 中的日期值吗?如何?

2)如果没有过滤器,正确的方法是什么?

4

2 回答 2

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
于 2013-05-18T18:34:40.900 回答
0

如果您可以控制 PDF 的生成,则可以考虑在生成时将 PDF 文件内容的哈希值注入 pdf 关键字中。此哈希将唯一标识 PDF 文件,而不考虑日期字段。

然后在 git 方面,您可以在 .gitattributes 中使用一些东西(在 pdf 文件上使用extract -p 关键字)来对 pdf 文件进行二进制差异。

我想这可能会奏效。

于 2013-04-17T13:26:06.240 回答