Close

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
Logo Git
materiale correlato

Scheda di riferimento rapido di Git

Logo di Bitbucket
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 nell'avere una directory di compilazione o distribuzione non sottoposta a commit nell'indice di monitoraggio dei repository. La directory di compilazione contiene gli artefatti di compilazione effimeri generati dal codice sorgente sottoposto a commit. Questa directory di compilazione viene solitamente aggiunta al file .gitignore dei repository . Può tornare utile pulire anche questa directory insieme agli 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 non intenzionali 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.

Le persone collaborano utilizzando una parete piena di strumenti

Blog di Bitbucket

Illustrazione su Devops

Percorso di apprendimento DevOps

Funzione Demo Den per demo con esperti Atlassian

Come Bitbucket Cloud funziona con Atlassian Open DevOps

Iscriviti alla nostra newsletter DevOps

Thank you for signing up