Заставить git игнорировать дату в PDF-файлах

во-первых: я знаю общий комментарий: Не отслеживать сгенерированные файлы.

скажем, я хочу отслеживать сгенерированные PDF-файлы и Git игнорировать дату, записанную в PDF. Это означает, что я хочу, чтобы git обрабатывал два PDF-файла как одно и то же, если единственная разница-это информация о дате.

то, что я пробовал, - это фильтр, который-в своей чистой части-устанавливает дату на некоторое произвольное значение.

(--- комментарий ----
в принципе, фильтр делает sth вместе:

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

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

) --- конец комментария ----

фильтр работает (зафиксированный pdf имеет дату, установленную на мое произвольное значение), но я столкнулся с файлы повторно проверены из репозитория git с "чистым" фильтром в конечном итоге с измененным статусом

Итак, мой фильтр-это явно не то, что я хочу сделать здесь.

мой вопрос:
1) могу ли я использовать умный подход фильтра, чтобы заставить git полностью игнорировать значения даты в PDF? И как?
или
2) Каким был бы правильный подход, если бы не фильтры?

2 ответов


наконец, решил это с помощью списка рассылки git. В конце концов, это была не проблема git, а скорее проблема моих ожиданий фильтров pdftk. (Может быть, кодировка? Не стал копать глубже.)

полезное сообщение в списке рассылки git находится здесь: http://permalink.gmane.org/gmane.comp.version-control.git/224797

в принципе, сценарий фильтра, который я написал, не был IDEM-potent, что означает, что применение чистого фильтра во второй раз к очищенному файл изменит файл.

фон: Когда 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=""
 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

Если вы контролируете генерацию PDF, вы можете рассмотреть возможность введения хэша содержимого файла PDF в Ключевое слово pdf при генерации. Этот хэш однозначно идентифицирует PDF-файл без учета поля даты.

тогда на стороне git вы можете присяжные что-то подстроили .gitattributes по (через извлечь -п ключевые слова в файле pdf), чтобы сделать двоичный diff в файле pdf.

Я думаю, что это может сработать.