În această secțiune, ne vom concentra pe o discuție detaliată a comenzii git clean
. Git clean
este, într-o oarecare măsură, o comandă „undo”. Git clean
poate fi considerată complementară altor comenzi precum git reset
și git checkout
. În timp ce aceste alte comenzi operează asupra fișierelor adăugate anterior în indexul de urmărire Git, comanda git clean
operează asupra fișierelor netrasate. Fișierele netrasate sunt fișiere care au fost create în directorul de lucru al repo-ului dumneavoastră, dar care nu au fost încă adăugate la indexul de urmărire al depozitului cu ajutorul comenzii git add
. Pentru a demonstra mai bine diferența dintre fișierele urmărite și cele netrasate, luați în considerare următorul exemplu de linie de comandă:
$ 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
Exemplul creează un nou depozit Git în directorul git_clean_test
. Apoi procedează la crearea unui tracked_file
care este adăugat la indexul Git, în plus, este creat un untracked_file
și un untracked_dir
. Exemplul invocă apoi git status
, care afișează o ieșire care indică starea internă a Git de modificări urmărite și netrasate. Cu depozitul în această stare, putem executa comanda git clean
pentru a demonstra scopul urmărit.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
În acest moment, executarea comenzii implicite git clean
poate produce o eroare fatală. Exemplul de mai sus demonstrează cum poate arăta acest lucru. În mod implicit, Git este configurat la nivel global pentru a solicita ca git clean
să primească o opțiune „force” la inițiere. Acesta este un mecanism de siguranță important. Atunci când este executat în final, git clean
nu poate fi anulat. Atunci când este executat complet, git clean
va face o ștergere dură a sistemului de fișiere, similar cu executarea utilitarului rm din linia de comandă. Asigurați-vă că doriți cu adevărat să ștergeți fișierele nedepistate înainte de a o executa.
Opțiuni și utilizări comune
După explicația anterioară a comportamentelor și avertismentelor implicite ale git clean
, următorul conținut demonstrează diverse cazuri de utilizare a git clean
și opțiunile de linie de comandă aferente, necesare pentru funcționarea lor.
-n
Opțiunea -n
va efectua o „execuție uscată” a git clean
. Aceasta vă va arăta ce fișiere vor fi eliminate fără a le elimina efectiv. Este cea mai bună practică să efectuați întotdeauna mai întâi o execuție „la fugă” a git clean
. Putem demonstra această opțiune în repo-ul demo pe care l-am creat mai devreme.
$ git clean -n Would remove untracked_file
Lovitura ne spune că untracked_file
va fi eliminat atunci când se execută comanda git clean
. Observați că untracked_dir
nu este raportată în ieșirea de aici. În mod implicit, git clean
nu va opera recursiv asupra directoarelor. Acesta este un alt mecanism de siguranță pentru a preveni ștergerea permanentă accidentală.
-f or --force
Opțiunea force inițiază ștergerea efectivă a fișierelor netrasate din directorul curent. Force este necesară, cu excepția cazului în care opțiunea de configurare clean.requireForce
este setată la false. Această opțiune nu va elimina folderele sau fișierele netrasate specificate de .gitignore
. Să executăm acum un git clean
live git clean
în repo-ul nostru de exemplu.
$ git clean -f Removing untracked_file
Comanda va afișa fișierele care sunt eliminate. Puteți vedea aici că untracked_file
a fost eliminat. Executând git status
în acest moment sau făcând un ls
va arăta că untracked_file
a fost șters și nu mai este nicăieri de găsit. În mod implicit, git clean -f
va opera asupra tuturor fișierelor netrasate din directorul curent. În plus, se poate trece o valoare cu opțiunea -f
care va elimina un fișier specific.
git clean -f -d include directories
Opțiunea -d
îi spune lui git clean
că doriți să eliminați și toate directoarele netrasate, în mod implicit va ignora directoarele. Putem adăuga opțiunea -d
la exemplele noastre anterioare:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
Aici am executat o „probă de funcționare” folosind combinația -dn
care dă ca rezultat că untracked_dir
este pregătit pentru eliminare. Apoi executăm o curățare forțată și primim ca rezultat faptul că untracked_dir
este eliminat.
-x force removal of ignored files
Un model comun de lansare de software este acela de a avea un director de construcție sau de distribuție care nu este confirmat în indexul de urmărire a depozitelor. Directorul de construcție va conține artefacte de construcție efemere care sunt generate din codul sursă confirmat. Acest director de construcție este, de obicei, adăugat la fișierul „repositories .gitignore
„. Poate fi convenabil să se curețe, de asemenea, acest director cu alte fișiere netrasate. Opțiunea -x
îi spune lui git clean
să includă, de asemenea, toate fișierele ignorate. Ca și în cazul invocărilor anterioare ale lui git clean
, este o bună practică să se execute mai întâi o „execuție de probă”, înainte de ștergerea finală. Opțiunea -x
va acționa asupra tuturor fișierelor ignorate, nu doar asupra celor specifice construcției proiectului. Acestea ar putea fi lucruri neintenționate, cum ar fi fișierele de configurare IDE ./.idea.
git clean -xf
Ca și opțiunea -d
, -x
poate fi transmisă și compusă cu alte opțiuni. Acest exemplu demonstrează o combinație cu -f
care va elimina fișierele netrasate din directorul curent, precum și orice fișiere pe care Git le ignoră de obicei.
Modul interactiv sau git clean interactive
În plus față de execuția ad-hoc în linie de comandă pe care am demonstrat-o până acum, git clean
are un mod „interactiv” pe care îl puteți iniția prin trecerea opțiunii -i
. Să revizuim exemplul repo din introducerea acestui document. În această stare inițială, vom începe o sesiune interactivă de curățare.
$ 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>
Am inițiat sesiunea interactivă cu opțiunea -d
, astfel încât aceasta va acționa și asupra lui untracked_dir
al nostru. Modul interactiv va afișa un prompt What now>
care solicită o comandă care să se aplice fișierelor netrasate. Comenzile în sine sunt destul de autoexplicative. Vom arunca o scurtă privire asupra fiecăreia într-o ordine aleatorie, începând cu comanda 6: help
. Selectarea comenzii 6 va explica mai detaliat celelalte comenzi:
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
Este directă și va ieși din sesiunea interactivă.
1: clean
Va șterge elementele indicate. Dacă am executa 1: clean
în acest moment untracked_dir/ untracked_file
ar fi eliminat untracked_dir/ untracked_file
.
4: ask each
va itera peste fiecare fișier nedetectat și va afișa o cerere Y/N
pentru o ștergere. Seamănă cu următoarele:
*** 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
Afișează un prompt suplimentar care primește datele de intrare folosite pentru a filtra lista de fișiere netrasate.
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/
Aici introducem modelul de wildcard *_file
care apoi restrânge lista de fișiere netrasate la doar untracked_dir
.
3: select by numbers
Similară comenzii 2, comanda 3 funcționează pentru a rafina lista de nume de fișiere netrasate. Sesiunea interactivă va solicita numerele care corespund unui nume de fișier netrasat.
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
Rezumat
Pentru a recapitula, git clean
este o metodă convenabilă pentru ștergerea fișierelor netrasate din directorul de lucru al unui repo. Fișierele netrasate sunt cele care se află în directorul repo-ului, dar care nu au fost încă adăugate la indexul repo-ului cu git add
. În general, efectul lui git clean
poate fi realizat folosind git status
și instrumentele de ștergere native ale sistemului de operare. Git clean
poate fi utilizat împreună cu git reset
pentru a anula complet orice adăugare și confirmare într-un depozit.