Ga naar hoofdinhoud

Git prune: wat is Git-pruning en hoe gebruik je git prune

Git prune is een Git-commando dat objecten uit de repository verwijdert die niet langer bereikbaar zijn vanuit een commit of branch, zodat je schijfruimte kunt vrijmaken.
· 5 min lezen

Verken met AI

Git’s beschermende aanpak bij het verwijderen van data voorkomt dat belangrijke commits of gegevens per ongeluk verloren gaan.

Dit kan er echter toe leiden dat verouderde data, zoals verwijzingen naar verwijderde branches, zichtbaar blijft. Na verloop van tijd kunnen Git-repositories ongerefereerde objecten verzamelen, die onnodig schijfruimte innemen en mogelijk voor verwarring zorgen.

Het git prune-commando is een onderhoudstool binnen Git, bedoeld om onbereikbare objecten in de repository op te schonen.

Een onbereikbaar object is een object dat niet toegankelijk is via een branch, tag, remote-tracking branch of andere referentie. Deze objecten kunnen ruimte innemen in de repository en die na verloop van tijd vervuilen met overbodige data.

Hoewel git prune een krachtig hulpmiddel is om repositories slank te houden, hoeven de meeste gebruikers het niet direct te gebruiken dankzij Git’s automatische garbage collection (git gc). Toch kan het nuttig zijn om de rol en werking te begrijpen voor gevorderde Git-gebruikers of in specifieke situaties waarin handmatig onderhoud van de repository nodig of gewenst is.

Wat is git prune?

Het commando git prune wordt gebruikt om objecten te verwijderen die niet langer nodig zijn in de lokale repository. Dit kunnen commits, trees (directory-snapshots), blobs (bestanden) en tags zijn die niet langer vanuit een branch of tag in de repository toegankelijk zijn.

Kort gezegd helpt git prune bij het opschonen van overbodige bestanden en data in de repository, waardoor je ruimte bespaart en rommel vermindert.

Hoe kunnen objecten onbereikbaar worden?

Objecten kunnen op meerdere manieren onbereikbaar raken—bijvoorbeeld door branches te verwijderen of commits te herschrijven. Wanneer branches worden verwijderd, worden commits die uniek zijn voor die branches en die niet deel uitmaken van een andere branch of tag, onbereikbaar.

Het herschrijven van commits, met commando’s zoals git rebase, genereert nieuwe commits en gooit de oude weg, waardoor die ook onbereikbaar worden.

Respijtperiode en reflogs

Git houdt een log bij van updates aan branchtoppen en andere referenties, de zogenoemde reflogs (referentielogs). We kunnen deze bekijken met het commando git reflog.

Zelfs als een object onbereikbaar is, wordt het niet verwijderd door git prune zolang het nog in de reflog staat.

Standaard heeft de reflog een vervaldatum van 90 dagen, wat een respijtperiode biedt waarin onbereikbare objecten tijdelijk worden bewaard en niet direct worden opgeschoond.

Wanneer gebruik je git prune?

Meestal hoeven we git prune niet direct te gebruiken. Git heeft een garbage-collectionmechanisme dat na sommige commando’s automatisch draait om overbodige bestanden op te ruimen en de efficiëntie van de lokale repository te verbeteren door sommige bestanden te comprimeren.

Toch kan het wenselijk zijn om de repository handmatig op te schonen, bijvoorbeeld:

  • Nadat we een actie hebben uitgevoerd waarvan we weten dat die onbereikbare objecten creëert, zoals het verwijderen van een branch. 
  • Als we onmiddellijk schijfruimte willen vrijmaken.
  • Om de repository altijd netjes en opgeruimd te houden.

Garbage collection met git gc

In plaats van direct te prunen, is het doorgaans aan te raden te vertrouwen op het garbage-collectionmechanisme, dat niet alleen een git prune uitvoert maar ook ruimte optimaliseert door objecten te comprimeren.

Zoals hierboven genoemd, wordt garbage collection na sommige commando’s automatisch uitgevoerd. We kunnen garbage collection ook handmatig starten met het commando:

git gc

Hoe gebruik je git prune?

Omdat git prune data verwijdert, is het aan te raden het eerst uit te voeren met de optie --dry-run.

git prune --dry-run

Deze optie toont de objecten die zouden worden opgeschoond zonder ze daadwerkelijk te verwijderen. De uitvoer ziet er ongeveer zo uit:

0d7dff8258654c03a058987b3e63c86feca9200d commit
ea1380f52f0bfa0142e46767adfd56593681091a blob
fa91af78a1ab453c1d7632192b3ca8bf217ec711 commit

De uitvoer geeft aan dat er twee commits en een blob onbereikbaar zijn en zouden worden verwijderd. Nadat je zeker weet dat er geen belangrijke data tussen staat, kun je doorgaan met het opschonen:

git prune

In sommige situaties willen we de repository opschonen direct nadat we een actie hebben uitgevoerd waarvan we weten dat die tot onbereikbare objecten leidt, zoals het verwijderen van een branch. We draaien git prune --dry-run, maar de uitvoer is leeg. De reden is dat de verwijderde commits nog steeds in de reflog zijn gerefereerd.

Als we niet willen wachten tot ze uit de reflog verlopen, kunnen we ze handmatig laten verlopen met het commando:

git reflog expire --expire-unreachable=now --all

Laten we de gebruikte opties toelichten:

  • De optie --expire-unreachable=now stelt de vervaldatum van alle onbereikbare objecten in op nu, zodat ze direct verlopen.
  • De optie --all richt zich op alle reflog-items in de repository. Zonder deze optie zouden we een specifieke ref (zoals een branch of tag) moeten opgeven waarop we willen werken.

git prune: geavanceerd gebruik

Laten we enkele geavanceerde technieken bekijken, zoals een vervaltijd opgeven of gepackte bestanden opschonen.

Een vervaltijd opgeven

Misschien willen we alleen oudere onbereikbare objecten opruimen, bijvoorbeeld alleen objecten die minstens twee weken oud zijn.

Met de optie --expire <time> kunnen we een grensmoment opgeven. Git verwijdert objecten die langer dan de opgegeven tijd onbereikbaar zijn. De parameter <time> accepteert verschillende formaten zoals "2 weeks ago", "3 days", "yesterday", enzovoort, zodat je flexibel de verloopperiode kunt aangeven.

Voorbeeldcommando:

git prune --expire=2.weeks.ago

Gepackte bestanden opschonen

Git slaat objecten op twee manieren op: als losse bestanden (loose objects) en in gepackte bestanden. Packen is een mechanisme om ruimte te besparen en prestaties te verbeteren door meerdere objecten in één bestand op te slaan en redundantie te verwijderen.

Soms kan een object zowel in losse als in gepackte vorm bestaan. Hoewel deze redundantie niet schadelijk is (behalve dat het wat extra schijfruimte kost), willen we mogelijk die losse objecten opruimen die ook al gepackt zijn om ruimte terug te winnen.

Het commando git prune-packed verwijdert losse objecten als ze al in een pack zijn opgenomen. In tegenstelling tot git prune neemt git prune-packed geen opties zoals --expire <time> aan. Het ruimt simpelweg losse objecten op die al gepackt zijn.

Conclusie

Tijdens het gebruik van een repository worden sommige objecten onbereikbaar, wat onnodig schijfgebruik veroorzaakt. Git beheert dit met een garbage-collection­systeem dat onbereikbare objecten na een periode van inactiviteit verwijdert.

Het garbage-collectionmechanisme wordt door Git automatisch uitgevoerd na sommige commando’s. We kunnen het ook handmatig draaien met het commando git gc. Het garbage-collectionproces verwijdert niet alleen onbereikbare objecten met git prune, maar optimaliseert ook schijfruimte door sommige objecten te comprimeren.

Gevorderde Git-gebruikers willen hun repository mogelijk handmatig schoon houden. Met het commando git prune kun je onbereikbare objecten handmatig verwijderen. Voer altijd git prune --dry-run uit voordat je git prune draait om een overzicht te krijgen van de objecten die tijdens het pruning-proces worden verwijderd.

François Aubry

Auteur

François Aubry

Full-stack engineer & oprichter bij CheapGPT. Lesgeven is altijd mijn passie geweest. Al vanaf mijn studententijd zocht ik actief naar kansen om bijles te geven en andere studenten te helpen. Die passie bracht me ertoe om te promoveren, waarbij ik ook als onderwijsassistent werkte ter ondersteuning van mijn academische werk. In die jaren vond ik veel voldoening in de traditionele klasomgeving, waar ik verbindingen kon leggen en leren kon begeleiden. Met de opkomst van online leerplatforms zag ik echter het transformerende potentieel van digitaal onderwijs. Sterker nog, ik was actief betrokken bij de ontwikkeling van zo’n platform op onze universiteit. Ik zet me sterk in om traditionele didactische principes te combineren met innovatieve digitale methoden. Mijn passie is om cursussen te maken die niet alleen boeiend en informatief zijn, maar ook toegankelijk voor lerenden in dit digitale tijdperk.

Onderwerpen

Gerelateerd