Os múltiplos `.gitignore`s são desaprovados?

239

A menos que um repositório consistisse em vários projetos independentes, parece que seria mais simples ter apenas um .gitignorearquivo na raiz do repositório do que vários. Existe uma prática recomendada padrão nesta ou em alguma análise on-line de quando uma abordagem é melhor que a outra?

Conley Owens
fonte

Respostas:

254

Posso pensar em pelo menos duas situações em que você gostaria de ter vários .gitignorearquivos em diferentes (sub) diretórios.

  • Diretórios diferentes têm tipos diferentes de arquivos a serem ignorados. Por exemplo, o .gitignorediretório no topo do seu projeto ignora os programas gerados, enquanto Documentation/.gitignoreignora a documentação gerada.

  • Ignorar arquivos dadas apenas em determinada (sub) anuário (você pode usar /sub/fooem .gitignore, embora).

Lembre-se de que os padrões no .gitignorearquivo se aplicam recursivamente ao (sub) diretório em que o arquivo está e a todos os seus subdiretórios, a menos que o padrão contenha '/' (por exemplo, o padrão namese aplica a qualquer arquivo nomeado nameno diretório especificado e a todos os seus subdiretórios, ao /namepasso que o arquivo com esse nome apenas no diretório especificado).

Jakub Narębski
fonte
1
Ah, por alguma razão, pensei que /Documentation/*.html cobriria isso, mas acho que o curinga * corresponderá apenas aos diretórios em um nível.
Conley Owens
9
@ConleyOwens: com Git moderno você pode usar Documentation/**/*.html(note que quaisquer âncoras reduzir o padrão; o /fooé usado para arquivo âncora diretamente no diretório)
Jakub Narębski
97

Como uma observação tangencial, um caso em que a capacidade de ter vários .gitignorearquivos é muito útil é se você deseja um diretório extra em sua cópia de trabalho que nunca pretende confirmar. Basta colocar um byte .gitignore(contendo apenas um asterisco) nesse diretório e ele nunca será exibido git statusetc.

Aristóteles Pagaltzis
fonte
4
você também pode usar o arquivo "
.git
10
Claro, se você não se importa com a dificuldade de abrir um arquivo em um local em algum lugar fora da raiz do repositório, grave um caminho inteiro nele e lembre-se de limpar a entrada se / quando você excluir o diretório. Compare isso com printf \* > .gitignore(a limpeza é automática quando você exclui o diretório). Estou certo de que há situações em que .git/info/excludeé a escolha mais apropriada, mas não muitas.
Aristóteles Pagaltzis
Sim, quando você deseja excluir um arquivo em vez de uma pasta, por exemplo: p
Ayell
4
Eu disse "se você quiser um diretório extra em sua cópia de trabalho que nunca pretende cometer" na minha resposta.
Aristóteles Pagaltzis
1
Como cria menos confusão no .gitignore raiz, eu gosto muito dessa abordagem.
David A. Gray
59

Você pode ter vários .gitignore, cada um, é claro, em seu próprio diretório.
Para verificar qual a regra gitignore é responsável por ignorar um arquivo, uso git check-ignore: git check-ignore -v -- afile.

E você pode ter uma versão diferente de um .gitignorearquivo por ramificação: eu já vi esse tipo de configuração para garantir que uma ramificação ignore um arquivo enquanto a outra ramificação não: veja essa pergunta, por exemplo .

Se o seu repositório incluir vários projetos independentes, seria melhor referenciá-los como submódulos .
Essas seriam as melhores práticas reais, permitindo que cada um desses projetos seja clonado independentemente (com seus respectivos .gitignorearquivos), enquanto são referenciados por uma revisão específica em um projeto pai global.
Veja a verdadeira natureza dos submódulos para obter mais.


Observe que, desde o git 1.8.2 (março de 2013), você pode fazer um git check-ignore -v -- yourfilepara ver a qual execução do gitignore (a partir de qual .gitignorearquivo) é aplicada ' yourfile' e entender melhor por que esse arquivo é ignorado.
Consulte " qual gitignoreregra está ignorando meu arquivo? "

VonC
fonte
17

Pro single

  • Fácil de encontrar.

  • Caçar regras de exclusão pode ser bastante difícil se eu tiver vários gitignore, em vários níveis no repositório.

  • Com vários arquivos, você também geralmente acaba com uma boa quantidade de duplicação.

Pro múltiplo

  • Escopos "conhecimento" para a parte da árvore de arquivos onde é necessário.

  • Como o Git rastreia apenas arquivos, um .gitignore vazio é a única maneira de confirmar um diretório "vazio".

    (E antes do Git 1.8, a única maneira de excluir um padrão como my/**.exampleera criar my/.gitignoreo padrão **.foo. Esse motivo não se aplica agora, como você pode fazer /my/**/*.example.)


Eu prefiro um único arquivo, onde posso encontrar todas as exclusões. Nunca perdi o diretório .svn por diretório e também não perdi o diretório .gitignore.

Dito isto, vários gitignores são bastante comuns. Se você os usar, pelo menos seja consistente no uso deles para torná-los razoáveis ​​para trabalhar. Por exemplo, você pode colocá-los nos diretórios apenas um nível da raiz.

Paul Draper
fonte
"um .gitignore vazio é a única maneira de confirmar um diretório" vazio "." Na verdade, acho que o upload de um único arquivo README (ou um arquivo chamado emptypara esse assunto) é mais comum.
Marc.2377
6
.gitkeep também é uma boa maneira de fazer isso ... apenas mais uma convenção. Eu gosto da ideia de usar um arquivo leia-me, porque então você pode explicar para que serve o diretório, nesse arquivo leia-me.
precisa
8

Há muitas situações em que você deseja cometer um diretório a sua repo Git, mas sem os arquivos nele, por exemplo, a logs, cache, uploadsdiretórios etc.

Então, o que eu sempre faço é adicionar um .gitignorearquivo nesses diretórios com o seguinte conteúdo:

*
!.gitignore

Com esse .gitignorearquivo, o Git não rastreia nenhum arquivo desses diretórios, mas ainda permite que eu adicione o .gitignorearquivo e, portanto, o próprio diretório ao repositório.

Lukman
fonte