In questa sezione, ci concentreremo su una discussione dettagliata del comando git clean
. Git clean
è in qualche misura un comando “annulla”. Git clean
può essere considerato complementare ad altri comandi come git reset
e git checkout
. Mentre questi altri comandi operano sui file precedentemente aggiunti all’indice di tracciamento di Git, il comando git clean
opera sui file non tracciati. I file non tracciati sono file che sono stati creati all’interno della directory di lavoro del tuo repo ma non sono ancora stati aggiunti all’indice di tracciamento del repository usando il comando git add
. Per dimostrare meglio la differenza tra file tracciati e non tracciati considera il seguente esempio di linea di comando:
$ 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
L’esempio crea un nuovo repository Git nella directory git_clean_test
. Poi procede a creare un tracked_file
che viene aggiunto all’indice Git, inoltre, viene creato un untracked_file
e un untracked_dir
. L’esempio poi invoca git status
che visualizza l’output che indica lo stato interno di Git delle modifiche tracciate e non tracciate. Con il repository in questo stato, possiamo eseguire il comando git clean
per dimostrare il suo scopo.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
A questo punto, eseguire il comando predefinito git clean
può produrre un errore fatale. L’esempio sopra dimostra come può apparire. Per default, Git è configurato globalmente per richiedere che a git clean
venga passata un’opzione “force” per essere avviato. Questo è un importante meccanismo di sicurezza. Quando finalmente eseguito git clean
non è annullabile. Quando viene eseguito completamente, git clean
effettuerà una dura cancellazione del filesystem, simile all’esecuzione dell’utilità rm a riga di comando. Assicurati di voler veramente cancellare i file non tracciati prima di eseguirlo.
Opzioni comuni e utilizzo
Data la precedente spiegazione dei comportamenti e delle avvertenze di default di git clean
, il seguente contenuto dimostra vari casi d’uso di git clean
e le opzioni della linea di comando di accompagnamento richieste per il loro funzionamento.
-n
L’opzione -n
eseguirà un “dry run” di git clean
. Questo vi mostrerà quali file stanno per essere rimossi senza effettivamente rimuoverli. È una buona pratica eseguire sempre prima una prova secca di git clean
. Possiamo dimostrare questa opzione nel repo demo che abbiamo creato prima.
$ git clean -n Would remove untracked_file
L’output ci dice che untracked_file
sarà rimosso quando il comando git clean
sarà eseguito. Notate che il untracked_dir
non è riportato nell’output qui. Per default git clean
non opererà ricorsivamente sulle directory. Questo è un altro meccanismo di sicurezza per prevenire la cancellazione permanente accidentale.
-f or --force
L’opzione force inizia l’effettiva cancellazione dei file non tracciati dalla directory corrente. La forza è richiesta a meno che l’opzione di configurazione clean.requireForce
sia impostata su false. Questo non rimuoverà le cartelle o i file non tracciati specificati da .gitignore
. Eseguiamo ora un live git clean
nel nostro repo di esempio.
$ git clean -f Removing untracked_file
Il comando mostrerà i file rimossi. Qui puoi vedere che untracked_file
è stato rimosso. Eseguire git status
a questo punto o fare un ls
mostrerà che untracked_file
è stato cancellato e non si trova più da nessuna parte. Per default git clean -f
opererà su tutti i file non tracciati della directory corrente. Inoltre, un valore può essere passato con l’opzione -f
che rimuoverà un file specifico.
git clean -f -d include directories
L’opzione -d
dice a git clean
che vuoi anche rimuovere qualsiasi directory non tracciata, per default ignorerà le directory. Possiamo aggiungere l’opzione -d
ai nostri esempi precedenti:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
Qui abbiamo eseguito un ‘dry run’ usando la combinazione -dn
che produce untracked_dir
per la rimozione. Poi eseguiamo una pulizia forzata e riceviamo l’output che untracked_dir
è stato rimosso.
-x force removal of ignored files
Un modello comune di rilascio del software è quello di avere una directory di compilazione o distribuzione che non è impegnata nell’indice di tracciamento dei repository. La directory di compilazione conterrà artefatti di compilazione effimeri che sono generati dal codice sorgente impegnato. Questa directory di compilazione viene solitamente aggiunta al file .gitignore
dei repository. Può essere conveniente pulire anche questa directory con altri file non tracciati. L’opzione -x
dice a git clean
di includere anche qualsiasi file ignorato. Come con le precedenti invocazioni di git clean
, è una buona pratica eseguire prima una “prova secca”, prima della cancellazione finale. L’opzione -x
agirà su tutti i file ignorati, non solo su quelli specifici del progetto. Questo potrebbe essere cose non volute come i file di configurazione ./.idea IDE.
git clean -xf
Come l’opzione -d
-x
può essere passata e composta con altre opzioni. Questo esempio dimostra una combinazione con -f
che rimuoverà i file non tracciati dalla directory corrente così come qualsiasi file che Git solitamente ignora.
Modalità interattiva o git clean interactive
In aggiunta all’esecuzione ad-hoc da linea di comando che abbiamo dimostrato finora, git clean
ha una modalità “interattiva” che puoi avviare passando l’opzione -i
. Rivediamo il repo di esempio dall’introduzione di questo documento. In questo stato iniziale, inizieremo una sessione interattiva pulita.
$ 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>
Abbiamo iniziato la sessione interattiva con l’opzione -d
così agirà anche sul nostro untracked_dir
. La modalità interattiva mostrerà un prompt What now>
che richiede un comando da applicare ai file non tracciati. I comandi stessi sono abbastanza auto esplicativi. Daremo una breve occhiata a ciascuno di essi in ordine casuale, iniziando dal comando 6: help
. Selezionando il comando 6 verranno spiegati ulteriormente gli altri comandi:
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
E’ semplice e uscirà dalla sessione interattiva.
1: clean
Cancellerà gli elementi indicati. Se dovessimo eseguire 1: clean
a questo punto untracked_dir/ untracked_file
verrebbe rimosso.
4: ask each
itererà su ogni file non tracciato e mostrerà un prompt Y/N
per l’eliminazione. Assomiglia al seguente:
*** 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
Verrà visualizzato un ulteriore prompt che prende l’input utilizzato per filtrare la lista dei file non tracciati.
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/
Qui inseriamo il modello *_file
wildcard che poi restringe la lista dei file non tracciati a solo untracked_dir
.
3: select by numbers
Simile al comando 2, il comando 3 funziona per raffinare la lista dei nomi dei file non tracciati. La sessione interattiva chiederà i numeri che corrispondono al nome di un file non tracciato.
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
Sommario
Per ricapitolare, git clean
è un metodo di convenienza per cancellare i file non tracciati nella directory di lavoro di un repo. I file non tracciati sono quelli che sono nella directory del repo ma che non sono ancora stati aggiunti all’indice del repo con git add
. Nel complesso l’effetto di git clean
può essere ottenuto usando git status
e gli strumenti di cancellazione nativi del sistema operativo. Git clean
può essere usato insieme a git reset
per annullare completamente qualsiasi aggiunta e commit in un repository.