.gitignore è ignorato da Git


1513

Il mio .gitignorefile sembra essere ignorato da Git - il .gitignorefile potrebbe essere corrotto? Quale formato di file, locale o cultura si aspetta da Git?

Il mio .gitignore:

# This is a comment
debug.log
nbproject/

Uscita da git status:

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       debug.log
#       nbproject/
nothing added to commit but untracked files present (use "git add" to track)

Vorrei debug.loge nbproject/non apparire nell'elenco dei file non tracciati.

Dove dovrei iniziare a cercare di risolvere questo problema?


56
Assicurati che il tuo .gitignorefile usi ANSIo UTF-8codifichi. Se utilizza qualcos'altro Unicode BOM, è possibile che Git non riesca a leggere il file.
ADTC

8
@ADTC questo era esattamente il problema sul mio computer (Windows). Ho usato echo "file" > .gitignorein PowerShell, il file aveva una codifica UCS-2!
MarioDS

7
git rm --cached debug.log nbproject/
Gayan Weerakutti,

4
Perché il primo commento qui non è una risposta è oltre me
RedOrav

2
@MattParkins Ah, lo vedo ora, mi sorprende ancora che una risposta così semplice e precisa sia sepolta come un commento o che quella effettivamente accettata sia laggiù. Grazie!
RedOrav,

Risposte:


3121

Anche se finora non hai monitorato i file, Git sembra essere in grado di "conoscerli" anche dopo averli aggiunti .gitignore.

ATTENZIONE: prima commetti le tue modifiche attuali o le perderai.

Quindi eseguire i seguenti comandi dalla cartella principale del repository Git:

git rm -r --cached .
git add .
git commit -m "fixed untracked files"

8
Ho ottenuto "utilizzo: git rm [opzioni] [-] <file> ..." stampato quando ho provato "git rm -r --cached". Se è importante, sto usando Git da PowerShell dopo aver fatto clic su "Strumenti-> Apri una shell qui" in GitHub per Windows.
Soonts,

61
su Windows: git rm. -r --cached e git add.
Beachhouse,

90
Ricorda di eseguire il commit di tutte le modifiche prima, altrimenti perderai il controllo su tutti i file modificati !!
Cosmin,

45
I primi 3 commentatori sembrano aver perso il punto alla fine. Questo significa ogni file. "git -rm -r --cached." <- nota il punto.
Christophe De Troyer

18
Se non vuoi impegnarti, una soluzione alternativa è mettere le tue modifiche sullo scaffale: "git stash". Esegui i comandi sopra. ed esegui "git stash pop"
Ivan Voroshilin,

335

Se sembra che Git non stia notando le modifiche apportate al tuo .gitignorefile, potresti voler controllare i seguenti punti:

  • Potrebbe esserci un .gitignorefile globale che potrebbe interferire con quello locale
  • Quando aggiungi qualcosa in un file .gitignore, prova questo:

    git add [uncommitted changes you want to keep] && git commit
    git rm -r --cached .
    git add .
    git commit -m "fixed untracked files"
    
  • Se rimuovi qualcosa da un file .gitignore e i passaggi precedenti potrebbero non funzionare, se ritieni che i passaggi precedenti non funzionino, prova questo :

    git add -f [files you want to track again]
    git commit -m "Refresh removing files from .gitignore file."
    
    // For example, if you want the .java type file to be tracked again,
    // The command should be:
    //     git add -f *.java
    

3
Forse potresti modificare la risposta di @AlinHuruba per aggiungere il tuo passaggio 3?
Benj,

@Benj Grazie per il tuo consiglio, non ho trovato la risposta di AlinHuruba, non so quale sia la differenza, quindi per favore dimmelo direttamente.
ifeegoo,

2
Il passaggio 3 è quello di cui avevo bisogno. La maggior parte della risposta dice semplicemente come rimuovere il file che non vogliamo rintracciare. Grazie per il punto di vista opposto.
Yeung,

Spero che questo ti aiuti!
ifeegoo,

7
git rm -r --cached .ha funzionato per me
Jason

198

Fisso. OK, ho creato il file .gitignore in Blocco note su Windows e non funzionava. Quando ho visto il file .gitignore su Linux sembrava un gibberish organizzato - forse Notepad aveva scritto Unicode anziché ASCII o qualunque sia 8-bit.

Quindi ho riscritto il file sul mio box Linux e quando l'ho riportato in Windows funziona benissimo! Evviva!


77
In Blocco note è sufficiente selezionare la codifica "ANSI" nella finestra di dialogo "Salva con nome". O meglio ancora, procurati un vero editor di testo - dopotutto sei un programmatore :) ... posso consigliare "Programmer's Notepad", altri preferiscono Notepad ++ e ce ne sono letteralmente altre centinaia.
0xC0000022L

1
hehe, sì, avrei dovuto crearlo in netbeans (che stavo usando in quel momento), eclissi o visual studio. L'ho appena chiamato dalla riga di comando pensando che non avrebbe fatto differenza.
Matt Parkins,

8
Il mio problema era simile: il mio .gitignore utilizzava UTF8 con una distinta componenti . L'ho appena salvato come UTF8 senza una distinta base e ha iniziato magicamente a funzionare.
Phil

13
Anche questo era il mio problema. Avevo creato il file .gitignore con "echo dirName> .gitignore" perché Windows fa un tale problema creare file che iniziano con ".". La codifica del file creato in questo modo era illeggibile da git e invece lo interpretava come un file binario. Facendo clic su "Codifica -> UTF-8" in Notepad ++, salva, fatto.
Laura,

4
Ha avuto lo stesso problema di @Laura in PowerShell: il file viene salvato per impostazione predefinita come UTF16.
mrówa,

113

Senza aggiungere un altro commit al tuo progetto, sarà sufficiente una riga per far .gitignorefunzionare come dovrebbe:

git rm -r --cached debug.log nbproject

Questo li rimuoverà dal repository, ma li manterrà comunque fisicamente. In parole povere, elimina qualsiasi cronologia delle modifiche ad esse correlate e inoltre non terrà traccia delle loro modifiche in alcun commit futuro. Puoi trovare una spiegazione migliore qui .


1
Ha funzionato esattamente come volevo: avevo solo 1 file che non è stato monitorato correttamente. Ho salvato il suo contenuto nel blocco note e l'ho fatto: git rm -r --cached someFile.phpe ha funzionato come un incanto :)
ShayLivyatan

@FMFF Questo lo rimuoverà dal repository ma li manterrà comunque fisicamente, in un inglese semplice, elimina qualsiasi cronologia dei cambiamenti ad essi correlati e inoltre non ne terrà traccia in alcun commit futuro. Una spiegazione migliore si può trovare qui: stackoverflow.com/questions/37279654/...
H Aßdøμ

Ho ottenuto un "fatal: pathspec 'debug.log' non corrisponde ad alcun file"
Michael

45

Un'altra causa di questo problema sono gli spazi vuoti o le schede prima dell'istruzione:

Esempio:

# Be aware of the following:
 notWorkingIgnore.*
workingIgnore.*

E come sottolineato dal commento sotto uno spazio finale può anche essere un problema:

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace

11
Uno spazio finale era il mio problema, che è ancora più difficile da trovare.
amr

3
ha anche avuto un problema di spazio bianco finale.
Trefex,

3
Sì, lo stesso qui. Ho pensato che avrei potuto scrivere commenti dopo il modello di file: *.txt # Tex files. Ma git capisce: "Ignora i file con l'estensione txt "
Adam Libuša,

3
La mia parola, mi ci sono voluti 2 giorni per trovare questa risposta a 15 voti. Questo merita di più.
Ford

2
Hai appena risolto un problema che ho avuto per mesi ... Grazie!
Arkellys,

36

Ho notato che la codifica di .gitignorestava avendo un effetto: se il file era Unicode, veniva ignorato, se era ASCII, non lo era.

Processi:

  1. Verifica lo stato: PS> git status
  2. Creare una funzione per Get-FileEncoding
  3. .gitignoreCodifica del test :PS> Get-FileEncoding .gitignore
  4. Cambia la codifica in ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. Confermare: PS> git status

5
1000 grazie per questo. Stavo creando il file .gitignore sul mio sistema usando touch .gitignoree echo ".db" >> .gitignoreroute tramite powershell. Ho scoperto che echo ".db" >> .gitignore"stava impostando la codifica del file su UCS-2 LE-BOM, una rapida conversione in ASCII e gitignore ha iniziato a funzionare.
B-Rad,

2
Puoi provare saltando i passaggi 2 e 3.
Aniket Bhansali il

32

Come per le altre soluzioni, si impegnano prima ed essere consapevoli che si perderanno tutte le modifiche non-impegnata.

Ho avuto risultati migliori con questo:

git rm -r --cached .
git reset HEAD --hard
git status

Si noti che lo stato non dovrebbe avere alcun file modificato ora.


2
questo non funziona per me ma la risposta di ifeegoo lo fa
fanny

21

Nel mio caso, è perché i file esistono già nel repository e sto cercando di ignorarlo.

Queste sono le cose che ho fatto per risolvere il problema:

  • Copia i file in una cartella temporanea
  • Rimuovili dalla mia cartella del progetto.
  • Conferma le modifiche che rimuovono quei file dal repository
  • Aggiunti nuovamente quei file nella cartella del mio progetto

A quel punto, tutte le modifiche che ho apportato su quei file sono state ignorate.

Penso che non si possano ignorare i file già esistenti nel repository.


Nel mio caso, erano già in scena. Solo dopo aver fatto ciò che mi hai suggerito, quindi aver tentato di impegnarmi e aver visto l'avvertimento che erano stati messi in scena e rimossi, mi sono reso conto che era il problema.
dudeNumber4,

19

Tutte le risposte qui sono in realtà soluzioni alternative. È necessario creare il file .gitignore prima di eseguire git init. Altrimenti gitnon saprai mai che devi ignorare quei file, perché sono già stati tracciati.

echo .idea/ >> .gitignore
git init

Se sviluppi quotidianamente, ti consiglio di aggiungere i tuoi file ignorati abituali al tuo ~/.gitignore_globalfile. In questo modo, gitsaprà già quali file (che significa "il tuo utente", poiché è un file nella tua home directory) di solito ignori.


Grazie a Dio ... finalmente una soluzione che funziona per me.
Dobl

~/.gitignore_globalè un nome configurabile. Esegui git config --global core.excludesfileprima per vedere se hai già definito un file. Altrimenti, scappa git config --global core.excludesfile ~/.gitignore_global.
Noumenon

Una soluzione alternativa se non è stata creata .gitignoreprima: rinominare il file monitorato. .gitignoreverrà applicato come se fosse nuovo.
Noumenon,

15

Controlla anche la directory in cui hai inserito .gitignore.

Dovrebbe essere nella radice del tuo progetto :

./myproject/.gitignore

Non in

./myproject/.git/.gitignore

9

In particolare per gli utenti Windows: se si dispone di file non monitorati e la cancellazione / rimozione dei file memorizzati nella cache non funziona. Prova ad aprire PowerShell e a convertire il file .gitignore in codifica UTF-8:

$Myfile = Get-Content .\.gitignore`
$Myfile | Out-File -Encoding "UTF8" .gitignore

È necessario eseguire questa operazione una sola volta per codificare il file .gitignore per quella directory e poiché il file viene quindi codificato correttamente, ogni volta che si modifica il file in futuro dovrebbe funzionare. Credo che ciò sia dovuto a un problema tecnico con GitHub che non sta per leggere la codifica non UTF-8 per un file .gitignore. Per quanto ne so, questo problema non è stato ancora risolto per Windows. Non è un grosso problema, è solo un dolore per il debug quando non funziona.


8

.gitignorePotrebbe esserci un altro problema , specialmente per un utente Windows. A Git non piace quando chiami .gitignore(come unity.gitignore).

Ti consigliamo di nominarlo sempre .gitignore, o su Windows, .gitignore.poiché Windows pensa che stai provando a rinominarlo senza un nome file.


7

Ho appena incontrato questo problema. Il contenuto del mio file .gitignore ha continuato a comparire nell'elenco dei file non tracciati.

Lo stavo usando per creare il file ignore:

echo "node_modules" > .gitignore

Si scopre che le doppie citazioni stavano causando il problema per me. Ho eliminato il file ignore e quindi ho usato nuovamente il comando senza virgolette e ha funzionato come previsto. Non ho avuto bisogno di pasticciare con la codifica dei file. Sono su una macchina Windows 10 usando Cmder .

Esempio:

echo node_modules > .gitignore

Strano, questa dichiarazione di eco ha risolto un problema che avevo localmente in cui un file ignorato che avevo cancellato per caso e poi ricreato veniva mostrato come un file commitabile e non tracciato. Per qualche ragione, anche se questo non ha cambiato il mio file ignore, ha risolto il mio problema.
Patrick,

6

Per me nessuna delle risposte precedenti ha funzionato. Ho dovuto copiare il .gitignoretesto nel exclude.txtfile trovato in

<Your-project-folder>\.git\info

Una volta fatto, aggiorna le modifiche e tutti i file non tracciati scompaiono. Impegnati come al solito.


6

Il mio problema era (come suggeriva OP) un file .gitignore corrotto. Non ci credevo e ignoravo la possibilità fino a quando tutto il resto falliva. Il danneggiamento non si è presentatovi , ma all'inizio del file c'erano due byte che hanno fatto sì che il file .gitignore venisse ignorato. Per me, questi sono comparsi solo quando ho digitato cat .gitignore, che ha mostrato:

��# Built application files
*.apk
*.ap_

# ...

Non ho idea di come siano finiti lì, ma ricreare il file ha risolto il problema. Un'analisi esadecimale del file danneggiato ha mostrato quanto segue:

user@dev ~/project/myproject $ xxd -b .gitignore
00000000: 11111111 11111110 00100011 00000000 00100000 00000000  ..#. .
00000006: 01000010 00000000 01110101 00000000 01101001 00000000  B.u.i.

2
Sembra un segno di ordine UTF-16 byte in un file codificato UTF-8. it.wikipedia.org/wiki/Byte_order_mark
jsageryd

6

Ho avuto questo problema, con un file .gitignore contenente questa riga:

lib/ext/

Ho appena realizzato che, in effetti, questa directory è un collegamento simbolico a una cartella da qualche altra parte:

ls -la lib/ext/
lrwxr-xr-x 1 roipoussiere users 47 Feb  6 14:16 lib/ext -> /home/roipoussiere/real/path/to/the/lib

Sulla linea lib/ext/, Git in realtà cerca una cartella , ma un collegamento simbolico è un file , quindi la mia libcartella non viene ignorata.

Ho risolto questo problema sostituendolo lib/ext/con il lib/extmio file .gitignore.


5

Ho avuto lo stesso problema. Credo che il problema fosse una discrepanza tra CR e CR + LF. Ho nascosto le cose nel mio .gitignore usando CMD (su Windows 7) e il seguente comando:

Cattivo:

echo "file_to_be_ignored.py" >> .gitignore<br>
echo "*~" >> .gitignore

Eccetera.

Il problema era che questo comando non posizionava il marker di fine riga corretto affinché Git riconoscesse le nuove righe (CR o CR + LF quando Git si aspetta l'altro). Ho risolto il problema sostituendo manualmente ogni nuova riga in Vim (Vim in soccorso!) E ha funzionato perfettamente.

Prova a modificare il tuo .gitignore in Notepad ++ o Vim (idealmente). Anche se il file sembra formattato correttamente, prova a sostituire le nuove righe. Sembra strano, lo so, ma ha funzionato per me. : D



3

Una cosa da anche guardare: stai salvando il tuo file .gitignore con le terminazioni di riga corrette?

Finestre:

Se lo stai usando su Windows, lo stai salvando con i finali di linea di Windows? Non tutti i programmi lo faranno di default; Notepad ++ e molti editor PHP passano automaticamente alle terminazioni di linea di Linux, quindi i file saranno compatibili con il server. Un modo semplice per verificarlo è aprire il file nel Blocco note di Windows. Se tutto appare su una riga, il file è stato salvato con terminazioni di riga Linux.

Linux:

Se riscontri problemi con il funzionamento del file in un ambiente Linux, apri il file in un editor come Emacs o nano . Se vedi caratteri non stampabili, il file è stato salvato con terminazioni di riga di Windows.


3

Un'altra possibile ragione : 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 ignorava 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 cache Git; controlla se .gitignore è UTF-8; rimuovi file → commit → sposta indietro i file; salta un commit - niente ha aiutato.

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

Soluzione : ricontrolla più client Git nascosti e usa un solo client Git alla volta, in particolare durante la cancellazione della cache Git.


3

Ci sono già ottime risposte, ma la mia situazione era noiosa. Avevo modificato la fonte di un software PLM (Product Lifecycle Management) installato su Win10 e successivamente ho deciso "Probabilmente avrei dovuto farlo diventare un repository git".

Quindi, l'opzione cache non funzionerà direttamente per me. Pubblicare per altri che potrebbero aver aggiunto il controllo del codice sorgente DOPO aver fatto un sacco di lavoro iniziale E .gitignoreNON funziona MA, potresti avere paura di perdere un sacco di lavoro, quindi git rm --cachednon fa per te.

! IMPORTANTE: Questo perché ho aggiunto git troppo tardi a un "progetto" troppo grande e che sembra ignorare il mio .gitignore. Non ho mai commesso, mai. Posso andare via con questo :)

Innanzitutto, ho appena fatto:

rm -rf .git
rm -rf .gitignore

Quindi, ho dovuto avere una foto delle mie modifiche. Ancora una volta, questo è un prodotto di installazione su cui ho apportato modifiche. Troppo tardi per un primo commit di puro ramo master. Quindi, avevo bisogno di un elenco di ciò che ho cambiato da quando avevo installato il programma aggiungendo > changed.loga uno dei seguenti:

PowerShell

# Get files modified since date.
Get-ChildItem -Path path\to\installed\software\ -Recurse -File | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-02-25')} | Select-Object FullName

bash

# Get files modified in the last 10 days...
find ./ -type f -mtime -10

Ora, ho la mia lista di ciò che ho cambiato negli ultimi dieci giorni (non entriamo nelle migliori pratiche qui se non per dire, sì, l'ho fatto da solo).

Per un nuovo inizio, ora:

git init .
# Create and edit .gitignore

Ho dovuto confrontare il mio elenco modificato con il mio .gitignore in crescita, eseguendolo git statusman mano che lo miglioravo, ma le mie modifiche in .gitignore vengono lette mentre procedo.

Infine, ho l'elenco delle modifiche desiderate! Nel mio caso è boilerplate - alcuni temi funzionano insieme a gravi configurazioni XML specifiche per l'esecuzione di un sistema di sviluppo su questo software che voglio mettere in un repository per consentire ad altri sviluppatori di afferrare e contribuire su ... Questo sarà il nostro ramo principale, quindi impegnarsi, spingere e, infine, BRANCHING per nuovi lavori!


2

Basta rimuovere la cartella o il file, che è stato precedentemente eseguito il commit in Git, con il seguente comando. Quindi il file gitignore rifletterà i file corretti.

    git rm -r -f "folder or files insides"

2

Una cosa complicata non trattata dalle altre risposte qui è che il file .gitignore non funzionerà se hai commenti incorporati, come questo:

foo/bar # The bar file contains sensitive data so we don't want to make this public

Quindi, se hai commenti del genere, modificali in questo modo:

# The bar file contains sensitive data so we don't want to make this public
foo/bar

2

È anche possibile che il .gitignorefile sia stato modificato con un sudocomando. Ho riscontrato lo stesso problema e durante l'esecuzione dei comandi: git statuspotevo ancora vedere i file "dovrebbero essere ignorati".

Al momento di modificare con nano .gitignoreinvece di sudo nano .gitignore, ho potuto vedere il riflesso corretto.


2

Ho creato .gitignore utilizzando echo "..." > .gitignorein PowerShell in Windows, perché non mi consente di crearlo in Esplora risorse.

Il problema nel mio caso era la codifica del file creato e il problema è stato risolto dopo averlo modificato in ANSI.


2

Anch'io ho lo stesso problema su Ubuntu, l'ho creato .gitignoredal terminale e funziona per me

touch .gitignore


2

Il mio non funzionava perché ho letteralmente creato un documento di testo chiamato .gitignore

Invece, crea un documento di testo, aprilo in Notepad ++ e poi salva come .gitignore

Assicurati di selezionare Tutti i tipi (*. *) Dal menu a discesa quando lo salvi.


O in gitbash, usa semplicemente touch .gitignore


1

Se sei un utente di Notepad ++ , prova a fare quanto segue:

Apri il tuo file .gitignore usando Notepad ++ ed esegui:

Menu ModificaConversione EOLFormato WindowsSalva .

Prova a usarlo di git statusnuovo e vedi se funziona per te.

Ho pubblicato la risposta a una domanda simile qui .


1

Per me è stato l'ennesimo problema. Il mio file .gitignore è impostato per ignorare tutto tranne le cose che gli dico di non ignorare. Come tale:

/*
!/content/

Ora questo ovviamente significa che sto anche dicendo a Git di ignorare il file .gitignore stesso. Il che non è stato un problema fino a quando non stavo monitorando il file .gitignore. Ma a un certo punto ho eseguito il commit del file .gitignore stesso. Ciò ha portato quindi al file .gitignore ad essere ignorato correttamente.

Quindi l'aggiunta di un'altra riga l'ha risolto:

/*
!/content/
!.gitignore

1

Il mio problema era che ho scritto i file da ignorare tra virgolette "" separazione non con barra /.

Questo non ha funzionato ed è stato ignorato da git:

"db.sqlite3"
"tdd_venv/"

Questo ha funzionato bene:

/db.sqlite3
/tdd_venv/

Ho anche controllato la mia codifica dei file in Windows con Notepad ++. La codifica è stata impostata su UTF-8.

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.