Como fazer .gitignore arquivos recursivamente

105

Estou tentando evitar o seguinte padrão em meu .gitignorearquivo.

MyPrject/WebApp/Scripts/special/*.js
MyPrject/WebApp/Scripts/special/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*.js
MyPrject/WebApp/Scripts/special/*/*/*/*/*/*/*.js

Nós tentamos:

MyPrject/WebApp/Scripts/special/**.js
MyPrject/WebApp/Scripts/special/**/*.js

No entanto, isso não funcionou. Este é o git no Windows. Existe uma maneira mais concisa de fazer isso sem repetir as coisas?

orad
fonte

Respostas:

115

A partir do git 1.8.2, isto:

MyPrject/WebApp/Scripts/special/**/*.js

Deve funcionar de acordo com esta resposta . Também funciona para mim no Windows 7 usando Sourcetree 1.6.12.0 e a versão do git que ele instala (1.8.4-preview20130916).

Para ignorar cada arquivo e pasta em um diretório recursivamente:

MyPrject/WebApp/Scripts/special/**
Sam
fonte
E antes do git 1.8?
cinzas999,
1
Se esta resposta não funcionar (no Windows), adicione o caractere /no início. Exemplo:/MyProject/WebApp/Scripts/special/**/*.js
batressc
3
Estou envergonhado porque minha resposta continua recebendo votos positivos quando é literalmente um link para outra resposta.
Sam
1
@puk: o .gitignorenesta questão estava na raiz do repo (diretório pai de /Webapp).
lucid_dreamer
1
Sua resposta parece boa, mas não funcionou para mim no Windows 10 com git 1.9.1 para ignorar todos os arquivos, exceto js no seguinte caso: (primeira linha) foo/bar/*/*(segunda linha) !foo/bar/**/*.jsFuncionou apenas para um nível de subdiretórios, mas não recursivamente.
LLL
19

A seguir a página de manual do gitignore:

[...] git trata o padrão como um shell glob adequado para consumo por fnmatch (3) com o sinalizador FNM_PATHNAME: curingas no padrão não corresponderão a um / no nome do caminho.

Portanto, fica claro que não há como especificar uma certa quantidade de diretórios entre duas strings, como entre speciale js.

No entanto, você pode ter um .gitignorearquivo por diretório, então talvez no seu caso o seguinte conteúdo

*.js

no seguinte lugar

MyPrject/WebApp/Scripts/special/.gitignore

seria suficiente?

Guillaume Lemaître
fonte
Eu costumava ter MyPrject/WebApp/Scripts/special*.jse combinava MyPrject/WebApp/Scripts/specialfile.jstambém MyPrject/WebApp/Scripts/special/a/b/c/file.js. No entanto, por algum motivo, o comportamento mudou e minha solução atual é listar os diretórios individualmente. Estou usando o GitHub para Windows.
orad
1
por exemplofind MyPrject/WebApp/Scripts/special -type d -printf 'echo "*.js" >> %h/.gitignore\n git add %h/.gitignore\n' | sh
jthill
9

Isso funciona para mim no osx.

lib64/**/__pycache__/
lib/**/__pycache__/
*.py[cod]
.ipynb_checkpoints/
**/.ipynb_checkpoints/
.DS_Store
**/.DS_Store
Jonathan
fonte
0

Tente executar git rm -r --cached MyPrject/WebApp/Scripts/special/ Seu diretório mencionado pode ter sido armazenado em cache pelo git e aparecerá em arquivos não rastreados. Depois de limpar o cache, certifique-se de mencioná-lo .gitignore.

Pradipta Sarma
fonte