Applicare .gitignore su un repository esistente già tenendo traccia di un numero elevato di file


314

Ho un progetto Visual Studio esistente nel mio repository. Di recente ho aggiunto un file .gitignore nel mio progetto e presumo che indichi a Git di ignorare i file elencati nel file.

Il mio problema è che tutti quei file sono già stati tracciati e, per quanto ne so, Git non ignorerà un file che è già stato tracciato prima che una regola fosse aggiunta a questo file per ignorarlo.

Mi è stato suggerito di usare: git rm --cachede di rintracciarli manualmente, ma mi ci vorrà un'eternità per esaminarli uno per uno.

Ho pensato di eliminare il repository e ricrearlo di nuovo, ma questa volta con il file .gitignore presente, ma ci deve essere un modo migliore per farlo.


1
è possibile git rm --cachedintere directory con l' -ropzione, se è utile
Nathan Wallace,



Risposte:


870

Questa risposta ha risolto il mio problema:

Innanzitutto, esegui il commit di tutte le modifiche in sospeso.

Quindi eseguire questo comando:

git rm -r --cached .

Questo rimuove tutto dall'indice, quindi esegui:

git add .

Commettilo:

git commit -m ".gitignore is now working"

9
Risposta perfetta! Aggiungi git push originanche un per riflettere le modifiche nel repository remoto.
Sanket Berde,

8
Ho iniziato a usare questa risposta ... e ha eliminato quasi tutto nel mio progetto! Ovviamente stavo facendo qualcosa di sbagliato. Ma voglio avvertire la gente di non seguire questo suggerimento in modo casuale.
Mark Olbert,

4
Questo finisce per perdere la cronologia dei file quando li rimuovi e li aggiungi di nuovo
Aran Mulholland,

10
Mi chiedo quanti impegni ci siano usando questo .gitignore is now workingmessaggio. :)
ihavenoidea,

1
Questo metodo ha funzionato bene per me. Ho creato un file gitignore, ignorato un'intera directory, quindi ho commesso questa modifica alla creazione di gitignore. Ho seguito questi tre comandi sopra esattamente come hanno detto. Ha funzionato perfettamente, ma dovrei dire che devi "impegnare tutte le modifiche in sospeso" prima come indicato sopra.
Erich Meissner,

61
  1. Crea un file .gitignore, quindi per farlo, devi solo creare qualsiasi file .txt vuoto.

  2. Quindi devi cambiare il suo nome scrivendo la seguente riga sul cmd (dove si git.txttrova il nome del file che hai appena creato):

    rename git.txt .gitignore

  3. Quindi è possibile aprire il file e scrivere tutti i file non tracciati che si desidera ignorare per sempre. Ad esempio, il mio è simile al seguente:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

C'è un'intera raccolta di utili file .gitignore di GitHub

  1. Una volta ottenuto questo, è necessario aggiungerlo al repository git proprio come qualsiasi altro file, solo che deve trovarsi nella radice del repository.

  2. Quindi nel tuo terminale devi scrivere la seguente riga:

    git config --global core.excludesfile ~ / .gitignore_global

Da documento ufficiale:

Puoi anche creare un file .gitignore globale, che è un elenco di regole per ignorare i file in ogni repository Git sul tuo computer. Ad esempio, è possibile creare il file in ~ / .gitignore_global e aggiungere alcune regole ad esso.

Terminale aperto. Esegui il seguente comando nel tuo terminale: git config --global core.excludesfile ~ / .gitignore_global

Se il repository esiste già, è necessario eseguire questi comandi:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Se il passaggio 2 non funziona, è necessario scrivere la route del foro dei file che si desidera aggiungere.


4
@Karen_Wiznia il "git config ... _global" crea un gitingore globale per tutti i repository Git sul computer. L'OP non ha voluto farlo.
Ivan7707,

Vorrei poterlo apprezzare più di una volta, torno continuamente a questa domanda cercando questo promemoria.
Antony D'Andrea

1
Dovrebbe essere "mv git.txt .gitignore" invece di "rinomina git.txt .gitignore".
Ahmad F,

30

Come specificato qui È possibile aggiornare l'indice:

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

In questo modo, i file non verranno visualizzati in git statuso git diff.

Per ricominciare a tracciare i file è possibile eseguire:

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

5
Questa è la risposta migliore: è focalizzata solo sul singolo file, il file che non si desidera monitorare dal repository. Anche la risposta più alta funzionerà, ma fa molto di più che ignorare un file dal tracciamento di git.
Chris Mejka,

1
Questo è buono. E se tirassimo? Ci sono conflitti di unione?
pramod,

@pramod, ottima domanda. Non sono veramente sicuro. Provalo in un repository di prova ridotto?
Patrick James McDougle,

15

Se hai aggiunto .gitignoretroppo tardi, git continuerà a tenere traccia dei file già sottoposti a commit indipendentemente. Per risolvere questo problema, puoi sempre rimuovere tutte le istanze memorizzate nella cache dei file indesiderati.

Innanzitutto, per verificare quali file stai effettivamente monitorando, puoi eseguire:

git ls-tree --name-only --full-tree -r HEAD

Supponiamo che tu abbia trovato file indesiderati in una directory come questa cache/, è più sicuro scegliere come target quella directory anziché tutti i tuoi file.

Quindi invece di:

git rm -r --cached .

È più sicuro indirizzare il file o la directory indesiderati:

git rm -r --cached cache/

Quindi procedere per aggiungere tutte le modifiche,

git add .

e commetti ...

git commit -m ".gitignore is now working"

Riferimento: https://amyetheredge.com/code/13.html


Questa è la risposta migliore e chiara se si desidera rimuovere solo pochi file, non l'intero repository. Ti do il pollice in alto.
Apuig

2

Ecco un modo per "non tracciare" eventuali file che altrimenti verrebbero ignorati sotto l'attuale serie di schemi di esclusione:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Ciò lascia i file nella directory di lavoro ma li rimuove dall'indice.

Il trucco usato qui è fornire un file indice inesistente per git ls-files in modo che pensi che non ci siano file tracciati. Il codice della shell sopra richiede tutti i file che verrebbero ignorati se l'indice fosse vuoto e quindi li rimuove dall'indice reale con git rm.

Dopo che i file sono stati "non tracciati", utilizzare lo stato git per verificare che non sia stato rimosso nulla di importante (in tal caso, modificare i modelli di esclusione e utilizzare git reset - percorso per ripristinare la voce di indice rimossa). Quindi fai un nuovo commit che tralasci il "greggio".

Il "greggio" sarà ancora in tutti i vecchi impegni. Puoi usare git filter-branch per produrre versioni pulite dei vecchi commit se hai davvero bisogno di una cronologia pulita (nb usando git filter-branch "riscriverà la cronologia", quindi non dovrebbe essere intrapreso alla leggera se hai collaboratori che hanno tirato uno qualsiasi dei tuoi impegni storici dopo che il "greggio" è stato introdotto per la prima volta).


sembra una soluzione solida :) Presumo che questo sia per la shell Linux, giusto? purtroppo sono un utente Win7. In qualche modo posso farlo in Windows?
Tohid

0

Rimuovere i file dall'area di gestione temporanea

git reset HEAD .

Aggiungi tutte le modifiche

git add .

Commettilo:

git commit -m ".gitignore is now working"

-1

Penso che questo sia un modo semplice per aggiungere un file .gitignore a un repository esistente.

Prerequisito :

È necessario un browser per accedere al proprio account github.

passi

  1. Creare un nuovo file nel progetto richiesto (esistente) e denominarlo .gitignore . Verrà richiesto un suggerimento per i modelli .gitignore non appena si denomina il file come .gitignore . Utilizzare questi modelli o utilizzare gitignore.io per generare il contenuto del file gitignore .
  2. Conferma le modifiche.
  3. Ora clona questo repository.

Divertiti!


-3

Usa git clean
Ottieni assistenza su questa corsa

git clean -h

Se vuoi vedere cosa succederebbe prima, assicurati di passare l'interruttore -n per una corsa a secco:

git clean -xn

Per rimuovere la spazzatura gitingnored

git clean -xdf

Attenzione: potresti ignorare i file di configurazione locali come database.yml che verrebbero rimossi. Utilizzare a proprio rischio.

Poi

git add .
git commit -m ".gitignore is now working"
git push
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.