¿Cómo funcionan los patrones negados en .gitignore?

91

Estoy intentando usar un archivo .gitignore con patrones negados (¡líneas que comienzan con!), Pero no funciona como esperaba.

Como ejemplo mínimo, tengo la siguiente estructura de directorios:

C:/gittest
 -- .gitignore
 -- aaa/
   -- bbb/
     -- file.txt
   -- ccc/
     -- otherfile.txt

y en mi archivo gitignore, tengo esto:

aaa/
!aaa/ccc/

Tengo entendido (basado en esta página de documentos ) que el archivo aaa / ccc / otherfile.txt no debe ignorarse, pero de hecho git está ignorando todo lo que se encuentra en aaa.

¿Estoy entendiendo mal esta oración: "Un prefijo opcional! Que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se incluirá nuevamente"?

Por cierto, esto es en Windows con msysgit 1.7.0.2.

Chris Perkins
fuente

Respuestas:

157

Creo que lo que realmente quieres hacer es:

aaa/*
!aaa/ccc

Le estás diciendo "no mires aaa", por lo que ni siquiera examina el camino aaa/ccc. Si usa el comodín, aún lee el contenido de aaa, entonces cada entrada coincide con el comodín y se ignora, excepto aaa/ccccuál se vuelve a colocar.

Cascabel
fuente
2
@iconoclast: Entonces probablemente estés haciendo algo diferente. Publique otra pregunta (con información completa) si necesita ayuda.
Cascabel
Esto tampoco funcionó para mí: / apps / *! / Apps / myApps / FluidTest / bin /
Jarrod Smith
5
@ Jarrod Funciona; solo estás haciendo algo diferente. Tendrá que usar este método de forma recursiva, exactamente por las razones que se dan en la respuesta. ! apps / myApps, apps / myApps / * y así sucesivamente.
Cascabel
Ahh lo siento, ahora lo entiendo. Pero SO no me dejará votar a favor de nuevo.
Jarrod Smith
Me pregunto por qué no funciona para aaa / ** / *! Aaa / ccc / eee (ignore todo, excepto los archivos en cierta ruta)
Phương Nguyễn
20

Si desea excluir todo en aaa, pero incluir aaa/cccy todo lo que está debajo, debe usar:

aaa/*
!aaa/ccc
!aaa/ccc/*

La primera línea le dice a git que ignore todo lo que está debajo aaa, la segunda le dice que no ignore la carpeta aaa/cccque en realidad "habilita" la tercera línea que luego le dice que no ignore todo lo que está debajo aaa/ccc.

xmak
fuente
1
La tercera línea no hizo ninguna diferencia para mí.
James Hopkin
3
Para poder incluir todo en cualquier subdirectorio de aaa/ccccualquier nivel, lo que funcionó para mí fue en !aaa/ccc/**lugar de!aaa/ccc/*
boclodoa
3

Si alguien aún no ve elementos nuevos no ignorados en una git statusejecución git update-indexprevia, puede ayudar a git a ver los cambios (al menos en la versión 1.9.x de gitbash).

alexkb
fuente