Close

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
Datenbanken
Zugehöriges Material

Verschieben eines vollständigen Git-Repositorys

Bitbucket-Logo
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.

Mitarbeiter arbeiten mit unzähligen Tools zusammen

Bitbucket-Blog

Abbildung: DevOps

DevOps-Lernpfad

Demo Den: Feature-Demos mit Atlassian-Experten

So funktioniert Bitbucket Cloud mit Atlassian Open DevOps

Melde dich für unseren DevOps-Newsletter an

Thank you for signing up