Ignorando i contenuti di una directory già archiviata?


227

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.

Ora voglio solo che la struttura dei file gerarchici (sorgente) sia tracciata da git, e la directory flat (destinazione) (con tutti i file in un mucchio) dovrebbe essere ignorata.

Ho aggiunto la directory di destinazione a .gitignore, ma git sta ancora monitorando le modifiche in essa. 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 far dimenticare a Git la directory di destinazione?


Qual è il nome della directory e cosa hai inserito in .gitignore
mmmmmm il

1
Il nome è DirNameIrrelevant e in .gitignore ho provato a mettere "DirNameIrrelevant", "DirNameIrrelevant /" e "DirNameIrrelevant / *"
Felixyz

Risposte:


524

Questo comando farà in modo che git non tenga traccia della directory e di tutti i file al suo interno senza eliminarli:

git rm -r --cached <your directory>

Il -r opzione provoca la rimozione di tutti i file nella tua directory.

L' --cachedopzione fa sì che i file vengano rimossi solo dall'indice di git, non dalla tua copia di lavoro. Di default git rm <file>eliminerebbe <file>.


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 --cached?
Felixyz,

sicuro. Ho modificato la mia risposta per descrivere le due opzioni.
Gordon Wilson,

Per quanto riguarda il motivo per cui questo è necessario, posso solo speculare. Immagino che i creatori volessero che il non-tracking dei file fosse esplicito al fine di ridurre i rischi di erroneamente non-tracking di parti importanti del tuo progetto. Immagino ci siano anche ragioni tecniche.
Gordon Wilson,

15
Gitignore è usato per determinare quali file non tracciati saranno a conoscenza di git; non influisce sui file già tracciati. Se l'utente vuole tracciare file altrimenti ignorati, git glielo permette. Questo potrebbe essere fatto usando add -fo essere la tua situazione. Come ha detto Gordon, questo ti impedisce di cancellare accidentalmente un mucchio di file: il repository è l'elenco principale, non il gitignore. Questo ti consente anche di tracciare manualmente alcune cose che altrimenti verrebbero ignorate da una regola jolly, cosa che ho trovato utile.
Cascabel,

l' -ropzione non è quella di "causare la rimozione di tutti i file nella directory", ma piuttosto di ricorrere attraverso i sottodir.
MrE

78

Se è necessario disporre di un file monitorato (archiviato), ma non si desidera tenere traccia di ulteriori modifiche di un file mantenendolo nel proprio 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.


1
Mentre OP potrebbe aver richiesto una directory, questo è esattamente quello che stavo cercando: ignorare ulteriori modifiche a un singolo file archiviato; Grazie!
sdaau,

1
per ignorare completamente una directory usa 'git update-index --assume-invariato dirName / *'. Mi ci è voluto un po 'per trovare la sintassi,' * 'è necessario qui
J-Dizzle,

1
Come si potrebbe invertire questo?
Rhys,

3
@Rhys per invertire:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

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

blah 
blah/*

1

TL; DR per ripulire il repository git e assicurarsi che TUTTI i tuoi elementi ignorati vengano effettivamente ignorati:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Nota: non è necessario specificare una directory, in questo modo si sta pulendo l' intero repository remoto .

Per andare oltre leggi questo


0

Non sono sicuro se questo conta o mi rende una persona cattiva, ma qui va.

  1. Ho aggiunto *Generated*al file .gitignore di root
  2. Ho inviato i file che voglio conservare come GeneratedFile.Whatever.ext. Controllato
  3. Ho fatto un hook git al checkout post per chiamare uno script PowerShell facendo questo:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Mi sento un po 'male con me stesso ... ma in effetti funziona.


-2

Ok, sembra che tu debba prima fare un check-in con la directory completamente vuota (né vecchi né nuovi file), e tutti i file aggiunti successivamente verranno ignorati. Se si rimuovono i vecchi file aggiunti e quelli nuovi prima di eseguire il commit, i nuovi vengono aggiunti al repository sebbene debbano essere ignorati.

Almeno, questo ha funzionato per me in questa situazione. Sarebbe comunque bello se qualcuno potesse fornire maggiori informazioni su ciò che sta accadendo.


1
Versione breve di ciò che abbiamo detto altrove: gitignore influisce su quali dati git non tracciati saranno a conoscenza. Non influisce su ciò che verrà fatto con i dati di cui hai parlato (ad es. Indirizzarlo per aggiungerlo al repository).
Cascabel,

Quindi ha senso che i file che sono stati tracciati e che ora sono stati eliminati debbano essere tracciati come tali, ma non ha ancora senso per me che i file aggiunti (se eseguiti prima del prossimo commit) vengano tracciati, mentre se io 1) ignora, 2) elimina file, 3) commit, 4) aggiungi nuovo file, i nuovi file non vengono tracciati.
Felixyz,
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.