Ignora i file che sono già stati impegnati in un repository Git

Ho un repository Git già inizializzato a cui ho aggiunto un file .gitignore . Come posso aggiornare l’indice del file in modo che i file che voglio ignorati vengano ignorati?

Per annullare la traccia di un singolo file che è già stato aggiunto / inizializzato al repository, ad esempio , interrompere il rilevamento del file ma non eliminarlo dal proprio sistema: git rm --cached filename

Per annullare la traccia di tutti i file che si trovano ora nel tuo .gitignore :

Per prima cosa commetti eventuali modifiche al codice in sospeso , quindi esegui questo comando:

 git rm -r --cached . 

Questo rimuove qualsiasi file modificato dall’indice (area di staging), quindi esegui semplicemente:

 git add . 

Impegnati:

 git commit -m ".gitignore is now working" 

Per annullare git rm --cached filename , usa git add filename .

Assicurati di impegnare tutte le tue importanti modifiche prima di eseguire git add . In caso contrario, si perderanno eventuali modifiche ad altri file.

Se stai cercando di ignorare le modifiche a un file già tracciato nel repository (ad esempio un file dev.properties che avresti bisogno di cambiare per l’ambiente locale ma non vorresti mai controllare queste modifiche) rispetto a quello che vuoi fare è:

 git update-index --assume-unchanged  

Se vuoi iniziare nuovamente a monitorare le modifiche

 git update-index --no-assume-unchanged  

Vedi git-update-index (1) Pagina manuale .

skip-worktree anche un’occhiata alle skip-worktree e no-skip-worktree per update-index se avete bisogno di questo per persistere dopo un git-reset ( via )


Aggiornamento: dal momento che le persone chiedono, ecco un alias conveniente (e aggiornato dal commentato qui sotto) per vedere quali file sono attualmente “ignorati” (–assume-unchanged) nello spazio di lavoro locale

 $ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]" 

Per annullare la traccia di un file che è già stato aggiunto / inizializzato al repository, ovvero interrompere il rilevamento del file ma non eliminarlo dal proprio sistema, utilizzare: git rm --cached filename

Sì, il sistema .gitignore ignora solo i file attualmente non sotto controllo di versione da git.

Ad esempio, se hai già aggiunto un file chiamato test.txt utilizzando git-add , aggiungere test.txt a .gitignore causerà comunque la traccia delle modifiche a test.txt .

Dovresti prima eseguire git rm test.txt e confermare tale modifica. Solo allora le modifiche a test.txt saranno ignorate.

Rimuovi spazi bianchi finali in .gitignore

Inoltre, assicurati di non avere spazi bianchi finali nel tuo .gitignore. Sono arrivato a questa domanda perché stavo cercando una risposta, poi ho avuto la strana sensazione di dover aprire l’editor invece di catingare .gitignore. Rimosso un singolo spazio extra dalla fine e poof funziona ora 🙂

Ho seguito questi passaggi

 git rm -r --cached . git add . git reset HEAD 

dopodiché, git cancella tutti i file (* .swp nel mio caso) che dovrebbero essere ignoranti.

Se si desidera interrompere il tracciamento del file senza eliminare il file dal sistema locale, che preferisco per ignorare il file config/database.yml . Basta provare:

 git rm --cached config/database.yml # this will delete your file from git history but not from your local system. 

ora aggiungi questo file al file .gitignore e conferma le modifiche. E d’ora in poi, qualsiasi modifica apportata a config / database.yml non verrà tracciata da git.

 $ echo config/database.yml >> .gitignore 

Grazie

Per rimuovere solo alcuni file specifici da tracciamento:

 git update-index --assume-unchanged path/to/file 

Se mai vuoi iniziare a seguirlo di nuovo:

 git update-index --no-assume-unchanged path/to/file 

Come dice dav_i, per mantenere il file in repo e tuttavia rimuoverlo dalle modifiche senza creare un commit extra puoi usare:

 git update-index --assume-unchanged filename 

Non sapendo bene cosa ha fatto il comando ‘risposta’, l’ho eseguito, con mio grande sgomento. Rimuove in modo ricorsivo ogni file dal tuo repository git.

Stackoverflow per il salvataggio … Come ripristinare un “git rm -r.”?

 git reset HEAD 

Il trucco, dal momento che avevo file locali non salvati che non volevo sovrascrivere.

Risposte complesse ovunque!

Basta usare il seguente

 git rm -r --cached . 

Rimuoverà i file che stai cercando di ignorare dall’origine e non dal master sul tuo computer!

Dopo di ciò, basta impegnarsi e spingere!

C’è un altro suggerimento forse per i ragazzi lenti come me =) Metti il ​​file .gitignore nella root del repository non nella cartella .git . Saluti!

Nessuna delle risposte ha funzionato per me.

Anziché:

  1. Sposta il file fuori dalla directory controllata da git
  2. Controlla la rimozione in git
  3. Sposta il file nella directory controllata da git

Dopo aver spostato il file, git lo ignorerà.

Funziona anche con le directory!

un altro problema che ho avuto è stato un commento in linea.

 tmp/* # ignore my tmp folder (this doesn't work) 

questo funziona

 # ignore my tmp folder tmp/ 

Se i file sono già in controllo versione è necessario rimuoverli manualmente.

Grazie alla tua risposta, sono stato in grado di scrivere questo piccolo one-liner per migliorarlo. L’ho eseguito sul mio .gitignore e repo, e non ho avuto problemi, ma se qualcuno ha visto problemi evidenti, si prega di commentare. Questo dovrebbe git rm -r --cached da git rm -r --cached :

cat $ (git rev-parse –show-toplevel) /. gitIgnore | sed “s // $ //” | grep -v “^ #” | xargs -L 1 -I {} trova $ (git rev-parse –show-toplevel) -name “{}” | xargs -L 1 git rm -r –cached

Nota che avrai un sacco di fatal: pathspec '' did not match any files . Questo è solo per i file che non sono stati modificati.

Ho trovato uno strano problema con .gitignore. Tutto era a posto e sembrava corretto. L’unico motivo per cui il mio .gitignore era “ignorato” era che la fine della linea era in formato Mac (\ r). Quindi, dopo aver salvato il file con la terminazione di riga corretta (in vi usando: set ff = unix) tutto ha funzionato come un incantesimo!

Un altro problema non menzionato qui è che se hai creato il tuo .gitignore nel blocco note di Windows può sembrare incomprensibile su altre piattaforms come ho scoperto. La chiave è assicurarsi che la codifica sia impostata su ANSI nel blocco note (o creare il file su Linux come ho fatto io).

Dalla mia risposta qui: https://stackoverflow.com/a/11451916/406592

Sul mio server linux server (non vero sul mio dev mac locale), le directory vengono ignorate a condizione che non aggiunga un asterisco:

www / archives / *

Non so perché, ma mi ha fatto perdere un paio d’ore, quindi ho voluto condividere …

Una cosa da tenere a mente anche se .gitignore non sembra ignorare i file non tracciati è che non dovresti avere commenti sulla stessa riga delle ignori. Quindi va bene

 # ignore all foo.txt, foo.markdown, foo.dat, etc. foo* 

Ma questo non funzionerà:

 foo* # ignore all foo.txt, foo.markdown, foo.dat, etc. 

.gitignore interpreta quest’ultimo caso come “ignora i file denominati "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc." , che, naturalmente, non hai.

Se è necessario interrompere il tracciamento di molti file ignorati, è ansible combinare alcuni comandi:

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

Questo fermerebbe il monitoraggio dei file ignorati. Se si desidera rimuovere effettivamente i file dal filesystem, non utilizzare l’opzione --cached . Puoi anche specificare una cartella per limitare la ricerca, come ad esempio:

git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm