Reduzieren Sie die Größe des Git-Repositorys

290

Ich habe versucht, nach einem guten Tutorial zum Reduzieren der Repo-Größe zu suchen, habe aber keines gefunden. Wie reduziere ich meine Repo-Größe? Es sind ungefähr 10 MB, aber Heroku erlaubt nur 50 MB und ich bin noch lange nicht mit der Entwicklung meiner App fertig.

Ich habe die üblichen Verdächtigen (Protokoll, Anbieter, Dokument usw.) bereits zu .gitignore hinzugefügt. Obwohl ich erst kürzlich .gitignore hinzugefügt habe.

Irgendwelche Vorschläge?

sent-hil
quelle
1
Ich habe es gerade getan und es hat es auf 2,2 MB reduziert ... vielen Dank! Obwohl das die Repo-Größe auf Heroku nicht zu reduzieren schien..hmm
sent-hil
11
Schieben Sie es mit --force. Es wird den Inhalt überschreiben, auch wenn es keine Änderung gab (keine neuen Commits usw.)
Marcin Gil
1
@MarcinGil - Im Folgenden gibt VonC an, dass Sie Zugriff auf den Server benötigen, um den Remote-Server zu bereinigen (wenn ich ihn richtig analysiere).
JWW
1
Nur ein Kommentar, um anderen Lesern zu helfen, wenn sie nicht wissen, was sie hinzufügen sollen. .gitignoreAuf gitignore.io gibt es einen netten Service, der Ihnen hilft, ein Gut .gitignorebasierend auf Ihrer Entwicklungsumgebung einzurichten .
Blairg23

Antworten:

351

git gc --aggressiveist eine Möglichkeit, den Beschneidungsprozess zu erzwingen (um sicher zu sein :) git gc --aggressive --prune=now. Sie haben auch andere Befehle, um das Repo zu bereinigen. Vergiss aber manchmal nichtgit gc allein das Repo vergrößert werden kann !

Es kann auch nach a verwendet werden filter-branch, um einige Verzeichnisse zu markieren, die aus dem Verlauf entfernt werden sollen (mit einem weiteren Platzgewinn). siehe hier . Das bedeutet aber, dass niemand aus Ihrem öffentlichen Repo zieht.filter-branchkann Backup-Refs behalten.git/refs/original , so dass auch das Verzeichnis bereinigt werden kann.

Schließlich, wie in diesem Kommentar und dieser Frage erwähnt ; Das Reinigen des Reflogs kann helfen:

git reflog expire --all --expire=now
git gc --prune=now --aggressive

Eine noch vollständigere und möglicherweise gefährliche Lösung besteht darin, nicht verwendete Objekte aus einem Git-Repository zu entfernen

VonC
quelle
In einem anderen Szenario siehe auch stackoverflow.com/questions/1029969/…
VonC
1
Hinweis für sich selbst: Remote-Zweige nicht vergessen: stackoverflow.com/questions/11255802/…
VonC
1
Hinweis für sich selbst: Remote-Tags nicht vergessen
Saiyancoder
1
Neben Remote-Referenzen ist das Reflog eine weitere Sache, die dazu führen kann, dass Referenzen, die Sie entfernen möchten, beibehalten werden. stackoverflow.com/q/27489761/1072626
vossad01
1
@jww Ich bestätige, dass dies eine rein lokale Operation ist. Es hat keinen Einfluss auf die Größe des Remote-Repos. Sie benötigen einen direkten Zugriff auf den Server dieses Remote-Repos, um dasselbe zu tun.
VonC
94

Vielen Dank für Ihre Antworten. Folgendes habe ich getan:

git gc
git gc --aggressive
git prune

Das schien den Trick getan zu haben. Ich habe mit ungefähr 10,5 MB angefangen und jetzt sind es kaum mehr als 980 KB.

sent-hil
quelle
8
prunewird immer von ausgeführt gc(mit Standardeinstellung vor 2 Wochen).
Cas
117
Sie können alle 3 mit Pflaume bis jetzt mitgit gc --aggressive --prune=now
rahul286
1
Wenn ich das Repo lösche und dann erneut klone, ist die Größe immer noch groß. Wie gehst du damit um?
Cwtuan
2

In meinem Fall habe ich mehrere große Dateien (> 100 MB) gepusht und sie dann entfernt. Aber sie waren noch in der Geschichte meines Repos, also musste ich sie auch daraus entfernen.

Was war der Trick war:

bfg -b 100M  # To remove all blobs from history, whose size is superior to 100Mb
git reflog expire --expire=now --all
git gc --prune=now --aggressive

Dann müssen Sie Kraft auf Ihren Zweig ausüben:

git push origin <your_branch_name> --force

bfg ist ein Tool, das unter Linux und MacOS mit Brew installiert werden kann:

brew install bfg
vinzee
quelle