2012-06-20 9 views
48

Ho un sito che ha una directory /sites/default/files/ in cui il contenuto utente è in genere conservato. Capendo che non ho bisogno di tracciare questa roba, ho aggiunto/sites/default/files/al mio file .gitignore.Problema di non ignorare i file precedentemente ignorati in Git repo

Poi ho scoperto che volevo anche mantenere alcuni upload per lo più permanenti in quella directory. Ora ha più senso tenere traccia di tutto in/sites/default/files/ed escludere sottodirectory indesiderate, invece di farlo al contrario.

Il problema è che Git non smetterà di ignorare quella directory. Ho rimosso le righe da .gitignore che specificano questa directory e non la seguiranno. Ho la possibilità di usare git add /sites/default/files/ -f per forzare git a tracciare la directory, ma l'ho già fatto prima e sembra complicato.

Se .gitignore non specifica più quella directory come ignorata, perché dovrei costringere Git a iniziare a rintracciare quei file?

+1

Per caso sono in uso sottomoduli?Forse siti/o siti/default/o anche siti/default/file /? Controllare anche ciascuna di queste tre directory in modo specifico per un file .gitignore. Potresti anche provare a 'git add -f sites/default/files/*' per aggiungere i file specifici, invece di aggiungere la directory. – twalberg

+0

no, nessun sottomodulo (non era a conoscenza di loro, ma li ricorderà per un uso futuro - grazie). Doppio controllo di tutte le directory per più file .gitignore - niente. E provare a 'git add -f sites/default/files/*' non lo ha fatto: quando ho 'touch siti/default/files/test.mine' git continua a non vederlo. – doub1ejack

+1

Hmmm ... beh, sei sicuro che non ci siano altre voci in ".gitignore" che corrispondono allora - qualche carattere jolly di qualche tipo o qualcosa del genere? O qualcosa che causerebbe l'ignoranza dei singoli file - come un '* .pyc', e quella directory contenente solo file' .pyc'? Ricordate che la denominazione 'file' in' .gitignore' partite anche qualsiasi 'sottodirectory/file' o' sub/subdir/file' ... – twalberg

risposta

4

Per i posteri: la risposta al mio problema era "guarda più vicino".

@twalberg ha sottolineato, correttamente, che potrebbe esserci una regola che stavo trascurando nel file .gitignore. Il modo a cascata in cui vengono applicate le regole .gitignore semplifica l'esclusione di file in modo più ampio del previsto.

Per quanto posso dire, le ipotesi che stavo facendo su come funziona git erano corrette. Allo stesso modo, il mio caso non sembra supportare (o smentire) i commenti di @ J-16 SDiZ su quale ruolo possa giocare il assume-unchanged bit.

48

Sai già come farlo. Sì, git add -f è la via.

Se si chiede perché ... questo è perché git imposta internamente un bit assume-unchanged. Questo bit fa pensare che il file non sia stato modificato, quindi git add non lo aggiungerà.

Se si desidera modificare i dettagli dell'implementazione, è possibile utilizzare il comando git update-index --no-assume-unchanged <file>.

+0

Quindi presumibilmente, quando costringo git ad aggiungere questi file e li spingo nel nostro repository di sviluppo, anche tutti gli altri sviluppatori inizieranno a seguirli, giusto? Sto avendo un po 'di difficoltà a vedere come funziona quando i propri file .gitignore stanno ignorando i file di essere tirato dalla repo dev (fino a che non aggiornano i loro file .gitignore locali), ma sono ok solo confidando git su questo. – doub1ejack

+0

il tuo '.gitignore' dovrebbe essere nel controllo di versione. Gli altri sviluppatori dovrebbero scaricarlo quando si aggiornano. –

+0

Esatto, dovrebbero. Tuttavia, le modifiche al mio file .gitignore non risolvono il problema, quindi mi chiedo se ognuno degli altri sviluppatori debba usare questa stessa correzione '-f' sui propri repository locali. – doub1ejack

9

Non penso che J-16 sia corretto. Da http://www.kernel.org/pub/software/scm/git/docs/git-add.html:

Il comando git add non aggiungerà i file ignorati per impostazione predefinita. Se nella riga di comando sono stati specificati esplicitamente dei file ignorati, git add non funzionerà con un elenco di file ignorati. I file ignorati raggiunti dalla ricorsione delle directory o dal globbing dei nomi dei file eseguito da Git (citano i globoni prima della shell) verranno ignorati in modo silenzioso. Il comando git add può essere utilizzato per aggiungere file ignorati con l'opzione -f (forza).

git add -f sembra essere solo per l'aggiunta di un file che fa esiste in un file di ignorare qualche parte.

Forse c'è un altro file .gitignore in/sites o/sites/default che sta anche dicendo a Git di ignorare questa dir, o forse è stata impostata in .git/info/exclude?

+0

No, ho solo il file .gitignore e il file di esclusione è vuoto. – doub1ejack

+0

Mi manca qualcosa allora? Ho provato a riprodurre la tua situazione (http://pastebin.com/wZB6F8Qj) e dopo aver modificato .gitignore, il file si presenta di nuovo come non tracciato, e 'git add file' funziona. – hdgarrood

+0

Sto iniziando a chiedermi così ... dopo aver usato -f per forzare git per aggiungere una directory se io, ancora una volta, fare un 'add' git git mi dice che che la directory viene ignorata da uno dei miei file .gitignore. Ho cercato il mio repository locale per .gitignore, ne ho trovato solo uno e ho aperto il file exclude e ho verificato che non interferiva. Mi sto perdendo qualcosa? – doub1ejack

1

Abbiamo avuto un problema molto simile nella nostra directory dei siti di Drupal. Il problema è che la distribuzione Drupal ha un file .gitignore nella directory drupal di livello superiore che corrisponde a qualsiasi cosa in drupal/sites/files/*