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

Respostas:

121

Nunca tentei, mas git help ignoresugere que se você colocar um .gitignorecom *.jsno /public/static, ele vai fazer o que quiser.

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

ptyx
fonte
19
Não é necessária a melhor solução. Potencialmente, as pessoas precisam procurar em 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 repo.
haren 24/03
1
@haren não é a única solução - a resposta de Joey também é certamente válida. Escolha o que for melhor para você. Eu diria que ignorar regras locais para um diretório deve estar nesse diretório e que regras globais devem ser globais. (Além disso, essa resposta é antiga e acho que ** não era suportada na época).
Ptyx
209

Parece que a **sintaxe é suportada a gitpartir da versão de 1.8.2.1acordo com a documentação .

Dois asteriscos consecutivos (" **") nos padrões correspondentes ao nome do caminho completo podem ter um significado especial:

  • Um líder " **" seguido por uma barra meio corresponder em todos os diretórios. Por exemplo, " **/foo" corresponde a um arquivo ou diretório " foo" em qualquer lugar, igual ao padrão " foo". " **/foo/bar" corresponde ao arquivo ou diretório " bar" em qualquer lugar que esteja diretamente no diretório " foo".

  • Um " /**" final corresponde a tudo dentro. Por exemplo, " abc/**" corresponde a todos os arquivos dentro do diretório " abc", em relação à localização do .gitignorearquivo, 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/b", " a/x/b", " a/x/y/b" e assim por diante.

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

joeyhoer
fonte
1
qual é a diferença entre xxx/**e xxx/?
Thuzhf 24/05
9
xxx/**direciona todos os arquivos e diretórios dentro de xxxenquanto xxx/direciona o xxxdiretório diretamente. Isso realmente importa apenas ao negar padrões com !como "Não é possível incluir novamente um arquivo se um diretório pai desse arquivo for excluído.", Portanto, usar xxx/*ou xxx/**seria necessário nesse caso.
Joeyhoer 26/05
4
Todos os arquivos com o final .meta devem ser ignorados pelo git. Como é que isso funciona? **.js?
Preto
"Outros asteriscos consecutivos são considerados inválidos." resume tudo
imrok
68

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


A página do manual gitignore (5) declara:

Os padrões são lidos em um arquivo .gitignore no mesmo diretório que o caminho ou em qualquer diretório pai, com os padrões nos arquivos de nível superior (até o nível superior da árvore de trabalho) sendo substituídos pelos que estão nos arquivos de nível inferior até o diretório contendo o arquivo

O que isso significa é que os padrões em um .gitignorearquivo em um determinado diretório do seu repositório afetarão esse diretório e todos os subdiretórios .

O padrão que você forneceu

/public/static/**/*.js

não está certo, primeiro porque (como você notou corretamente) a **sintaxe não é usada pelo Git. Além disso, as principais /âncoras desse padrão para o início do nome do caminho. (Portanto, /public/static/*.jscorresponderá, /public/static/foo.jsmas não /public/static/foo/bar.js .) A remoção da liderança /também não funcionará, combinando caminhos como public/static/foo.jse foo/public/static/bar.js. EDIT: Apenas remover a barra principal também não funcionará - porque o padrão ainda contém uma barra, ele é tratado pelo Git como uma bola de casca simples e não recursiva (obrigado @Joey Hoer por apontar isso).

Como o @ptyx sugeriu, o que você precisa fazer é criar o arquivo <repo>/public/static/.gitignoree incluir apenas este padrão:

*.js

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

Adam Sharp
fonte
2
Isso não é totalmente verdade - especificamente a parte "Remover os principais /também não funcionará, correspondendo a caminhos como public/static/foo.jse foo/public/static/bar.js". é falso. Para citar a documentação "Se o padrão não contém uma barra /, o Git o trata como um padrão de globos de shell e verifica se há uma correspondência com o nome do caminho em relação à localização do arquivo .gitignore (em relação ao nível superior da árvore de trabalho se não de um arquivo .gitignore) ". foo/public/static/bar.jsnão seria correspondido porque o padrão contém a /.
joeyhoer
@ JoeyHoer obrigado pela dica, atualizei minha resposta de acordo.
Adam afiada
9

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

Thiago Ramos
fonte
1
Isso não seria transferido para outros clones do repositório como o .gitignore (após ser confirmado, é claro).
Jpmc26
3

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

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

Descobri que cortar ./o início é geralmente necessário para o git entender quais arquivos evitar. Portanto, o cut -c 3-.

Garini
fonte