git gc
Der Befehl git gc
ist ein Befehl zur Repository-Wartung. Das "gc" steht für "garbage collection" (Speicherbereinigung). Wenn git gc
ausgeführt wird, ist dies die buchstäbliche Anweisung an git, das Chaos, das es im aktuellen Repository verursacht hat, zu bereinigen. Diese Speicherbereinigung ist ein Konzept, das aus den Interpretersprachen stammt, die eine dynamische Speicherzuweisung durchführen. Die Speicherbereinigung wird in Interpretersprachen verwendet, um Speicher wiederherzustellen, auf die das ausgeführte Programm nicht mehr zugreifen kann.
Git-Repositorys häufen verschiedene Arten von Unrat an. Ein Beispiel hierfür sind verwaiste oder unzugängliche Commits. Git-Commits können unzugänglich werden, wenn Befehle zum Ändern des Verlaufs wie git reset oder git rebase ausgeführt werden. Um den Verlauf zu bewahren und Datenverlust zu vermeiden, löscht Git keine losgelösten Commits. Ein losgelöster Commit kann über git log
immer noch ausgecheckt, ausgewählt und untersucht werden.
Zusätzlich zur Bereinigung von getrennten Commits führt git gc
auch eine Komprimierung gespeicherter Git-Objekte durch, wodurch wertvoller Speicherplatz freigegeben wird. Wenn Git eine Gruppe ähnlicher Objekte identifiziert, werden sie zu einem Paket komprimiert. Pakete sind wie Zip-Dateien von Git-Objekten und befinden sich unter ./git/objects/pack
innerhalb eines Repositorys.
Was macht git gc eigentlich genau?
Vor der Ausführung prüft git gc
zunächst mehrere git config-Werte. Diese Werte verdeutlichen die übrige Zuständigkeit von git gc
.
Konfiguration von git gc
gc.reflogExpire
Eine optionale Variable, die standardmäßig 90 Tage verwendet. Mit ihr wird festgelegt, wie lange Datensätze in einem Branch-Reflog aufbewahrt werden sollen.
gc.reflogExpireUnreachable
Eine optionale Variable, die standardmäßig 30 Tage verwendet. Mit ihr wird festgelegt, wie lange unzugängliche Reflog-Datensätze aufbewahrt werden sollen.
gc.aggressiveWindow
Zugehöriges Material
Verschieben eines vollständigen Git-Repositorys
Lösung anzeigen
Git kennenlernen mit Bitbucket Cloud
Eine optionale Variable, die standardmäßig 250 beträgt. Sie bestimmt, wie viel Zeit in der Delta-Komprimierungsphase des Objektpakets verbracht wird, wenn git gc
mit der Option --aggressive
ausgeführt wird.
gc.aggressiveDepth
Optionale Variable, die standardmäßig 50 beträgt. Sie bestimmt den Komprimierungsgrad, den git-repack
während der Ausführung von git gc --aggresive
verwendet.
gc.pruneExpire
Optionale Variable, die standardmäßig "vor 2 Wochen" verwendet. Sie legt fest, wie lange ein unzugängliches Objekt vor dem Pruning aufbewahrt wird.
gc.worktreePruneExpire
Optionale Variable, die standardmäßig "vor 3 Monaten" verwendet. Sie legt fest, wie lange ein veralteter Arbeitsbaum erhalten bleibt, bevor er gelöscht wird.
Ausführung von git gc
Hinter den Kulissen führt git gc
tatsächlich ein Bündel anderer interner Unterbefehle wie git prune, git repack
, git pack
und git rerere
aus. Die übergeordnete Aufgabe dieser Befehle besteht darin, alle Git-Objekte zu identifizieren, die außerhalb der in der git gc
-Konfiguration festgelegten Schwellenwerte liegen. Nach ihrer Identifizierung werden diese Objekte komprimiert oder mit "prune" gelöscht.
Best Practices und FAQs zu git gc
Die Speicherbereinigung wird bei mehreren häufig verwendeten Befehlen automatisch ausgeführt:
Die Häufigkeit, mit der git gc
manuell ausgeführt werden sollte, entspricht dem Aktivitätsniveau eines Repositorys. Für ein Repository, in dem ein einziger Entwickler arbeitet, muss git gc
weitaus seltener ausgeführt werden als für ein häufig aktualisiertes Repository mit mehreren Benutzern.
git gc vs. git prune
git gc
ist ein übergeordneter Befehl, dem git prune
untergeordnet ist. git gc
triggert intern git prune
. git prune
wird verwendet, um Git-Objekte zu entfernen, die von der git gc
-Konfiguration als unzugänglich erachtet wurden. Erfahre mehr über git prune.
Was ist git gc aggressive?
git gc
kann mit der Befehlszeilenoption --aggressive
aufgerufen werden. Die Option --aggressive
sorgt dafür, dass git gc
mehr Zeit für seinen Optimierungsaufwand aufwendet. Dies führt dazu, dass git gc
langsamer läuft, nach seiner Fertigstellung wird jedoch mehr Speicherplatz eingespart. Die Auswirkungen von --aggressive
sind dauerhaft und müssen nur nach einer großen Anzahl von Änderungen an einem Repository ausgeführt werden.
Was ist git gc auto?
Die Befehlsvariante git gc --auto
prüft vor der Ausführung zunächst, ob ein Housekeeping für das Repository erforderlich ist. Wenn festgestellt wird, dass dies unnötig ist, wird die Ausführung ohne weitere Aktionen beendet. Einige Git-Befehle führen nach der Ausführung implizit git gc --auto
aus, um lose Objekte zu bereinigen, die sie erstellt haben.
Vor der Ausführung überprüft git gc --auto
die git
-Konfiguration auf Schwellenwerte für lose Objekte und die Paketkomprimierungsgröße. Diese Werte können mit git config festgelegt werden. Wenn das Repository einen der Housekeeping-Schwellenwerte überschreitet, wird git gc --auto
ausgeführt.
Erste Schritte mit git gc
Du verwendest git gc
wahrscheinlich bereits, ohne es zu merken. Wie unter "Best Practices" erläutert, wird es automatisch durch häufig verwendete Befehle aufgerufen. Wenn du es manuell aufrufen möchtest, führe einfach git gc
aus. Daraufhin sollte eine Ausgabe angezeigt werden, in der die ausgeführten Aktionen aufgelistet sind.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.