2010-07-15 23 views
45

Ho iniziato a utilizzare git con un progetto xcode e ho scoperto di recente che posso utilizzare i file .gitignore e .gitattributes per ignorare il rumore proveniente dal compilatore e dal sistema. Ora che ho i file .gitignore e .gitattributes sul posto, come posso "applicare" le nuove regole di ignoranza e liberarmi del controllo della versione?Applicare git .gitignore a un repository esistente

Il mio file .gitignore è:

# xcode noise 
*.modelv3 
*.pbxuser 
*.perspective 
*.perspectivev3 
*.pyc 
*~.nib/ 
build/* 

# Textmate - if you build your xcode projects with it 
*.tm_build_errors 

# old skool 
.svn 

# osx noise 
.DS_Store 
profile 

E il mio file .gitattributes è:

*.pbxproj -crlf -diff -merge 

Grazie!

+2

+1 Il collegamento al commento di Chris qui ha funzionato meglio di qualsiasi altra cosa in questa pagina. – Jorin

+0

** No no no, ** [questo è il modo giusto] (http://stackoverflow.com/a/7532131/288906). La maggior parte delle risposte suggerite re-commit TUTTI i file. –

risposta

37

uso git rm --cached per i file e per la git rm -r --cachedbuild/ directory

+23

Mentre è * accurato *, sono arrivato da Google e ho trovato una risposta * non utile * perché è come eseguire un file alla volta. Molto più utile ed efficiente sarebbe una risposta come quella di Chris Johnsen che ti dice come uccidere tutti i file che dovrebbero essere ignorati in un solo passaggio. –

+4

Questa è una risposta migliore: http://stackoverflow.com/a/1139797/743957 –

+0

Questo non deve essere un file alla volta. Esegui 'git rm -r --cached *' per eliminare tutto. – cbartondock

-1

Non è necessario "applicare" le modifiche. semplicemente inserisci il file .gitignore nella tua directory home (se vuoi che sia globale) o nella root del progetto (se vuoi che sia univoco solo per quel progetto).

Modifica: Mi viene in mente che si potrebbe avere questo problema perché hai aggiunto i file che non vuoi tracciare già. Ecco cosa ha da dire la pagina man di gitignore:

Si noti che tutti i file di gitignore riguardano solo file che non sono già tracciati da git; per ignorare le modifiche non salvate nei file già tracciati, fai riferimento a git update-index --assume-unchanged documentation.

+0

Le persone che non amano questa risposta ... si prega di offrire feedback sul motivo per cui non ti piace. Non è utile solo ridimensionarlo senza una ragione. –

10

Se sei già il monitoraggio dei file che si desidera ignorare, è necessario rimuoverli con

git rm --cached <file> 

Git non ignorare i file che sono già monitorati (ovvero sono stati aggiunti con git add).

+0

Questo comando imposta sempre il file come eliminato per me .... –

+0

@MladenDanic Va bene, git sta dicendo che vede il file come cancellato. Il file non verrà effettivamente cancellato a causa dell'operatore '--cached', ma git lo visualizza effettivamente come rimosso ora. –

+0

Ma se non sbaglio lo cancellerà dal repository remoto, giusto? –

1

mv the_file_i_want_to_ignore the_file_i_want_to_ignore.back

git rm the_file_i_want_to_ignore

mv the_file_i_want_to_ignore.back the_file_i_want_to_ignore

git status

git commit -m 'ignore a bunch of stuff i should have ignored before'

questo un po 'di un flusso di lavoro manuale, ma la sua come ho fatto in passato.

+6

Si vuole davvero usare 'git rm --cached'. –

1

Se si desidera rimuovere completamente i file, quindi ecco una handy reference from Github.

Sappiate che:

  1. Questo sarà riscrivere la storia, quindi è probabilmente vale la pena solo facendo prima di pubblicare il pronti contro termine.
  2. Ricorda che i vecchi sha saranno ancora nel database degli oggetti, ma la guida a cui mi sono collegato ti mostrerà come gestirli.
62

Ecco 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 dal indice.

Il trucco utilizzato qui è quello di fornire un file di indice inesistente a git ls-files in modo che pensi che non ci siano file rilevati. Il codice shell qui sopra richiede tutti i file che verrebbero ignorati se l'indice fosse vuoto e quindi li rimuovesse dall'indice effettivo con git rm.

Dopo che i file sono stati “non tracciata”, utilizzare git status per verificare che nulla di importante è stato rimosso (se in modo regolare i vostri modelli di escludere e utilizzare git reset -- path per ripristinare la voce di indice rimosso). 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 qualche collaboratore che ha tirato qualsiasi dei tuoi storici commit dopo il "crud" è stato primo introdotto).

+1

Questa soluzione ha avuto più senso per me: http://stackoverflow.com/questions/1139762/ gitignore-file-not-ignoring – wbarksdale

+0

Com'è eseguito questo comando? Incollarlo in un terminale dà l'errore '-bash: git: comando non trovato', eppure posso eseguire comandi git in quella directory. – memmons

+0

@Answerbot: cosa dice 'type git'? Sembra che sia un alias (o funzione di shell?). Il fatto che 'git' non sia solo un normale comando esterno causa il fallimento della shell quando combinato con l'assegnazione della variabile di ambiente temporanea (es.' FOO = bar git ... 'non espande il tuo alias' git', e il tuo PATH non ha 'git'). O si fallirebbe anche con * xargs * dato che * xargs * sta eseguendo i comandi da sé, non usando la shell per farlo. Devi o "espandere" il tuo * git * usa per abbinare il tuo alias/funzione, o utilizzare uno script di wrapper esterno che raggruppa gli stessi effetti. –

Problemi correlati