Ignore corretamente todos os arquivos recursivamente em uma pasta específica, exceto para um tipo de arquivo específico

89

Tenho visto perguntas semelhantes ( 1 , 2 e 3 ), mas não consigo obter uma solução adequada delas.

Preciso ignorar todos os arquivos em uma pasta específica, exceto para um tipo de arquivo específico. A pasta é um subdiretório do caminho raiz. Deixe-me nomear a pasta Resources. Já que não quero complicar as coisas, deixe-me ignorar os arquivos em todas as pastas nomeadas Resourcesonde quer que estejam.

Esta é a solução mais comum (em todas as perguntas duplicadas)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

O problema com essa solução é que ela para de rastrear arquivos recém-adicionados (uma vez que *ignora todos os arquivos). Não quero ficar excluindo cada tipo de arquivo. Eu quero um comportamento normal onde se qualquer novo arquivo for adicionado, git statusmostre-o.

Finalmente encontrei uma solução aqui . A solução é adicionar outro .gitignorearquivo na Resourcespasta. Isso funciona corretamente.

Posso conseguir o mesmo com um arquivo para ignorar? Acho que ter muitos arquivos para ignorar em diferentes diretórios é um pouco desajeitado.

Isso é o que estou tentando alcançar:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Mas isso dá a saída oposta. Ele ignora *.footipos e rastreia outros arquivos.

Nawfal
fonte

Respostas:

108

@SimonBuchan está correto.

Desde o git 1.8.2, Resources/** !Resources/**/*.foofunciona.

Jim G.
fonte
1
Isso funciona para mim, leve ajuste, eu só preciso remover os diretórios e tudo o que está abaixo deles, assim fiz: DirectoryName1/** DirectoryName1/**/*para cada um deles. Primeiro removem diretórios, mas você precisa do segundo para remover todos os tipos de arquivo.
Scala Enthusiast
27

A melhor resposta é adicionar um arquivo Resources / .gitignore em Resources contendo:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Se você não quiser ou não puder adicionar esse arquivo .gitignore, há uma solução deselegante:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Você precisará editar esse padrão se adicionar diretórios mais profundos do que o especificado.

Ben Martin
fonte
2
Isso é triste. Na verdade, terei diretórios mais profundos, então vou ficar com o primeiro :(
nawfal
Veja mais detalhes sobre a mesma solução aqui: stackoverflow.com/questions/7803689/… - também vinculado acima por OP @nawfal
aqui
7

Isso pode parecer estúpido, mas verifique se você ainda não adicionou a pasta / arquivos que está tentando ignorar ao índice antes. Se você fez isso, não importa o que você colocou em seu arquivo .gitignore, as pastas / arquivos ainda serão testados.

Tiago
fonte
5
Se alguém se deparar com esse caso de uso específico, você pode usar git rm --cached <path to files>para limpar esses arquivos ignorados do git enquanto ainda os deixa no sistema de arquivos.
slothluvchunk
5

Ou estou fazendo errado ou a resposta aceita não funciona mais com o git atual.

Na verdade, encontrei a solução adequada e a publiquei quase na mesma questão aqui . Para mais detalhes acesse aqui.

Solução:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
Aleksander Stelmaczonek
fonte
2
Sim, isso funciona para mim. Adicionar o !/Resources/**/foi crucial para que o git não ignore os subdiretórios.
Johnster