2013-04-17 6 views
6

Erstens: Ich bin mir des allgemeinen Kommentars bewusst: Generierte Dateien nicht verfolgen.Machen Sie git das Datum in PDF-Dateien ignorieren

Angenommen, ich möchte generierte PDFs nachverfolgen und das Datum ignorieren, das in das PDF geschrieben wurde. Das heißt, ich möchte zwei PDFs als gleich behandeln, wenn der einzige Unterschied die Datumsinformation ist.

Was ich versucht habe, ist ein Filter, der - in seinem sauberen Teil - das Datum auf einen beliebigen Wert setzt.

(--- Kommentar ----
im Grunde funktioniert der Filter etw zusammen:

## 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" 

) --- Ende Kommentar ----

Der Filter arbeitet (die engagierte pdf hat das Datum auf meinen willkürlichen Wert gesetzt) ​​aber ich lief in files re-checked out from git repository with 'clean' filter end up with modified status

Also, mein Filter ist anscheinend nicht das, was ich hier tun möchte.

Meine Frage ist:
1) Kann ich einen cleveren Filteransatz verwenden, um git die Datumswerte in der PDF vollständig zu ignorieren? Und wie?
oder
2) Was wäre der richtige Ansatz, wenn nicht Filter?

Antwort

1

Schließlich löste dies mit Hilfe der Git-Mailing-Liste. War kein git Problem, aber mehr ein Problem meiner Filter Erwartungen von pdftk. (? Vielleicht eine Codierung Sache Hat gräbt nicht tiefer.)

Die hilfreiche Nachricht auf der git Mailing-Liste ist hier: http://permalink.gmane.org/gmane.comp.version-control.git/224797

Grundsätzlich ist der Filter-Skript schrieb ich nicht idem-potent, was bedeutet, dass die Anwendung Wenn Sie den Filter ein zweites Mal auf eine bereinigte Datei zurücksetzen, wird die Datei geändert.

Hintergrund: Wenn pdftk verwendet wird, um die Metadaten eines PDF mit dem Metadaten zu aktualisieren, extrahiert es aus diesem exakten PDF vor, zu meiner Überraschung ändert es die PDF-Datei.

Also, ich habe eine Sicherheitsüberprüfung in meinen Filter aufgenommen und das Problem ist weg.

Als Referenz hier ist der vollständige Filter:

#!/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

Wie hast du dein Skript idempotent gemacht? Ich stehe vor demselben Problem. – rodion

+0

Meine einfache Lösung war eine explizite Prüfung: '## wenn die Metadaten nicht geändert haben, nichts tun wenn Diff" $ TMPFILE3 "" $ TMPFILE "; dann rm "$ TMPFILE3"; rm "$ TMPFILE"; if [-n $ FILEASARG]; dann \t Katze "$ FILENAME" fi Ausfahrt 0 fi '(Entschuldigung für die schlechte Formatierung ...) – Andreas

0

Wenn Sie die PDF-Generierung unter Kontrolle haben, können Sie nach der Generierung einen Hash des Inhalts der PDF-Datei in ein PDF-Schlüsselwort einfügen. Dieser Hash würde die PDF-Datei eindeutig identifizieren, ohne das Datumsfeld zu berücksichtigen.

Dann auf der Git-Seite können Sie jury rig something in .gitattributes (mit extract -p keywords auf der PDF-Datei), um eine binäre Diff auf die PDF-Datei zu tun.

Ich denke, das könnte funktionieren.

+0

Vielen Dank für diese Idee. Das wäre eine robuste Lösung. Ich habe tatsächlich die Kontrolle über die PDF-Generierung, aber ich würde es vorziehen, dies nicht zu stören, sondern stattdessen git zu konfigurieren. Wenn ich mich mit der PDF-Erzeugung herumschlagen würde, wäre ein einfacherer (und weniger robuster) Ansatz, die Daten während der PDF-Erzeugung festzulegen. – Andreas

+0

Hm. Sie können Glück haben, wenn Ihre PDFs extrem standard sind, und dann tatsächlich nutzbare Ausgaben von pdftotext bekommen.Wenn das der Fall ist, können Sie git's binary diff mit einem sed wmidge/clean in der Klartextdarstellung des PDFs verwenden. Ich bin der Meinung, dass das binäre diff in gitattributes das aussichtsreichste Element in einer Lösung für Ihr Problem ist. Entweder das oder, wenn Ihre PDF-Generierung vorlagenbasiert ist, extrahieren Sie den Text aus der Vorlage und verwenden Sie ihn in einem gitattributes-Filter, um festzustellen, ob sich die generierte PDF-Datei (beide in git nebeneinander gespeichert) geändert hat. – JosefAssad