- As regras de ignorar arquivos no Git se dividem em três níveis conforme o escopo de compartilhamento:
.gitignore, .git/info/exclude e ~/.config/git/ignore
- O
.gitignore é commitado junto com o código do repositório, então é o lugar para colocar regras compartilhadas que a equipe ou o projeto devem aplicar em conjunto
- Itens como arquivos pessoais ou arquivos de trabalho local, que são necessários no repositório mas difíceis de justificar como regra da equipe, são mais adequados em
.git/info/exclude
- Arquivos que precisam ser excluídos repetidamente em todos os repositórios, como
.DS_Store no macOS, podem ser colocados em ~/.config/git/ignore, o arquivo de ignore global da máquina
git check-ignore -v <nome_do_arquivo> é útil para rastrear qual regra está fazendo um arquivo ser ignorado; se não houver regra correspondente, não há saída
Onde as regras de ignore do Git se aplicam
- O Git pode processar regras para ignorar arquivos em três locais
.gitignore
.git/info/exclude
~/.config/git/ignore
.gitignore: regras compartilhadas que são commitadas no repositório
.gitignore é o arquivo comum onde se escrevem os nomes dos arquivos a serem ignorados
- Ele é versionado no Git junto com o restante do código
- Arquivos que correspondem às regras do
.gitignore não são considerados durante a execução de comandos do git
.git/info/exclude: regras pessoais por repositório
- O arquivo
exclude fica dentro do diretório .git de todo repositório Git
- Alterações nesse arquivo não são commitadas no Git
- Em um repositório Git novo, ele normalmente contém algumas linhas de comentário
- É apropriado para arquivos que você quer ignorar apenas naquele repositório, mas não quer colocar no
.gitignore
- Exemplo: se você quiser manter
notes.txt fora dos commits sem adicioná-lo ao .gitignore do projeto, por ser algo necessário apenas no seu fluxo de trabalho pessoal, adicione notes.txt em .git/info/exclude
~/.config/git/ignore: regras globais da máquina
- O arquivo global de
ignore fica em ~/.config/git/ignore no diretório home
- Nomes de arquivos adicionados ali passam a ser ignorados globalmente no nível da máquina
- Ele não é commitado no Git nem está vinculado a um repositório específico
- É um bom lugar para colocar arquivos que você quer ignorar em todos os repositórios Git do computador
- Exemplo: no macOS, faz sentido adicionar
.DS_Store aqui
Alterando o caminho do arquivo global de ignore
- O arquivo global de ignore pode ser definido para outro arquivo
- Para usar
.gitignore_global como arquivo global de ignore do Git, execute o seguinte comando
git config --global core.excludesFile ~/.gitignore_global
- Para voltar à configuração padrão, execute o seguinte comando
git config --global --unset core.excludesFile
Como verificar qual regra está ignorando um arquivo
- Com
git check-ignore -v <nome_do_arquivo>, você pode verificar qual regra está fazendo um arquivo específico ser ignorado
- Para verificar como
.DS_Store está sendo ignorado, execute o seguinte comando dentro de um repositório Git
git check-ignore -v .DS_Store
- Se o
.gitignore do repositório estiver ignorando .DS_Store, um exemplo de saída será o seguinte
$ git check-ignore -v .DS_Store
.gitignore:1:.DS_Store .DS_Store
- Se o
.git/info/exclude do repositório estiver ignorando .DS_Store, um exemplo de saída será o seguinte
$ git check-ignore -v .DS_Store
.git/info/exclude:7:.DS_Store .DS_Store
- Se o arquivo global
~/.config/git/ignore estiver ignorando .DS_Store, um exemplo de saída será o seguinte
$ git check-ignore -v .DS_Store
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
- Se o arquivo global de ignore personalizado
.gitignore_global estiver ignorando .DS_Store, um exemplo de saída será o seguinte
$ git check-ignore -v .DS_Store
/Users/nelson/.gitignore_global:1:.DS_Store .DS_Store
- Se não houver nenhuma regra para ignorar um arquivo específico, o comando
git check-ignore -v não produz nenhuma saída
3 comentários
Também pode ser útil colocar coisas como o spec de trabalho ou arquivos
plan.mdem.git/info/exclude.Então existia uma configuração na raiz, hein? haha
Comentários do Hacker News
Artigo interessante, mas faltou o meu recurso favorito de quase ignorar no Git:
.gitattributesCom esse arquivo, dá para dizer ao Git para "ignorar" diferenças de arquivos específicos. Por exemplo, em projetos Node,
package-lock.jsoné quase puro ruído do ponto de vista do Git. Você acaba vendo diferenças enormes com versões exatas de bibliotecas, enquanto a informação real de versão, mais legível para humanos, já está separada nopackage.jsonSe adicionar uma linha
package-lock.json -diffno.gitattributesda raiz do projeto, o arquivo continua sendo staged/commitado, mas ogit diffdeixa de mostrar aquelas diferenças gigantes e sem significadopackage-lock.jsonnão deveria ser ruído. Se você não pretende atualizá-lo de propósito, então não deveria atualizá-lo; caso contrário, fica exposto a risco de cadeia de suprimentos sem motivoSe mudanças em
package-lock.jsonaparecem com frequência de forma inesperada, então algo está sendo feito erradopackage-lock.jsonmostra todas as dependências transitivas, enquantopackage.jsonmostra apenas dependências diretas. Então dizer que o segundo traz a "versão real legível por humanos" não está corretoOs dois têm propósitos diferentes, e dizer que sempre dá para ignorar diferenças no arquivo de lock é perigoso
git diffnão mostrasse as diferenças do arquivo de lockEntendo que pareça ruído linha a linha, mas quando precisa, precisa mesmo
Configuração global/de usuário para exclusões é um recurso que deveria ser mais conhecido. Eu recebo com frequência mudanças querendo adicionar arquivos de IDE/OS/IA ao
.gitignorede todos os projetos, e quando explico que dá para colocar isso na configuração padrão, ignorar em todo lugar, não mexer em cada projeto e ainda evitar o risco de commitar sem querer em projetos cujo.gitignorenão foi atualizado, a maioria gosta da ideiaMinha regra pessoal é que o
.gitignoredentro do repositório deveria ser usado só para itens específicos do repositório, como artefatos de build e pastas de dependências, enquanto a maioria das ferramentas de usuário deveria ficar na configuração individual de cada um.gitignoreé uma consequência natural do princípio de usar o.gitignoredo repositório apenas para itens específicos do repositórioSe a ideia é gastar menos tempo de todo mundo, é melhor simplesmente colocar esses arquivos no
.gitignoreem todos os projetos.gitignoredo projeto para evitar que alguém, por desconhecimento, os adicionasse ao projetoNo fim das contas, isso seria removido do Git de qualquer forma, e a pessoa teria dor de cabeça; então eu já bloqueava antes por gentileza. Talvez eu seja menos gentil daqui para frente
gitignoreporque ele sobrevive à reconstrução de contêineres de desenvolvimentoSe for para evitar
gitignore, ainda dá para restaurar/manter a configuração com script de geração ou volume, mas aí você precisa de script extra ou configuração de mount nodevcontainerem vez de uma simples linha no.gitignoreQuanto à configuração global do Git e arquivos de ignore, acho mais correto usar
~/.config/git/ignoree~/.config/git/configem vez de criar~/.gitignore_globale mexer na configuraçãoQuando você usa
~/.config/para várias coisas, a quantidade de dotfiles na raiz fica bem menorO Git exclude é menos usado porque não é commitado no repositório; então, sempre que você quer usá-lo, precisa recriá-lo. Não estou dizendo que isso é ruim, só que é esse o motivo de ser menos usado
~/.config, depois fica fácil modificar e compartilhar~/.cvsignorepara outras ferramentas que leem o mesmo arquivoNão sei onde aprendi isso, mas adicionei
atticao meu Git ignore globalAí posso criar um diretório
atticem qualquer projeto para guardar coisas aleatórias que jamais deveriam ser commitadas. Ainda não vi um repositório que de fato verifique a existência de um diretório dessesSe houver um diretório como
attic, você pode criarattic/.gitignorecom/**, e isso faz com que o diretório e todo o conteúdo dele sejam ignorados, inclusive o próprio arquivo de ignoreNormalmente eu dou ao meu diretório uma versão com um único caractere U+1F4A9, mas o HN não permite colocar isso nos comentários
auxColoco dentro dele um
.gitignorecontendo apenas um asterisco*, e isso faz com que ele ignore a si mesmo e todo o conteúdo.localscratch/Até agora ainda não me atrapalhou
Sobre ignores por usuário: no macOS, o ideal seria colocar
.DS_Storeali, mas isso exige que todos os usuários de Mac do projeto façam o mesmoSe forem duas pessoas ou mais, talvez seja melhor não deixar isso a cargo de cada uma
.DS_Storeno arquivo~/.gitignore_global, e a configuração global do Git também já está definida para ignorar os itens desse arquivoA data desse arquivo no Mac novo é de dois dias antes de eu encomendá-lo, e não lembro de ter configurado isso manualmente, então imagino que tenha vindo por padrão. O Mac antigo provavelmente era parecido e, olhando as versões do macOS, isso talvez já seja o padrão há bastante tempo
Então talvez já tenha passado a época em que era preciso adicionar
.DS_Store/ao.gitignoreUau, como eu não sabia disso? Sou desenvolvedor profissional de software há 20 anos e sempre usei só
.gitignorePercebi que nunca nem me perguntei se havia um jeito melhor do que bagunçar o
.gitignorecom todo tipo de exclusão que só importa para mim. Eu simplesmente aceitava o mundo como ele apareciaHoje o mundo ficou um pouco melhor
Uso muito
.git/info/exclude. É perfeito para scripts/Makefilesó locais, que não são necessários para colaboradores nem poderiam ser usados por eles.git/info/excludetodos os arquivos não rastreados mostrados porgit statusNormalmente aplico isso depois de
addecommitno que eu realmente quero colocar no repositórioEm diretórios de projeto com configuração Git por projeto diferente para vários repositórios, eu uso arquivos de excludes desta forma
https://laszlo.nu/blog/project-level-git-config.html
Tenho alguns aliases relacionados que uso
assume = update-index --assume-unchangedunassume = update-index --no-assume-unchangedassumed = "!git ls-files -v | grep ^h | cut -c 3-"unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"assumeall = "!git st -s | awk {'print $2'} | xargs git assume"Para arquivos já rastreados, também existe
git update-index --[no]-skip-worktreePode ser útil para experimentos locais, mas como não é uma funcionalidade que o Git exponha muito bem, acaba sendo um pouco chato de usar. Você precisa lembrar do que configurou e, se esquecer, isso pode bloquear outras operações, como checkout