Git Clean
In dit gedeelte concentreren we ons op een gedetailleerde beschrijving van de opdracht git clean
. Git clean
is tot op zekere hoogte een opdracht om iets ongedaan te maken. Git clean
kan worden beschouwd als een aanvulling op andere opdrachten, zoals git reset en git checkout. Terwijl deze andere opdrachten werken op bestanden die eerder zijn toegevoegd aan de Git-trackingindex, werkt de opdracht git clean
op niet-bijgehouden bestanden. Niet-bijgehouden bestanden zijn bestanden die zijn aangemaakt in de werkmap van je repo, maar die nog niet zijn toegevoegd aan de trackingindex van de repository met behulp van de opdracht git add.
Bekijk het volgende opdrachtregelvoorbeeld om het verschil tussen bijgehouden en niet-bijgehouden bestanden beter te begrijpen.
$ mkdir git_clean_test
$ cd git_clean_test/
$ git init .
Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/
$ echo "tracked" > ./tracked_file
$ git add ./tracked_file
$ echo "untracked" > ./untracked_file
$ mkdir ./untracked_dir && touch ./untracked_dir/file
$ git status
On branch master
Initial commit
Changes to be committed: (use "git rm --cached <file>..." to unstage)
new file: tracked_file
Untracked files: (use "git add <file>..." to include in what will be committed) untracked_dir/ untracked_file
gerelateerd materiaal
Git cheat sheet
Oplossing bekijken
Git leren met Bitbucket Cloud
In het voorbeeld wordt een nieuwe Git-repository gemaakt in de map git_clean_test
. Vervolgens wordt een tracked_file
aangemaakt dat wordt toegevoegd aan de Git-index. Daarnaast wordt een untracked_file
aangemaakt en een untracked_dir
. In het voorbeeld wordt vervolgens git status
aangeroepen, waarin uitvoer wordt weergegeven die de interne status van de bijgehouden en niet-bijgehouden wijzigingen in Git aangeeft. Met de repository in deze staat kunnen we de opdracht git clean
uitvoeren om het beoogde doel te demonstreren.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
Op dit punt kan het uitvoeren van de standaardopdracht git clean
een fatale fout opleveren. Het voorbeeld hierboven laat zien hoe dit eruit zou kunnen zien. Git is standaard globaal zo geconfigureerd dat aan git clean
een 'force'-optie moet worden doorgegeven voor initiatie. Dit is een belangrijk veiligheidsmechanisme. Wanneer de opdracht uiteindelijk wordt uitgevoerd, is git clean
niet meer ongedaan te maken. Als de opdracht volledig wordt uitgevoerd, zorgt git clean
voor de harde verwijdering van het bestandssysteem, vergelijkbaar met het uitvoeren van het rm-hulpprogramma op de opdrachtregel. Zorg ervoor dat je de niet-bijgehouden bestanden echt wilt verwijderen voordat je de opdracht start.
Veelvoorkomende opties en gebruik
Gezien de voorgaande uitleg over het standaardgedrag van git clean en de bijbehorende waarschuwingen, vind je hierna verschillende toepassingen van git clean en de bijbehorende opdrachtregelopties die nodig zijn voor het gebruik ervan.
-n
Met de optie -n voert git clean een 'testrun' uit. Dit laat je zien welke bestanden verwijderd zullen worden zonder ze daadwerkelijk te verwijderen. Het is verstandig om altijd eerst een testrun uit te voeren. We kunnen deze optie demonstreren in de demo-repo die we eerder hebben aangemaakt.
$ git clean -n
Would remove untracked_file
De output geeft aan dat untracked_file
wordt verwijderd wanneer de opdracht git clean
wordt uitgevoerd. Merk op dat de untracked_dir
hier niet in de output wordt vermeld. Git clean
werkt standaard niet recursief op mappen. Dit is een ander veiligheidsmechanisme om onbedoelde permanente verwijdering te voorkomen.
-f or --force
De force-optie initieert de daadwerkelijke verwijdering van niet-bijgehouden bestanden uit de huidige map. Force is vereist, tenzij de configuratieoptie clean.requireForce
is ingesteld op false. Hiermee worden niet-bijgehouden mappen of bestanden die zijn gespecificeerd met .gitignore
, niet verwijderd. Laten we nu een live git clean
uitvoeren in onze voorbeeldrepo.
$ git clean -f
Removing untracked_file
De output van de opdracht toont de bestanden uit die zijn verwijderd. Je kunt hier zien dat untracked_file
is verwijderd. Als je op dit punt git status uitvoert of een ls doet, kun je zien dat het bestand untracked_file verwijderd is en nergens te vinden is. Git clean -f werkt standaard op alle niet-bijgehouden bestanden in de huidige map. Bovendien kan een
git clean -f <path>
-d include directories
De optie -d vertelt git clean dat je ook niet-bijgehouden mappen wilt verwijderen. Standaard worden mappen genegeerd. We kunnen de optie -d toevoegen aan onze vorige voorbeelden:
$ git clean -dn
Would remove untracked_dir/
$ git clean -df
Removing untracked_dir/
Hier hebben we een 'testrun' uitgevoerd met de combinatie -dn, wat als output oplevert dat untracked_dir klaar is voor verwijdering. Vervolgens voeren we een geforceerde clean uit en krijgen we als output dat untracked_dir is verwijderd.
-x force removal of ignored files
Een veelvoorkomend patroon van softwarereleases is om een build- of distributieregister te hebben dat niet is gecommit in de trackingindex van de repository's. De build-map bevat dan kortstondige build-artefacten die zijn gegenereerd op basis van de gecommitte broncode. Deze build-map wordt gewoonlijk toegevoegd aan het bestand .gitignore van de repository . Het kan handig zijn om deze map ook op te schonen met andere niet-bijgehouden bestanden. Met de optie -x moet git clean ook worden toegepast op alle genegeerde bestanden. Net zoals bij eerdere aanroepen van gitclean, is het verstandig om eerst een 'testrun' uit te voeren voordat je de definitieve verwijdering uitvoert. De optie -x werkt op alle genegeerde bestanden, niet alleen op bestanden die specifiek zijn voor de projectbuild. Dit kunnen onbedoelde items zijn, zoals ./.idea IDE-configuratiebestanden.
git clean -xf
Zo kan de -d optie -x worden doorgegeven en gecombineerd met andere optie. Dit voorbeeld toont een combinatie met -f waarmee niet-bijgehouden bestanden uit de huidige map worden verwijderd, evenals alle bestanden die Git gewoonlijk negeert.
Interactieve modus of git clean interactief
Naast de ad-hoc-opdrachtregeluitvoering die we tot nu toe hebben gedemonstreerd, heeft git clean
een 'interactieve' modus die je kunt starten door de optie -i
door te geven. Laten we de voorbeeldrepo uit de introductie van dit document nog eens bekijken. In dat beginstadium starten we een interactieve cleansessie.
$ git clean -di
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now>
We hebben de interactieve sessie gestart met de optie -d
, zodat deze dus zal ook reageren op onze untracked_dir
. In de interactieve modus wordt een What Now>
-prompt weergegeven waarin wordt gevraagd om een opdracht toe te passen op de niet-bijgehouden bestanden. De opdrachten zelf spreken voor zich. We zullen ze allemaal kort bekijken in willekeurige volgorde, te beginnen met de 6: help
. Als je opdracht 6 selecteert, worden de andere opdrachten verder uitgelegd:
What now> 6
clean - start cleaning
filter by pattern - exclude items from deletion
select by numbers - select items to be deleted by numbers
ask each - confirm each deletion (like "rm -i")
quit - stop cleaning
help - this screen
? - help for prompt selection
5: quit
Is eenvoudig en verlaat de interactieve sessie.
1: clean
Verwijdert de aangegeven items. Als we 1: clean
zouden uitvoeren, dan wordt untracked_dir/untracked_file
verwijderd
4: ask each
herhaalt elk nietbijgehouden bestand en geeft een Y/N
-prompt voor een verwijdering weer. Dit ziet er als volgt uit:
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 4
Remove untracked_dir/ [y/N]? N
Remove untracked_file [y/N]? N
2: filter by pattern
Geeft een extra prompt weer waarvan de input wordt gebruikt om de lijst met niet-bijgehouden bestanden te filteren.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 2
untracked_dir/ untracked_file
Input ignore patterns>> *_file
untracked_dir/
Hier voeren we het jokertekenpatroon *_file
in, dat vervolgens de lijst met niet-bijgehouden bestanden beperkt tot alleen untracked_dir
.
3: select by numbers
Net als opdracht 2, dient opdracht 3 om de lijst met niet-bijgehouden bestandsnamen te verfijnen. Tijdens de interactieve sessie wordt gevraagd om cijfers die overeenkomen met een niet-bijgehouden bestandsnaam.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 3
1: untracked_dir/ 2: untracked_file
Select items to delete>> 2
1: untracked_dir/ * 2: untracked_file
Select items to delete>>
Would remove the following item:
untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
Samenvatting
Samenvattend: git clean
is een handige methode om niet-bijgehouden bestanden te verwijderen uit de werkmap van een repo. Niet-bijgehouden bestanden zijn bestanden die in de map van de repo staan, maar nog niet met git add zijn toegevoegd aan de index van de repo. Over het algemeen kan het effect van git clean
worden bereikt met behulp van git status en de eigen verwijderingstools van het besturingssysteem. Git clean
kan naast git reset worden gebruikt om toevoegingen en commits in een repository volledig 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.