2013-10-29 14 views
158

Ho un progetto di Visual Studio esistente nel mio repository. Recentemente ho aggiunto un file .gitignore sotto il mio progetto e presumo che Git ignori i file elencati nel file.Applicare gitignore su un repository esistente già rilevando un numero elevato di file

Il mio problema è che tutti questi file sono già stati rintracciati e per quanto ne so Git non ignorerà un file che era già tracciato prima di aggiungere una regola a questo file per ignorarlo.

È stato suggerito l'uso di: git rm --cached e disinserirle manualmente, ma mi ci vorrà un'eternità per esaminarle una per una.

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

+1

puoi 'git rm --cacciare 'intere directory con l'opzione' -r', se questo è utile –

+0

Vedi anche: [Untrack Files From Git] (http://stackoverflow.com/questions/6964297/untrack- files-from-git) –

+1

possibile duplicato di [Ignora file che sono già stati impegnati in un repository Git] (http://stackoverflow.com/questions/1139762/ignore-files-that-have-already-been-committed- to-a-git-repository) –

risposta

482

Questo answer Ha risolto il problema:

impegnare tutte le modifiche in sospeso, quindi eseguire il seguente comando:

git rm -r --cached . 

Questo rimuove tutto dall'indice, poi basta eseguire:

git add . 

Commit it:

git commit -m ".gitignore is now working" 
+0

Se ho fatto questo e ora ottengo un errore apache di: "Attenzione: la direttiva SuexecUserGroup richiede wrapper SUEXEC." Cosa dovrei fare? : -s –

+7

Grazie, questo funziona come un fascino. – Andro

+8

Risposta perfetta! Si prega di aggiungere un 'git push origin' anche per riflettere le modifiche nel repository remoto. –

1

Qui è un modo per “untrack” tutti i file che sono altrimenti sarebbero ignorati sotto l'attuale serie di escludere i modelli:

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

questo lascia i file nella directory di lavoro, ma li rimuove dall'indice.

Il trucco utilizzato qui è quello di fornire un file indice inesistente per git ls-files in modo che pensi che non ci siano file tracciati. Il codice shell qui sopra richiede tutti i file che verrebbero ignorati se l'indice fosse vuoto e quindi li rimuovesse 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, regolare i propri modelli di esclusione e utilizzare git reset - percorso per ripristinare la voce di indice rimossa). Quindi fai un nuovo commit che lascia fuori il "crud".

Il "crud" sarà ancora in qualsiasi vecchio commit. 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 "riscrive la cronologia", quindi non dovrebbe essere intrapreso alla leggera se hai dei collaboratori che hanno tirato uno qualsiasi dei tuoi impegni storici dopo che il "crud" è stato introdotto per la prima volta).

+0

suona come una soluzione solida :) Presumo che questo sia per la shell di Linux, giusto? sfortunatamente sono un utente di Win7. In ogni modo posso farlo in Windows? – Tohid

23

come specificato here È possibile aggiornare l'indice:

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

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

Per iniziare nuovamente il monitoraggio dei file è possibile eseguire:

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

Questa è la risposta migliore: si concentra solo sul singolo file, il file che non si desidera tenere traccia dal repository. Anche la risposta con il punteggio più alto funzionerà, ma fa molto di più che ignorare un file dal monitoraggio di git. –

+1

Questo è buono. Ma cosa succede se tiriamo? Ci sono conflitti di fusione? – pramod

+0

@pramod, ottima domanda. Non sono veramente sicuro. Provalo in un repository di test ridotto? –

-3

Usa git clean
Get aiuto su questo correre

git clean -h 

Se volete vedere che cosa sarebbe accaduto prima, assicurarsi di passare l'interruttore -n per una corsa a vuoto:

git clean -xn 

Per rimuovere spazzatura gitingnored

git clean -xdf 

Attenzione: Si può essere ignorando i file di configurazione locali come database.yml che sarebbe anche essere rimosso. Utilizzare a proprio rischio.

Poi

git add . 
git commit -m ".gitignore is now working" 
git push 
41
  1. Creare un file .gitignore, in modo per farlo, basta creare un file txt vuoto.

  2. poi si deve cambiare il suo nome a scrivere la seguente linea sul cmd (dove git.txt è il nome del file che avete appena creato):

    rename git.txt .gitignore

  3. Quindi è possibile aprire il file e scrivi tutti i file non tracciati che vuoi ignorare per sempre. Ad esempio, il mio aspetto:

`` `

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 whole collection of useful .gitignore files by GitHub

  1. Una volta fatto questo, è necessario aggiungilo al tuo repository git come qualsiasi altro file, solo che deve essere nella root del repository.

  2. Poi, nel tuo terminale si deve scrivere la seguente riga:

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

Da doc oficial:

Puoi anche creare un file .gitignore globale, che è un elenco di regole per ignorare i file in ogni repository Git sul tuo computer. Per 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 respository esiste già allora dovete eseguire questi comandi:

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

Se il lavoro Indifferente punto 2 allora si dovrebbe scrivere il percorso del foro dei file che si desidera Inserisci.

+3

@Karen_Wiznia "git config ... _global" crea un gitingore globale per tutti i repository Git sul computer. L'OP non voleva farlo. – ivan7707

+0

Vorrei poterlo più di una volta, continuo a tornare a questa domanda alla ricerca di questo promemoria. –

+0

Dovrebbe essere "mv git.txt .gitignore" invece di "rinominare git.txt .gitignore". –

Problemi correlati