¿Es posible ignorar las reglas .gitignore en el subdirectorio?

82

Quiero ignorar todas las reglas .gitignore en el subdirectorio, excepto las reglas .gitignore en la raíz.

por ejemplo) Ya tengo un .gitignorearchivo en una estructura de directorio /a.

Y también tener .gitignorearchivo en formato /a/b. Suponga que /atiene a.txt b.txtarchivos.

/a/btiene .configarchivo. .gitignoredefine .configen /a/b.

.configel archivo será ignorado por .gitignorein /a/b.

Pero realmente quiero rastrear el .configarchivo ignorando las reglas de .gitignoreen el subdirectorio.

¿Es posible?

Gracias por adelantado

jeon
fuente

Respuestas:

134

Su pregunta no es demasiado clara, pero si hay algunos subdirectorios en los que desea diferentes reglas de gitignore, puede crear un nuevo .gitignore en ese directorio.

Di que tienes:

proyecto / .gitignore
proyecto / cosas / .gitignore

El .gitignore en stuff / anulará el .gitignore en el directorio raíz.

git help gitignoreo man gitignoretiene bastante más información sobre lo que es posible.

signine
fuente
2
Creo que el PO está preguntando si usted tiene una estructura de directorios /a/b/cy actualizar .gitignoreen /a/b, ¿es posible en /a/b/chacer caso omiso de las reglas en /a/by en su lugar sólo utilizan reglas de /a.
Michael Mior
45
Sí, si esa fuera la pregunta, es posible negar las reglas en un .gitignore más adelante en la cadena. "An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again."
signine
3
@signine No funciona con directorios. Mira mi respuesta .
Ross Patterson
2
Creo que es más exacto decir que: inner .gitignorese fusionará outer .gitignorecon una prioridad más alta, no simplemente se anulará.
Eric Wang
@eric wang aparentemente un subdirectorio no se fusiona, pero anula: git-scm.com/docs/gitignore
topspin
40

Digamos que desea incluirlo node_modulesen su repositorio, pero algún módulo en la línea tiene uno .gitignorepropio. Puede negar las reglas agregando lo siguiente a su .gitignorearchivo raíz :

# Make sure to include everything in node_modules.
!node_modules/**
Nick Zalutskiy
fuente
3
¿Existe una forma más genérica de hacer esto? digamos que tengo node_modules/mod1, node_modules/mod2dentro de ambos hay un .gitignore que ignora lo más profundo node_modulesdentro de ellos (como en node_modules/mod1/node_modules. Agrego y elimino módulos a menudo, así que no puedo saber muy bien y agregar reglas manualmente para ignorar node_modules/mod1/.gitignoreo agregar manualmente !node_modules/mod1/node_modulestodo el tiempo. Básicamente, estoy tratando de implementar una aplicación de meteoritos y todas las integradas .gitignoreshacen que sea imposible obtenerlo todo en git.
gman
10

La clave del problema aquí es que se excluye un directorio principal. De $ man gitignore:

No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo. Git no enumera los directorios excluidos por razones de rendimiento, por lo que los patrones en los archivos contenidos no tienen ningún efecto, sin importar dónde estén definidos.

Así es como lo hice funcionar. Dado:

/a/...
/b/foo
/c/...

/.gitignore:

/*
!/b

Luego /b/foose mostrarán como archivos incluidos, mientras que todo lo que esté en /ay /cse excluirá. La compensación es que debe agregar una negación para todos los padres de cualquier directorio en el que desee incluir archivos.

Ross Patterson
fuente
¿Por qué no usar !/b/**/*?
Alexis Tyler
No puedo responder sin más explicaciones tuyas.
Ross Patterson
6

Hasta donde yo sé, no hay forma de hacerlo. Como el .gitignore local sobrescribirá la raíz ginignore Mi solución es agregar manualmente.

git add --force [ your file and folder]
holailoveit
fuente
child .gitignoreno funcionó para mí ya que el padre anula la configuración de la carpeta secundaria. Si fuerza la adición git add -f myfile.txt, comenzará a realizar un seguimiento de los cambios sin pasar por la .gitignoreconfiguración principal .
SliverNinja - MSFT