Como posso impedir que o .gitignore apareça na lista de arquivos não rastreados?

971

Acabei de fazer um git initna raiz do meu novo projeto.

Então eu criei um .gitignorearquivo.

Agora, quando eu digito git status, o arquivo .gitignore aparece na lista de arquivos não rastreados. Por que é que?

Jacques René Mesrine
fonte
13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Alastair
1
Posso ignorar a pasta .git / e colocá-la em ".gitignore"?
Timo
2
Você poderia criar um "gitignore" global na sua pasta pessoal no Linux e armazená-lo lá: git configuração --global core.excludesfile ~ / .gitignore_global
Timo
14
Eu vim aqui pesquisando how to gitignore .gitinore filee a pergunta e a resposta aceita não estão realmente relacionadas ao título. O título pode ser melhorado.
m.rufca
6
Existem casos de uso para ignorar .gitignore. O fluxo de trabalho da minha equipe exige que eu altere um conjunto de arquivos para o meu ambiente de desenvolvimento local, mas eles não devem ser confirmados. O fluxo de trabalho pode ser melhorado com uma arquitetura melhor, mas está fora do meu alcance. Enquanto isso, ter o git prestando atenção nesses arquivos é uma obrigação. Portanto, quero fazer o gitignore deles, mas apenas localmente, e não quero arriscar cometer o meu .gitignore, pois ele não deve ser compartilhado com a equipe.
Mark

Respostas:

959

O .gitignorearquivo deve estar no seu repositório, portanto deve ser adicionado e confirmado, comogit status sugere. Ele deve fazer parte da árvore do repositório, para que as alterações nele possam ser mescladas e assim por diante.

Portanto, adicione-o ao seu repositório, ele não deve ser gitignored.

Se você realmente deseja, pode adicionar .gitignoreao .gitignorearquivo se não desejar que ele seja confirmado. No entanto, nesse caso, provavelmente é melhor adicionar os .git/info/excludeitens ignorados , um arquivo local de checkout especial que funciona exatamente como .gitignore, mas não aparece no "status git", pois está na .gitpasta.

Consulte também https://help.github.com/articles/ignoring-files

August Lilleaas
fonte
17
Isso não deveria fazer parte dos metadados do repositório, e não um arquivo rastreado?
endolith 12/03/10
13
Os metadados do repositório são locais para o repositório. Se você adicionar um gancho de confirmação ao seu repositório e alguém cloná-lo, ele não receberá o gancho, por exemplo.
August Lilleaas 13/03/10
91
@ wukong, se você está trabalhando em equipe, todos deveriam ignorar o mesmo conjunto de arquivos? É por isso que o arquivo .gitignore é adicionado ao repositório. Ninguém diz que você precisa implantá-lo como parte do seu projeto.
Ryan Lundy
13
@endolith e wukong Não precisa ser um arquivo no seu repositório. Você pode fazer as configurações de ignorar em muitos lugares diferentes. O GitHub possui um ótimo artigo: help.github.com/ignore-files Você pode ter configurações globais de ignorar em qualquer lugar e configurações específicas de repo nos metadados .git do repo.
Boushley
6
@ deed02392 Ao usar esses arquivos ignorados, você certamente precisa julgar o que colocar neles, mas eles ainda têm ótimos usos. Por exemplo, eu uso o Vim e, no meu gitignore global, tenho arquivos * .swp marcados como ignorados. Dessa forma, não preciso adicioná-lo a cada um dos meus projetos, e os caras que nunca usam o vim não precisam se preocupar com isso.
Boushley
282

Se você deseja armazenar a lista de arquivos ignorados fora da sua árvore do Git, use o arquivo .git / info / exclude . É aplicado apenas ao checkout do repo.

Paweł Hajdan
fonte
19
+1, isso é ótimo para ignorar que não são relacionados ao projeto, como arquivos de backup do emacs * ~, .DS_Store do OS X e assim por diante.
August Lilleaas
38
@AugustLilleaas Pessoalmente, prefiro colocar esses tipos de arquivos específicos do {editor, platform}, ~/.gitignorepara que sejam ignorados em qualquer repositório em que trabalho.
Michael Mior
22
Depois que um arquivo é rastreado, você pode usar git update-index --assume-unchanged <file>para interromper o rastreamento de alterações sem alterar seu repo. Isso é muito útil em grandes projetos compartilhados, nos quais você precisa fazer alterações locais, mas ninguém mais quer ver suas coisas comprometidas com o repositório. Veja blog.pagebakers.nl
Chris Esplin
6
@AugustLilleaas: o gitignore por usuário é melhor para esse caso de uso.
Caracol mecânico
3
obrigado por esta dica, estou usando git-svn para que os outros usuários do SVN repo no servidor não gostaria exatamente .gitignore o check-in.
enorl76
74

Você pode realmente colocar uma linha .gitignoreno seu .gitignorearquivo. Isso faria com que o .gitignorearquivo fosse ignorado pelo git. Na verdade, não acho que seja uma boa ideia. Eu acho que o arquivo ignorar deve ser controlado e rastreado por versão. Eu só estou colocando isso lá fora para ser completo.

1800 INFORMAÇÃO
fonte
7
Trabalhou para mim! versão 1.5.6.5. Também concordo com o 1800 Information que não é uma boa ideia, mas acho que pode ser bom em certos contextos (digamos que você use um repositório git-svn e não queira que os arquivos git-ish acessem o svn). O arquivo de exclusões é provavelmente melhor.
J. Polfer
4
@ehsanul - o arquivo não deve ser rastreado (você não deveria ter adicionado ou confirmado). Você pode rastrear isso. Provavelmente, essa não é uma ótima idéia em um ambiente somente para git, mas se você, por exemplo, usar o git como um cliente inteligente para um repositório do subversion (sem o resto saber, <risadas maníacas>) - esse truque é ótimo.
Tomasz Gandor
2
@IshanSrivastava Você provavelmente já tem o arquivo rastreado. Tente corrergit rm --cached .gitignore
Gideon
51

Você também pode ter um .gitignorearquivo git de usuário global que será aplicado automaticamente a todos os seus repositórios. Isso é útil para IDE e arquivos de edição (por exemplo, swpe *~arquivos para o Vim). Altere os locais do diretório para se adequar ao seu sistema operacional.

  1. Adicione ao seu ~/.gitconfigarquivo:

    [core]
    excludesfile = /home/username/.gitignore
    
  2. Crie um ~/.gitignorearquivo com padrões de arquivos a serem ignorados.

  3. Salve seus arquivos de ponto em outro repositório para ter um backup (opcional).

Sempre que você copiar, iniciar ou clonar um repositório, seu arquivo gitignore global também será usado.

Alec the Geek
fonte
6
Acredito que esta é a melhor solução para situações em que seus editores deixam para trás arquivos temporários, por exemplo. *. Swp (VIM) e ._ * (TM), pois não faria sentido adicionar continuamente essas regras a todos os repositórios git, e forçar outros usuários com IDEs diferentes a verificar esses arquivos.
Thomas Hunter II
1
Isso funciona de maneira brilhante para ignorar que não deve ser enviado a nenhum ramo. Substitua 'username' pelo seu nome de usuário real, é claro, e não adicione uma segunda seção [core] ao .gitconfig, se você já tiver uma - basta colocar a linha de exclusão de arquivo sob a seção [core] existente.
esmeril
47

Se alguém já adicionou um .gitignoreao seu repositório, mas você deseja fazer algumas alterações e ignorá-las, faça o seguinte:

git update-index --assume-unchanged .gitignore

Fonte .

Leif Gruenwoldt
fonte
5
Má ideia, existe uma razão .git/info/excludes.
Arrowmaster
6
Presumo que --assume-unchangedtambém exista uma razão . Por que um é melhor que o outro?
Leif Gruenwoldt 10/02
9
E btw .git/info/excludesnão funciona se o arquivo já estiver rastreado.
Leif Gruenwoldt
Isso realmente me ajudou com um .gitignore que já estava confirmado e para o qual eu não desejava confirmar alterações. Estou executando o git 1.7.4.1 no Ubuntu 11.04 repos e as páginas de ajuda o adicionam no índice de atualização. "Esta opção também pode ser usada como um mecanismo grosseiro no nível do arquivo para ignorar alterações não confirmadas nos arquivos rastreados (semelhante ao que o .gitignore faz para arquivos não rastreados). O Git falhará (normalmente) caso precise modificar esse arquivo no índice por exemplo, ao mesclar em uma confirmação; portanto, caso o arquivo assumido não rastreado seja alterado a montante, você precisará lidar com a situação manualmente. "
YonahW 10/05
Eu voto nessa resposta, porque geralmente você precisará dessa ação para o estado inicial do repo master e manterá os benefícios da funcionalidade git. Não há nenhuma boa razão para ignorar este arquivo (período)
Lazaros Kosmidis
37

Depois de adicionar .gitignoree confirmar o arquivo, ele não será mais exibido na lista "arquivos não rastreados".

git add .gitignore
git commit -m "add .gitignore file"
git status
Greg Hewgill
fonte
20

Apenas coloque alguém que tenha a mesma dor que tivemos. Queríamos excluir um arquivo que já havia sido confirmado.

Esta postagem foi muito mais útil: trabalhar com .git / info / exclude tarde demais

Especificamente, o que você precisa para ignorar um arquivo é realmente usar o comando git remove Consulte git rm ( http://www.kernel.org/pub/software/scm/git/docs/git-rm.html )

você testa indo

git rm --dry-run *.log
(se você quiser excluir todos os arquivos de log)

isso produzirá o que seria excluído se você o executasse.

então

você executa indo

git rm *.log
(ou o caminho / expressão do nome de arquivo que você deseja)

Em seguida, adicione uma *.loglinha ao seu .gitignorearquivo.

Evoluir
fonte
4
Obviamente, você pode querer continuar adicionando os padrões relevantes (por exemplo, * .log) ao seu .gitignore, para que eles não fiquem confusos git statusse aparecerem no futuro.
Patrick O'Leary
2
Embora meu problema não tenha sido o mesmo que o OP: obrigado por me informar que eu precisaria usar o RM para "limpar" meu repositório depois de fazer alterações no arquivo .gitignore (se os arquivos já foram confirmados.) , Eu sei, mas esse foi o primeiro lugar que eu pessoalmente vi alguém mencionar isso.
29511 Mike
Obrigado pelo feedback. Sim, foi por isso que eu o escrevi, tendo vindo aqui e depois percorrendo o longo caminho para resolver isso também, pensei que seria bom escrevê-lo. :)
Evolve
16

É claro que o arquivo .gitignore está aparecendo no status, porque não é rastreado, e o git o vê como um novo arquivo saboroso para comer!

No entanto, como .gitignore é um arquivo não rastreado, é um candidato a ser ignorado pelo git quando você o coloca no .gitignore!

Portanto, a resposta é simples: basta adicionar a linha:

.gitignore # Ignore the hand that feeds!

para o seu arquivo .gitignore!

E, ao contrário da resposta de agosto, eu diria que não é que o arquivo .gitignore deve estar em seu repositório. Acontece que pode ser, o que geralmente é conveniente. E provavelmente é verdade que esse é o motivo pelo qual o .gitignore foi criado como uma alternativa ao .git / info / exclude, que não tem a opção de ser rastreado pelo repositório. De qualquer forma, a forma como você usa o arquivo .gitignore depende totalmente de você.

Para referência, consulte a página de manual do gitignore (5) no kernel.org.

correr atrás
fonte
15

A idéia é colocar arquivos específicos do seu projeto no .gitignorearquivo e (como já mencionado) adicioná-lo ao repositório. Por exemplo .pyce.o arquivos, registra que o testsuite cria, algumas luminárias etc.

Para arquivos criados por sua própria instalação, mas que não necessariamente aparecerão para todos os usuários (como .swparquivos se você usar vim, diretórios ocultos ocultos e similares), você deve usar .git/info/exclude(como já mencionado).

bayer
fonte
14

Primeiro de tudo, como muitos outros já disseram, você .gitignoredeve ser rastreado pelo Git (e, portanto, não deve ser ignorado). Deixe-me explicar o porquê.

(TL; DR: confirme o .gitignorearquivo e use um global.gitignore para ignorar arquivos criados pelo seu IDE ou sistema operacional)

O Git é, como você provavelmente já sabe, um sistema de controle de versão distribuído . Isso significa que ele permite alternar entre versões diferentes (mesmo que o desenvolvimento tenha divergido em ramos diferentes) e também permite que vários desenvolvedores trabalhem no mesmo projeto.

Embora o rastreamento do seu .gitignoretambém tenha benefícios quando você alterna entre os instantâneos, o motivo mais importante para confirmar é que você deseja compartilhar o arquivo com outros desenvolvedores que estão trabalhando no mesmo projeto. Ao enviar o arquivo para o Git, outros colaboradores o obterão automaticamente .gitignorequando clonarem o repositório, para que não precisem se preocupar em confirmar acidentalmente um arquivo que não deve ser confirmado (como arquivos de log, diretórios de cache, credenciais de banco de dados). etc.). E se, em algum momento, o projeto .gitignorefor atualizado, eles poderão simplesmente executar essas alterações em vez de precisar editar o arquivo manualmente.

Obviamente, haverá alguns arquivos e pastas que você deseja ignorar, mas são específicos para você e não se aplicam a outros desenvolvedores. No entanto, esses não devem estar no projeto .gitignore. Existem outros dois lugares onde você pode ignorar arquivos e pastas:

  • Os arquivos e pastas criados pelo seu sistema operacional ou IDE devem ser colocados em um global.gitignore . O benefício é que isso .gitignoreé aplicado a todos os repositórios do seu computador, para que você não precise repetir isso para todos os repositórios. E não é compartilhado com outros desenvolvedores, pois eles podem estar usando um sistema operacional e / ou IDE diferente.
  • Arquivos que não pertencem ao projeto .gitignore, nem ao global .gitignore, podem ser ignorados usando exclusões explícitas do repositórioyour_project_directory/.git/info/exclude . Este arquivo não será compartilhado com outros desenvolvedores e é específico para esse repositório único
Nic Wortel
fonte
Bom mencionar for global.gitignore
Gruber
Acho que após a configuração inicial, o arquivo .gitignore deve ser ignorado, para que não haja alterações acidentais. Isso não significa que não pode mais ser alterado, mas está protegido contra acidentes, de certa forma. Os acidentes nesse arquivo podem causar confusão ou até pôr em risco algum trabalho; portanto, a "vedação" (ignorando a si mesma) também deve ser considerada.
Sasa
O @Sasa .gitignorefunciona apenas para ignorar arquivos que ainda não estão sendo rastreados pelo Git. Adicionar um arquivo já rastreado .gitignorenão impedirá que você cometa alterações nesse arquivo. Mesmo se isso fosse possível, como você confirmaria a alteração .gitignorequando ela instruir o Git a se ignorar?
Nic Wortel
@ Nic - eu passei a explicação detalhada para o meu ponto de vista na resposta separada @ na parte inferior deste tópico.
Sasa
12

Cuidado com o seguinte "problema" Às vezes, você deseja adicionar diretórios, mas nenhum arquivo dentro desses diretórios. A solução simples é criar um .gitignore com o seguinte conteúdo:

*

Isso funciona bem até que você perceba que o diretório não foi adicionado (conforme o esperado no seu repositório. A razão disso é que o .gitignore também será ignorado e, portanto, o diretório estará vazio. Portanto, você deve fazer algo assim :

*
!.gitignore
Labirinto
fonte
9

Isso parece funcionar apenas no diretório atual Gitpara ignorar todos os arquivos do repositório.

atualize este arquivo

.git/info/exclude 

com seu curinga ou nome do arquivo

*pyc
*swp
*~
Naskov
fonte
5

Se você já fez check-in .gitignore e deseja ignorar as modificações, confira esta resposta :

Tente usar este comando:

git update-index --assume-unchanged FILENAME_TO_IGNORE

Para revertê-lo (se você quiser confirmar alterações), use:

git update-index --no-assume-unchanged

ATUALIZAÇÃO :

Veja como listar os arquivos 'assumir inalterados' no diretório atual:

git ls-files -v | grep -E "^[a-z]"

Como a -vopção usará letras minúsculas para arquivos 'assumir inalterados'.

Aaron
fonte
4

No meu caso, quero excluir um arquivo existente. Apenas modificar .gitignore não funciona. Eu segui estes passos:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

Dessa maneira, limpei do cache o arquivo que desejava excluir e depois o adicionei ao .gitignore .

Andrea Perdicchia
fonte
melhor solução para mim. você também pode usar o git add. em segundo lugar, depois que git commit -m "fixação .gitignore"
brainray
3

Navegue para o diretório base do seu git repo e execute o seguinte comando:

echo '\\.*' >> .gitignore

Todos os arquivos de ponto serão ignorados, incluindo o irritante .DS_Store se você estiver em um Mac.

weffen
fonte
4
Eu não faria isso. Pode haver arquivos de ponto que você precisa. Em vez disso, eu apenas adicionaria .gitignore e .DS_Store literalmente.
Edward Falk
2

É bem possível que um usuário final queira que o Git ignore o arquivo ".gitignore" simplesmente porque as pastas específicas do IDE criadas pelo Eclipse provavelmente não são iguais ao NetBeans ou outro IDE. Portanto, para manter o IDE do código-fonte antagônico, facilita a vida ter um git personalizado ignorado que não seja compartilhado com toda a equipe, pois os desenvolvedores individuais podem estar usando IDEs diferentes.

John Brown
fonte
1

.gitignoreé sobre ignorar outros arquivos. git é sobre arquivos, então isso é sobre ignorar arquivos. No entanto, como o git trabalha com arquivos, esse arquivo precisa estar lá como o mecanismo para listar os outros nomes de arquivos.

Se fosse chamado .the_list_of_ignored_files, poderia ser um pouco mais óbvio.

Uma analogia é uma lista de itens de tarefas que você NÃO deseja executar. A menos que você os liste em algum lugar, existe algum tipo de lista de tarefas que você não saberá sobre eles.

Michael Durrant
fonte
1

Eu acho que há situações em que ignorar o .gitignore é muito útil. Por exemplo, quando você tem várias equipes ou uma equipe grande trabalhando na mesma base de código. Nesse caso, você precisa ter certas convenções, uma delas é sobre o que é ignorado no repositório git. Geralmente, trata-se de ignorar arquivos e diretórios criados pelo IDE ou OS, alguns logs gerados etc.

No entanto, existe uma força que tende a introduzir alterações não convencionais no .gitignorearquivo. o.gitignore arquivo pode ser alterado ainda mais por pessoa irresponsável, por engano, por uma ferramenta usada ou em outro caso.

Para ter uma força contrária a isso, podemos fazer o seguinte:

  1. O .gitignore inicial deve refletir a convenção nas equipes,
  2. Depois de pressionado, o .gitignore deve ser protegido adicionando a entrada .gitignore e pressionando essa alteração novamente.O .gitignorearquivo é " lacrado " dessa maneira.

O arquivo " selado " .gitignorepode ser alterado, apenas localmente, sem propagar esses trocadores para outros membros da (s) equipe (s). No entanto, se uma mudança for amplamente aceita em toda a equipe, é possível "destravá-la", altere-a e "selar" novamente. Isso não pode ser feito por engano, apenas intencionalmente.

Infelizmente, você não pode estar 100% protegido da estupidez, mas dessa maneira fez tudo o que pôde para impedir que coisas estúpidas acontecessem.

Se você tem uma equipe relativamente pequena com profissionais muito bons, isso não seria importante, mas mesmo esses caras gostariam de ter uma coisa a menos para se preocupar.

O uso .git/info/excludeé legal quando você não pode fazer nada sobre as configurações de infraestrutura, apenas cobrindo seu próprio ** para não cometer um erro.

Do ponto de vista do que é certo e do errado, estou votando por ter a entrada .gitignore dentro do .gitignorearquivo, dando a todos a liberdade de fazer localmente o que quiserem, mas não invadindo os outros.

Sasa
fonte
0

Eu descobri que o melhor lugar para configurar um ignorar para os .DS_Storearquivos traquinas é o .git/info/excludearquivo.

O IntelliJ parece fazer isso automaticamente quando você configura um repositório git nele.

Stephen McConnell
fonte
1
Arquivo ignorar global do usuário seria um lugar melhor para ignorar .DS_Store
Max Nanasy