PDFs in Git, verkleinern

6

Ich habe ein Git-Repository mit vielen PDF-Dateien. Das Git-Repository wächst so stark an, dass es sehr kompliziert ist, das Repository auf einen neuen Host zu klonen, wenn die Internetverbindung begrenzt ist ...

Ich habe verwendet, git gc && git gc --aggressivewas mich viel RAM kostet und nichts Sinnvolles getan hat. Die Größe des Repositorys ist größtenteils immer noch gleich.

Ich habe davon gehört git annex, weiß aber nicht, ob es der richtige Weg ist, weil ich nicht jedes Mal, wenn ich eine der PDF-Dateien benötige, diese herunterladen möchte. Natürlich kann ich es tun und alle Dateien auf meinem Laptop belassen, aber ich möchte alles auf einmal klonen und nicht zwei verschiedene Repos.

Gibt es eine gute Möglichkeit, die Größe zu reduzieren und die PDFs dennoch verwendbar zu machen (neben der Reduzierung der Größe der PDFs - in meinem Repository befinden sich einige mit einer Größe von über 100 MB)?

reox
quelle

Antworten:

10

Weder Git noch Mercurial können sehr gut mit großen Binärdateien umgehen. Beide gehen davon aus, dass die zu verfolgenden Dateien relativ klein und leicht zu unterscheiden sind, PDF-Dateien jedoch nicht. Wenn Sie bereits ausgeführt haben git gc, wird Ihr Repository nicht viel kleiner als es bereits ist.

Wenn Sie keine Lösung von Drittanbietern wünschen, können Sie dies mit Git mithilfe von Submodulen abmildern. Wenn es sinnvoll ist, können Sie die verschiedenen Dateien in Ihrem Repository in Submodule aufteilen und diese separat klonen. Auf diese Weise können Sie das Masterprojekt klonen, um alle Submodulreferenzen abzurufen, und dann jedes der Submodule nach Bedarf klonen.

Wie Sie jedoch vermuten, ist Git Annex wahrscheinlich die beste Lösung. Es ist ein Artefakt-Repository, ähnlich wie bfiles für Mercurial. Diese Artefakt-Repositorys sind für die Verwendung mit großen, binären, nicht diffiblen Dateien vorgesehen. Sie verwalten den Abruf der Artefakte. Git und Mercurial sind nur für die Pflege der Referenzen verantwortlich. Auf diese Weise müssen Sie beim Klonen mit Git nur die Referenzen klonen, und das Abrufen von Artefakten ist ein separater Schritt, der nach Bedarf ausgeführt wird.

Wenn Sie eine dieser Routen wählen, können Sie den Verlauf neu schreiben, um alle zuvor festgeschriebenen Objekte zu entfernen und sie in Submodule oder Git-Anhänge zu verschieben. Andernfalls ist Ihr Repository immer mindestens so groß wie jetzt.


git gcNebenbei bemerkt, der Grund, warum die Größe des Repository nicht reduziert wurde, war, dass die Garbage Collection von Git nur nicht referenzierte Objekte aus dem Repository entfernt und lose Objekte in Packdateien komprimiert. Da Ihre PDF-Dateien alle referenziert sind und sich in den Packdateien nicht gut komprimieren lassen, wäre das Repository nicht viel kleiner geworden.

Stephen Jennings
quelle