Close

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
Databases
gerelateerd materiaal

Een volledige Git-repository verplaatsen

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

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up