Estou tentando resolver um problema de gitignore em uma grande estrutura de diretórios, mas para simplificar minha pergunta, reduzi-a ao seguinte.
Eu tenho a seguinte estrutura de diretórios de dois arquivos (foo, bar) em um novo repositório git (nenhum commit até agora):
a/b/c/foo
a/b/c/bar
Obviamente, um 'status git -u' mostra:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
O que eu quero fazer é criar um arquivo .gitignore que ignore tudo dentro de a / b / c, mas não ignore o arquivo 'foo'.
Se eu criar um .gitignore assim:
c/
Em seguida, um 'git status -u' mostra foo e bar como ignorados:
# Untracked files:
...
# .gitignore
O que é como eu espero.
Agora, se eu adicionar uma regra de exclusão para foo, assim:
c/
!foo
De acordo com a página de manual do gitignore, eu esperaria que isso funcionasse. Mas não - ainda ignora:
# Untracked files:
...
# .gitignore
Isso também não funciona:
c/
!a/b/c/foo
Nem isso:
c/*
!foo
Dá:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
Nesse caso, embora foo não seja mais ignorado, bar também não é ignorado.
A ordem das regras em .gitignore também não parece importar.
Isso também não faz o que eu esperaria:
a/b/c/
!a/b/c/foo
Aquele ignora tanto foo quanto bar.
Uma situação que funciona é se eu criar o arquivo a / b / c / .gitignore e colocar lá:
*
!foo
Mas o problema é que, eventualmente, haverá outros subdiretórios sob a / b / ce não quero colocar um .gitignore separado em cada um deles - eu esperava criar um .gitignore baseado em projeto arquivos que podem ficar no diretório superior de cada projeto e abranger toda a estrutura de subdiretórios 'padrão'.
Isso também parece ser equivalente:
a/b/c/*
!a/b/c/foo
Isso pode ser a coisa mais próxima do "trabalho" que eu posso alcançar, mas os caminhos relativos completos e exceções explícitas precisam ser declarados, o que será uma dor se eu tiver muitos arquivos com o nome 'foo' em diferentes níveis da árvore do subdiretório.
De qualquer forma, eu não entendo direito como as regras de exclusão funcionam ou não funcionam quando os diretórios (em vez de curingas) são ignorados - por uma regra que termina em /
Alguém por favor pode lançar alguma luz sobre isso?
Existe uma maneira de fazer o gitignore usar algo sensato, como expressões regulares, em vez dessa sintaxe desajeitada baseada em shell?
Estou usando e observe isso com o git-1.6.6.1 no Cygwin / bash3 e o git-1.7.1 no Ubuntu / bash3.