.gitignore é ignorado pelo Git

1513

Meu .gitignorearquivo parece estar sendo ignorado pelo Git - o .gitignorearquivo pode estar corrompido? Que formato de arquivo, local ou cultura o Git espera?

Meu .gitignore:

# This is a comment
debug.log
nbproject/

Saída de 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)

Eu gostaria debug.loge nbproject/não aparecesse na lista de arquivos não rastreados.

Onde devo começar a procurar corrigir isso?

Matt Parkins
fonte
56
Verifique se o seu .gitignorearquivo usa ANSIou UTF-8codifica. Se ele usa algo mais Unicode BOM, é possível que o Git não consiga ler o arquivo.
ADTC
8
@ADTC este foi exatamente o problema na minha máquina (Windows). Eu usei echo "file" > .gitignoreno PowerShell, o arquivo tinha uma codificação UCS-2!
MarioDS
7
git rm --cached debug.log nbproject/
Gayan Weerakutti
4
Por que o primeiro comentário aqui não é uma resposta está além de mim
RedOrav
2
@ MattParkins Ah, eu vejo isso agora, ainda me surpreende que uma resposta tão simples e direta seja escondida como um comentário ou que a resposta realmente aceita esteja lá embaixo. Obrigado!
RedOrav

Respostas:

3121

Mesmo que você não tenha rastreado os arquivos até agora, o Git parece ser capaz de "conhecê-los" mesmo depois de adicioná-los .gitignore.

AVISO: primeiro confirme suas alterações atuais ou você as perderá.

Em seguida, execute os seguintes comandos na pasta superior do seu repositório Git:

git rm -r --cached .
git add .
git commit -m "fixed untracked files"
Alin Huruba
fonte
8
Eu recebi "use: git rm [opções] [-] <arquivo> ..." impresso quando tentei "git rm -r --cached". Se isso importa, estou usando o Git no PowerShell depois de clicar em "Ferramentas-> Abrir um shell aqui" no GitHub para Windows.
Soonts 17/10/12
61
no Windows: git rm. -r --cached e git add.
Beachhouse
90
Esteja ciente de confirmar todas as suas alterações antes, caso contrário você perderá o controle de todos os arquivos alterados !!
Cosmin
45
Os três primeiros comentaristas parecem ter perdido o ponto no final. Isso significa todo arquivo. "git -rm -r --cached." <- observe o ponto.
Christophe De Troyer
18
Se você não deseja confirmar, uma solução alternativa é colocar as alterações na prateleira: "git stash". Execute os comandos acima. e execute "git stash pop"
Ivan Voroshilin
335

Se parece que o Git não está percebendo as alterações feitas no seu .gitignorearquivo, convém verificar os seguintes pontos:

  • Pode haver um .gitignorearquivo global que possa interferir no seu local
  • Quando você adiciona algo a um arquivo .gitignore, tente o seguinte:

    git add [uncommitted changes you want to keep] && git commit
    git rm -r --cached .
    git add .
    git commit -m "fixed untracked files"
    
  • Se você remover algo de um arquivo .gitignore, e as etapas acima talvez não funcionarem, se você achou que as etapas acima não estão funcionando, tente o seguinte :

    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
    
ifeegoo
fonte
3
Talvez você possa editar a resposta de @AlinHuruba para adicionar sua etapa 3?
Benj
@ Benj Obrigado pelo seu conselho, não encontrei a resposta da AlinHuruba, não sei qual é a diferença, então, por favor, me diga diretamente.
ifeegoo
2
O passo 3 é o que eu precisava. A maioria das respostas diz apenas como remover o arquivo que queremos rastrear. Obrigado pelo ponto de vista oposto.
Yeung
Espero que isso ajude você!
ifeegoo
7
git rm -r --cached .trabalhou para mim
Jason
198

Fixo. OK, criei o arquivo .gitignore no bloco de notas no Windows e ele não estava funcionando. Quando eu vi o arquivo .gitignore no Linux, ele parecia uma bobagem organizada - talvez o Bloco de Notas tenha escrito Unicode em vez de ASCII ou seja o que for de 8 bits.

Então, eu reescrevi o arquivo na minha caixa Linux e, quando o puxei de volta para o Windows, ele funcionou bem! Viva!

Matt Parkins
fonte
77
No bloco de notas, basta escolher a codificação "ANSI" na caixa de diálogo "Salvar como". Ou melhor ainda, obtenha um editor de texto adequado - afinal você é um programador :) ... eu posso recomendar o "Bloco de Notas do Programador", outros preferem o Notepad ++ e existem literalmente centenas a mais por aí.
0xC0000022L
1
hehe, sim, eu deveria ter criado no netbeans (que eu estava usando na época), eclipse ou visual studio. Eu acabei de ligar da linha de comando pensando que não faria diferença.
22412 Matt Parkins
8
Meu problema era semelhante - meu .gitignore estava usando UTF8 com uma lista técnica . Apenas o salvei como UTF8 sem uma lista técnica e, magicamente, começou a funcionar.
26414 Phil
13
Este foi o meu problema também. Eu criei o arquivo .gitignore com "echo dirName> .gitignore" porque o Windows torna muito difícil criar arquivos que começam com ".". A codificação do arquivo criado dessa maneira era ilegível pelo git e, em vez disso, foi interpretada como um arquivo binário. Clique em "Codificação -> UTF-8" no Notepad ++, salve, pronto.
Laura
4
Teve o mesmo problema que o @Laura no PowerShell - o arquivo é salvo por padrão como UTF16.
mrówa 8/09/16
113

Sem adicionar outro commit ao seu projeto, uma linha será suficiente para fazer o .gitignoretrabalho como deveria:

git rm -r --cached debug.log nbproject

Isso os removerá do repositório, mas ainda os manterá fisicamente. Em inglês simples, ele exclui qualquer histórico de alterações relacionadas a eles e também não rastreará suas alterações em nenhum commit futuro. Você pode encontrar uma explicação melhor aqui .

H Aßdøµ
fonte
1
Funcionou exatamente como eu queria - eu tinha apenas 1 arquivo que não foi rastreado corretamente. Salvei seu conteúdo no bloco de notas, e fez: git rm -r --cached someFile.phpe funcionou como um encanto :)
ShayLivyatan
@FMFF Isso irá removê-lo do repositório, mas ainda mantê-los fisicamente, em inglês simples, exclui qualquer histórico de alterações relacionadas a eles e também não rastreará suas alterações em nenhum commit futuro. Uma explicação melhor que você pode encontrar aqui: stackoverflow.com/questions/37279654/…
H Aßdøµ
Eu recebi um "fatal: pathspec 'debug.log' não corresponde a nenhum arquivo"
Michael
45

Outra causa desse problema são espaços em branco ou guias antes da declaração:

Exemplo:

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

E, como apontado pelo comentário abaixo, um espaço à direita também pode ser um problema:

# Be aware of the following:
notWorkingIgnore.* #<-Space
workingIgnore.*#<-Nospace
Rawa
fonte
11
Um espaço à direita era o meu problema, o que é ainda mais difícil de encontrar.
amr
3
também teve um problema de espaço em branco à direita.
22815 Trefex
3
Sim, o mesmo aqui. Eu pensei que eu poderia escrever comentários após o padrão de arquivo: *.txt # Tex files. Mas o git entende: "Ignore os arquivos com a extensão txt "
Adam Libuša
3
Minha palavra, demorei 2 dias para encontrar esta resposta com 15 votos a favor. Isso merece mais.
Fordcars
2
Você acabou de resolver um problema que tive por meses ... Obrigado!
22618 Arkellys
36

Notei que a codificação do .gitignore estava tendo efeito - se o arquivo era Unicode, era ignorado, se era ASCII, não era.

Processo:

  1. Verificar status: PS> git status
  2. Crie uma função para Get-FileEncoding
  3. .gitignoreCodificação do teste :PS> Get-FileEncoding .gitignore
  4. Mude a codificação para ASCII:PS> Set-Content .gitignore -Encoding Ascii -Value (Get-Content .gitignore)
  5. Confirme: PS> git status
craig
fonte
5
1000 obrigado por isso. Eu estava criando o arquivo .gitignore no meu sistema usando a rota touch .gitignoree echo ".db" >> .gitignorevia powershell. Eu descobri que echo ".db" >> .gitignore"estava definindo a codificação do arquivo para UCS-2 LE-BOM, uma conversão rápida para ASCII e o gitignore começaram a funcionar.
B-Rad
2
Você pode tentar saltando Passo 2 e 3.
Aniket Bhansali
32

Tal como acontece com as outras soluções, comprometer em primeiro lugar e estar ciente de que você vai perder todas as alterações un-comprometido.

Eu tive melhores resultados com isso:

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

Observe que o status não deve ter nenhum arquivo modificado agora.

Steven Stark
fonte
2
este não está funcionando para mim mas a resposta ifeegoo do faz
fanny
21

No meu caso, é porque os arquivos já existem no repositório e estou tentando ignorá-lo.

Estas são as coisas que eu fiz para corrigir o problema:

  • Copie os arquivos para uma pasta temporária
  • Remova-os da minha pasta do projeto.
  • Confirme as alterações que removem esses arquivos do repositório
  • Re-adicionou esses arquivos à minha pasta do projeto

Até então, todas as alterações feitas nesses arquivos eram ignoradas.

Eu acho que você não pode ignorar arquivos que já existem no repositório.

Edesa
fonte
No meu caso, eles já foram encenados. Somente depois de fazer o que você sugere, depois de tentar confirmar e ver o aviso de que eles haviam sido encenados e removidos, percebi que esse era o problema.
usar o seguinte comando
19

Todas as respostas aqui são realmente soluções alternativas. Você precisa criar o arquivo .gitignore antes de executar git init. Caso contrário, gitvocê nunca saberá que precisa ignorar esses arquivos, porque eles já foram rastreados.

echo .idea/ >> .gitignore
git init

Se você desenvolver diariamente, recomendamos que você adicione seus arquivos ignorados habituais ao seu ~/.gitignore_globalarquivo. Dessa forma, gitvocê já saberá quais arquivos você (que significa "seu usuário", já que é um arquivo no diretório inicial) geralmente ignora.

CESCO
fonte
Graças a Deus ... finalmente uma solução que funciona para mim.
Dbl 30/08/19
~/.gitignore_globalé um nome configurável. Execute git config --global core.excludesfileprimeiro para ver se você já possui um arquivo definido. Caso contrário, corra git config --global core.excludesfile ~/.gitignore_global.
Noumenon
Uma solução alternativa se você não criou .gitignoreprimeiro: renomeie o arquivo rastreado. .gitignoreserá aplicado como se fosse novo.
Noumenon
15

Verifique também o diretório em que você colocou .gitignore.

Deve estar na raiz do seu projeto :

./myproject/.gitignore

Não em

./myproject/.git/.gitignore
Artem Zaytsev
fonte
9

Especificamente para usuários do Windows: Se você tiver arquivos não rastreados e a limpeza / remoção dos arquivos em cache não estiver funcionando. Tente abrir o PowerShell e converter o arquivo .gitignore em codificação UTF-8:

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

Você só precisa fazer isso uma vez para codificar o arquivo .gitignore para esse diretório e, como o arquivo é codificado corretamente, sempre que você editar o arquivo no futuro, ele deverá funcionar. Eu acredito que isso se deve a uma falha no GitHub não estar prestes a ler a codificação não UTF-8 para um arquivo .gitignore. Tanto quanto sei, esse problema ainda não foi resolvido para o Windows. Não é grande coisa, apenas uma dor para depurar quando não está funcionando.

maximusg
fonte
8

Há outro problema .gitignoreque pode acontecer, especialmente para um usuário do Windows. O Git não gosta quando você nomeia .gitignore(como unity.gitignore).

Você sempre desejará nomeá-lo .gitignoreou no Windows, .gitignore.pois o Windows pensa que está tentando renomeá-lo sem um nome de arquivo.

Chama Dourada
fonte
7

Acabei de encontrar este problema. O conteúdo do meu arquivo .gitignore continuou a aparecer na lista de arquivos não rastreados.

Eu estava usando isso para criar o arquivo ignorar:

echo "node_modules" > .gitignore

Acontece que as aspas duplas estavam causando o problema para mim. Excluí o arquivo ignorar e, em seguida, usei o comando novamente sem aspas, e funcionou conforme o esperado. Eu não precisava mexer com a codificação do arquivo. Estou em uma máquina Windows 10 usando o Cmder .

Exemplo:

echo node_modules > .gitignore
bprdev
fonte
Estranho, essa declaração de eco corrigiu um problema que eu tinha localmente, onde um arquivo ignorado, que eu excluí por acidente e depois recriava, aparecia como um arquivo não rastreado e comprometido. Por alguma razão, mesmo que isso não tenha alterado meu arquivo de ignorados, ele corrigiu meu problema.
22417 Patrick
6

Para mim, nenhuma das respostas anteriores funcionou. Eu tive que copiar o .gitignoretexto no exclude.txtarquivo encontrado em

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

Uma vez feito, atualize suas alterações e todos os arquivos não rastreados desaparecerão. Confirme como de costume.

raga
fonte
6

Meu problema foi (como sugerido pelo OP) um arquivo .gitignore corrompido. Eu não acreditava nisso e ignorei a possibilidade até que todo o resto falhasse. A corrupção não apareceuvi , mas havia dois bytes no início do arquivo que fizeram com que o arquivo .gitignore fosse ignorado. Para mim, eles só apareceram quando eu digitei cat .gitignore, o que mostrou:

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

# ...

Não tenho idéia de como eles foram parar lá, mas a recriação do arquivo corrigiu o problema. Uma análise hexadecimal do arquivo corrompido mostrou o seguinte:

user@dev ~/project/myproject $ xxd -b .gitignore
00000000: 11111111 11111110 00100011 00000000 00100000 00000000  ..#. .
00000006: 01000010 00000000 01110101 00000000 01101001 00000000  B.u.i.
pcdev
fonte
2
Parece uma marca de pedido de UTF-16 bytes em um arquivo codificado em UTF-8. pt.wikipedia.org/wiki/Byte_order_mark
jsageryd
6

Eu tive esse problema, com um arquivo .gitignore contendo esta linha:

lib/ext/

Acabei de perceber que, de fato, este diretório é um link simbólico para uma pasta em outro lugar:

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

Na linha lib/ext/, o Git realmente procura uma pasta , mas um link simbólico é um arquivo , então meulib pasta não é ignorada.

Eu reparei isso substituindo lib/ext/por lib/extno meu arquivo .gitignore.

roipoussiere
fonte
5

Eu tenho esse mesmo problema. Acredito que o problema foi uma discrepância CR vs. CR + LF. Eu escondi coisas no meu .gitignore usando o CMD (no Windows 7) e o seguinte comando:

Ruim:

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

Etc.

O problema foi que esse comando não coloca o marcador de fim de linha correto para o Git reconhecer as novas linhas (CR ou CR + LF quando o Git espera o outro). Resolvi o problema substituindo manualmente cada nova linha no Vim (Vim para o resgate!) E funcionou perfeitamente.

Tente editar o seu .gitignore no Notepad ++ ou Vim (idealmente). Mesmo que o arquivo pareça estar formatado corretamente, tente substituir as novas linhas. Parece estranho, eu sei, mas funcionou para mim. : D

fictivelogic
fonte
3

Uma coisa a considerar: você está salvando o arquivo .gitignore com as terminações de linha corretas?

Janelas:

Se você o está usando no Windows, está salvando-o com finais de linha do Windows? Nem todos os programas farão isso por padrão; O Notepad ++ e muitos editores de PHP usam como padrão as terminações de linha do Linux, para que os arquivos sejam compatíveis com o servidor. Uma maneira fácil de verificar isso é abrir o arquivo no Windows Notepad. Se tudo aparecer em uma linha, o arquivo foi salvo com as terminações de linha do Linux.

Linux:

Se você estiver tendo problemas com o arquivo funcionando em um ambiente Linux, abra o arquivo em um editor como o Emacs ou o nano . Se você vir algum caractere não imprimível, o arquivo foi salvo com as terminações de linha do Windows.

Beachhouse
fonte
3

Outro motivo possível - algumas instâncias de clientes Git em execução ao mesmo tempo . Por exemplo, "git shell" + "GitHub Desktop" etc.


Isso aconteceu comigo. Eu estava usando o "GitHub Desktop" como cliente principal e estava ignorando algumas novas configurações do .gitignore: commit após commit:

  1. Você comete alguma coisa.
  2. Em seguida, confirme: ignora as configurações .gitignore. A confirmação inclui muitos arquivos temporários mencionados no .gitignore.
  3. Limpar cache do Git; verifique se .gitignore é UTF-8; remover arquivos → confirmar → mover arquivos de volta; pule um commit - nada ajudou.

Motivo : o editor de código do Visual Studio estava sendo executado em segundo plano com o mesmo repositório aberto. O Código do Visual Studio possui controle Git interno, o que gera alguns conflitos.

Solução : verifique novamente vários clientes Git ocultos e use apenas um cliente Git por vez, especialmente ao limpar o cache do Git.

Oleg Zarevennyi
fonte
3

Já existem ótimas respostas, mas minha situação era entediante. Eu editei a fonte de um software PLM (gerenciamento do ciclo de vida do produto) instalado no Win10 e depois decidi: "Eu provavelmente deveria ter feito disso um repositório git".

Portanto, a opção de cache não funcionará diretamente para mim. Postando para outras pessoas que podem ter adicionado o controle de origem APÓS fazer um monte de trabalho inicial E .gitignorenão funcionar, MAS, você pode ter medo de perder um monte de trabalho,git rm --cached não é para você.

!IMPORTANTE: Isso porque eu adicionei o git tarde demais a um "projeto" muito grande e parece ignorar o meu .gitignore. Eu nunca comprometo, nunca. Eu posso me afastar com isso :)

Primeiro, acabei de fazer:

rm -rf .git
rm -rf .gitignore

Então, eu tive que ter uma foto das minhas alterações. Novamente, este é um produto de instalação em que eu fiz alterações. Tarde demais para um primeiro commit do branch master puro. Então, eu precisava de uma lista do que alterei desde que instalei o programa adicionando > changed.logum dos seguintes:

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

Bater

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

Agora, tenho minha lista do que mudei nos últimos dez dias (não vamos entrar nas melhores práticas aqui além de dizer: sim, eu fiz isso comigo mesmo).

Para um novo começo, agora:

git init .
# Create and edit .gitignore

Eu tive que comparar minha lista alterada com meu .gitignore crescente, executando git status conforme eu a , mas minhas edições no .gitignore são lidas à medida que eu passo.

Finalmente, eu tenho a lista de alterações desejadas! No meu caso, é clichê - alguns temas funcionam junto com sever xml configs específicas para executar um sistema de desenvolvimento nesse software que eu quero colocar em um repositório para outros desenvolvedores aproveitarem e contribuírem ... Este será nosso ramo principal, então comprometendo, pressionando e, finalmente, SUBSTITUINDO novos trabalhos!

Neil Guy Lindberg
fonte
2

Apenas remova a pasta ou o arquivo confirmado anteriormente no Git, pelo seguinte comando. O arquivo gitignore refletirá os arquivos corretos.

    git rm -r -f "folder or files insides"
Atif Hussain
fonte
2

Uma coisa complicada não abordada pelas outras respostas aqui é que o arquivo .gitignore não funcionará se você tiver comentários embutidos, como este:

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

Portanto, se você tiver comentários como esse, altere-os assim:

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

Também é possível que você tenha editado o .gitignorearquivo com um sudocomando. Encontrei o mesmo problema e ao executar os comandos:git status :, ainda conseguia ver os arquivos "deveriam ser ignorados".

Ao editar com em nano .gitignorevez de sudo nano .gitignore, pude ver o reflexo correto.

aviral sanjay
fonte
2

Eu criei .gitignore usando echo "..." > .gitignoreno PowerShell no Windows, porque não me permite criá-lo no Windows Explorer.

O problema no meu caso foi a codificação do arquivo criado e o problema foi resolvido depois que eu o alterei para ANSI.

Ahmad
fonte
2

Eu também tenho o mesmo problema no Ubuntu, criei o a .gitignorepartir do terminal e funciona para mim

touch .gitignore

UA_
fonte
2

O meu não estava funcionando porque eu literalmente criei um documento de texto chamado .gitignore

Em vez disso, crie um documento de texto, abra-o no Notepad ++ e salve como .gitignore

Certifique-se de escolher Todos os tipos (*. *) Na lista suspensa ao salvá-la.


Ou no gitbash, basta usar touch .gitignore

Kari
fonte
1

Se você é um usuário do Notepad ++ , tente fazer o seguinte:

Abra o arquivo .gitignore usando o Notepad ++ e faça:

Menu EditarConversão de EOLFormato do WindowsSalvar .

Tente usar git statusnovamente e veja se funciona para você.

Eu postei a resposta para uma pergunta semelhante aqui .

Ozesh
fonte
1

Para mim, era outro problema. Meu arquivo .gitignore está configurado para ignorar tudo, exceto coisas que eu digo para não ignorar. Assim:

/*
!/content/

Agora, obviamente, isso significa que também estou dizendo ao Git para ignorar o próprio arquivo .gitignore. O que não foi um problema, desde que eu não estivesse rastreando o arquivo .gitignore. Mas em algum momento eu comprometi o próprio arquivo .gitignore. Isso levou o arquivo .gitignore a ser ignorado corretamente.

Então, adicionando mais uma linha, foi corrigida:

/*
!/content/
!.gitignore
user8118328
fonte
1

Meu problema foi que anotei arquivos para ignorar com aspas "" a separação e não com a barra /.

Isso não funcionou e foi ignorado pelo git:

"db.sqlite3"
"tdd_venv/"

Isso funcionou muito bem:

/db.sqlite3
/tdd_venv/

Também verifiquei minha codificação de arquivos no Windows com o Notepad ++. A codificação foi definida como UTF-8.

JSalys
fonte