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):
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 :
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:
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:
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.
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).
Antworten:
Sie können eine
textconv
Konfigurationsoption 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.
Wenn Sie das nächste Mal nach einem Unterschied für eine Zip-Datei in einem Repository fragen, wird
unzip -v
sowohl die Version als auch der resultierende Text unterschieden.Beispiel 2 :
Für PDF-Dateien können Sie zB verwenden
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):quelle
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/config
Datei Ihres Repositorys oder in Ihrer persönlichen globalen~/.gitconfig
Datei definieren, z. B. einen hexadezimalen diff-Befehl mit denhexdump
folgenden Befehlen :Als nächstes müssen Sie die
.gitattributes
Datei des Repositorys verwenden, um git mitzuteilen, welche Dateien mit diesem speziellen diff-Befehl verwendet werden sollen:Wie die
.gitignore
Datei sollte die.gitattributes
Datei 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.
quelle
.gitattributes
global einstellen (entsprechend den[diff]
Einträgen in Ihrem Global.gitconfig
). Wenn Sie das.gitattributes
lokale zum Repo machen, muss der Benutzer seine lokalen.gitconfig
Repo-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.gitconfig
unter[core]
addattributesfile = c:/users/<username>/.gitattributes
oder wo immer Sie es speichern möchten, wenn Sie es global machen (beachten Sie die Schrägstriche, auch in Windows).Wenn Sie git zwingen möchten, Binärdateien diff als Nur-Text-Diff anzuzeigen, verwenden Sie die folgende
--text
Option:quelle
Die oben genannten Möglichkeiten sind umfassend. Wenn Sie dies jedoch nur für einige Dateien tun müssen, verwende ich die folgende Methode:
Hier verwende ich,
vimdiff
aber 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.quelle