2009-08-25 21 views
209

Ho un repository git che viene utilizzato solo per contenere file grafici e audio utilizzati in diversi progetti. Sono tutti in una directory senza sottodirectory. Ora ho appena creato uno script per copiare queste risorse da un'altra directory strutturata, con diversi livelli di sottodirectory.Ignorando i contenuti di una cartella già archiviata?

Ora voglio solo che la struttura gerarchica del file (sorgente) sia tracciata da git, e la directory piatta (di destinazione) (con tutti i file in una pila) dovrebbe essere ignorata.

Ho aggiunto la directory di destinazione a .gitignore, ma git sta ancora monitorando le modifiche al suo interno. Ho pensato che se commetto la cancellazione del vecchio file nella directory di destinazione, git potrebbe smettere di tracciare il nuovo contenuto (copiato dallo script), ma non lo fa.

Come faccio a dimenticare la directory di destinazione?

+0

Qual è il nome della directory e quello che hai messo in .gitignore – Mark

+1

Il nome è DirNameIrrelevant e in .gitignore ho cercato di mettere "DirNameIrrelevant", "DirNameIrrelevant /" e "DirNameIrrelevant/*" – Felixyz

risposta

491

Questo comando farà sì che git per untrack vostra directory e tutti i file in essa contenuti senza peraltro riuscire a eliminazione:

git rm -r --cached <your directory>

L'opzione -r provoca la rimozione di tutti i file sotto la tua directory

L'opzione --cached fa sì che i file vengano rimossi solo dall'indice di git, non dalla copia di lavoro. Per impostazione predefinita, git rm <file> eliminerebbe <file>.

+0

Ah, grazie. Molto utile, anche se non vedo perché questo dovrebbe essere necessario (perché non è sufficiente aggiungere la directory in .gitignore?). Potresti dirmi a cosa serve la --cached? – Felixyz

+0

sicuro. Ho modificato la mia risposta per descrivere le due opzioni. –

+0

Per quanto riguarda il motivo per cui è necessario, posso solo speculare. Immagino che i creatori volessero che la tracciabilità dei file fosse esplicita al fine di ridurre i rischi di erroneamente non tracciare parti importanti del tuo progetto. Immagino ci siano anche ragioni tecniche. –

4

Per una sottodirectory denominata blah/ aggiunta a git, entrambe le seguenti operazioni sembrano ignorare i nuovi file in blah/. Aggiunto a .gitignore:

blah 
blah/* 
+0

Yep provato entrambi questi, ma grazie. – Felixyz

-1

Ok, sembra che tu debba prima fare un check-in con la directory completamente vuota (né vecchi né nuovi file), e qualsiasi file aggiunto successivamente verrà ignorato. Se si rimuovono i vecchi file e ne si aggiungono di nuovi prima di eseguire il commit, i nuovi vengono aggiunti al repository anche se devono essere ignorati.

Almeno, questo ha funzionato per me in questa situazione. Sarebbe comunque bello se qualcuno potesse fornire ulteriori informazioni su cosa sta succedendo.

+1

Versione breve di ciò che abbiamo detto altrove: il gitignore influisce su ciò che i dati git non documentati saranno a conoscenza. Non influisce su ciò che verrà fatto con i dati che gli hai detto (ad esempio diretto per aggiungerlo al repository). – Cascabel

+0

Quindi ha senso che i file che sono stati tracciati e che vengono ora cancellati siano tracciati come tali, ma non ha ancora senso che i file * aggiunti * (se fatti prima del prossimo commit) siano tracciati, mentre se I 1) ignora, 2) cancella file, 3) commuta, 4) aggiunge nuovo file, i nuovi file non sono tracciati. – Felixyz

61

Se è necessario disporre di un file tracciato (archiviato), ma non si desidera tenere traccia di ulteriori modifiche di un file mantenendolo nel repository locale e nel repository remoto, è possibile farlo con:

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

Successivamente, eventuali modifiche a questo file non verranno più visualizzate in git status.

+0

whooo, grazie! – Utopik

+1

Mentre OP potrebbe aver chiesto una directory, questo è esattamente quello che stavo cercando - ignorando ulteriori modifiche a un singolo file archiviato; Grazie! – sdaau

+0

per ignorare una directory utilizzare completamente 'git update-index --assume-unchanged dirName/*'. Mi ci è voluto un po 'per trovare la sintassi,' * 'è necessario qui –

Problemi correlati