Estoy tratando de resolver un problema de gitignore en una estructura de directorio grande, pero para simplificar mi pregunta, la he reducido a lo siguiente.
Tengo la siguiente estructura de directorios de dos archivos (foo, bar) en un nuevo repositorio de git (hasta ahora no hay confirmaciones):
a/b/c/foo
a/b/c/bar
Obviamente, un 'git status -u' muestra:
# Untracked files:
...
# a/b/c/bar
# a/b/c/foo
Lo que quiero hacer es crear un archivo .gitignore que ignore todo dentro de a / b / c pero no ignore el archivo 'foo'.
Si creo un .gitignore así:
c/
Luego, un 'git status -u' muestra tanto foo como bar como ignorados:
# Untracked files:
...
# .gitignore
Que es lo que espero.
Ahora si agrego una regla de exclusión para foo, entonces:
c/
!foo
Según la página de manual de gitignore, esperaría que esto funcione. Pero no lo hace, todavía ignora a foo:
# Untracked files:
...
# .gitignore
Esto tampoco funciona:
c/
!a/b/c/foo
Tampoco esto:
c/*
!foo
Da:
# Untracked files:
...
# .gitignore
# a/b/c/bar
# a/b/c/foo
En ese caso, aunque foo ya no se ignora, la barra tampoco se ignora.
El orden de las reglas en .gitignore tampoco parece importar.
Esto tampoco hace lo que esperaría:
a/b/c/
!a/b/c/foo
Ese ignora tanto el foo como el bar.
Una situación que funciona es si creo el archivo a / b / c / .gitignore y lo pongo allí:
*
!foo
Pero el problema con esto es que eventualmente habrá otros subdirectorios bajo a / b / c y no quiero tener que poner un .gitignore separado en cada uno; esperaba crear .gitignore 'basado en proyectos' archivos que pueden ubicarse en el directorio superior de cada proyecto y cubrir toda la estructura del subdirectorio 'estándar'.
Esto también parece ser equivalente:
a/b/c/*
!a/b/c/foo
Esto podría ser lo más cercano al "trabajo" que puedo lograr, pero es necesario establecer las rutas relativas completas y las excepciones explícitas, lo que será difícil si tengo muchos archivos de nombre 'foo' en diferentes niveles del árbol subdirectorio.
De todos modos, o no entiendo cómo funcionan las reglas de exclusión, o no funcionan cuando los directorios (en lugar de los comodines) son ignorados, por una regla que termina en un /
¿Alguien puede arrojar algo de luz sobre esto?
¿Hay alguna manera de hacer que gitignore use algo sensible como expresiones regulares en lugar de esta sintaxis torpe basada en shell?
Estoy usando y observo esto con git-1.6.6.1 en Cygwin / bash3 y git-1.7.1 en Ubuntu / bash3.