V této části se zaměříme na podrobný popis příkazu git clean
. Příkaz Git clean
je do jisté míry příkazem „undo“. Příkaz Git clean
lze považovat za doplňkový k ostatním příkazům, jako jsou git reset
a git checkout
. Zatímco tyto ostatní příkazy pracují se soubory dříve přidanými do sledovacího indexu systému Git, příkaz git clean
pracuje s nesledovanými soubory. Nesledované soubory jsou soubory, které byly vytvořeny v pracovním adresáři repozitáře, ale dosud nebyly přidány do sledovacího indexu repozitáře pomocí příkazu git add
. Pro lepší demonstraci rozdílu mezi sledovanými a nesledovanými soubory uvažujte následující příklad příkazového řádku:
$ 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
Příklad vytváří nový repozitář Git v adresáři git_clean_test
. Poté pokračuje vytvořením adresáře tracked_file
, který je přidán do indexu Git, dále je vytvořen adresář untracked_file
a adresář untracked_dir
. Příklad poté vyvolá git status
, který zobrazí výstup udávající vnitřní stav sledovaných a nesledovaných změn systému Git. S úložištěm v tomto stavu můžeme spustit příkaz git clean
a demonstrovat jeho zamýšlený účel.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
V tomto okamžiku může spuštění výchozího příkazu git clean
způsobit fatální chybu. Výše uvedený příklad demonstruje, jak to může vypadat. Ve výchozím nastavení je systém Git globálně nakonfigurován tak, že pro spuštění příkazu git clean
vyžaduje předání volby „force“. Jedná se o důležitý bezpečnostní mechanismus. Když je příkaz git clean
nakonec spuštěn, není možné jej vrátit zpět. Po úplném spuštění git clean
dojde k tvrdému odstranění souborového systému, podobně jako při spuštění nástroje rm z příkazového řádku. Před spuštěním se ujistěte, že opravdu chcete odstranit nesledované soubory.
Běžné volby a použití
Vzhledem k předchozímu vysvětlení výchozího chování git clean
a upozornění demonstruje následující obsah různé případy použití git clean
a doprovodné volby příkazového řádku potřebné pro jejich fungování.
-n
Volba -n
provede „suché spuštění“ git clean
. Tím se ukáže, které soubory budou odstraněny, aniž by byly skutečně odstraněny. Doporučuje se vždy nejprve provést suché spuštění git clean
. Tuto možnost si můžeme demonstrovat na ukázkovém repozitáři, který jsme vytvořili dříve.
$ git clean -n Would remove untracked_file
Výstup nám říká, že untracked_file
bude odstraněn po provedení příkazu git clean
. Všimněte si, že untracked_dir
zde není ve výstupu hlášen. Ve výchozím nastavení nebude příkaz git clean
pracovat rekurzivně s adresáři. Jedná se o další bezpečnostní mechanismus, který má zabránit náhodnému trvalému odstranění.
-f or --force
Příkaz force iniciuje skutečné odstranění nesledovaných souborů z aktuálního adresáře. Vynucení je vyžadováno, pokud není konfigurační volba clean.requireForce
nastavena na hodnotu false. Neodstraní se nesledované složky nebo soubory zadané pomocí .gitignore
. Proveďme nyní živé git clean
v našem příkladovém repozitáři.
$ git clean -f Removing untracked_file
Příkaz vypíše odstraněné soubory. Zde můžete vidět, že untracked_file
byl odstraněn. Spuštění git status
v tomto okamžiku nebo provedení ls
ukáže, že untracked_file
byl odstraněn a není nikde k nalezení. Ve výchozím nastavení bude git clean -f
pracovat se všemi nesledovanými soubory aktuálního adresáře. Navíc lze pomocí volby -f
předat hodnotu, která odstraní konkrétní soubor.
git clean -f -d include directories
Volba -d
říká git clean
, že chcete odstranit také všechny nesledované adresáře, ve výchozím nastavení bude adresáře ignorovat. Volbu -d
můžeme přidat do našich předchozích příkladů:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
Zde jsme provedli „suchou zkoušku“ pomocí kombinace -dn
, jejímž výstupem je untracked_dir
je k odstranění. Poté provedeme vynucené čištění a obdržíme výstup, že untracked_dir
je odstraněn.
-x force removal of ignored files
Běžným vzorem při vydávání softwaru je adresář sestavení nebo distribuce, který není odevzdán do indexu sledování repozitářů. Adresář sestavení bude obsahovat efemérní artefakty sestavení, které jsou generovány z odevzdaného zdrojového kódu. Tento adresář sestavení se obvykle přidává do souboru repositories .gitignore
. Tento adresář může být vhodné vyčistit i od dalších nesledovaných souborů. Volba -x
říká git clean
, že má zahrnout také všechny ignorované soubory. Stejně jako u předchozích volání git clean
je nejlepším postupem provést nejprve „suchý běh“ před konečným smazáním. Volba -x
bude působit na všechny ignorované soubory, nejen na soubory specifické pro sestavení projektu. Mohlo by se jednat o nechtěné věci, jako jsou konfigurační soubory ./.idea IDE.
git clean -xf
Stejně jako volbu -d
lze volbu -x
předávat a skládat s dalšími volbami. Tento příklad demonstruje kombinaci s -f
, která odstraní nesledované soubory z aktuálního adresáře a také všechny soubory, které Git obvykle ignoruje.
Interaktivní režim nebo git clean interactive
Kromě ad-hoc spouštění příkazového řádku, které jsme si dosud ukázali, má git clean
„interaktivní“ režim, který můžete spustit předáním volby -i
. Vraťme se k příkladu repozitáře z úvodu tohoto dokumentu. V tomto počátečním stavu spustíme interaktivní čistou relaci.
$ 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>
Interaktivní relaci jsme zahájili pomocí volby -d
, takže bude působit i na náš untracked_dir
. V interaktivním režimu se zobrazí výzva What now>
, která si vyžádá příkaz k použití na nesledované soubory. Samotné příkazy jsou poměrně srozumitelné. Krátce se na ně podíváme v náhodném pořadí, přičemž začneme příkazem 6: help
. Výběr příkazu 6 dále vysvětlí ostatní příkazy:
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
Je přímočarý a ukončí interaktivní relaci.
1: clean
Odstraní uvedené položky. Pokud bychom v tomto okamžiku provedli 1: clean
, untracked_dir/ untracked_file
by bylo odstraněno.
4: ask each
bude iterovat po jednotlivých nesledovaných souborech a zobrazí Y/N
výzvu k odstranění. Vypadá to následovně:
*** 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
Zobrazí další výzvu, která přijme vstupní údaje sloužící k filtrování seznamu nesledovaných souborů.
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/
Zde zadáme zástupný vzor *_file
, který pak omezí seznam nesledovaných souborů pouze na untracked_dir
.
3: select by numbers
Podobně jako příkaz 2 funguje příkaz 3 pro zpřesnění seznamu názvů nesledovaných souborů. Interaktivní relace se zeptá na čísla, která odpovídají názvu nesledovaného souboru.
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
Souhrn
Pokud to shrneme, git clean
je pohodlná metoda pro odstranění nesledovaných souborů v pracovním adresáři repozitáře. Nesledované soubory jsou ty, které jsou v adresáři repa, ale ještě nebyly přidány do indexu repa pomocí git add
. Celkově lze efektu git clean
dosáhnout pomocí git status
a nativních nástrojů pro mazání operačních systémů. Git clean
lze použít spolu s git reset
k úplnému zrušení všech přidání a revizí v úložišti.