Optimieren Sie ein Git-Repo, das große Binärdateien enthält

21

Unser Projekt hat ungefähr 11 GB, von denen 10 Binärdaten (PNG-Bilder) sind. Folglich dauert eine git diffoder git status-Operation mehr als eine Minute. Zum Glück sind alle Dateien in einem Ordner mit dem wunderbaren Namen getrennt data. Die Aufgabe lautet "Vermeiden Sie das Komprimieren, Vergleichen und andere kostspielige Vorgänge mit Binärdateien."

Ich denke, dass Git-Attribute die Lösung sind, aber wie? Oder gibt es eine bessere Architektur als ein monolithisches Repo?

Vorac
quelle
1
Die erste große Frage ist hier, wie wichtig diese Datendateien sind. Benötigt Ihr Programm all diese Bilder, um irgendetwas Nützliches zu tun, oder kann es während einer typischen Entwicklung / eines typischen Tests mit einer kleinen Teilmenge davonkommen?
Ixrec
@Ixrec, die Bilder sind eigentlich wichtiger als der Quellcode. Alle müssen vorhanden sein und .png-Prüfsummen werden immer auf beschädigte Dateien überprüft.
Vorac
1
Warum ist diese Frage nicht auf Stapelüberlauf? Der Q. scheint genau dafür geeignet zu sein.
spirc
@spirc Diese Frage bewegt sich zwischen "Hilfe mit einem Softwaretool", das bei SO zum Thema gehört, und "Versionskontrollstrategie", die hier zum Thema gehört. Da nicht gefragt wird, welcher git-Befehl ausgeführt werden soll, um etwas zu tun, ist dies nicht eindeutig auf der SO-Seite der Zeile, sodass ich dafür gestimmt habe, ihn hier offen zu lassen.
@Snowman danke für die Antwort. In welchen Punkt der Themenliste passt das? programmers.stackexchange.com/help/on-topic
spirc

Antworten:

18

Sie können git-lfs oder ähnliche Tools (git-fat, git-annex usw.) verwenden. Diese Tools ersetzen im Grunde genommen die Binärdateien in Ihrem Repo durch kleine Textdateien mit Hashes und speichern die eigentlichen Binärdaten auf nicht-git-Weise - wie bei einer Netzwerkfreigabe.

Macht Diffs und alles superschnell, da nur Hashes verglichen werden, und ist - zumindest für git-lfs - für den Benutzer transparent (nach einmaliger Installation).

Afaik git-lfs wird von github, gitlab, VisualStudio und Open Source unterstützt.

kat0r
quelle
2
Haben Sie versucht, git-lfsein Projekt mit vielen Gigabyte Assets mit einem gemischten Entwickler- / Künstlerteam zu bearbeiten? Ich bin daran interessiert zu wissen, ob Leute Git-LFS für Projekte wie Spiele und Animationen verwenden. Da es zum Zeitpunkt des Schreibens noch ziemlich neu ist. Nach meiner Erfahrung ist die Eintrittsbarriere für weniger technische Benutzer bereits sehr hoch, sodass eine zusätzliche Ebene für die Dateiverwaltung hinzukommt. Dies kann für Benutzer schwierig sein, es sei denn, sie sind bereits mit Git vertraut.
ideasman42
Nur für bis zu ca. 1 GB Daten, sorry. Git-lfs sollte jedoch keine zusätzlichen Schritte für Endbenutzer hinzufügen, sondern vollständig transparent sein.
Kat0r
Dies scheint die richtige Antwort zu sein, wenn während der Integration einige Probleme auftreten, werde ich hier zurückmelden. Der Installationsvorgang muss also nur einmal auf dem Server und nicht auf jedem Client-Computer abgeschlossen werden?
Vorac
Um ein kleines Client-Add-In zu installieren, schauen Sie auf der Github-Seite nach. Aber das sollte mit einer Gruppenrichtlinie einfach umzusetzen sein / einfacher als jede Alternative.
Kat0r
1

Verwenden Sie sowohl GIT- als auch SVN-Repos

Wenn die Binärdateien logisch von der Quelle getrennt werden können, sollten Sie möglicherweise Git für Textdateien und ein Nicht-DVCS wie Subversion für die Binärdateien verwenden.

Ein Projekt, an dem ich arbeite, tut dies, da wir viele GB für pro-kompilierte Bibliotheken (für OSX / Win32-Abhängigkeiten) haben, die wir versioniert halten müssen.


Wenn Sie jedoch keine technischen Benutzer haben, kann die Verwendung von zwei Versionskontrollsystemen problematisch sein. Wenn die Interpreten jedoch nicht an Code arbeiten, können Sie ein Skript bereitstellen, um die Aktualisierung durchzuführen, und sie können Subversion verwenden, um binäre Assets festzuschreiben.

Benutze SVN (mit git svn)

Während dieser Kompromiss für Entwickler, die es gewohnt sind, normales Git zu verwenden, nicht immer so gut ist, können Sie SVN als Haupt-Repository verwenden und Entwickler können git svnTools verwenden.

Für Entwickler, die git verwenden, bedeutet dies etwas mehr Arbeit, aber für alle, die mit DVCS (oder VCS im Allgemeinen) nicht vertraut sind: Sie können das einfache Modell von SVN verwenden, ohne mehrere komplexe Versionskontrollsysteme verwenden zu müssen.


git-lfs ist auch eine Option, aber ich habe es nicht benutzt und kann nicht sagen, wie gut es funktioniert.

ideasman42
quelle