Applicazione di .gitignore ai file impegnati


436

Ho impegnato un sacco di file che ora voglio ignorare. Come posso dire a Git di ignorare ora questi file da commit futuri?

EDIT: Voglio rimuoverli anche dal repository. Sono file creati dopo la creazione o per il supporto di strumenti specifici dell'utente.


1
possibile duplicato del file
.gitignore

8
@Wooble La risposta può essere simile, ma questa domanda descrive esattamente il problema che ho dovuto affrontare e che dovevo risolvere.
rjmunro,

1
Questa è la risposta che si rivolge direttamente alla domanda del titolo con modifiche minime al tuo repo git: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Risposte:


472

12
Ci sono molti file però. Non voglio farlo per ognuno di essi
user880954

1
I file sono in directory comuni? In caso contrario, il problema si riduce a una domanda sull'utilizzo della shell, non a una domanda git.
Matt Ball,

12
È necessario che sia presente la modalità "Ho dimenticato di aggiungere il mio .gitignore fino a dopo il mio commit iniziale".
Luke Puplett,

9
La risposta è sotto questa.
Sbilenco il

3
Mi ha chiesto di aggiungere flag -r per poterlo fare.
Vishal Gulati,

601

Dopo aver modificato .gitignoreper abbinare i file ignorati, puoi fare git ls-files -ci --exclude-standardper vedere i file inclusi negli elenchi di esclusione; allora puoi farlo

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

per rimuoverli dal repository (senza eliminarli dal disco).

Modifica : puoi anche aggiungere questo come alias nel tuo file .gitconfig in modo da poterlo eseguire in qualsiasi momento. Aggiungi la seguente riga nella sezione [alias] (modifica secondo necessità per Windows o Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(Il -rflag in xargsimpedisce l' git rmesecuzione su un risultato vuoto e la stampa del suo messaggio di utilizzo, ma può essere supportato solo da GNU findutils. Altre versioni di xargspotrebbero avere o meno un'opzione simile.)

Ora puoi semplicemente digitare il git apply-gitignoretuo repository e farà il lavoro per te!


10
Penso che xargs per mac non abbia -r ... o il mio sia buggy / vecchio, non lo so ... e perché il !git prima? bene ... il mio ha funzionato come alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino,

18
Su Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett il

Questo ha appena rimosso i miei file .gitignore, non i file che volevo ignorare che erano elencati nei file .gitignore - era questo il punto?
Hippyjim,

@Hippyjim se i file sono già stati sottoposti a commit (anche se sono stati elencati in .gitignore) e .gitignore non è ancora stato eseguito il commit, questo sarebbe il risultato atteso, altrimenti non sono sicuro di cosa stia succedendo nel tuo caso.
Jonathan Callen,

1
Per gli utenti Mac, -rè predefinito e non è accettato dalle versioni BSD. Quindi rimuovi -r.
Weishi Zeng,

136

per lasciare il file nel repository ma ignorare le modifiche future ad esso:

git update-index --assume-unchanged <file>

e per annullare questo:

git update-index --no-assume-unchanged <file>

per scoprire quali file sono stati impostati in questo modo:

git ls-files -v|grep '^h'

credito per la risposta originale a http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/


1
Chronial ha una grande risposta per fare questo in modo ricorsivo per una directory: stackoverflow.com/a/16346756/1101076
jordan314

Volevo eseguire una configurazione IDE ma non tenere traccia delle modifiche non necessarie. Funziona, anche se non sono sicuro che funzionerà per gli altri che controllano il repository. Può essere combinato con git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedse ciò aiuta.
dlamblin,

7
Questa è l' unica risposta che fa esattamente ciò che chiede la domanda del titolo. PERFETTO! La maggior parte di queste altre risposte stava rovinando inutilmente file.
kayleeFrye_onDeck,

1
Questa è la risposta esatta alla domanda. L'uso di comandi come git rm --cachedrimuoverà il file nel repository, il che non soddisfa la necessità di quiz. Grazie. Lo apprezzo molto. La tua risposta mi aiuta molto.
Ramwin,

88

Assicurati che il tuo repository effettivo sia la versione più recente

  1. Modifica .gitignorecome desideri
  2. git rm -r --cached .
  3. git add .

quindi impegnarsi come al solito


14
Questa dovrebbe essere la risposta accettata in quanto la domanda specificava che c'erano molti file da rimuovere.
Nbeuchat,

3
Si noti che il passaggio 2 può richiedere del tempo se si dispone di un repository di grandi dimensioni.
brainbag

Questo ha portato alla rimozione di tutti i file dall'indice! Questo mi ha salvato: git reset HEAD(Ricorda di nascondere eventuali modifiche)
aksh1618

2
Il passaggio 2 rimuove tutto, sì, ma il passaggio 3 dovrebbe leggerli tutti, tranne quelli che falliscono a causa di .gitignore.
ojchase il

11

Vecchia domanda, ma alcuni di noi sono in git-posh(PowerShell). Questa è la soluzione per questo:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

0

Segui questi passi:

  1. Aggiungi percorso al gitignorefile

  2. Esegui questo comando

    git rm -r --cached foldername
    
  3. commettere modifiche come al solito.

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.