Come rimuovere i file elencati in .gitignore ma ancora nel repository?


327

Ho alcuni file nel mio repository che dovrebbero essere ignorati, li ho aggiunti a .gitignore ma, ovviamente, non vengono rimossi dal mio repository.

Quindi la mia domanda è: esiste un comando o uno script magico che utilizza il filtro-ramo che può riscrivere la mia storia e rimuovere facilmente tutti questi file? O semplicemente un comando che creerà un commit che li rimuoverà?


3
Duplicazione del file



ATTENZIONE: Anche se questo non rimuoverà il file fisico dal tuo locale, rimuoverà i file dalle altre macchine degli sviluppatori al prossimo git pull. Come far "dimenticare" a Git un file che è stato rintracciato ma che si trova ora in .gitignore?
Kris Roofe,

@Stevoisiak questo non è un duplicato di quella domanda perché questa fa una domanda su TUTTI i file ignorati e ha anche una risposta migliore di una qualsiasi delle domande simili.
Omn,

Risposte:


438

Puoi rimuoverli manualmente dal repository:

git rm --cached file1 file2 dir/file3

Oppure, se hai molti file:

git rm --cached `git ls-files -i --exclude-from=.gitignore`

Ma questo non sembra funzionare in Git Bash su Windows. Produce un messaggio di errore. Di seguito funziona meglio:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

Per quanto riguarda la riscrittura dell'intera storia senza questi file, dubito fortemente che ci sia un modo automatico per farlo.
E sappiamo tutti che riscrivere la storia è male, no? :)


2
Sfortunatamente il comando Git Bash su Windows non funziona con percorsi che contengono spazi
Nate Bundy,

19
@Cupcake grazie. git ls-files -i -z --exclude-from=.gitignore | xargs -0 git rm --cachedsembra fare il trucco
Nate Bundy,

3
Mi sono bloccato con lo stesso problema su Windows. Sto usando PowerShell e, nel mio caso, ho ricevuto il terzo comando da @ samy-dindane e l'ho cambiato in una foreach. È diventato questogit ls-files -i --exclude-from=.gitignore | %{git rm --cached $_}
digaomatias il

1
"git ls-files -i --exclude-from = .gitignore" è molto utile, mi dice quali file sono esclusi da .ignore.
Owen Cao,

1
Sono stato felice di trovare questi comandi, MA in realtà non rimuove i file dal repository. Quando ho rimosso 2300 kB di immagini, le dimensioni del repository sono diminuite di soli 10 kB. Quindi non può essere utilizzato, ad esempio, per rendere il repository più piccolo e più veloce da trasferire.
Jan Potužník,

343

Un modo più semplice che funziona su qualsiasi sistema operativo è quello di fare

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

Fondamentalmente hai letto tutti i file, tranne quelli nel .gitignore


1
In che modo questo influisce sugli altri utenti del repository eseguendo un pull - mentre lo leggo, la cartella che non vogliamo più tracciare viene eliminata ??? Come possiamo evitarlo
snh_nl

Questo segnerà tutti i file come modificati con un falso messaggio di commit!
Haidar Zeineddine,

3
cosa intendi con messaggio di commit falso? È un vero messaggio di commit: P Puoi ovviamente cambiare il messaggio, a seconda delle tue esigenze ...
gtatr

1
Solo per completezza hai bisogno del comando git push alla fine.
Mariusz Bialobrzeski,

1
Non farlo, rimuoverà la cronologia di tutti i file
agrath il

145

Dato che i file in .gitignore non vengono monitorati, è possibile utilizzare il comando git clean per rimuovere in modo ricorsivo i file che non sono sotto controllo della versione.

Utilizzare git clean -xdnper eseguire una corsa a secco e vedere cosa verrà rimosso.
Quindi utilizzare git clean -xdfper eseguirlo.

Fondamentalmente, git clean -ho man git-clean(in unix) ti darà aiuto.

Tenere presente che questo comando rimuoverà anche i nuovi file che non si trovano nell'area di gestione temporanea.

Spero che sia d'aiuto.


6
Questa dovrebbe essere la risposta accettata. In realtà funziona (la risposta accettata non ha funzionato per me, su macOS), ed è molto più pulita.
Roger Oba,

25
Questa risposta non è applicabile - l'OP afferma che i file in .gitignore vengono monitorati.
Ken Williams,

20
ATTENZIONE! Questo elimina definitivamente tutti i file non tracciati, piuttosto che rimuoverli dal ramo
Emmanuel

1
il git clean -xdnè un funzionamento a secco, che non verranno eliminati. il prossimo lo farà.
JohnZaj,

17
-1: Questa è una risposta molto fuorviante: il poster originale voleva rimuovere dal repository, non rimuovere completamente i file. Ero così vicino all'eliminazione di un carico di file dinamici richiesti dal mio IDE ma non richiesti per essere nel repository.
Auspice,

4

Ho fatto una soluzione molto semplice manipolando l'output dell'istruzione .gitignore con sed:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

Spiegazione:

  1. stampa il file .gitignore
  2. rimuove tutti i commenti dalla stampa
  3. elimina tutte le righe vuote
  4. aggiungi 'git rm -r' all'inizio della riga
  5. eseguire ogni riga.

10
sedè semplice?
IgorGanapolsky,

0

In Linux puoi usare questo comando:

per esempio voglio eliminare "* .py ~", quindi il mio comando dovrebbe essere ==>

find . -name "*.py~" -exec rm -f {} \;


-3

Git ignorerà i file .gitignore corrispondenti al file dopo averlo aggiunto a .gitignore.

Ma i file già esistenti nel repository saranno ancora presenti.

utilizzare git rm files_ignored; git commit -m 'rm no use files'per eliminare i file ignorati.


4
Ce ne sono molti, c'è un modo per eliminarli senza dover specificare i loro nomi?
Intrepidd,
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.