554 Stimmen

Verwaltung großer Binärdateien mit Git

Ich bin auf der Suche nach Meinungen zum Umgang mit großen Binärdateien, von denen mein Quellcode (Webanwendung) abhängig ist. Wir erörtern derzeit mehrere Alternativen:

  1. Kopieren Sie die Binärdateien von Hand.
    • Pro: Nicht sicher.
    • Contra: Ich bin strikt dagegen, da dies die Wahrscheinlichkeit von Fehlern bei der Einrichtung einer neuen Website bzw. der Migration der alten Website erhöht. Es baut eine weitere Hürde auf, die es zu nehmen gilt.
  2. Verwalten Sie sie alle mit Git .
    • Pro: Die Möglichkeit, das Kopieren einer wichtigen Datei zu "vergessen", entfällt
    • Contra: Bläht das Repository auf und verringert die Flexibilität bei der Verwaltung der Code-Basis, und das Auschecken, Klonen usw. wird eine ganze Weile dauern.
  3. Getrennte Repositories.
    • Pro: Das Auschecken/Klonen des Quellcodes ist so schnell wie immer, und die Images werden ordnungsgemäß in einem eigenen Repository archiviert.
    • Contra: Entfernt die Einfachheit der der Einzige Git-Repository für das Projekt. Das bringt sicherlich noch einige andere Dinge mit sich, über die ich nicht nachgedacht habe.

Was sind Ihre Erfahrungen/Gedanken dazu?

Auch: Hat jemand Erfahrung mit mehreren Git-Repositories und deren Verwaltung in einem Projekt?

Die Dateien sind Bilder für ein Programm, das PDFs mit diesen Dateien erzeugt. Die Dateien werden sich nicht sehr oft ändern (wie in Jahren), aber sie sind sehr wichtig für ein Programm. Das Programm wird ohne die Dateien nicht funktionieren.

318voto

rafak Punkte 5433

Ich entdeckte git-annex was ich großartig finde. Es wurde für die effiziente Verwaltung großer Dateien entwickelt. Ich verwende es für meine Foto-/Musiksammlungen (usw.). Die Entwicklung von git-annex ist sehr aktiv. Der Inhalt der Dateien kann aus dem Git-Repository entfernt werden, nur die Baumhierarchie wird von Git nachverfolgt (durch Symlinks). Um jedoch den Inhalt der Datei zu erhalten, ist ein zweiter Schritt nach dem Ziehen/Pushen notwendig, z.B.:

$ git annex add mybigfile
$ git commit -m'add mybigfile'
$ git push myremote
$ git annex copy --to myremote mybigfile ## This command copies the actual content to myremote
$ git annex drop mybigfile ## Remove content from local repo
...
$ git annex get mybigfile ## Retrieve the content
## or to specify the remote from which to get:
$ git annex copy --from myremote mybigfile

Es stehen viele Befehle zur Verfügung, und es gibt eine umfangreiche Dokumentation auf der Website. Ein Paket ist verfügbar auf Debian .

179voto

Pat Notz Punkte 196406

Wenn das Programm ohne die Dateien nicht funktioniert, scheint es eine schlechte Idee zu sein, sie in ein separates Repo aufzuteilen. Wir haben große Testsuiten, die wir in ein separates Repository aufteilen, aber das sind wirklich "Hilfsdateien".

Möglicherweise können Sie die Dateien aber auch in einem separaten Repository verwalten und dann die git-submodule um sie auf vernünftige Weise in Ihr Projekt einzubeziehen. Sie hätten also immer noch die vollständige Historie aller Ihrer Quellen, aber so wie ich es verstehe, hätten Sie nur die eine relevante Revision Ihres Bilder-Submoduls. Die git-submodule sollte Ihnen helfen, die richtige Version des Codes mit der richtigen Version der Bilder in Einklang zu bringen.

Hier ist eine gute Einführung in Submodule von Git Book.

62voto

VonC Punkte 1117238

Eine weitere Lösung, die seit April 2015 besteht, ist Git Large File Storage (LFS) (von GitHub).

Sie verwendet git-lfs (siehe git-lfs.github.com ) und mit einem Server getestet, der dies unterstützt: lfs-test-server :
Sie können die Metadaten nur im Git-Repository und die große Datei an anderer Stelle speichern.

https://cloud.githubusercontent.com/assets/1319791/7051226/c4570828-ddf4-11e4-87eb-8fc165e5ece4.gif

34voto

sehe Punkte 346808

Werfen Sie einen Blick auf Korkenzieher eine Git-Erweiterung zur intelligenten Speicherung großer Binärdateien in einem Git-Repository.

Sie würden es als Submodul haben wollen, aber Sie müssen sich keine Sorgen machen, dass das Repository schwer zu handhaben ist. Eines ihrer Anwendungsbeispiele ist die Speicherung von VM-Images in Git.

Ich habe noch keine besseren Kompressionsraten gesehen, aber meine Repositories enthalten auch keine wirklich großen Binärdateien.

Ihre Erfahrungen können variieren.

29voto

Carl Punkte 41134

Sie können auch Folgendes verwenden git-fat . Ich mag, dass es nur auf Lager Python und abhängt rsync . Es unterstützt auch den üblichen Git-Workflow mit den folgenden selbsterklärenden Befehlen:

git fat init
git fat push
git fat pull

Außerdem müssen Sie eine .gitfat-Datei in Ihr Repository einchecken und Ihre .gitattributes ändern, um die gewünschten Dateierweiterungen anzugeben git fat zu verwalten.

Sie fügen eine Binärdatei mit der normalen git add , die wiederum die git fat basierend auf Ihren gitattributes-Regeln.

Und schließlich hat es den Vorteil, dass der Speicherort der Binärdateien von mehreren Repositories und Benutzern gemeinsam genutzt werden kann und alles unterstützt rsync tut.

UPDATE: Verwenden Sie git-fat nicht, wenn Sie eine Git-SVN-Brücke verwenden. Es wird dazu führen, dass die Binärdateien aus Ihrem Subversion-Repository entfernt werden. Wenn Sie jedoch ein reines Git-Repository verwenden, funktioniert es wunderbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X