Gibt es eine Möglichkeit, die Größe des Git-Ordners zu reduzieren?

156

Scheint, als würde mein Projekt mit jedem Git größer und größer commit/push. Gibt es eine Möglichkeit, meinen Git-Ordner zu bereinigen?

Sheehan Alam
quelle

Antworten:

214

Ich bin mir nicht sicher, was du willst. Zuallererst wird das Verzeichnis natürlich jedes Mal, wenn Sie es festschreiben / pushen, etwas größer, da es jedes dieser zusätzlichen Festschreibungen speichern muss.

Wahrscheinlich möchten Sie jedoch, git gcwelche "unnötige Dateien bereinigen und das lokale Repository optimieren" ( Handbuchseite ).

Ein weiterer möglicherweise relevanter Befehl ist git cleandas Löschen nicht verfolgter Dateien aus Ihrem Baum ( Handbuchseite ).

houbysoft
quelle
30
git clean -d -f -x löscht die in .gitignore und so aufgelisteten Dateien. ZB Arbeitsbereiche, die nicht in Git, Pods-Ordner usw. gehören
Kalle
102
WARNINGDer Befehl wie oben geschrieben von @Kalle wird entfernen EVERY > untracked <Datei- und Verzeichnis innerhalb Ihrer GIT ROOT , nicht nur „Dateien in .gitignore aufgeführt“. Alles, was nicht von Git verfolgt wird, unabhängig davon, ob es in aufgeführt ist oder nicht, .gitignorewird gelöscht. git clean -dfX(Beachten Sie den Fall auf der X) entfernt nur Elemente, für die eine geltende Regel gilt .gitignore. Bitte beachten Sie diese Warnung: Führen Sie niemals aus, git cleanohne sie entweder im interaktiven Modus auszuführen , -ianstatt -foder zumindest zuerst einen Trockenlauf durchzuführen - -nund dann erneut mit -f.
Adrian Günter
5
Oder ein Backup machen :-)
Mateen Ulhaq
61

Lauf:

git remote prune origin

Löscht alle veralteten Verfolgungszweige, die bereits entfernt wurden, originaber lokal noch verfügbar sind remotes/origin.

git gc --auto

' G arbage C ollection' - läuft Verwaltungsaufgaben (Kompressen Revisionen, entfernt lose / unzugängliche Objekte). Das --autoFlag bestimmt zuerst, ob Arbeit erforderlich ist, und wird beendet, ohne etwas zu tun, wenn nicht.

Phamductri
quelle
4
Eine Erklärung, was diese tun? Ich weiß, dass wir sie googeln und nach ihrer Dokumentation suchen können, aber es ist üblich, eine kurze Beschreibung Ihrer Antwort bereitzustellen, wenn es sich nur um Code oder Befehle handelt.
Dzhuneyt
28

Ein Szenario, in dem Ihr Git-Repo mit jedem Commit ernsthaft größer wird, ist eines, in dem Sie Binärdateien festschreiben, die Sie regelmäßig generieren. Ihre Speicherung ist nicht so effizient wie die von Textdateien .

Eine andere ist eine, bei der Sie eine große Anzahl von Dateien innerhalb eines Repos (was eine Grenze für Git darstellt ) anstelle mehrerer Subrepos ( die als Submodule verwaltet werden ) haben.

In diesem Artikel über Git Space erwähnt AlBlue:

Beachten Sie, dass Git (und Hg sowie andere DVCSs) unter einem Problem leiden, bei dem (große) Binärdateien eingecheckt und dann gelöscht werden, da sie weiterhin im Repository angezeigt werden und Speicherplatz beanspruchen, auch wenn sie nicht aktuell sind .

Wenn Sie große Binärdateien in Ihrem Git-Repo gespeichert haben, können Sie Folgendes berücksichtigen:

Wie ich in " Was sind die Dateilimits in Git (Anzahl und Größe)? " Erwähnt habe , ist das neuere (2015, 5 Jahre nach dieser Antwort) Git LFS von GitHub eine Möglichkeit, diese großen Dateien zu verwalten (indem sie außerhalb des Git gespeichert werden) Git-Repository).

VonC
quelle
1
Die Unterstützung großer Git-Dateien ist hilfreich, wenn große Binärdateien (wie Bilder) routinemäßig hinzugefügt / aktualisiert werden. Siehe git-lfs.github.com . Super einfach zu implementieren, unterstützt von Github. Alle Teammitglieder müssen es installieren, um es gemeinsam nutzen zu können.
Eric Woods
@ EricWoods True. Ich habe Git-LFS bereits erwähnt (64 Mal: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Ich habe diese alte Antwort entsprechend bearbeitet.
VonC
Ha, in der Tat! Komisch, wie eine 9+ Jahre alte Antwort immer noch relevant ist (und jetzt noch mehr mit den LFS-Informationen).
Eric Woods
22

ja ja, git gcist die lösung natürlich

und lokal - Sie können das lokale Repository einfach löschen und erneut klonen.

aber hier gibt es etwas Wichtigeres ...

Die Sekunden, die Sie auf die Verarbeitung dieses riesigen Git & Externals warten, werden in langen Minuten erfasst, in denen Stunden ineffizienter Zeit erfasst werden.

Erstellen Sie ein neues Repository (nicht nur ein Zweig) von Grund auf neu , einschließlich der einzigen aktuellen Version von Dateien. Natürlich verlieren Sie den gesamten Verlauf.

Aber wenn es in der Code-Welt nicht an der Zeit ist, sentimental zu werden, macht es keinen Sinn, die gesamten 5 Jahre des Codes bei jedem Commit oder Diff mitzuziehen. Sie können das alte Git & Externals trotzdem irgendwo speichern, wenn Sie nostalgisch werden:]

aber irgendwann muss man wirklich mitmachen:]

Ihr Team wird es Ihnen danken!

Gemeinschaft
quelle
12
Völlig einverstanden, wir haben diesen Ansatz kürzlich mit einem alten Repository gewählt und haben nicht zurückgeschaut.
Nun
13

Das Ausführen dieses Befehls ist äußerst gefährlich, verkleinert jedoch Ihr Repository, indem alle Ihre Git-Wiederherstellungs- / Sicherungsdateien gelöscht werden:

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

Es löscht alle Dateien, die git verwendet, um Ihr Repository von einem fehlerhaften Befehl wiederherzustellen. Wenn Sie dies beispielsweise getan haben git reset --hard, können Sie normalerweise die verlorenen Dateien wiederherstellen. Aber wenn Sie dies git reset --hardvor dem git reflog expire...Befehl tun , haben Sie alles verloren. Jetzt besteht Ihre einzige Hoffnung darin, ein Tool zu verwenden, das Ihr Dateisystem analysiert und versucht, die gelöschten Dateien wiederherzustellen, wenn sie nicht überschrieben wurden.

Benutzer
quelle
3
Ich würde das wirklich nicht als extrem gefährlich bezeichnen . Ich würde es einfach als etwas bezeichnen, mit dem man vorsichtig sein muss . Nach meiner Erfahrung berühren nur sehr wenige jemals das Reflog oder nicht erreichbare Objekte - die meisten wissen nicht einmal, dass sie da sind oder wie sie mit ihnen interagieren sollen, und bleiben daher in Situationen stecken, in denen sie nützlich wären oder Dinge schrecklich machen würden ineffizienter Weg. Ich würde sogar sagen, wenn Sie nicht wissen und nicht herausfinden können, was diese Befehle bewirken, können Sie sie sicher ausführen!
Chris Morgan
10

git clean -d -f -i ist der beste Weg, es zu tun.

Dies hilft bei einer kontrollierten Reinigung.

-i steht für interaktiv.

Anandharshan
quelle
3
Obwohl die Frage des OP vage ist und diesbezüglich eine gute Antwort ist, möchte ich darauf hinweisen, dass dies git cleannicht für die Bereinigung des Repos , sondern für die Bereinigung des Verzeichnisses gilt. Für Benutzer, die blind kopieren / einfügen, ist Vorsicht geboten. Dadurch werden nicht verfolgte Dateien / Verzeichnisse entfernt, die Sie möglicherweise tatsächlich lokal benötigen.
Sraboy
git clean -d -x -f funktioniert gut, wenn Sie tief reinigen möchten
Rishabh Jain
2

Ich weiß nicht, ob es schrumpfen wird, aber nachdem ich es ausgeführt habe git clean, mache ich es oft git repack -adauch, was die Anzahl der Packdateien verringert.

Damien Sawyer
quelle
5
Das Umpacken ist Teil des git gcProzesses, daher muss es nicht separat ausgeführt werden
artkoshelev