In dit gedeelte zullen we ons richten op een gedetailleerde bespreking van het git clean
commando. Git clean
is tot op zekere hoogte een ‘ongedaan maken’ commando. Git clean
kan worden beschouwd als een aanvulling op andere commando’s zoals git reset
en git checkout
. Terwijl deze andere commando’s werken op bestanden die eerder aan de Git tracking index zijn toegevoegd, werkt het git clean
commando op niet-getraceerde bestanden. Ongevolgde bestanden zijn bestanden die in de werkmap van je repo zijn aangemaakt, maar nog niet aan de tracking index van het repository zijn toegevoegd met het git add
commando. Om het verschil tussen tracked en untracked bestanden beter te demonstreren, zie het volgende commando regel voorbeeld:
$ 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 ..." to unstage) new file: tracked_file Untracked files: (use "git add ..." to include in what will be committed) untracked_dir/ untracked_file
Het voorbeeld maakt een nieuwe Git repository aan in de git_clean_test
directory. Het gaat dan verder met het aanmaken van een tracked_file
die aan de Git index wordt toegevoegd, daarnaast wordt er een untracked_file
aangemaakt, en een untracked_dir
. Het voorbeeld roept dan git status
aan, welke uitvoer toont die de interne status van Git aangeeft met tracked en untracked wijzigingen. Met de repository in deze staat, kunnen we het git clean
commando 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 het standaard git clean
commando een fatale fout opleveren. Het voorbeeld hierboven laat zien hoe dit er uit kan zien. Standaard is Git zo ingesteld dat git clean
een “force” optie moet krijgen om te starten. Dit is een belangrijk veiligheidsmechanisme. Als git clean
uiteindelijk uitgevoerd is, kan het niet ongedaan gemaakt worden. Wanneer git clean
volledig wordt uitgevoerd, zal het een harde verwijdering van het bestandssysteem uitvoeren, vergelijkbaar met het uitvoeren van de commandoregel rm utility. Zorg ervoor dat u de ongevolgde bestanden echt wilt verwijderen voordat u het uitvoert.
Algemene opties en gebruik
Gezien de vorige uitleg van het standaardgedrag en de beperkingen van git clean
, demonstreert de volgende inhoud verschillende gebruikssituaties van git clean
en de bijbehorende commandoregelopties die nodig zijn voor hun werking.
-n
De -n
optie voert een “dry-run” uit van git clean
. Dit laat u zien welke bestanden zullen worden verwijderd zonder ze daadwerkelijk te verwijderen. Het is een goede gewoonte om altijd eerst een “dry run” van git clean
uit te voeren. We kunnen deze optie demonstreren in de demo repo die we eerder hebben gemaakt.
$ git clean -n Would remove untracked_file
De uitvoer vertelt ons dat untracked_file
zal worden verwijderd wanneer het git clean
commando wordt uitgevoerd. Merk op dat de untracked_dir
hier niet in de uitvoer wordt gemeld. Standaard zal git clean
niet recursief werken op directories. Dit is een ander veiligheidsmechanisme om onbedoelde permanente verwijdering te voorkomen.
-f or --force
De force optie initieert de daadwerkelijke verwijdering van niet-getraceerde bestanden uit de huidige directory. Force is vereist tenzij de clean.requireForce
configuratie optie op false is gezet. Dit verwijdert geen ongevolgde mappen of bestanden die zijn opgegeven met .gitignore
. Laten we nu een live git clean
uitvoeren in onze voorbeeld repo.
$ git clean -f Removing untracked_file
Het commando zal de bestanden die verwijderd zijn, uitvoeren. U kunt hier zien dat untracked_file
is verwijderd. Het uitvoeren van git status
op dit punt of het doen van een ls
zal laten zien dat untracked_file
is verwijderd en nergens meer te vinden is. Standaard zal git clean -f
werken op alle ongevolgde bestanden in de huidige directory. Daarnaast kan een waarde worden doorgegeven met de -f
optie die een specifiek bestand zal verwijderen.
git clean -f -d include directories
De -d
optie vertelt git clean
dat u ook alle ongevolgde directories wilt verwijderen, standaard zullen directories worden genegeerd. We kunnen de -d
optie toevoegen aan onze vorige voorbeelden:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
Hier hebben we een ‘dry run’ uitgevoerd met de -dn
combinatie die aangeeft dat untracked_dir
aan de beurt is om verwijderd te worden. Daarna voeren we een ‘forced clean’ uit, en krijgen de uitvoer dat untracked_dir
verwijderd is.
-x force removal of ignored files
Een veel voorkomend software release patroon is om een build of distributie directory te hebben die niet gecommit is op de repositories tracking index. De build directory bevat efemere build artefacten die worden gegenereerd uit de gecommitteerde broncode. Deze bouwmap wordt meestal toegevoegd aan het .gitignore
bestand van de repositories. Het kan handig zijn om deze directory ook op te schonen met andere untracked bestanden. De optie -x
vertelt git clean
om ook alle genegeerde bestanden te includen. Net als bij eerdere git clean
-aanroepen, is het een goede gewoonte om eerst een ‘dry run’ uit te voeren, voordat de bestanden definitief worden verwijderd. De -x
optie zal op alle genegeerde bestanden werken, niet alleen op project build specifieke bestanden. Dit kunnen onbedoelde dingen zijn zoals ./.idea IDE configuratie bestanden.
git clean -xf
Zoals de -d
optie kan -x
worden doorgegeven en samengesteld met andere opties. Dit voorbeeld demonstreert een combinatie met -f
die ongetraceerde bestanden uit de huidige directory zal verwijderen, evenals alle bestanden die Git normaal negeert.
Interactieve modus of git clean interactive
Naast de ad-hoc commando regel executie die we tot nu toe hebben laten zien, heeft git clean
een “interactieve” modus die je kunt starten door de -i
optie door te geven. Laten we de voorbeeld repo uit de inleiding van dit document opnieuw bekijken. In die begintoestand zullen we een interactieve schone sessie starten.
$ 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 -d
optie, zodat deze ook op onze untracked_dir
zal reageren. De interactieve modus zal een What now>
prompt tonen die om een commando vraagt om toe te passen op de ongevolgde bestanden. De commando’s zelf spreken voor zich. We zullen ze kort bekijken in willekeurige volgorde, te beginnen met commando 6: help
. Door commando 6 te selecteren worden de andere commando’s 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 recht-toe-recht-aan en zal de interactieve sessie afsluiten.
1: clean
Wijdert de aangegeven items. Als we 1: clean
op dit punt zouden uitvoeren, zou untracked_dir/ untracked_file
worden verwijderd.
4: ask each
zal itereren over elk niet getraceerd bestand en een Y/N
prompt tonen voor een verwijdering. Het 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/ ? N Remove untracked_file ? N
2: filter by pattern
Weergave van een extra prompt die invoer vraagt om de lijst van niet-getraceerde 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 *_file
jokertekenpatroon in dat vervolgens de lijst van niet-getraceerde bestanden beperkt tot alleen untracked_dir
.
3: select by numbers
Gelijkaardig aan commando 2, werkt commando 3 om de lijst van niet-getraceerde bestandsnamen te verfijnen. De interactieve sessie zal om getallen vragen die overeenkomen met een niet gevolgde 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
Om samen te vatten, git clean
is een gemakkelijke methode om niet gevolgde bestanden in de werkmap van een repo te verwijderen. Niet gevolgde bestanden zijn bestanden die in de directory van de repo staan, maar nog niet zijn toegevoegd aan de index van de repo met git add
. Over het algemeen kan het effect van git clean
worden bereikt met git status
en de eigen verwijder-gereedschappen van het besturingssysteem. Git clean
kan samen met git reset
worden gebruikt om alle toevoegingen en commits in een repository volledig ongedaan te maken.