Risincronizza il repository git con il nuovo file .gitignore


192

È possibile "aggiornare" un repository git dopo aver aggiornato il file gitignore?

Ho appena aggiunto più ignoranze (?) Al mio gitignore e vorrei rimuovere le cose già nel repository corrispondenti al nuovo file.



Potrebbe essere, quella soluzione eliminerebbe i file già sottoposti a commit corrispondenti al nuovo gitignore?
Christian Wattengård,

100
+1 per inventare la parola "ignorazione".
Aasmund Eldhuset,

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset è ufficiale
Daniel Springer

1
@ user770: oggi ho imparato!
Aasmund Eldhuset,

Risposte:


372

La soluzione menzionata nel " file .gitignore non ignorato " è un po 'estrema, ma dovrebbe funzionare:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( assicurati di eseguire prima il commit delle modifiche che desideri conservare , per evitare incidenti come jball037 commenti di seguito .
L' --cachedopzione manterrà comunque i tuoi file intatti sul tuo disco.)

Hai anche un'altra soluzione più dettagliata nel post del blog " Far ignorare a Git i file già tracciati ":

git rm --cached `git ls-files -i --exclude-standard`

Bassim suggerisce nella sua modifica :

File con spazio nei loro percorsi

Nel caso in cui fatal: path spec '...' did not match any filesvenga visualizzato un messaggio di errore simile , potrebbero esserci file con spazi nel loro percorso.

Puoi rimuovere tutti gli altri file con l'opzione --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

ma i file senza eguali rimarranno nel tuo repository e dovranno essere rimossi esplicitamente racchiudendo il loro percorso tra virgolette doppie:

git rm --cached "<path.to.remaining.file>"

Ho scoperto che il passaggio git add non è necessario, quando eseguo git status dopo git rm --cached, i file rimossi sono già nell'area di gestione temporanea e puoi semplicemente procedere e impegnarli.
cap.

3
Ho appena eseguito questo, ho perso tutte le mie modifiche non confermate e ho quasi annunciato le mie dimissioni dal mio lavoro. La risposta accettata su questo thread ha salvato la vita: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC scusa, non intendevo essere un rant o un bastone :) Ma sì, ho usato --cached e tutte le mie modifiche non confermate sono andate perse quando ho controllato i miei file. In preda al panico per un momento, ma "git reset HEAD" ha ripristinato i miei file (ma questa volta senza i file che ho specificato in .gitignore, quindi la tua soluzione funzionava ancora!)
jball037

3
@ jball037 Bene. Ho aggiunto l'avvertimento e modificato la risposta di conseguenza.
VonC,

1
se solo leggessi ancora una riga prima di fare questo "(assicurati di confermare prima le modifiche che vuoi conservare, per evitare qualsiasi incidente come jball037" #fml
Aiden Strydom,

9

Potrei fraintendere, ma stai cercando di eliminare i file appena ignorati o vuoi ignorare le nuove modifiche a questi file? In questo caso, la cosa funziona.

Se si desidera eliminare i file ignorati precedentemente sottoposti a commit, utilizzare

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

Cosa c'è tra virgolette singole qui?
IgorGanapolsky,

Questa è un'ottima risposta
Holene,

Questo è un motivo molto semplice per rimuovere i file dopo aver aggiornato il mio .gitignore Tuttavia ha bisogno di un paio di aggiornamenti minori: `` git rm –cached git ls-files -i –exclude-standard git commit -m 'clean up ``
Aaron

1

So che questa è una vecchia domanda, ma la soluzione di gracchus non funziona se i nomi dei file contengono spazi. La soluzione di VonC ai nomi di file con spazi è di non rimuoverli utilizzando --ignore-unmatch, quindi rimuoverli manualmente, ma questo non funzionerà bene se ce ne sono molti.

Ecco una soluzione che utilizza array bash per acquisire tutti i file.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
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.