Perché Git non ignora il mio file specificato?


195

Ho aggiunto la seguente riga a .gitignore:

sites/default/settings.php

ma quando git statusscrivo mostra il file come file non in scena.

Qual è il problema? Tutti gli altri schemi funzionano bene.



Ho avuto lo stesso problema, poi ho scoperto di aver salvato il mio file .gitignore su un'unità diversa: face-palm:
Henry Chan

È una pessima idea tenere le cose nel tuo repository e ignorare le modifiche su di esso.
Yevgeniy Afanasyev,

Risposte:


370

Assicurati che il tuo .gitignoresia nella radice della directory di lavoro, e in quella directory esegui git statuse copia il percorso nel file dall'output di stato e incollalo nel file .gitignore.

Se non funziona, è probabile che il tuo file sia già tracciato da Git. È possibile confermare ciò tramite l'output di git status. Se il file non è elencato nella sezione "File non tracciati " , allora è già tracciato da Git e ignorerà la regola dal .gitignorefile.

Il motivo per ignorare i file in Git è che non verranno aggiunti al repository. Se in precedenza hai aggiunto un file che desideri ignorare, verrà tracciato da Git e le regole di ignoramento corrispondenti verranno ignorate. Git lo fa poiché il file fa già parte del repository.

Per ignorare effettivamente il file, è necessario non tracciarlo e rimuoverlo dal repository. Puoi farlo usando git rm --cached sites/default/settings.php. Questo rimuove il file dal repository senza eliminare fisicamente il file (ecco cosa --cachedfa). Dopo aver eseguito il commit di tale modifica, il file verrà rimosso dal repository e, ignorandolo, dovrebbe funzionare correttamente.


Cosa intendi con "root della directory di lavoro"? La directory in cui si trova il repository '.git'?
Jonathan Leffler,

La directory di lavoro è la directory in cui .gitsi trova la directory e che è essa stessa la radice del repository. Come quando cloni un repository, /xy/allora /xy/è la tua directory di lavoro con /xy/.git/dentro.
colpire il

3
A volte dovrai anche fare un git add .secondo git rm --cachedper ricostruire correttamente l'indice.
Cooper

L'idea di verificarlo nello stato git è stata geniale. Ho continuato a controllarlo nella Git Staging in Eclipse e il percorso non era corretto. Grazie!
walla,

1
Avevo bisogno di aggiungere il flag -r (ricorsivo) dato che avevo archiviato anche le cartelle nidificate. Nel mio caso sono passato alla radice della mia cartella git quindi ho eseguito il comando git rm --cached -r .vs / Where vs era la cartella di livello superiore che volevo rimuovere dal tracciamento.
Devology Ltd,

106

Mi imbatto in questa, è una vecchia domanda, ma voglio che il file venga tracciato ma non rintracciarlo su determinate copie funzionanti, per farlo puoi eseguire

git update-index --assume-unchanged sites/default/settings.php

5
Questa è in realtà la risposta che stavo cercando. Tutte le altre risposte presuppongono che il file sia stato aggiunto con git add, il che non è sempre il caso. Con Acquia Cloud, il file .gitignore dovrebbe ignorare settings.php (ad esempio) ma il file è incluso con il primo commit. Non tenere traccia del file, lo elimina semplicemente dal repository, quindi lo elimina dal sito live ...
PatrickS

Aiutato anche me - grazie! Votato. Ho il sospetto che si applichi solo al repository git locale e non persisterebbe una volta spinto a distanza e clonato da altri sviluppatori?
Ivan

1
Sì, è solo locale.
Mescalito,

41

.gitignore ignorerà solo i file che non hai già aggiunto al tuo repository.

Se l'hai fatto git add ., e il file è stato aggiunto all'indice, .gitignore non ti aiuterà. Dovrai farlo git rm sites/default/settings.phpper rimuoverlo, quindi verrà ignorato.


thanks.but Come rimuovo il file solo dall'indice e non dalla directory di lavoro?
Nick.h,

1
git rmdovrebbe farlo, ma potrebbe chiederti di usare l'opzione -f che lo rimuoverà dalla directory di lavoro. Non ho capito altro oltre a fare una copia del file, fare git rm -fe quindi ripristinare la copia.
jonescb,

Lo stesso, amico. Crea una copia da qualche parte, rimuovila, esegui il commit dello stato rimosso, aggiungi nuovamente i file e vedi come vengono ignorati ora.
Yevgeniy Afanasyev,

18

Si prega di utilizzare questo comando

git rm -rf --cached .
git add .

A volte i file .gitignore non funzionano anche se sono corretti. Il motivo per cui Git ignora i file è che non vengono aggiunti al repository. Se hai aggiunto un file che desideri ignorare in precedenza, verrà tracciato da Git e le regole di abbinamento saltate verranno ignorate. Git lo fa perché il file fa già parte del repository.


12

Ho avuto lo stesso problema. File definiti in .gitingorecui elencati come file non tracciati durante l'esecuzione git status.

Il motivo è stato che il .gitignorefile è stato salvato nella UTF-16LEcodifica e non nella UTF8codifica.

Dopo aver modificato la codifica del .gitignorefile in UTF8ha funzionato per me.


Mi sento un noob a causa di questo ... dang it Windows
Coty Embry

Qualche idea sul perché la codifica dei file sia importante? Forse non stai leggendo correttamente il percorso?
Chargnn,

2

Cosa ho fatto per ignorare correttamente il file settings.php :

  1. git rm --cached sites / default / settings.php
  2. commit (fino a qui non ha funzionato)
  3. siti / default / settings.php eliminati manualmente (questo ha funzionato)
  4. git add.
  5. commit (ignorato correttamente)

Penso che se c'è il file di commit su Git, ignora non funziona come previsto. Elimina semplicemente il file e esegui il commit. Successivamente ignorerà.


2

Ci sono esempi, ad esempio, i file di configurazione dell'applicazione, che voglio tracciare in git (quindi .gitignore non funzionerà), ma che devo modificare per le impostazioni locali. Non voglio che Git gestisca questi file o li mostri come modificati. Per fare ciò uso skip-worktree:

git update-index --skip-worktree path/to/file

Puoi confermare che i file vengono saltati elencando i file e controllando le righe che iniziano con S per saltare

git ls-files -v | grep ^S

Se in futuro vuoi che git gestisca nuovamente il file localmente, esegui semplicemente:

 git update-index --no-skip-worktree path/to/file

Mescalito sopra ha avuto un'ottima risposta, ma mi ha portato sulla buona strada

git update-index --assume-file invariato / to / ignore.php

Ha un contratto con git quello in cui: l'utente promette di non modificare il file e consente a Git di supporre che il file dell'albero di lavoro corrisponda a ciò che è registrato nell'indice.

Tuttavia, cambio il contenuto dei file, quindi nel mio caso --skip-worktree è l'opzione migliore.

Il sito Web di Toshiharu Nishina ha fornito un'eccellente spiegazione di skip-worktree vs assume-immutato: ignora i file già gestiti con Git localmente


2

Un altro possibile motivo : alcune istanze di client git in esecuzione contemporaneamente . Ad esempio "git shell" + "GitHub Desktop", ecc.


Questo mi è successo, stavo usando "GitHub Desktop" come client principale e ignoravo alcune nuove impostazioni .gitignore: commit dopo commit:

  1. Commetti qualcosa.
  2. Successivamente, commit: ignora le impostazioni .gitignore. Commit include molti file temporanei menzionati in .gitignore.
  3. Cancella git cache; controlla se .gitignore è UTF8; rimuovi file -> commit -> sposta indietro i file; salta 1 commit - niente ha aiutato.

Motivo : l'editor di codice di Visual Studio era in esecuzione in background con lo stesso repository aperto. VS Code ha il controllo git incorporato e questo crea alcuni conflitti.

Soluzione : ricontrolla più client git nascosti e usa solo un client git alla volta, specialmente mentre cancelli la cache git.


1

Assicurati che .gitignore non abbia un'estensione !! Non può essere .gitignore.txt, in Windows basta nominare il file .gitignore. e funzionerà.


0

Ho appena provato questo con git 1.7.3.1 e ho dato una struttura come:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

dove repoè quindi la "radice" di cui sopra (la definirei la radice del tuo albero di lavoro) e .gitignorecontiene solo sites/default/settings.php, l'ignore funziona per me (e non importa se .gitignoreviene aggiunto al repository o meno). Questo corrisponde al layout del repository? In caso contrario, cosa differisce?


Sì. È esattamente lo stesso di tuo. Ma non funziona. Tutti gli altri schemi funzionano. Come ho detto, il problema è sicuramente relativo alla cartella settings.php.
Nick.h,

Sento che è una pessima idea tenere roba nel tuo repository e ignorare i cambiamenti su di essa.
Yevgeniy Afanasyev,

@YevgeniyAfanasyev ad eccezione di elementi come l'output di compilazione, le impostazioni utente IDE, tutti gli altri file temporanei generati dalla tua toolchain ...
Chris F Carroll

Intendevo impegnarmi nel repository, non solo nei file presenti nella cartella del progetto. Perché avresti bisogno di file temporanei nel repository?
Yevgeniy Afanasyev il

0

Nel caso in cui qualcuno in futuro abbia lo stesso problema che ho fatto:

Se si utilizza il

*
!/**/
!*.*

trucco per rimuovere i file binari senza estensione, assicurarsi che TUTTE le altre linee gitignore siano SOTTO. Git leggerà da .gitignore dall'alto, quindi anche se avevo "test.go" nel mio gitignore, era il primo nel file e divenne "non firmato" dopo

!*.*

0

Ho provato la maggior parte dei comandi sopra sul terminale VS Code e ho ricevuto errori come:

fatal: pathspec '[dir]/[file]' did not match any files

Ho aperto il progetto su GitHub Desktop e da lì ho ignorato e ha funzionato.

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.