Ist Git gut mit Binärdateien?

96

Ist Git gut mit Binärdateien?

Wenn viele unkomprimierte Dateien geändert werden und viele komprimierte Dateien nie (oder fast nie) geändert werden, würde git dann gut damit umgehen? Wenn ich zum Beispiel die Mitte einfüge oder entferne und Daten gegen Ende einfüge, merkt es das wie beim Text?

Wenn Git mit Binärdateien nicht gut ist, welches Tool könnte ich in Betracht ziehen?

TRiG
quelle
1
sehr gut mit binär - ich benutze es selbst
tekknolagi
Es ist irgendwie wahr. Sie können Ihr / Zuhause unter Git-Revision stellen und es sollte ziemlich gut funktionieren.
Loïc Faure-Lacroix
1
Dies ist nicht im Sinne der Frage, die eindeutig als besorgt darüber angesehen wurde, ob Binärdateien mit Diffs versehen wurden (wahrscheinlich aus Gründen des Aufblähens des Repositorys und aus Gründen der Leistung). Ich habe es jedoch nicht abgelehnt (und es scheint, wer es getan hat, hat es seitdem entfernt).
Coreyward
1
Hinweis: Sie haben jetzt Git-lts, um Ihre Binärdateien an anderer Stelle zu speichern: stackoverflow.com/a/29530784/6309
VonC
1
Bläht es den .git-Ordner auf?
Nikhil

Antworten:

47

Standardmäßig kann git einfach Binärdateien zu seinem Index hinzufügen und diese auf effiziente Weise speichern, es sei denn, Sie führen häufige Aktualisierungen großer nicht komprimierbarer Dateien durch.

Die Probleme beginnen, wenn git Unterschiede und Zusammenführungen generieren muss: git kann keine aussagekräftigen Unterschiede erzeugen oder Binärdateien auf eine Weise zusammenführen, die sinnvoll sein könnte. Bei allen Zusammenführungen, Rebases oder Cherrypicks, die eine Änderung an einer Binärdatei beinhalten, müssen Sie eine manuelle Konfliktlösung für diese Binärdatei vornehmen.

Sie müssen entscheiden, ob die Änderungen an Binärdateien selten genug sind, damit Sie mit der zusätzlichen manuellen Arbeit leben können, die sie im normalen Git-Workflow mit Zusammenführungen, Rebases und Cherrypicks verursachen.

ndim
quelle
24
Ich muss darauf hinweisen, dass Änderungen an Binärdateien kein Problem sind, Änderungen an mehreren Stellen vorzunehmen und dann zu versuchen, sie zusammenzuführen.
Winston Ewert
15
Git kann bedeutungsvolle Unterschiede erzeugen. Ein mit erstelltes Diff kann git diff --binaryBinärdateien patchen.
CB Bailey
46

Neben anderen Antworten.

  • Sie können ein Diff im binären Diff- Format an eine Binärdatei senden . Es ist nicht für Menschen lesbar und kann nur angewendet werden, wenn Sie ein genaues Vorbild in Ihrem Repository haben, dh ohne Fuzz.
    Ein Beispiel:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • Sie können textconv gitattribute verwenden , git diffum ein für Menschen lesbares Diff für Binärdateien oder Teile von Binärdateien anzuzeigen. Zum Beispiel kann es bei * .jpg-Dateien Unterschiede in den EXIF-Informationen geben, bei PDF-Dateien kann es Unterschiede in der Textdarstellung geben (pdf2text oder ähnliches).

HTH.

Jakub Narębski
quelle
5
Vielen Dank, dass Sie mir etwas über Gitattribute beigebracht haben! Öffnet eine ganz neue Welt der Möglichkeiten.
Hermannloose
14

Wenn Sie wirklich große Binärdateien haben, können Sie git-annex verwenden, um die Daten außerhalb des Repositorys zu speichern. Überprüfen Sie heraus: http://git-annex.branchable.com/

John Gibb
quelle
6
Git-Anhang ist ganz wunderbar, aber wahrscheinlich besser geeignet für Dateien, die sich nicht
allzu
@sr_ genau, Git LFS auch. Es scheint, dass es kein Versionskontrollsystem gibt, das für diese Art von Anwendungsfällen geeignet ist, und gleichzeitig ein verteiltes System als Basis (wie Git).
Marc J. Schmidt
5

Ich kenne keine Tools, die versuchen, verschiedene Binärdateien für die Versionskontrolle zu speichern, aber es ist erwähnenswert, dass Git dies nicht einmal für Textdateien tut. Git speichert Dateien als Blobs und unterscheidet sie bei Bedarf.

Wenn Sie die Versionskontrolle für Photoshop / Illustrator-Dokumente durchführen möchten , ist GridIron Flow möglicherweise das Richtige für Sie. Wenn Sie versuchen, sie zwischen Computern synchron zu halten, können Dropbox oder Rsync damit umgehen, aber sie werden keine intelligenten Unterschiede machen.

Coreyward
quelle
1
Aus dem Git-Community-Buch ( book.git-scm.com/7_how_git_stores_objects.html ): "Um diesen Speicherplatz zu sparen, verwendet Git die Paketdatei. In diesem Format speichert Git nur den Teil, der sich in der zweiten Datei geändert hat , mit einem Zeiger auf die Datei, der es ähnlich ist. "
Wayne Conrad
2
Ja, das ist, wenn Sie laufen, git gcum die Speicherbereinigung durchzuführen. Auf derselben Seite: "Da Git jede Version jeder Datei als separates Objekt speichert, kann es ziemlich ineffizient werden. Stellen Sie sich vor, eine Datei ist mehrere tausend Zeilen lang und ändert eine einzelne Zeile. Git speichert die zweite Datei in ihrer Gesamtheit ist eine große Platzverschwendung. "
Coreyward
2
Fair 'nuff. git macht gc ab und zu automatisch, zumindest für das Projekt, für das ich es benutze. Ich weiß nicht, mit welcher Metrik entschieden wird, wann ausgeführt werden soll - vielleicht gibt es Bäume, die niemals (oder selten) gc auslösen würden.
Wayne Conrad
1
Auf der Manpage von git gc: "Benutzer werden aufgefordert, diese Aufgabe regelmäßig in jedem Repository auszuführen, um eine gute Speicherplatzauslastung und eine gute Betriebsleistung aufrechtzuerhalten. Einige git-Befehle führen möglicherweise automatisch git gc aus. Weitere Informationen finden Sie im Flag --auto unten . "
Jacob Akkerboom
1
@ KennyEvitt Es gibt jetzt eine Tonne. Abstrakt ist einer und Kactus ist ein anderer, der Git hinter den Kulissen verwendet.
Coreyward
3

Nun, Git ist gut mit Binärdateien. Binärdateien wie Textdateien werden jedoch nicht verarbeitet. Es ist, als ob Sie Binärdateien zusammenführen möchten. Ich meine, ein Diff auf einem JPEG wird dir niemals etwas zurückgeben. Git funktioniert sehr gut mit Textdateien und wahrscheinlich genauso schlecht wie jede andere Lösung mit Binärdateien!

Loïc Faure-Lacroix
quelle
2

Wenn Sie eine Lösung für die Versionierung suchen, sollten Sie git-lfs in Betracht ziehen , sollten , das einen leichten Zeiger auf Ihre Datei hat.

Wenn Sie Ihr Repo klonen, werden nicht alle Versionen heruntergeladen, sondern nur die ausgecheckte.

Hier ist ein schönes Tutorial, wie man es benutzt

danfromisrael
quelle