Domanda Come far sì che Git "dimentichi" di un file che è stato rintracciato ma ora è in .gitignore?


C'è un file che è stato seguito da git, ma ora il file è sul .gitignore elenco.

Tuttavia, quel file continua a essere visibile in git status dopo che è stato modificato. Come si forza git dimenticarsene completamente?


3644
2017-08-13 19:23


origine


risposte:


.gitignore impedirà l'aggiunta di file non tracciati (senza un file add -f) al set di file tracciati da git, tuttavia git continuerà a tracciare tutti i file che sono già stati tracciati.

Per interrompere il tracciamento di un file è necessario rimuoverlo dall'indice. Questo può essere ottenuto con questo comando.

git rm --cached <file>

La rimozione del file dalla revisione principale avverrà al prossimo commit.


3870
2017-08-13 20:40



La serie di comandi di seguito rimuoverà tutti gli elementi dall'indice Git (non dalla directory di lavoro o dal repository locale), quindi aggiorna l'indice Git, rispettando le ignorazioni git. PS. Indice = Cache

Primo:

git rm -r --cached . 
git add .

Poi:

git commit -am "Remove ignored files"

1990
2017-09-30 13:51



git update-index fa il lavoro per me:

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

Nota: Questa soluzione è in realtà indipendente su .gitignore come gitignore è solo per i file non tracciati.

modificare: Poiché questa risposta è stata pubblicata, è stata creata una nuova opzione che dovrebbe essere preferita. Dovresti usare --skip-worktree che è per i file tracciati modificati che l'utente non vuole più commettere e conservare --assume-unchanged per prestazioni che impediscono a git di controllare lo stato di file di grandi dimensioni. Vedere https://stackoverflow.com/a/13631525/717372 per ulteriori dettagli...


738
2017-11-27 11:24



git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Questo prende l'elenco dei file ignorati e li rimuove dall'indice, quindi impegna le modifiche.


217
2018-05-23 22:29



Io uso sempre questo comando per rimuovere quei file non tracciati. Output pulito su una sola riga, in stile Unix:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Elenca tutti i file ignorati, sostituisce invece ogni linea di output con una linea quotata per gestire i percorsi con spazi all'interno e passa tutto a git rm -r --cached rimuovere i percorsi / file / dir dall'indice.


59
2018-06-19 15:42



Se non puoi git rm un file tracciato perché altre persone potrebbero averne bisogno (avviso, anche se tu  git rm --cached, quando qualcun altro riceve questo cambiamento, i loro file saranno cancellati nel loro filesystem) per favore guarda https://gist.github.com/1423106 per i modi in cui le persone hanno lavorato attorno al problema.


49
2017-07-19 00:08



spostalo, commetti, quindi spostalo nuovamente. Questo ha funzionato per me in passato. C'è probabilmente un modo 'gittier' per realizzare questo.


43
2017-08-13 19:27



Cosa non ha funzionato per me

(Sotto Linux), volevo usare i post qui suggerendo il ls-files --ignored --exclude-standard | xargs git rm -r --cached approccio. Tuttavia, (alcuni dei) i file da rimuovere avevano una nuova riga incorporata / LF /\n nel loro nome. Nessuna delle soluzioni:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

far fronte a questa situazione (ottenere errori sui file non trovati).

Quindi offro

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached

Questo usa il -z argomento a LS-files, e il -0 argomento a xargs per soddisfare in modo sicuro / corretto i caratteri "cattivi" nei nomi dei file.

Nella pagina di manuale git-LS-files (1), afferma:

Quando non viene utilizzata l'opzione -z, i caratteri TAB, LF e backslash in   i percorsi sono rappresentati come \ t, \ n e \\, rispettivamente.

quindi penso che la mia soluzione sia necessaria se i nomi dei file contengono alcuni di questi caratteri.

EDIT: mi è stato chiesto di aggiungere che --- come qualsiasi git rm comando --- questo deve essere seguito da a commettere per rendere permanenti le rimozioni, ad es. git commit -am "Remove ignored files".


37
2017-12-29 12:50



Ho realizzato questo usando git filter-branch. Il comando esatto che ho usato è stato preso dalla pagina man:

AVVERTIMENTO: questo cancellerà il file dalla tua intera cronologia

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

Questo comando ricrea l'intera cronologia del commit, eseguendo git rm prima di ogni commit e quindi sbarazzarsi del file specificato. Non dimenticare di eseguirne il backup prima di eseguire il comando volere essere perso.


34
2017-08-13 19:35



Usalo quando:

1. Si desidera annullare la traccia di molti file o

2. Hai aggiornato il tuo file gitignore

Link alla fonte:  http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Diciamo che hai già aggiunto / inserito alcuni file nel tuo repository git e li aggiungi al tuo .gitignore; questi file saranno ancora presenti nel tuo indice di repository. Questo articolo vedremo come sbarazzarsi di loro.

Passaggio 1: conferma tutte le modifiche

Prima di procedere, assicurati che tutte le modifiche siano state eseguite, incluso il file .gitignore.

Passaggio 2: rimuovi tutto dal repository

Per cancellare il tuo deposito, usa:

git rm -r --cached .
  • rm è il comando remove
  • -r consentirà la rimozione ricorsiva
  • -cached rimuoverà solo i file dall'indice. I tuoi file saranno ancora lì.

Il rm il comando può essere implacabile. Se desideri provare ciò che fa in anticipo, aggiungi il -n o --dry-run bandiera per testare le cose.

Passaggio 3: aggiungi di nuovo tutto

git add .

Passaggio 4: commit

git commit -m ".gitignore fix"

Il tuo repository è pulito :)

Spingere le modifiche sul telecomando per vedere anche le modifiche effettive.


21
2018-04-22 18:11



  1. Aggiorna il tuo .gitignore file - ad esempio, aggiungi una cartella a cui non vuoi tracciare .gitignore.

  2. git rm -r --cached . - Rimuovi tutti i file tracciati, inclusi quelli desiderati e indesiderati. Il tuo codice sarà al sicuro finché avrai salvato localmente.

  3. git add . - Tutti i file verranno aggiunti nuovamente, ad eccezione di quelli in .gitignore.


Punta di cappello su @AkiraYamamoto per averci indicato nella giusta direzione.


18
2018-04-04 04:09