Por que o Git não ignora meu arquivo especificado?

195

Adicionei a seguinte linha a .gitignore:

sites/default/settings.php

mas quando eu digito, git statusele mostra o arquivo como arquivo não estático.

Qual é o problema? Todos os outros padrões funcionam bem.

Nick.h
fonte
Eu tive o mesmo problema, então eu descobri que eu salvo meu arquivo .gitignore em uma unidade diferente em vez disso: face-palm:
Henry Chan
É uma péssima idéia manter as coisas no seu repositório e ignorar as alterações nele.
Yevgeniy Afanasyev 29/08

Respostas:

370

Certifique-se de que o seu .gitignoreestá na raiz do diretório de trabalho, e nesse diretório prazo git statuse copiar o caminho para o arquivo a partir da saída de status e cole-o no .gitignore.

Se isso não funcionar, é provável que seu arquivo já esteja rastreado pelo Git. Você pode confirmar isso através da saída de git status. Se o arquivo não estiver listado na seção "Arquivos não rastreados" , ele já será rastreado pelo Git e ignorará a regra do .gitignorearquivo.

O motivo para ignorar arquivos no Git é para que eles não sejam adicionados ao repositório. Se você adicionou anteriormente um arquivo que deseja ser ignorado, ele será rastreado pelo Git e as regras de ignorância correspondentes serão ignoradas. O Git faz isso porque o arquivo já faz parte do repositório.

Para realmente ignorar o arquivo, você deve rastreá-lo e removê-lo do repositório. Você pode fazer isso usando git rm --cached sites/default/settings.php. Isso remove o arquivo do repositório sem excluir o arquivo fisicamente (é o que --cachedfaz). Após confirmar essa alteração, o arquivo será removido do repositório e ignorá-lo deve funcionar corretamente.

cutucar
fonte
O que você quer dizer com 'raiz do diretório de trabalho'? O diretório em que o repositório '.git' é encontrado?
Jonathan Leffler
O diretório de trabalho é o diretório em que o .gitdiretório está localizado e qual é a raiz do repositório. Como quando você clonar um repositório para /xy/, em seguida, /xy/é o seu diretório de trabalho com /xy/.git/dentro.
cutuca
3
Às vezes, você também precisará fazer um git add .depois git rm --cachedpara reconstruir adequadamente o índice.
Cooper
A ideia de verificar no status git foi brilhante. Continuei a checá-lo no Git Staging no Eclipse e o caminho estava incorreto. Obrigado!
walla
1
Eu precisava adicionar o sinalizador -r (recursivo), pois havia aninhado pastas também. No meu caso, mudei para a raiz da minha pasta git e executei o comando git rm --cached -r .vs / Where vs era a pasta de nível superior que eu queria remover do rastreamento.
Devology Ltd
106

Eu me deparo com isso, é uma pergunta antiga, mas quero que o arquivo seja rastreado, mas não em determinadas cópias de trabalho. Para fazer isso, você pode executar

git update-index --assume-unchanged sites/default/settings.php
Mescalito
fonte
5
Essa é realmente a resposta que eu estava procurando. Todas as outras respostas assumem que o arquivo foi adicionado com o git add, o que nem sempre é o caso. Com o Acquia Cloud, o arquivo .gitignore deve ignorar o settings.php (por exemplo), mas o arquivo é incluído no primeiro commit. Cancelando o arquivo, simplesmente exclui-lo do repositório, portanto, excluí-lo do site ao vivo ...
Patricks
Também me ajudou - obrigado! Votado. Eu suspeito que ele se aplique apenas ao repositório git local e não persistiria uma vez enviado para remoto e clonado por outros desenvolvedores?
31316 Ivan
1
Sim, é apenas local.
Mescalito
41

O .gitignore ignorará apenas os arquivos que você ainda não adicionou ao seu repositório.

Se você fez um git add .e o arquivo foi adicionado ao índice, o .gitignore não o ajudará. Você precisará fazer isso git rm sites/default/settings.phppara removê-lo e, em seguida, ele será ignorado.

jonescb
fonte
thanks.but Como removo o arquivo apenas do índice e não do diretório de trabalho?
Nick.h
1
git rmdeve fazer isso, mas pode estar pedindo para você usar a opção -f que a removeria do diretório de trabalho. Eu não percebi isso além de fazer uma cópia do arquivo, fazer git rm -fe depois restaurar a cópia.
Jonescb
O mesmo homem. Faça uma cópia em algum lugar, remova-a, confirme o estado removido, adicione os arquivos novamente e veja como eles são ignorados agora.
Yevgeniy Afanasyev 29/08
18

Por favor use este comando

git rm -rf --cached .
git add .

Às vezes, os arquivos .gitignore não funcionam, mesmo que estejam corretos. O motivo pelo qual o Git ignora arquivos é que eles não são adicionados ao repositório. Se você adicionou um arquivo que deseja ignorar antes, ele será rastreado pelo Git, e todas as regras correspondentes serão ignoradas. O Git faz isso porque o arquivo já faz parte do repositório.

LiQiang
fonte
12

Eu tive o mesmo problema. Arquivos definidos .gitingoreonde listados como arquivos não rastreados durante a execução git status.

O motivo foi que o .gitignorearquivo foi salvo na UTF-16LEcodificação e não na UTF8codificação.

Depois de alterar a codificação do .gitignorearquivo UTF8, funcionou para mim.

Floris Devreese
fonte
Eu me sinto como um noob por causa disso ... Dang ele o Windows
Coty Embry
Alguma idéia de por que a codificação do arquivo é importante? Talvez não esteja lendo o caminho corretamente?
Chargnn 02/12/19
2

O que fiz para ignorar o arquivo settings.php com sucesso:

  1. git rm - sites em cache / default / settings.php
  2. confirmar (até aqui não funcionou)
  3. sites manualmente excluídos / default / settings.php (isso fez o truque)
  4. git add.
  5. confirmar (ignorado com sucesso)

Eu acho que se houver o arquivo confirmado no Git, ignorar não funciona como esperado. Basta excluir o arquivo e confirmar. Depois isso vai ignorar.

Alper Ebicoglu
fonte
2

Há instâncias, por exemplo, arquivos de configuração de aplicativos, que eu quero rastrear no git (para que o .gitignore não funcione), mas que eu preciso alterar as configurações locais. Eu não quero que o git gerencie esses arquivos ou mostre-os como modificados. Para fazer isso, eu uso o skip-worktree:

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

Você pode confirmar que os arquivos foram ignorados listando-os e verificando se há linhas começando com S para ignorar.

git ls-files -v | grep ^S

Se no futuro você quiser que o git gerencie o arquivo localmente novamente, basta executar:

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

Mescalito acima teve uma ótima resposta, que me levou pelo caminho certo, mas

git update-index - assume o arquivo inalterado / para / ignore.php

Possui um contrato com o git, no qual: o usuário promete não alterar o arquivo e permite ao Git assumir que o arquivo da árvore de trabalho corresponde ao que está registrado no índice.

No entanto, como altero o conteúdo dos arquivos, no meu caso - skip-worktree é a melhor opção.

O site de Toshiharu Nishina forneceu uma excelente explicação sobre skip-worktree vs assume-inalterado: Ignore arquivos já gerenciados com o Git localmente

J.Leupp
fonte
2

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 de .gitignore: commit após commit:

  1. Você comete alguma coisa.
  2. Em seguida, confirme: ignora as configurações de .gitignore. A confirmação inclui muitos arquivos temporários mencionados no .gitignore.
  3. Limpar cache do git; verifique se .gitignore é UTF8; remover arquivos -> confirmar -> mover arquivos de volta; pule 1 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 VS Code possui controle git interno, e isso cria alguns conflitos.

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

Oleg Zarevennyi
fonte
1

Verifique se o .gitignore não possui uma extensão !! Não pode ser .gitignore.txt, no Windows, apenas nomeie o arquivo .gitignore. e vai funcionar.

ZackOfAllTrades
fonte
0

Eu apenas tentei isso com o git 1.7.3.1 e recebi uma estrutura como:

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

onde repoassim é a "raiz" mencionada acima (eu chamaria de raiz da sua árvore de trabalho) e .gitignorecontém apenas sites/default/settings.php, o ignorar funciona para mim (e não importa se .gitignorefoi adicionado ao repositório ou não). Isso corresponde ao seu layout de repo? Se não, o que difere?

Johan
fonte
Sim. É exatamente o mesmo que o seu. Mas não funciona. Todos os outros padrões funcionam. Como eu disse, o problema certamente é relativo à pasta settings.php.
Nick.h
Eu acho que é uma péssima idéia manter as coisas no seu repositório e ignorar as alterações nele.
Yevgeniy Afanasyev 29/08
@YevgeniyAfanasyev exceto para coisas como saída de compilação, as configurações do usuário IDE, todos os outros arquivos temporários gerados pelo seu conjunto de ferramentas ...
Chris F Carroll
Eu quis dizer manter o comprometimento no repositório, não apenas os arquivos na pasta do projeto. Por que você precisaria de arquivos temporários no repositório?
Yevgeniy Afanasyev
0

Caso alguém no futuro tenha o mesmo problema que eu:

Se você usar o

*
!/**/
!*.*

truque para remover arquivos binários sem extensão, verifique se TODAS as outras linhas do gitignore estão ABAIXO. O Git lerá .gitignore da parte superior, portanto, embora eu tenha 'test.go' no meu gitignore, ele foi o primeiro no arquivo e tornou-se 'não-autorizado' depois

!*.*
Alasdair Mclean
fonte
0

Eu tentei a maioria dos comandos acima no terminal VS Code e obtive erros como:

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

Abri o projeto no GitHub Desktop e ignorei a partir daí, e funcionou.

Danna Capellan
fonte