W tym rozdziale skupimy się na szczegółowym omówieniu polecenia git clean
. Git clean
jest do pewnego stopnia poleceniem 'undo’. Git clean
można uznać za komplementarne w stosunku do innych poleceń, takich jak git reset
i git checkout
. Podczas gdy te inne polecenia operują na plikach wcześniej dodanych do indeksu śledzenia Git, polecenie git clean
operuje na plikach nieśledzonych. Nieśledzone pliki to pliki, które zostały utworzone w katalogu roboczym twojego repo, ale nie zostały jeszcze dodane do indeksu śledzenia repozytorium za pomocą polecenia git add
. Aby lepiej zademonstrować różnicę między plikami śledzonymi i nieśledzonymi, rozważ następujący przykład z wiersza poleceń:
$ 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
Przykład tworzy nowe repozytorium Git w katalogu git_clean_test
. Następnie przystępuje do utworzenia pliku tracked_file
, który jest dodawany do indeksu Git, dodatkowo tworzony jest plik untracked_file
oraz untracked_dir
. Następnie przykład wywołuje polecenie git status
, które wyświetla dane wyjściowe wskazujące na wewnętrzny stan Gita – śledzone i nieśledzone zmiany. Mając repozytorium w tym stanie, możemy wykonać polecenie git clean
, aby zademonstrować jego przeznaczenie.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
W tym momencie wykonanie domyślnego polecenia git clean
może spowodować błąd krytyczny. Powyższy przykład demonstruje, jak to może wyglądać. Domyślnie, Git jest globalnie skonfigurowany tak, aby wymagał, aby git clean
było przekazywane z opcją „force” do zainicjowania. Jest to ważny mechanizm bezpieczeństwa. Po ostatecznym wykonaniu git clean
nie da się cofnąć. Po pełnym wykonaniu, git clean
wykona twarde usunięcie systemu plików, podobne do wykonania narzędzia rm z wiersza poleceń. Upewnij się, że naprawdę chcesz usunąć nieśledzone pliki, zanim go uruchomisz.
Wspólne opcje i użycie
Zważywszy na poprzednie wyjaśnienie domyślnych zachowań i zastrzeżeń git clean
, poniższa treść demonstruje różne przypadki użycia git clean
i towarzyszące im opcje wiersza poleceń wymagane do ich działania.
-n
Opcja -n
wykona „suchy przebieg” git clean
. To pokaże ci, które pliki zostaną usunięte, bez faktycznego ich usuwania. Jest to najlepsza praktyka, aby zawsze najpierw wykonać suchy przebieg git clean
. Możemy zademonstrować tę opcję w demo repo, które utworzyliśmy wcześniej.
$ git clean -n Would remove untracked_file
Wyjście mówi nam, że plik untracked_file
zostanie usunięty po wykonaniu polecenia git clean
. Zauważ, że untracked_dir
nie jest wyświetlane na wyjściu. Domyślnie git clean
nie będzie działać rekurencyjnie na katalogach. Jest to kolejny mechanizm zabezpieczający przed przypadkowym trwałym usunięciem.
-f or --force
Opcja force inicjuje rzeczywiste usuwanie nieśledzonych plików z bieżącego katalogu. Opcja force jest wymagana, chyba że opcja konfiguracyjna clean.requireForce
jest ustawiona na false. Nie spowoduje to usunięcia nieśledzonych katalogów lub plików określonych przez .gitignore
. Wykonajmy teraz na żywo git clean
w naszym przykładowym repo.
$ git clean -f Removing untracked_file
Polecenie wyświetli pliki, które zostały usunięte. Możesz zobaczyć tutaj, że untracked_file
został usunięty. Wykonanie git status
w tym momencie lub wykonanie ls
pokaże, że untracked_file
został usunięty i nigdzie nie można go znaleźć. Domyślnie git clean -f
będzie działać na wszystkich nieśledzonych plikach bieżącego katalogu. Dodatkowo można przekazać wartość z opcją -f
, która usunie konkretny plik.
git clean -f -d include directories
Opcja -d
mówi git clean
, że chcesz również usunąć wszelkie nieśledzone katalogi, domyślnie będzie ignorować katalogi. Możemy dodać opcję -d
do naszych poprzednich przykładów:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
W tym przypadku wykonaliśmy „próbę na sucho” przy użyciu kombinacji -dn
, która wykazała, że untracked_dir
jest gotowy do usunięcia. Następnie wykonaliśmy 'forced clean’ i otrzymaliśmy informację, że untracked_dir
jest do usunięcia.
-x force removal of ignored files
Powszechnym wzorcem wydawania oprogramowania jest posiadanie katalogu kompilacji lub dystrybucji, który nie jest przypisany do indeksu śledzenia repozytoriów. Katalog kompilacji będzie zawierał efemeryczne artefakty kompilacji, które są generowane z zaangażowanego kodu źródłowego. Ten katalog build jest zwykle dodawany do pliku .gitignore
repozytoriów. Wygodne może być również czyszczenie tego katalogu z innych nieśledzonych plików. Opcja -x
mówi git clean
, aby uwzględniał także wszelkie ignorowane pliki. Podobnie jak w przypadku poprzednich wywołań git clean
, najlepszą praktyką jest wykonanie „próby na sucho” przed ostatecznym usunięciem. Opcja -x
będzie działać na wszystkie ignorowane pliki, nie tylko te specyficzne dla kompilacji projektu. Mogą to być niezamierzone rzeczy, takie jak pliki konfiguracyjne ./.idea IDE.
git clean -xf
Podobnie jak opcja -d
, -x
może być przekazywana i komponowana z innymi opcjami. Ten przykład demonstruje kombinację z -f
, która usunie nieśledzone pliki z bieżącego katalogu, a także wszelkie pliki, które Git zwykle ignoruje.
Tryb interaktywny lub git clean interactive
Oprócz doraźnego wykonywania poleceń w wierszu poleceń, które zademonstrowaliśmy do tej pory, git clean
ma tryb „interaktywny”, który można zainicjować, przekazując opcję -i
. Powróćmy do przykładowego repo z wprowadzenia do tego dokumentu. W tym początkowym stanie uruchomimy interaktywną sesję czyszczenia.
$ 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>
Zainicjowaliśmy sesję interaktywną opcją -d
, więc będzie ona również działać na nasz untracked_dir
. W trybie interaktywnym zostanie wyświetlony znak zachęty What now>
z żądaniem polecenia, które ma zostać zastosowane do nieśledzonych plików. Same komendy są dość oczywiste. Przyjrzymy się pokrótce każdej z nich w przypadkowej kolejności, zaczynając od polecenia 6: help
. Wybranie polecenia 6 spowoduje dalsze wyjaśnienie pozostałych poleceń:
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
Jest proste i spowoduje zakończenie sesji interaktywnej.
1: clean
Wykasuje wskazane elementy. Gdybyśmy wykonali 1: clean
w tym momencie untracked_dir/ untracked_file
zostałoby usunięte.
4: ask each
Wykona iterację nad każdym nieśledzonym plikiem i wyświetli Y/N
monit o usunięcie. Wygląda to następująco:
*** 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
Wyświetli dodatkowy znak zachęty, który przyjmuje dane wejściowe używane do filtrowania listy nieśledzonych plików.
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/
Tutaj wprowadzamy wzorzec wieloznaczny *_file
, który następnie ogranicza listę nieśledzonych plików tylko do untracked_dir
.
3: select by numbers
Podobnie jak polecenie 2, polecenie 3 działa w celu dopracowania listy nazw nieśledzonych plików. Interaktywna sesja zapyta o numery, które odpowiadają nazwom nieśledzonych plików.
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
Podsumowanie
Podsumowując, git clean
jest wygodną metodą usuwania nieśledzonych plików w katalogu roboczym repo. Nieśledzone pliki to te, które znajdują się w katalogu repo, ale nie zostały jeszcze dodane do indeksu repo za pomocą git add
. Ogólnie rzecz biorąc, efekt git clean
można osiągnąć za pomocą git status
i natywnych narzędzi usuwania z systemu operacyjnego. Git clean
może być użyty razem z git reset
do całkowitego cofnięcia wszelkich dodatków i commitów w repozytorium.