Git gc
De opdracht git gc
is een onderhoudsopdracht voor de repository. 'gc' staat voor 'afvalinzameling' ('garbage collection'). git gc
uitvoeren betekent letterlijk aan Git vertellen dat hij de rommel moet opruimen die in de huidige repository is gemaakt. Dit concept komt voort uit interpretatieve programmeertalen die zorgen voor dynamische geheugentoewijzing. 'Garbage collection' wordt in geïnterpreteerde talen gebruikt om geheugen terug te winnen dat ontoegankelijk is geworden voor het uitvoerende programma.
Git-repository's verzamelen verschillende soorten afval. Eén soort Git-afval zijn de 'verweesde' of ontoegankelijke commits. Git-commits kunnen ontoegankelijk worden bij het uitvoeren van opdrachten die de geschiedenis veranderen, zoals git resets of git rebase. In een poging om de geschiedenis te bewaren en gegevensverlies te voorkomen, zal Git geen afzonderlijke commits verwijderen. Een losgekoppelde commit kan nog steeds worden uitgecheckt, worden gebruikt voor cherry-picking en worden bekeken via het git log
.
Naast het opschonen van losgekoppelde commits, voert git gc
ook compressie uit op opgeslagen Git-objecten, waardoor kostbare schijfruimte vrijkomt. Wanneer Git een groep vergelijkbare objecten identificeert, worden deze gecomprimeerd tot een 'pakket'. Pakketten zijn als zip-bestanden van Git-objecten en bevinden zich in de map ./git/objects/pack
in een repository.
Wat doet git gc eigenlijk?
Voordat git gc
wordt uitgevoerd, controleert de opdracht eerst verschillende git config-waarden. Deze waarden helpen om de rest van de verantwoordelijkheid van git gc
te verduidelijken.
git gc-configuratie
gc.reflogExpire
Een optionele variabele met een standaardwaarde van 90 dagen. Deze wordt gebruikt om vast te stellen hoe lang records in een reflog van branches bewaard moeten blijven.
gc.reflogExpireUnreachable
Een optionele variabele met een standaardwaarde van 30 dagen. Deze wordt gebruikt om in te stellen hoe lang ontoegankelijke reflog-records bewaard moeten blijven.
gc.aggressiveWindow
gerelateerd materiaal
Een volledige Git-repository verplaatsen
Oplossing bekijken
Git leren met Bitbucket Cloud
Een optionele variabele met een standaardwaarde van 250. Deze bepaalt hoeveel tijd er wordt doorgebracht in de deltacompressiefase van het inpakken van een object wanneer git gc
wordt uitgevoerd met de optie --aggressive
.
gc.aggressiveDepth
Optionele variabele met een standaardwaarde van 50. Deze regelt de diepte van de compressie die git-repack
gebruikt tijdens het uitvoeren van git gc --agressive
gc.pruneExpire
Optionele variabele met '2 weken geleden' als standaardwaarde. Deze bepaalt hoe lang een ontoegankelijk object bewaard blijft voordat het wordt opgeschoond
gc.worktreePruneExpire
Optionele variabele met '3 maanden geleden' als standaardwaarde. Deze bepaalt hoe lang een oude, werkende structuur bewaard blijft voordat deze wordt verwijderd.
git gc-uitvoering
Achter de schermen voert git gc
in feite een reeks andere interne subopdrachten uit, zoals git prune, git repack
, git pack
en git rerere
. De hoofdverantwoordelijkheid van deze opdrachten is om alle Git-objecten te identificeren die zich buiten de drempelwaarden bevinden die zijn ingesteld in de git gc
-configuratie. Na identificatie worden deze objecten gecomprimeerd of opgeschoond.
git gc: best practices en veelgestelde vragen
'Garbage collection' wordt automatisch uitgevoerd voor verschillende veelgebruikte opdrachten:
De frequentie waarmee git gc
handmatig moet worden uitgevoerd, komt overeen met het activiteitsniveau van een repository. Een repository met één ontwikkelaar die bijdragen levert, hoeft git gc
veel minder vaak uit te voeren dan een regelmatig bijgewerkte repository voor meerdere gebruikers.
git gc versus git prune
git gc
is een bovenliggende opdracht, git prune
is een onderliggende opdracht. git gc
zal intern git prune
activeren. git prune
wordt gebruikt om Git-objecten te verwijderen die volgens de git gc
-configuratie als ontoegankelijk worden beschouwd. Ontdek meer over git prune.
Wat is 'git gc-aggressive'?
git gc
kan worden aangeroepen met de opdrachtregeloptie --aggressive
. De optie --aggressive
zorgt ervoor dat git gc
meer tijd besteedt aan zijn inspanningen op het gebied van optimalisatie. Hierdoor werkt git gc
langzamer, maar wordt er na voltooiing meer schijfruimte bespaard. De effecten van --aggressive
zijn blijvend en hoeven alleen uitgevoerd te worden na een groot aantal wijzigingen in een repository.
Wat is 'git gc auto'?
De opdrachtvariant git gc --auto
controleert eerst of de repo moet worden schoongemaakt voordat deze wordt uitgevoerd. Als er wordt vastgesteld dat dit niet nodig is, wordt de opdracht afgesloten zonder dat deze wordt uitgevoerd. Bij sommige Git-opdrachten wordt na uitvoering impliciet git gc --auto
uitgevoerd om eventuele losse objecten die zijn ontstaan op te schonen.
Voor de uitvoering controleert git gc --auto
de git
-configuratie op drempelwaarden voor losse voorwerpen en de grootte van de verpakkingscompressie. Deze waarden kunnen worden ingesteld met git config. Als de repository een van de drempelwaarden voor het 'schoonmaken' overschrijdt, wordt git gc --auto
uitgevoerd.
Aan de slag met git gc
Waarschijnlijk gebruik je git gc
al zonder dat je het merkt. Zoals in de best practices is besproken, wordt de functie automatisch aangeroepen via veelgebruikte opdrachten. Als je deze handmatig wilt aanroepen, moet je git gc
uitvoeren. Je ziet dan een uitvoer die aangeeft hoeveel werk er is verricht.
Deel dit artikel
Volgend onderwerp
Aanbevolen artikelen
Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.