PDFs in git, verkleinern

2373
reox

Ich habe ein Git-Repository mit vielen PDF-Dateien. Das Git-Repository wächst so stark, 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 sehr viel RAM kostet und nichts Nützliches getan hat. Die Größe des Repositorys ist größtenteils gleich.

Ich habe davon gehört, git annexaber ich weiß nicht, ob es der richtige Weg ist, weil ich nicht jedes Mal ziehen möchte, wenn ich eines der PDFs benötige. Natürlich kann ich es machen 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 PDF-Dateien dennoch nutzbar zu machen (abgesehen von der Verringerung der Größe der PDF-Dateien - es gibt einige in meinem Repository, die über 100 MB groß sind).

6

1 Antwort auf die Frage

10
Stephen Jennings

Weder Git noch Mercurial verarbeiten große Binärdateien sehr gut. Beide gehen davon aus, dass verfolgte 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 Drittanbieterlösung wünschen, können Sie dies durch die Verwendung von Submodulen mit Git verringern. Wenn es sinnvoll ist, können Sie die verschiedenen Dateien in Ihrem Repository in Submodule aufteilen und separat klonen. Auf diese Weise können Sie das Master-Projekt klonen, um alle Referenzen des Submoduls zu erhalten, und dann jedes Submodul nach Bedarf klonen.

Wie Sie 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 große, binäre, nicht diffable Dateien vorgesehen. Sie schaffen das Auffinden der Artefakte. Git und Mercurial sind nur für die Pflege der Referenzen verantwortlich. Auf diese Weise müssen Sie beim Klonen mit Git lediglich die Verweise klonen, und das Abrufen von Artefakten ist ein separater Schritt, der nach Bedarf ausgeführt wird.

Wenn Sie sich für eine dieser Routen entscheiden, sollten Sie den Verlauf des Protokolls neu schreiben, um alle zuvor festgeschriebenen Objekte zu entfernen und sie in Submodule oder Git-Anhänge zu verschieben. Wenn Sie dies nicht tun, ist Ihr Repository immer mindestens so groß wie jetzt.


git gcNebenbei bemerkt, der Grund für die Reduzierung der Repository-Größe war nicht, da Gits Garbage Collection nur nicht referenzierte Objekte aus dem Repository entfernt und lose Objekte in Packdateien komprimiert. Da Ihre PDFs alle referenziert werden und in den Packdateien nicht gut komprimiert werden, wäre das Repository nicht viel kleiner geworden.