gitignore todos os arquivos de extensão no diretório

Existe uma maneira de ignorar todos os arquivos de um tipo em um diretório?

** é aparentemente sem sentido para git, então isso não funciona:

 /public/static/**/*.js 

A ideia é combinar pastas aninhadas arbitrárias.

Nunca tentei, mas o git help ignore sugere que se você colocar um .gitignore com *.js em /public/static , ele fará o que quiser.

Nota: certifique-se também de verificar a resposta de Joeys abaixo: se você deseja ignorar arquivos em um subdiretório específico, então um .gitignore local é a solução correta (a localidade é boa). No entanto, se você precisar do mesmo padrão para aplicar em todo o repo, a solução é melhor.

Parece que a syntax ** é suportada pelo git partir da versão 1.8.2.1 acordo com a documentação .

Dois asteriscos consecutivos (” ** “) em padrões comparados com o caminho completo podem ter um significado especial:

  • Um ” ** ” inicial seguido por uma barra significa correspondência em todos os diretórios. Por exemplo, ” **/foo ” corresponde ao arquivo ou diretório ” foo ” em qualquer lugar, o mesmo que o padrão ” foo “. ” **/foo/bar ” corresponde ao arquivo ou diretório ” bar ” em qualquer lugar que esteja diretamente sob o diretório ” foo “.

  • Um ” /** ” final corresponde a tudo dentro. Por exemplo, ” abc/** ” corresponde a todos os arquivos dentro do diretório ” abc “, relativo à localização do arquivo .gitignore , com profundidade infinita.

  • Uma barra seguida por dois asteriscos consecutivos e uma barra corresponde a zero ou mais diretórios. Por exemplo, ” a/**/b ” corresponde a ” a/b “, ” a/x/b “, ” a/x/y/b ” e assim por diante.

  • Outros asteriscos consecutivos são considerados inválidos.

ATUALIZAÇÃO: Dê uma olhada na resposta do @ Joey : O Git agora suporta a syntax ** em padrões. Ambas as abordagens devem funcionar bem.


A página man gitignore (5) afirma:

Padrões lidos de um arquivo .gitignore no mesmo diretório que o caminho ou em qualquer diretório pai, com padrões nos arquivos de nível mais alto (até o nível superior da tree de trabalho) sendo substituídos pelos arquivos de nível inferior até o diretório contendo o arquivo.

Isso significa que os padrões em um arquivo .gitignore em qualquer diretório do .gitignore afetarão esse diretório e todos os subdiretórios .

O padrão que você forneceu

 /public/static/**/*.js 

não está certo, em primeiro lugar porque (como você observou corretamente) a syntax ** não é usada pelo Git. Além disso, as âncoras / âncoras que padronizam para o início do nome do caminho. (Assim, /public/static/*.js corresponderá a /public/static/foo.js mas não a /public/static/foo/bar.js .) A remoção da entrelinha / não funcionará também, combinando caminhos como public/static/foo.js e foo/public/static/bar.js EDIT: Apenas remover a barra inicial não funcionará também – porque o padrão ainda contém uma barra, ele é tratado pelo Git como um shell simples, não recursivo (obrigado @Joey Hoer por apontar isso).

Como sugeriu @ptyx, o que você precisa fazer é criar o arquivo /public/static/.gitignore e include apenas este padrão:

 *.js 

Não há lead / , portanto, ele corresponderá em qualquer parte do caminho, e esse padrão só será aplicado aos arquivos no diretório /public/static e seus subdiretórios.

Para ignorar arquivos não rastreados, vá para .git / info / exclude. Excluir é um arquivo com uma lista de extensões ou arquivos ignorados.

Eu acredito que a solução mais simples seria usar o find . Eu não gosto de ter vários .gitignore pendurados em subdiretórios e eu prefiro gerenciar um único .gitignore nível .gitignore . Para fazer isso, você pode simplesmente append os arquivos encontrados ao seu .gitignore . Supondo que /public/static/ seja seu projeto / git home eu usaria algo como:

 find . -type f -name *.js >> .gitignore