2009-12-15 14 views
12

Ich beginne gerade damit, git für mein Versionskontrollsystem zu verwenden, allerdings mache ich ein gutes Stück Web-/Spieleentwicklung, bei der natürlich Bilder (Binärdaten) gespeichert werden müssen. Wenn mein Verständnis stimmt, wenn ich ein Bild festlege und es sich 100-mal ändert, wenn ich eine neue Kopie dieses Repos erhalte, würde ich im Grunde alle 100 Revisionen dieser Binärdatei auschecken?Git und binäre Daten

Ist dies nicht ein Problem mit großen Repos, bei denen sich die Bilder regelmäßig ändern, würde der erste Abruf des Repos nicht ganz groß werden? Hat irgendjemand irgendetwas in der realen Welt damit zu tun gehabt? Ich habe zum Beispiel einige Alternativen gesehen, Submodule zu verwenden und Bilder in einem separaten Repo zu halten, aber dies hält nur die Codebasis kleiner, das Image Repo wäre immer noch riesig. Im Grunde frage ich mich nur, ob es eine nette Lösung dafür gibt.

+1

Dies ist eine Entwurfsbeschränkung von Git. Es wurde geschrieben, um eine Sache gut zu machen: Verwalten Sie den Linux-Source-Tree, der so ziemlich alles im Klartext ist. Git dreht sich alles um Diffs und Merges, Dinge, die nicht wirklich auf Bilder zutreffen.Wenn Ihre Mediendateien sehr umfangreich sind oder häufig bearbeitet werden, sollten Sie einen anderen Mechanismus verwenden, um den Verlauf dieser Dateien zu speichern. Wenn Sie nicht wirklich am Code arbeiten oder viele Zweige erstellen, sind Sie möglicherweise besser Ich benutze Git überhaupt nicht. – user57368

+2

git wird mit binären Dateien zurechtkommen, und das System, das es für das * Speichern * von Deltas verwendet, basiert auf binärem Inhalt (die Text-Diffs, die Sie in Patches sehen, werden im laufenden Betrieb berechnet, keine Darstellung dessen, was gespeichert ist). Allerdings reduziert xdelta für komprimierte Bilder den Platzbedarf kaum. Sie können alle Ihre Bilder als XPM oder BMP speichern: p – araqnid

Antwort

7

Ich würde das nicht "checkout" nennen, aber ja, das erste Mal, wenn Sie Repository abrufen, vorausgesetzt, dass Binärdaten riesig und inkompressibel sind, wird es sein, was es ist - riesig. Und ja, da das Erhaltungsrecht immer noch in Kraft ist, wenn man es in Module aufteilt, spart man nicht Platz und Zeit beim ersten Ziehen des Repositories.

Eine mögliche Lösung verwendet immer noch separate Repository und --depth Option beim Ziehen. Flache Repositories haben einige Einschränkungen, aber ich kann mich nicht mehr genau erinnern, da ich sie nie benutzt habe. Überprüfen Sie die Dokumente. Das Keyword ist "seicht".

bearbeiten: Von git-clone(1):

Eine flache Repository eine Reihe von Einschränkungen hat (nicht von klonen oder holen kann, noch drücken aus noch hinein), , aber wenn Sie ausreichend sind nur interessiert an der jüngsten Geschichte eines großen Projekts mit einer langen Geschichte, und würde in Fixes als Patches senden möchten.

+1

Interessant, wenn Sie die oben genannten doc Zitat in Betracht ziehen, scheint es fast, dass ein nicht verteilter vcs für binäre Daten besser sein könnte, da Sie eine Menge der Vorteile der Verwendung von Git fehlt sowieso mit binären Daten umgehen. – Jamie

+1

Ja, aber Sie können sich immer noch die Mühe machen, ein riesiges Repository einmal zu holen. Sie können auch ein separates Nicht-Git-Repository für Binärdaten verwenden. Aber da ich Git sehr liebe (obwohl ich anfangs skeptisch war - alles, was Linus schreibt, wird gelobt), würde ich empfehlen, binäre Daten zu trennen und ... naja, damit umzugehen; –

2

Leider ist Git nicht wirklich zum Speichern von Binärdaten gedacht. Da es verteilt ist, würden Sie alle Versionen aller Dateien ziehen, wenn Sie es klonen. Es wird auch lächerlich schwierig, diese großen Binärdateien aus Ihrem Code-Repository zu entfernen. Mehr dazu hier: (http://www.somethingorothersoft.com/2009/09/08/the-definitive-step-by-step-guide-on-how-to-delete-a-directory-permanently-from-git-on-widnows-for-dumbasses-like-myself/).

Ich würde empfehlen, es auszuprobieren, aber binäre Dateien getrennt von dem Code (d. H. Mit Submodulen). Sollte dies nicht funktionieren, können Sie eine andere Lösung verwenden, ohne den gesamten Verlauf für Ihr Haupt-Repository neu zu schreiben.

2

Ich mache die Bilder ignoriert/nicht verfolgt Verzeichnisse, und dann synchronisieren Sie die Bild-Verzeichnis/Verzeichnisse mit anderen, nicht-Git-Systeme (oder kopieren Sie einfach die Bild-Verzeichnis Änderungen einmal, wenn Sie über eine Menge sprechen Bilder, die nicht vollständig synchronisiert werden müssen.