Wie kann ich Binärdateien in Git unterscheiden?

28

Um Binärdateien in git zu unterscheiden, gehe ich davon aus, dass ich ein difftool einrichten muss.

Welche difftools funktionieren? Wie stellst du die Parameter ein?

Nick Retallack
quelle
Welche Art von Ausgabe erwarten Sie von einem Diff-Tool einer Binärdatei? Welche Art von Binärdatei ist das? Ist es etwas, das in ein Textformat gerendert und dann verglichen werden kann?
Zoredache

Antworten:

22

Sie können eine textconvKonfigurationsoption für einen Dateityp festlegen. Siehe "Durchführen von Textdifferenzen von Binärdateien" in gitattributes (5) . Was Sie verwenden sollten, hängt vom Dateityp ab.

Beispiel 1 :

Angenommen, Sie möchten den Inhalt von ZIP-Dateien unterscheiden. In diesem Fall sollten Sie Folgendes in die Datei $ GIT_DIR / config oder $ HOME / .gitconfig einfügen.

[diff "zip"]
    textconv = unzip -v

Wenn Sie das nächste Mal nach einem Unterschied für eine Zip-Datei in einem Repository fragen, wird unzip -vsowohl die Version als auch der resultierende Text unterschieden.

Beispiel 2 :

Für PDF-Dateien können Sie zB verwenden pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Beispiel 3 :

Wenn es für einen Dateityp kein spezielles Informationsdienstprogramm gibt, können Sie z. B. Folgendes verwenden hexdump(im Lieferumfang von FreeBSD und OSX enthalten, auch unter Linux verfügbar):

[diff "bin"]
    textconv = hexdump -v -C
Roland Smith
quelle
Ich könnte es in hex unterscheiden. Ich würde mich freuen, wenn ich nur wüsste, wie viele Bytes unterschiedlich sind oder an welchen Positionen sich die Bytes unterscheiden. Am Ende habe ich Hex Fiend verwendet, indem ich mein Git-Repository geklont habe, damit ich beide Versionen der Datei auschecken konnte, da ich nicht herausfinden konnte, wie ich Git dazu bringen kann, das Programm zu starten.
Nick Retallack
@NickRetallack: siehe beigefügte Beispiele.
Roland Smith
2
Ich habe Beispiel 3 zu meiner Git-Konfiguration hinzugefügt, aber wenn ich "git diff" mache, erhalte ich immer noch die gleiche kurze Meldung: "Binärdateien a / file und b / file unterscheiden sich"
Nick Retallack
1
Wenn Sie libmagic verwenden möchten, müssen Sie sich den Quellcode des Git ansehen, um festzustellen, ob dies funktioniert ...
Roland Smith
5
Ich habe es endlich geschafft, nachdem ich * .bin diff = bin zu meinen .gitattributes hinzugefügt habe
Justin Rowe
11

Die Antwort von Roland Smith war hilfreich, ist aber derzeit unvollständig (siehe Kommentare) - dazu gibt es zwei Teile.

Sie können neue diff-Befehle in der .git/configDatei Ihres Repositorys oder in Ihrer persönlichen globalen ~/.gitconfigDatei definieren, z. B. einen hexadezimalen diff-Befehl mit den hexdumpfolgenden Befehlen :

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

Als nächstes müssen Sie die .gitattributesDatei des Repositorys verwenden, um git mitzuteilen, welche Dateien mit diesem speziellen diff-Befehl verwendet werden sollen:

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

Wie die .gitignoreDatei sollte die .gitattributesDatei in Ihr Repository eingecheckt werden.

In meinem Fall habe ich mehrere verschiedene Dateierweiterungen, die ich als binär behandeln möchte (z. B. Vermeiden Sie Konvertierungen am Zeilenende, wenn Sie Git unter Windows verwenden) und sehen Sie auch Unterschiede über hexdump:

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

Unter https://github.com/resin-io/etcher/pull/1367 finden Sie ein weiteres Beispiel für die Definition eines Befehls hexdump diff zur Verwendung mit Bilddateien.

peterjc
quelle
Sie können das auch .gitattributesglobal einstellen (entsprechend den [diff]Einträgen in Ihrem Global .gitconfig). Wenn Sie das .gitattributeslokale zum Repo machen, muss der Benutzer seine lokalen .gitconfigRepo-Einstellungen ändern, da diese aus Sicherheitsgründen nicht auf die Fernbedienung übertragen werden. In beiden Fällen muss jeder Benutzer seine lokalen Dateien / Konfigurationen aktualisieren, um dieses Verhalten zu aktivieren. In .gitconfigunter [core]add attributesfile = c:/users/<username>/.gitattributesoder wo immer Sie es speichern möchten, wenn Sie es global machen (beachten Sie die Schrägstriche, auch in Windows).
LightCC
10

Wenn Sie git zwingen möchten, Binärdateien diff als Nur-Text-Diff anzuzeigen, verwenden Sie die folgende --textOption:

git diff --text
chestozo
quelle
-1

Die oben genannten Möglichkeiten sind umfassend. Wenn Sie dies jedoch nur für einige Dateien tun müssen, verwende ich die folgende Methode:

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

Hier verwende ich, vimdiffaber Sie können jedes andere Werkzeug verwenden. Das Obige kann auch zu einem kleinen Skript kombiniert werden, wenn Sie dies immer und immer wieder tun müssen.

alpha_989
quelle
Dies scheint die Änderungen an meiner Datei verworfen zu haben (und eine leere Datei erstellt zu haben, in der ich die festgeschriebene Version haben wollte).
Erhannis