Come rimuovere i file locali (non tracciati) dall'albero di lavoro Git corrente


6843

Come si eliminano i file locali non tracciati dall'albero di lavoro corrente?


86
Questo cheat sheet interattivo git ndpsoftware.com/git-cheatsheet.html mostra l'area di lavoro git (google offre risultati migliori con "area di lavoro" rispetto a "copia di lavoro").
qneill

28
Nota: se si desidera rimuovere solo alcuni file non tracciati, ma non tutti , git cleanè ora disponibile una modalità interattiva ! Vedi la mia risposta a quest'altra domanda : git 1.8.4+
VonC

17
Nota che non stai rimuovendo i file da git branch, poiché branch è un riferimento a un commit e quindi non contiene file non tracciati. Questi sono presenti solo nella directory di lavoro e non hanno nulla a che fare con i rami. Questo è probabilmente solo un chiarimento terminologico.
Pavel Šimerda,

6
Per chiarire la comprensione dei non iniziati e di quelli che non conoscono Git: esegui lo stato git e se mostra un file come non tracciato e non vuoi quel file nel repository, puoi semplicemente andare sul tuo filesystem ed eliminarlo o spostarlo . Questo non farà nulla di male al tuo repository locale o a Git. Puoi anche utilizzare git cleano alcune variazioni nelle risposte di seguito, inclusa la versione interattiva per eliminare solo file selettivi, ma la modalità interattiva può essere noiosa. Qualunque cosa tu faccia, assicurati di capire cosa git cleanverrà eliminato o utilizzato --dry-runper dirti senza eliminare nulla.
LightCC

4
Se i file non vengono ancora monitorati, non puoi semplicemente rimuoverli senza Git? rm files-to-be-deleted
mhatch

Risposte:


8734

git-clean - Rimuove i file non tracciati dall'albero di lavoro

Sinossi

git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>…​

Descrizione

Pulisce l'albero di lavoro rimuovendo in modo ricorsivo i file che non sono sotto il controllo della versione, a partire dalla directory corrente .

Normalmente, vengono rimossi solo i file sconosciuti a Git, ma se -xsi specifica l' opzione, vengono rimossi anche i file ignorati. Questo può, ad esempio, essere utile per rimuovere tutti i prodotti di compilazione.

Se <path>...vengono forniti argomenti facoltativi , vengono interessati solo quei percorsi.


Il passaggio 1 è mostrare ciò che verrà eliminato utilizzando l' -nopzione:

# Print out the list of files which will be removed (dry run)
git clean -n

Clean Step - attenzione: questo eliminerà i file :

# Delete the files from the repository
git clean -f
  • Per rimuovere le directory, eseguire git clean -f -dogit clean -fd
  • Per rimuovere i file ignorati, eseguire git clean -f -Xogit clean -fX
  • Per rimuovere i file ignorati e non ignorati, eseguire git clean -f -xogit clean -fx

Notare la differenza tra maiuscole e minuscole Xper i due ultimi comandi.

Se clean.requireForceè impostato su "true" (impostazione predefinita) nella configurazione, è necessario specificare -faltrimenti non accadrà effettivamente nulla.

Ancora una volta consulta la git-cleandocumentazione per ulteriori informazioni.


Opzioni

-f, --force

Se la variabile di configurazione di Git clean.requireForce non è impostata su false, git clean rifiuterà l'esecuzione a meno che non sia specificato -f, -noppure -i.

-x

Non utilizzare le regole di ignore standard lette da .gitignore (per directory) e $GIT_DIR/info/exclude, tuttavia, utilizzare comunque le regole di ignore fornite con le -eopzioni. Ciò consente di rimuovere tutti i file non tracciati, inclusi i prodotti di compilazione. Questo può essere usato (possibilmente in combinazione con git reset) per creare una directory di lavoro incontaminata per testare una build pulita.

-X

Rimuovi solo i file ignorati da Git. Questo può essere utile per ricostruire tutto da zero, ma mantenere i file creati manualmente.

-n, --dry-run

In realtà non rimuovere nulla, mostra solo cosa si farebbe.

-d

Rimuovere le directory non tracciate oltre ai file non tracciati. Se una directory non tracciata è gestita da un diverso repository Git, non viene rimossa per impostazione predefinita. Utilizzare l' -fopzione due volte se si desidera veramente rimuovere tale directory.


288
git clean -ffunziona solo nella directory in cui è chiamato (e sottodirectory). Se vuoi pulire l'intera copia di lavoro, dovresti chiamarla nella sua directory principale.
Eduardo Bezerra,

17
Rimuove anche tutti i file all'interno di .gitignore. Devo eliminare solo i file / le cartelle che sono nuovi e non in
.gitignore

24
@Kostanos Se non si desidera rimuovere i file che si trovano in .gitignore, non fornire il flag -x.
Lo-Tan,

52
git clean -f :/funziona come se fosse stato eseguito nella directory principale repo. Vedi anche le risposte successive anche tenendo conto dei sottomoduli congit clean -ffxd :/
qui il

18
@Michelle git clean -xfd RIMUOVERÀ TUTTI I FILE ATTUALMENTE IGNORATI NEL TUO .gitignore e non sono recuperabili
thedanotto

987

Utilizzare git clean -f -dper assicurarsi che anche le directory vengano rimosse.

  1. In realtà non rimuovere nulla, mostra solo cosa si farebbe.

    git clean -n
    

    o

    git clean --dry-run
    
  2. Rimuovere le directory non tracciate oltre ai file non tracciati. Se una directory non tracciata è gestita da un diverso repository Git, non viene rimossa per impostazione predefinita. Utilizzare l' -fopzione due volte se si desidera veramente rimuovere tale directory.

    git clean -fd
    

Puoi quindi verificare se i tuoi file sono davvero andati git status.


115
Come affermato in precedenza, è utile eseguirlo a secco congit clean -n -d
Ms01

15
La stessa cosa è fare git clean -nde git clean -fd.
Micer,

478

Sono sorpreso che nessuno ne abbia mai parlato prima:

git clean -i

Questo significa interattivo e otterrai una rapida panoramica di ciò che verrà eliminato offrendo la possibilità di includere / escludere i file interessati. Nel complesso, è ancora più veloce dell'esecuzione dell'obbligatorio --dry-runprima della vera pulizia.

Se -dvuoi occuparti anche delle cartelle vuote dovrai lanciare un a. Alla fine, crea un simpatico alias:

git iclean

Detto questo, il possesso extra di comandi interattivi può essere stancante per gli utenti esperti. In questi giorni uso solo il già citatogit clean -fd


16
@ pal4life È stato aggiunto in 1.8.4, potresti avere una versione precedente di git? github.com/git/git/blob/master/Documentation/RelNotes/1.8.4.txt
Mattias Backman

Mi piace questo - mi sento più a mio agio nella mia storia bash rispetto a qualsiasi altra opzione, perché non è un grosso problema se accidentalmente ctrl-r o ctrl-p.
csvoss,

Potrebbe essere che git clean -ifunziona solo se chiamato dalla radice della copia di lavoro?
Alessandro Jacopson


250

Se la directory non tracciata è un repository git a sé stante (ad es. Sottomodulo), è necessario utilizzare -fdue volte:

git clean -d -f -f


4
A proposito, questo è scritto nella documentazione : Git rifiuterà di eliminare le directory con la sottodirectory o il file .git a meno che non venga fornito un secondo -f. Ma grazie comunque!
Maxim Suslov,

248

Modo semplice per rimuovere file non tracciati

Per rimuovere tutti i file non tracciati, il modo più semplice è aggiungerli tutti prima e reimpostare il repository come di seguito

git add --all
git reset --hard HEAD


8
Puoi sostituirlo git add --allcon git add .. Quindi puoi farlo in un modo più breve in linea git add . && git reset --hard HEAD ( stai molto attento con questo comando) .
Rousseau

22
Perché usarlo oltre git clean?
user2864740

8
Perché git cleanapparentemente elimina anche tutto ciò che viene ignorato. Ha appena cancellato la mia node_modulescartella. In questo modo prima di tutto mettere in scena tutti i file tranne quelli ignorati, quindi eliminarli eseguendo un ripristino. I file ignorati non verranno toccati.
Andreas,

5
@Andreas per me non cancella i file ignorati (git 2.14.1). Dovresti correregit clean -n comunque prima di fare la vera cancellazione (o usare git clean -i).
Qw3ry,

8
git cleanelimina i file ignorati solo se si utilizza l' opzione -xo -X, altrimenti elimina solo i file non monitorati.
doubleDown,

140

Mi piace git stash push -uperché puoi annullarli tutti con git stash pop.

EDIT: Inoltre ho trovato un modo per mostrare file non tracciati in uno stash (ad esempio git show stash@{0}^3) https://stackoverflow.com/a/12681856/338986

EDIT2: git stash saveè deprecato a favore di push. Grazie @ script-wolf.


3
Puoi spiegare il -u sulla scorta? Non seguo come funziona diversamente da git stash save. Ho provato questo e ha funzionato. Ho cercato documenti git e non sono riuscito a trovarli nemmeno lì.
Winnemucca,

9
-uè equivalente a --include-untracked. Puoi trovare aiuto con git help stash.
Hiroshi,

3
@hiroshi Grazie! dopo aver provato ogni maledetta soluzione di una dozzina di persone diverse questa è quella che alla fine ha funzionato ... wow! Anche una git gash ha fatto nada. Il salvataggio - ti sei occupato di non tracciato. resettare hard / clean force / etc nessuno di questi ha fatto nulla per me.
uccidi il

3
L' saveopzione è stata deprecata in favore di push, che fa lo stesso ma di più. Puoi leggere di più qui, /programming/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952
Script Wolf

120

Questo è quello che uso sempre:

git clean -fdx

Per un progetto molto grande potresti volerlo eseguire un paio di volte.


@Martin Uno dei progetti a cui sto lavorando è +8 anni con +80 sviluppatori che programmano attivamente. A volte Git non riesce a pulirlo al primo passaggio.
Oscar Fraxedas,

1
Posso confermarlo, quindi è ancora valido nel 2020. Stiamo anche lavorando a un grande progetto e ho dovuto eseguirlo 4-5 volte fino a quando GIT non ha trovato altri file da eliminare.
turbolocust

90

git-clean è quello che stai cercando. Viene utilizzato per rimuovere i file non tracciati dall'albero di lavoro.


86

Se necessario per rimuovere file non tracciati da una sottodirectory specifica,

git clean -f {dir_path}

E un modo combinato per eliminare i file / dir non tracciati e i file ignorati.

git clean -fxd {dir_path}

dopo questo avrai modificato i file solo in git status.


68

Rimuovi tutte le cartelle e i file extra in questo repository + sottomoduli

Questo ti porta nello stesso stato del nuovo clone.

git clean -ffdx

Rimuovere tutte le cartelle e i file extra in questo repository ma non i suoi sottomoduli

git clean -fdx

Rimuovi cartelle extra ma non file (es. Cartella build o log)

git clean -fd

Rimuovi cartelle extra + file ignorati (ma non file aggiunti di recente)

Se il file non è stato ignorato e non ancora archiviato, rimane. Nota la X maiuscola.

git clean -fdX

Nuova modalità interattiva

git clean

57

git clean -fd rimuove la directory

git clean -fX rimuove i file ignorati

git clean -fx rimuove i file ignorati e non ignorati

possono essere utilizzate tutte le opzioni sopra in combinazione come

git clean -fdXx

controlla il manuale di git per ulteriori informazioni


10
Il comando git clean -fdXxproduce il messaggio di errore "fatale: -x e -X non possono essere usati insieme" (usando git-2.8). Per la tua ultima frase nella tua risposta, ti preghiamo di fornire un link al manuale di git. Saluti
olibre

eseguire i due comandi in sequenza: git clean -fdX, git clean -fdx
Clock ZHONG

55

OK, l' eliminazione di file e cartelle non tracciati indesiderati è facile da usare gitnella riga di comando, basta farlo in questo modo:

git clean -fd

Ricontrolla prima di farlo in quanto eliminerà i file e le cartelle senza fare alcuna cronologia ...

Anche in questo caso, -fsta per forza e -dsta per directory ...

Quindi, se si desidera eliminare solo i file, è possibile utilizzare -fsolo:

git clean -f

Se si desidera eliminare (directory) e file, è possibile eliminare solo directory e file non monitorati come questo:

git clean -fd

Inoltre, puoi usare -xflag per includere i file che sono ignorati da git. Ciò sarebbe utile se si desidera eliminare tutto.

E aggiungendo -iflag, fa in modo che git ti chieda il permesso di cancellare i file uno per uno in viaggio.

Se non sei sicuro e vuoi prima controllare le cose, aggiungi -nflag.

Utilizzare -qse non si desidera visualizzare alcun report dopo la corretta eliminazione.

Creo anche l'immagine qui sotto per renderla più memorabile, in particolare ho visto molte persone confuse -fa volte per pulire la cartella o mescolarla in qualche modo!


eliminazione di file e cartelle non tracciati indesiderati


Cosa c'è con quell'immagine?
Pacerier

37

Un modo migliore è usare: git clean

git clean -d -x -f

Ciò rimuove i file non tracciati, comprese le directory (-d)e i file ignorati da git (-x).

Inoltre, sostituisci l' -fargomento con -nper eseguire una modalità interattiva dry-runo -iper e ti dirà cosa verrà rimosso.


25

Approccio interattivo dell'utente:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/arsdumpgenerator/s3/ [y/N]? y

-i per interattivo
-f per forzare
-d per directory
-x per file ignorati (aggiungere se necessario)

Nota: aggiungere -n o --dry-run per controllare semplicemente cosa farà.


20

Un colpo di fortuna per tale situazione che ho appena inventato e provato (che funziona perfettamente):

git add .
git reset --hard HEAD

Attenzione! Assicurati di eseguire il commit di tutte le modifiche necessarie (anche nei file non tracciati) prima di eseguire questa operazione .


3
Almeno questo è un approccio diverso. :) Un altro modo, che ricorderebbe i file cancellati nel reflog ma non in nessun ramo, sarebbe:git add . git commit -m 'about to delete' git reset --hard HEAD~
joeytwiddle

2
il modo ancora più rapido ègit add . && git reset --hard HEAD
thybzi,

3
git add . && git reset --hard
Pleymor,

Questo potrebbe non essere quello che desideri se ci sono anche delle modifiche che desideri impegnare.
lacostenycoder,

@AlexanderMills git reset --hardreimposta tutte le modifiche non impegnate MA FILE NON TRACCIATI allo stato dell'ultimo commit. Questo è il motivo per cui abbiamo prima bisogno git add .- che mette in scena tutti i file non monitorati (quindi anche loro vengono ripristinati)
thybzi

19

git clean -f -d -x $(git rev-parse --show-cdup)si applica pulito alla directory principale, indipendentemente da dove la si chiama all'interno di una struttura di directory del repository. Lo uso sempre perché non ti costringe a lasciare la cartella in cui lavori ora e consente di ripulire e impegnare direttamente dal luogo in cui ti trovi.

Assicurarsi che le bandiere -f, -d, -xcorrispondano alle proprie esigenze:

-d
       Remove untracked directories in addition to untracked files. If an
       untracked directory is managed by a different Git repository, it is
       not removed by default. Use -f option twice if you really want to
       remove such a directory.

-f, --force
       If the Git configuration variable clean.requireForce is not set to
       false, git clean will refuse to delete files or directories unless
       given -f, -n or -i. Git will refuse to delete directories with .git
       sub directory or file unless a second -f is given. This affects
       also git submodules where the storage area of the removed submodule
       under .git/modules/ is not removed until -f is given twice.

-x
       Don't use the standard ignore rules read from .gitignore (per
       directory) and $GIT_DIR/info/exclude, but do still use the ignore
       rules given with -e options. This allows removing all untracked
       files, including build products. This can be used (possibly in
       conjunction with git reset) to create a pristine working directory
       to test a clean build.

Ci sono anche altre bandiere disponibili, basta controllare git clean --help.


A proposito, puoi semplicemente eseguire git clean {flags}: / così sarà come se avessi eseguito il comando nella radice del repository
The-null-Pointer-

19

Per me solo il seguito ha funzionato:

git clean -ffdx

In tutti gli altri casi, ho ricevuto il messaggio "Directory di salto" per alcune sottodirectory.


2
Grazie. Ho lasciato fuori -xe usato solo git clean -ffdper evitare di cancellare i file in .gitignore.
Feckmore,

15

Se vuoi solo eliminare i file elencati come non tracciati da 'git status'

git stash save -u
git stash drop "stash@{0}"

Preferisco questo a 'git clean' perché 'git clean' eliminerà i file ignorati da git, quindi la tua prossima build dovrà ricostruire tutto e potresti perdere anche le tue impostazioni IDE.


3
Ciò rimuoverà anche le modifiche valide ai file tracciati. Non lo consiglierei.
code_dredd

2
Sì, prima vorrai eseguire il commit delle modifiche ai file tracciati.
jazzdev,

14

Per sapere cosa verrà eliminato prima dell'eliminazione effettiva:

git clean -d -n

Produrrà qualcosa del tipo:

Rimuovere campione.txt

Per eliminare tutto ciò che è elencato nell'output del comando precedente:

git clean -d -f

Produrrà qualcosa del tipo:

Rimozione di sample.txt


11

Per rimuovere i file non tracciati, è necessario innanzitutto utilizzare il comando per visualizzare i file che saranno interessati dalla pulizia

git clean -fdn

Questo ti mostrerà l'elenco dei file che verranno eliminati. Ora per eliminare effettivamente quei file usa questo comando:

git clean -fd

11

Fai attenzione mentre esegui il comando `git clean`.

Utilizzare sempre -n prima di eseguire il comando effettivo in quanto mostrerà quali file verrebbero rimossi.

git clean -n -d 
git clean -f -d

Per impostazione predefinita, git cleanrimuoverà solo i file non tracciati che non vengono ignorati. Qualsiasi file che corrisponda a un modello in .gitignore o altri file ignorati non verrà rimosso. Se si desidera rimuovere anche quei file, è possibile aggiungere -xa al comando clean.

git clean -f -d -x

C'è anche una modalità interattiva disponibile -icon il comando clean

git clean -x -i

In alternativa

Se non sei sicuro al 100% che l'eliminazione del tuo lavoro non confermato sia sicura, puoi invece utilizzare lo stash

git stash --all

Pulirà anche la tua directory ma ti darà la flessibilità di recuperare i file in qualsiasi momento usando stash con apply o pop . Quindi in un secondo momento potresti cancellare la tua scorta usando:

git stash drop // or clean

2
la scorta è una buona idea, comunque potresti voler usaregit stash save and type some comment as to what this stash was for
lacostenycoder


9

Il comando uggested per la rimozione di file non tracciati da git docs è git clean

git clean - Rimuove i file non tracciati dall'albero di lavoro

Metodo suggerito: modalità interattiva utilizzando in git clean -i modo che possiamo avere il controllo su di esso. vediamo le restanti opzioni disponibili.

Opzioni disponibili:

git clean 
    -d -f -i -n -q -e -x -X (can use either)

Spiegazione:

1. -d

Rimuovere le directory non tracciate oltre ai file non tracciati. Se una directory non tracciata è gestita da un diverso repository Git, non viene rimossa per impostazione predefinita. Utilizzare l'opzione -f due volte se si desidera veramente rimuovere tale directory.

2. -f, --force

Se la variabile di configurazione di Git clean.requireForce non è impostata su false, git clean rifiuterà l'esecuzione a meno che non sia dato -f, -n o -i.

3. -i, --interattivo

Mostra cosa verrebbe fatto e pulisci i file in modo interattivo. Vedere "Modalità interattiva" per i dettagli.

4. -n, --dry-run

In realtà non rimuovere nulla, mostra solo cosa si farebbe.

5. -q, --quiet

Stai tranquillo, segnala solo gli errori, ma non i file che sono stati rimossi correttamente.

6. -e, --exclude =

Oltre a quelli trovati in .gitignore (per directory) e $ GIT_DIR / info / exclude, considera anche questi schemi come nel set delle regole di ignore in vigore.

7. -x

Non utilizzare le regole ignore standard lette da .gitignore (per directory) e $ GIT_DIR / info / exclude, ma utilizzare comunque le regole ignore fornite con le opzioni -e. Ciò consente di rimuovere tutti i file non tracciati, inclusi i prodotti di compilazione. Questo può essere usato (possibilmente in combinazione con git reset) per creare una directory di lavoro incontaminata per testare una build pulita.

8. -X

Rimuovi solo i file ignorati da Git. Questo può essere utile per ricostruire tutto da zero, ma mantenere i file creati manualmente.


Penso che tu abbia un refuso uggestedma è solo un " uggestionlol
lacostenycoder

8

Il git cleancomando normale non rimuove i file non tracciati con my git version 2.9.0.windows.1.

$ git clean -fdx     # doesn't remove untracked files
$ git clean -fdx *   # Append star then it works!

7

Possiamo rimuovere facilmente i file locali non tracciati dall'albero di lavoro di git corrente usando i commenti git seguenti.

git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

Esempio:

git reset --hard HEAD

Collegamenti:

  1. https://git-scm.com/docs/git-reset
  2. Come posso usare 'git reset --hard HEAD' per ripristinare un commit precedente?
  3. Ripristina il ramo del repository locale in modo che sia esattamente come HEAD del repository remoto
  4. https://jwiegley.github.io/git-from-the-bottom-up/3-Reset/4-doing-a-hard-reset.html

Questo rimuoverà anche le modifiche organizzate per il commit, non solo i file non tracciati, che potrebbero non essere ciò che desideri.
raspy

Non funziona: lascia alcuni file. git clean -ffdxè la soluzione
Eugene Gr. Filippov,

7

Pulisci ricorsivamente il repository git e tutti i sottomoduli

Il seguente comando pulirà ricorsivamente l'attuale repository git e tutti i suoi sottomoduli:

(git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)

sicuramente questo dovrebbe essere usato con grande cautela
lacostenycoder

6
git clean -f

rimuoverà i file non tracciati dall'attuale git

git clean -fd

quando si desidera rimuovere directory e file, verranno eliminati solo file e directory non tracciati


5

oh-my-zsh con zsh fornisce quei grandi alias tramite il plugin git. Possono essere usati anche in bash.

gclean='git clean -fd'
gpristine='git reset --hard && git clean -dfx'

  • gclean rimuove le directory non tracciate oltre ai file non tracciati .
  • gpristinereimpostare le modifiche locali, rimuovere le directory non tracciate, i file non tracciati e non utilizzare le regole ignore standard lette da .gitignore (per directory) e $ GIT_DIR / info / exclude, ma utilizzare comunque le regole ignore fornite con le opzioni -e. Ciò consente di rimuovere tutti i file non tracciati, inclusi i prodotti di compilazione. Questo può essere usato (possibilmente in combinazione con git reset) per creare una directory di lavoro incontaminata per testare una build pulita .

2
Grazie per il tuo feedback, la mia affermazione è stata confusa. Volevo dire che gli alias evidenziati arrivano automaticamente con oh-my-zsh. Ovviamente funzionano alla grande bash. Ho modificato la mia risposta per riflettere ciò.
ZenLulz,

4

Mi piace usare il git stashcomando, in seguito puoi ottenere file e modifiche nascosti. git cleanè anche una buona opzione ma dipende totalmente dalle tue esigenze. ecco la spiegazione di git stash e git clean, 7.3 Git Tools - Stashing and Cleaning

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.