2012-11-24 6 views
167

Ho alcuni file nel mio repository che dovrebbero essere ignorati, li ho aggiunti a .gitignore ma, naturalmente, non vengono rimossi dal mio repository.Come rimuovere i file elencati in .gitignore ma ancora nel repository?

Quindi la mia domanda è, c'è un comando magico o uno script che utilizza un ramo di filtro che può riscrivere la mia cronologia e rimuovere facilmente tutti questi file? O semplicemente un comando che creerà un commit che li rimuoverà?

+3

duplicati di [.gitignore il file non ignorando] (http://stackoverflow.com/questions/1139762/gitignore-file-not-ignoring) –

+0

Simile a http://stackoverflow.com/questions/1274057/ make-git-forget-about-a-file-che-was-tracked-but-is-now-in-gitignore – testing

+0

Possibile duplicato di [Come fare in modo che Git "dimentichi" di un file che è stato rintracciato ma ora è in. gitignore?] (https://stackoverflow.com/questions/1274057/how-to-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore) –

risposta

260

È possibile rimuoverli dal repository manualmente:

git rm --cached file1 file2 dir/file3 

Oppure, se avete un sacco di 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. Le seguenti opere migliori:

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

quanto riguarda riscrivere tutta la storia senza questi file, dubito fortemente c'è un automatica modo per farlo.
E sappiamo tutti che riscrivere la storia è brutto, no? :)

+1

Sfortunatamente il comando Git Bash su Windows non funziona con percorsi che contengono spazi –

+0

@NateBundy se ci si riferisce al fatto che 'xargs' non funziona con gli spazi, la maggior parte delle utilità della riga di comando si aggira usando le bandiere speciali in modo che lo spazio non abbia importanza. In cima alla mia testa non ricordo quali sono i flag per 'git ls-files' e' xargs' (penso che potrebbe essere '-0' per' xargs'), ma puoi cercarli. –

+10

@Cupcake ringrazia. 'git ls-files -i -z --exclude-from = .gitignore | xargs -0 git rm --cached' sembra fare il trucco –

-1

Il git ignorerà i file corrispondenti al modello .gitignore dopo averlo aggiunto a .gitignore.

Ma i file esisteva già nel repository saranno ancora in.

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

+1

Là ce ne sono molti, c'è un modo per eliminarli senza dover specificare i loro nomi? – Intrepidd

197

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" 

che, fondamentalmente, readd tutti i file, tranne quelli del .gitignore

+0

In che modo questo effetto gli altri utenti sul repository eseguono un * pull * - come ho letto la cartella che non vogliamo è possibile eliminare più volte. Come possiamo evitare questo, vogliamo solo srotolare –

68

Come i file in .gitignore sono non essendo tracciabile, è possibile utilizzare il comando git clean per rimuovere in modo ricorsivo i file che non sono sotto controllo di versione.

Utilizzare git clean -xdn per eseguire una corsa a secco e vedere cosa verrà rimosso.
Quindi utilizzare git clean -xdf per eseguirlo.

Fondamentalmente, git clean -h o man git-clean (in unix) vi daranno una mano.

Si noti che questo comando rimuove anche i file nuovi che non si trovano nell'area di sosta.

Spero che aiuti.

+1

Questa dovrebbe essere la risposta accettata. Funziona davvero (la risposta accettata non ha funzionato per me, su macOS) ed è molto più pulita. –

+9

Questa risposta non è applicabile - l'OP dice che i file in '.gitignore' * sono * in fase di tracciamento –

+0

ATTENZIONE: questo elimina permanentemente tutti i file non tracciati, piuttosto che rimuovere dal ramo – Emmanuel

3

ho fatto una soluzione molto semplice manipolando l'uscita della dichiarazione .gitignore con sed:

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

Spiegazione:

  1. stampa il.il file gitignore
  2. rimuovere tutti i commenti dalla stampa
  3. cancellare tutte le linee vuote
  4. Aggiungi 'git rm -r' per l'inizio della linea
  5. eseguire ogni riga.