Git rm
Een veelgestelde vraag van mensen die aan de slag ga met Git is: 'Hoe kan ik ervoor zorgen dat Git een bestand (of bestanden) niet meer traceert?' De opdracht git rm
wordt gebruikt om bestanden te verwijderen uit een Git-repository. Deze kan gezien worden als het omgekeerde van de opdracht git add.
Overzicht van git rm
De opdracht git rm
kan gebruikt worden om afzonderlijke bestanden of een verzameling bestanden te verwijderen. De belangrijkste functie van git rm
is het verwijderen van bijgehouden bestanden uit de Git-index. Daarnaast kan git rm
gebruikt worden om bestanden te verwijderen uit zowel de staging-index als de werkmap. Er is geen optie om een bestand alleen uit de werkmap te verwijderen. De bestanden die beheerd worden moeten identiek zijn aan de bestanden in de huidige HEAD
. Als er een afwijking is tussen de HEAD
-versie van een bestand en de staging-index of de werkstructuurversie, blokkeert Git de verwijdering. Deze blokkade is een veiligheidsmechanisme om te voorkomen dat lopende wijzigingen worden verwijderd.
Let op dat git rm
geen branches verwijdert. Meer informatie over het gebruik van git branches.
Gebruik
<file>…
Specificeert de doelbestanden die verwijderd moeten worden. De optiewaarde kan een individueel bestand zijn, een lijst van bestanden gescheiden door spaties file1 file2 file3
, of een bestandsglob met wildcard (~./directory/*)
.
-f
--force
De optie -f
wordt gebruikt om de veiligheidscontrole te overschrijven die Git uitvoert om te garanderen dat de bestanden in HEAD
overeenkomen met de huidige inhoud in de staging-index en de werkmap.
gerelateerd materiaal
Git cheat sheet
Oplossing bekijken
Git leren met Bitbucket Cloud
-n
--dry-run
De optie 'dry run' is een beveiliging die de opdracht git rm
uitvoert, maar niet daadwerkelijk de bestanden verwijdert. In plaats daarvan wordt weergegeven welke bestanden de opdracht zou hebben verwijderd.
-r
De optie -r
is een afkorting voor 'recursief'. Bij gebruik in recursieve modus verwijdert git rm
de doelmap en de volledige inhoud van die map.
--
De scheidingsoptie wordt gebruikt om een expliciet onderscheid te maken tussen een lijst van bestandsnamen en de argumenten die worden doorgegeven aan git rm
. Dit is nuttig als een van de bestandsnamen een syntaxis heeft die mogelijk wordt aangezien is voor andere opties.
--cached
De optie in de cache geeft aan dat de verwijdering alleen mag plaatsvinden tijdens de staging-index. De bestanden in de werkmap worden met rust gelaten.
--ignore-unmatch
Dit zorgt ervoor dat de opdracht wordt afgesloten met de sigterm-status 0, zelfs als er geen overeenkomende bestanden zijn. Dit is een statuscode op Unix-niveau. De code 0 geeft aan dat het aanroepen van de opdracht is gelukt. De optie --ignore-unmatch
kan nuttig zijn als je git rm
gebruikt als onderdeel van een groter shellscript dat met storingen moet kunnen omgaan.
-q
--quiet
De stille optie verbergt de uitvoer van de opdracht git rm
. De opdracht geeft normaal gesproken één regel weer voor elk verwijderd bestand.
git rm ongedaan maken
Het uitvoeren van git rm
is geen permanente update. De opdracht zal de staging-index en de werkmap bijwerken. Deze wijzigingen worden niet voortgezet totdat een nieuwe commit is aangemaakt en de wijzigingen zijn toegevoegd aan de commit-geschiedenis. Dit betekent dat de wijzigingen hier 'ongedaan kunnen worden gemaakt' met gewone Git-opdrachten.
git reset HEAD
Een reset zal de huidige staging-index en werkmap terugzetten naar de commit HEAD
. Hiermee wordt een git rm
ongedaan gemaakt.
git checkout .
Een checkout heeft hetzelfde resultaat en herstelt de recentste versie van een bestand via HEAD
.
In het geval dat git rm
werd uitgevoerd en een nieuwe commit werd aangemaakt die de verwijdering doorzet, kan git reflog
gebruikt worden om een referentienummer te vinden vóór de uitvoering van git rm
. Meer informatie over het gebruik van git reflog.
Bespreking
Het
-argument dat aan de opdracht wordt gegeven, kan bestaan uit exacte paden, patronen met wildcards of exacte mapnamen. De opdracht verwijdert alleen de paden die momenteel naar de Git-repository gecommit zijn.
Het globben van bestanden met wildcards komt overeen in alle mappen. Het is belangrijk om voorzichtig te zijn met het gebruik van wildcards. Bekijk de voorbeelden: directory/*
en directory*
. In het eerste voorbeeld worden alle subbestanden van directory/
verwijderd, terwijl in het tweede voorbeeld alle naastgelegen mappen worden verwijderd, zoals directory1
directory2
directory_whatever
, wat een onverwacht resultaat kan hebben.
De scope van git rm
De opdracht git rm
werkt alleen op de huidige branch. De verwijdering wordt alleen toegepast op de werkmap en de staging-indexbomen. Het verwijderen van het bestand wordt niet voortgezet in de geschiedenis van de repository totdat er een nieuwe commit is aangemaakt.
git rm gebruiken in plaats van rm
Een Git-repository herkent wanneer er een normale shell-opdracht rm
is uitgevoerd op basis van een bestand dat wordt bijgehouden. Deze werkt de werkmap bij om de verwijdering weer te geven. De staging-index wordt niet bijgewerkt als de verwijdering plaatsvindt. Er moet een extra opdracht git add
uitgevoerd worden op de verwijderde bestandspaden om de wijzigingen aan de staging-index toe te voegen. De opdracht git rm
gedraagt zich als sneltoets in die zin dat het de werkmap en de staging-index bijwerkt wanneer de verwijdering plaatsvindt.
Voorbeelden
git rm Documentation/\*.txt
In dit voorbeeld wordt een bestandsglob met wildcard gebruikt om alle *.txt files
te verwijderen die ondergeschikt zijn aan de map Documentation
en alle submappen ervan.
Let op dat het sterretje * in dit voorbeeld door schuine strepen wordt afgescheiden. Dit is een beveiliging die voorkomt dat de shell de wildcard uitbreidt. De wildcard breidt vervolgens de padnamen uit van bestanden en submappen onder de map Documentation/
.
git rm -f git-*.sh
In dit voorbeeld wordt de optie force gebruikt die gericht is op alle bestanden met de wildcard git-*.sh
. De optie force verwijdert de doelbestanden expliciet uit zowel de werkmap als de staging-index.
Bestanden verwijderen die niet meer in het bestandssysteem zitten
Zoals hierboven vermeld werd in 'git rm
gebruiken in plaats van rm
', is git rm
in feite een gemaksopdracht die de standaard shell rm
en git add
combineert om een bestand te verwijderen uit de werkmap en die verwijdering naar de staging-index promoot. Een repository kan onhandelbaar worden in het geval dat er meerdere bestanden zijn verwijderd met alleen de standaard shell-opdracht rm
.
Als het de bedoeling is om alle expliciet verwijderde bestanden op te nemen als onderdeel van de volgende commit, voegt git commit -a
alle verwijderingsgebeurtenissen aan de staging-index toe ter voorbereiding van de volgende commit.
Als het echter de bedoeling is om de bestanden die zijn verwijderd met de shell rm
permanent te verwijderen, gebruik dan de volgende opdracht:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Deze opdracht genereert een lijst van de verwijderde bestanden uit de werkmap en stuurt die lijst door naar git rm --cached
, waardoor de staging-index wordt bijgewerkt.
Samenvatting van git rm
git rm
is een opdracht die op twee van de belangrijkste structuren voor intern statusbeheer van Git werkt: de werkmap en de staging-index. git rm
wordt gebruikt om een bestand te verwijderen uit een Git-repository. Het is een gemaksmethode die het effect van de standaard shellopdracht rm
combineert met git add
. Dit betekent dat er eerst een doel uit het bestandssysteem wordt verwijderd en dat die verwijderingsgebeurtenis vervolgens aan de staging-index wordt toegevoegd. De opdracht is een van de velen die kunnen worden gebruikt om wijzigingen in Git ongedaan te maken.
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.