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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.