Pergunta sobre git, gitignore – gitignore todos os arquivos de extensão no diretório

140

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.

Sua resposta

5   a resposta
2

Eu acredito que a solução mais simples seria usarfind. Eu não gosto de ter múltiplos.gitignore pendurado em subdiretórios e eu prefiro gerenciar um único e de nível superior.gitignore. Para fazer isso você pode simplesmente acrescentar os arquivos encontrados ao seu.gitignore. Supondo que/public/static/ é o seu projeto / git home eu usaria algo como:

find . -type f -name *.js | cut -c 3- >> .gitignore

Eu descobri que cortar o./ no começo é frequentemente necessário para o git entender quais arquivos devem ser evitados. Portanto, ocut -c 3-.

94

git help ignore sugere que, se você colocar um.gitignore com*.js em/public/static, vai fazer 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.

@haren não é a única solução - a resposta de Joey é certamente válida também. Escolha o que funciona melhor para você. Eu diria que as regras de ignorar locais para um diretório devem estar nesse diretório e que as regras globais devem ser globais. (Além disso, essa resposta é antiga e eu não acho que ** tenha sido suportada na época). ptyx
Isso não é necessário a melhor solução. Potencialmente, as pessoas precisarão cavar diferentes arquivos .gitignore para descobrir por que o arquivo está sendo ignorado. Alguns preferem ter todas essas informações em um arquivo .gitignore armazenado no diretório raiz do repositório. haren
61

@ Resposta de Joey: Git agora suporta o** sintaxe em padrões. Ambas as abordagens devem funcionar bem.

oPágina man do gitignore (5) estados:

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 árvore de trabalho) sendo substituídos por aqueles em arquivos de nível inferior até o diretório contendo o arquivo.

O que isto significa é que os padrões em um.gitignore arquivo em qualquer diretório do seu repositório afetaráesse diretório etodos os subdiretórios.

O padrão que você forneceu

/public/static/**/*.js

não está certo, em primeiro lugar porque (como você observou corretamente) o** sintaxe não é usada pelo Git. Além disso, o líder/ ancora esse padrão ao início do nome do caminho. (Assim,/public/static/*.js corresponderá/public/static/foo.js masnão /public/static/foo/bar.js.)Removendo o líder/ também não funciona, combinando caminhos comopublic/static/foo.js efoo/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<repo>/public/static/.gitignore e inclua apenas este padrão:

*.js

Não há nenhum líder/, assim ele corresponderá em qualquer parte do caminho, e esse padrão só será aplicado a arquivos no caminho/public/static diretório e seus subdiretórios.

Isso não é inteiramente verdade - especificamente a parte "Removendo o líder/ também não funciona, combinando caminhos comopublic/static/foo.js efoo/public/static/bar.js"é falso. Para citara documentação "Se o padrão não contiver uma barra /, o Git o tratará como um padrão shell glob e verificará uma correspondência com o nome do caminho relativo ao local do arquivo .gitignore (relativo ao nível superior da árvore de trabalho, se não de um arquivo .gitignore). arquivo gitignore). "foo/public/static/bar.js não seria correspondido porque o padrão contém um/. joeyhoer
@JoeyHoer graças à dica, atualizei minha resposta de acordo. Adam Sharp
164

** sintaxe é suportada porgit a partir da versão1.8.2.1 de acordo coma documentação.

Dois asteriscos consecutivos ("**") em padrões comparados com o caminho completo, pode ter um significado especial:

Uma liderança "**"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 trailing "/**"combina tudo dentro. Por exemplo,"abc/**"corresponde a todos os arquivos dentro do diretório"abc", em relação à localização do.gitignore arquivo, com profundidade infinita.

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

Outros asteriscos consecutivos são considerados inválidos.

Todos os arquivos com o .meta final devem ser ignorados pelo git. Como é que isso funciona?**.js ? Black
xxx/** alvos todos os arquivos e diretórios dentro dexxx enquanto quexxx/ tem como alvoxxx diretório diretamente. Isso realmente importa apenas quando negando padrões com! como "Não é possível reincluir um arquivo se um diretório pai desse arquivo for excluído".xxx/* ouxxx/** seria necessário nesse caso. joeyhoer
"Outros asteriscos consecutivos são considerados inválidos." resume tudo imrok
Qual é a diferença entrexxx/** exxx/? thuzhf
9

basta ir para .git / info / exclude. Excluir é um arquivo com uma lista de extensões ou arquivos ignorados.

Isso não seria transferido para outros clones do repositório, como o .gitignore faria (depois de estar comprometido, é claro). jpmc26

Perguntas relacionadas