Git clean
In questa sezione descriveremo nei dettagli il comando git clean
. git clean
è in un certo senso un comando di "annullamento". git clean
può essere considerato complementare ad altri comandi come git reset e git checkout. Mentre questi comandi operano su file precedentemente aggiunti all'indice di monitoraggio Git, il comando git clean
opera su file non monitorati. Questi sono file che sono stati creati nella directory di lavoro del repository, ma che non sono ancora stati aggiunti all'indice di monitoraggio del repository tramite il comando git add.
Per comprendere meglio la differenza tra file monitorati e non monitorati, osserva il seguente esempio della riga 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 <file>..." to unstage)
new file: tracked_file
Untracked files: (use "git add <file>..." to include in what will be committed) untracked_dir/ untracked_file
materiale correlato
Scheda di riferimento rapido di Git
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
Nell'esempio viene creato un nuovo repository Git nella directory git_clean_test
. Quindi, vengono creati un tracked_file
, aggiunto all'indice Git, un untracked_file
e una untracked_dir
. Viene quindi richiamato git status
che restituisce un output in cui è indicato lo stato interno di Git delle modifiche monitorate e non monitorate. Con il repository in questo stato, possiamo eseguire il comando git clean
per dimostrarne lo scopo previsto.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
A questo punto, l'esecuzione del comando git clean
predefinito potrebbe generare un errore irreversibile. L'esempio sopra mostra questo possibile scenario. Per impostazione predefinita, Git è configurato a livello globale per richiedere la selezione dell'opzione "force" per l'avvio di git clean
. Questo è un meccanismo di sicurezza importante. Quando git clean
viene infine eseguito, non sarà più possibile annullarlo. Una volta eseguito completamente, git clean
effettuerà un'eliminazione definitiva del file system, simile a quando si esegue l'utilità rm della riga di comando. Prima di eseguire il comando, assicurati di voler davvero eliminare i file non monitorati.
Opzioni e utilizzo comuni
Vista la spiegazione precedente dei comportamenti e degli avvertimenti predefiniti relativi a git clean, di seguito sono illustrati vari casi d'uso di git clean e le relative opzioni della riga di comando necessarie per il loro funzionamento.
-n
L'opzione -n esegue un "dry run" di git clean per mostrare quali file verranno rimossi, ma senza rimuoverli effettivamente. Come best practice, esegui sempre per prima cosa un dry run di git clean. Possiamo dimostrare questa opzione nel repository dimostrativo creato in precedenza.
$ git clean -n
Would remove untracked_file
L'output ci informa che untracked_file
verrà rimosso quando verrà eseguito il comando git clean
. Osserva che untracked_dir
non è riportata nell'output qui. Per impostazione predefinita, git clean
non opera in modo ricorsivo sulle directory. Questo è un altro meccanismo di sicurezza per impedire le eliminazioni definitive accidentali.
-f or --force
L'opzione force avvia l'eliminazione effettiva dei file non monitorati dalla directory corrente. Tale opzione è richiesta, a meno che l'opzione di configurazione clean.requireForce
non sia impostata su false. In questo modo non verranno rimosse le cartelle o i file non monitorati specificati da .gitignore
. Eseguiamo ora il comando git clean
live nel repository di esempio.
$ git clean -f
Removing untracked_file
Il comando restituirà come output i file rimossi. Puoi vedere qui che untracked_file
è stato rimosso. Se esegui git status a questo punto o se effettui un ls vedrai che untracked_file è stato eliminato e che non è possibile trovarlo da nessuna parte. Per impostazione predefinita, git clean -f opererà su tutti i file non monitorati della directory corrente. Inoltre, è possibile trasmettere un valore < path > con l'opzione -f per rimuovere un file specifico.
git clean -f <path>
-d include directories
L'opzione -d comunica a git clean che vuoi rimuovere anche tutte le directory non monitorate (per impostazione predefinita questo comando ignora le directory). Possiamo aggiungere l'opzione -d agli 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 restituisce come output le untracked_dir pronte per la rimozione. Quindi eseguiamo una pulizia forzata e riceviamo tramite l'output la conferma della rimozione di untracked_dir.
-x force removal of ignored files
Uno schema comune del rilascio di software consiste nel disporre di una directory della build o della distribuzione, non sottoposta a commit, nell'indice di monitoraggio dei repository. La directory della build contiene gli artefatti effimeri della build generati dal codice sorgente sottoposto a commit. Questa directory della build viene solitamente aggiunta al file .gitignore dei repository . Può essere utile eliminare da questa directory gli altri file non monitorati. L'opzione -x comunica a Git clean di includere anche tutti i file ignorati. Come per le precedenti attivazioni di Git clean, è consigliabile eseguire un "dry run" prima dell'eliminazione definitiva. L'opzione -x agirà su tutti i file ignorati, non solo su quelli specifici della build del progetto. Potrebbe trattarsi di elementi involontari, come i file di configurazione ./.idea IDE.
git clean -xf
Come l'opzione -d, l'opzione -x può essere trasmessa e composta con altre opzioni. In questo esempio viene mostrata una combinazione con -f per rimuovere i file non monitorati dalla directory corrente e tutti i file che di solito sono ignorati da Git.
Modalità interattiva o git clean interactive
Oltre all'esecuzione ad hoc della riga di comando dimostrata finora, git clean
ha una modalità "interattiva" che è possibile avviare trasmettendo l'opzione -i
. Riprendiamo il repository di esempio dall'introduzione di questo documento. Partendo da quello stato iniziale, avviamo una sessione di pulizia interattiva.
$ 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 avviato la sessione interattiva con l'opzione -d
, quindi questa agirà anche su untracked_dir
. La modalità interattiva mostra un prompt What now>
che richiede quale comando applicare ai file non monitorati. Le funzioni dei comandi stessi sono piuttosto chiare. Daremo una breve occhiata a ciascuno di questi comandi in ordine casuale a partire dal comando 6: help
. Selezionando il comando 6 verranno spiegati quindi 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
È intuitivo e consente di uscire dalla sessione interattiva.
1: clean
Elimina gli elementi indicati. Se dovessimo eseguire 1: clean
a questo punto, untracked_dir/ untracked_file
verrebbero rimossi
4: ask each
Crea iterazioni su ogni file non monitorato e mostra un prompt Y/N
per l'eliminazione. Ha un aspetto simile 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/ [y/N]? N
Remove untracked_file [y/N]? N
2: filter by pattern
Visualizza un prompt aggiuntivo che prende l'input utilizzato per filtrare la lista dei file non monitorati.
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 carattere jolly *_file
che limita la lista dei file non monitorati soltanto a untracked_dir
.
3: select by numbers
Simile al comando 2, il comando 3 consente di perfezionare la lista dei nomi dei file non monitorati. La sessione interattiva richiede i numeri che corrispondono a un nome di file non monitorato.
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
Riepilogo
Ricapitolando, git clean
è un metodo pratico per eliminare i file non monitorati nella directory di lavoro di un repository. Questi file sono quelli che si trovano nella directory del repository, ma che non sono ancora stati aggiunti all'indice del repository con git add. Nel complesso, l'effetto di git clean
può essere ottenuto utilizzando git status e gli strumenti di eliminazione nativi del sistema operativo. git clean
può essere usato insieme a git reset per annullare completamente qualsiasi aggiunta e commit in un repository.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.