Estoy tratando de resolver un problema de gitignore en una gran estructura de directorios, pero para simplificar mi pregunta, la he reducido a lo siguiente.¿Cómo funcionan las reglas de exclusión de gitignore?
que tienen la siguiente estructura de directorios de los dos archivos (foo, bar) en un nuevo repositorio git (no compromete hasta ahora):
a/b/c/foo
a/b/c/bar
Obviamente, un 'git status -u' shows:
# 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/
A continuación, un 'git status -u' muestra tanto foo y bar, ignorado:
# Untracked files:
...
# .gitignore
Cuál es como espero.
Ahora bien, si puedo añadir una regla de exclusión de foo, por lo tanto:
c/
!foo
De acuerdo con la página de manual gitignore, yo esperaría que esto funcione. Pero no es así - que todavía ignora foo:
# Untracked files:
...
# .gitignore
Esto no funciona bien:
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 es ignor ed, la barra tampoco se ignora.
El orden de las reglas en .gitignore tampoco parece importar.
Esto también no hace lo que cabe esperar:
a/b/c/
!a/b/c/foo
que uno ignora tanto foo y bar.
Una situación que hace el trabajo es si creo el archivo a/b/c/.gitignore y poner ahí:
*
!foo
Pero el problema con esto es que con el tiempo habrá otros subdirectorios bajo una/b/c y no quiero tener que poner un .gitignore por separado en cada uno de ellos - Tenía la esperanza de crear archivos .gitignore 'basados en proyectos' que puedan ubicarse en el directorio superior de cada proyecto y cubrir todos 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 parecido a "trabajo" que puedo lograr, pero las rutas relativas completos y excepciones explícitas necesita ser dicho, que se va a Sería un dolor si tengo muchos archivos con el nombre 'foo' en diferentes niveles del árbol de subdirectorios.
De todas formas, ya sea que no acabo de entender cómo funcionan las reglas de exclusión, o que no funcionan en absoluto cuando se ignoran los directorios (en lugar de comodines) - por una regla que termina en un/
Puede alguien por favor arrojar algo de luz sobre esto?
¿Hay alguna manera de hacer que gitignore use algo sensato como expresiones regulares en lugar de esta torpe sintaxis 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.
pregunta relacionada: http://stackoverflow.com/questions/2820255/how-do-negated-patterns-work-in-gitignore/2820310#2820310 – Cascabel