.gitignore excluye la carpeta pero incluye una subcarpeta específica

Resuelto chchrist asked hace 13 años • 20 respuestas

Tengo una carpeta application/que agrego al .gitignore.
Dentro de la application/carpeta hay una carpeta application/language/gr.

¿Cómo puedo incluir esta carpeta?

He probado esto:

application/
!application/language/gr/
chchrist avatar Apr 04 '11 05:04 chchrist
Aceptado

Si excluye application/, entonces todo lo que esté debajo siempre será excluido (incluso si algún patrón de exclusión negativo posterior (“designorar”) pueda coincidir con algo bajo application/).

Para hacer lo que desea, debe "designorar" todos los directorios principales de cualquier cosa que desee "designorar". Generalmente terminas escribiendo reglas para esta situación en pares: ignora todo lo que hay en un directorio, pero no algún subdirectorio determinado.

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

Nota
El final /*es significativo:

  • El patrón dir/excluye un directorio nombrado diry (implícitamente) todo lo que se encuentra debajo de él.
    Con dir/, Git nunca mirará nada bajo dir, y por lo tanto nunca aplicará ninguno de los patrones de "no exclusión" a nada bajo dir.
  • El patrón dir/*no dice nada sobre dirsí mismo; simplemente excluye todo lo que se encuentra debajo dir. Con dir/*, Git procesará el contenido directo de dir, dando a otros patrones la oportunidad de "desexcluir" parte del contenido ( !dir/sub/).
Chris Johnsen avatar Apr 04 '2011 05:04 Chris Johnsen

El compromiso 59856de de Karsten Blees (kblees) para Git 1.9/2.0 (primer trimestre de 2014) aclara ese caso:

gitignore.txt: aclarar la naturaleza recursiva de los directorios excluidos

Un prefijo opcional " !" que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se incluirá nuevamente.

No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo. ( *)
( *: a menos que se cumplan ciertas condiciones en git 2.8+, ver más abajo)
Git no enumera los directorios excluidos por razones de rendimiento, por lo que cualquier patrón en los archivos contenidos no tiene efecto, sin importar dónde estén definidos.

Coloque una barra invertida (" \") delante del primer " !" para los patrones que comienzan con un literal " !", por ejemplo, " \!important!.txt".

Ejemplo para excluir todo excepto un directorio específico foo/bar(tenga en cuenta que /*- sin la barra diagonal, el comodín también excluiría todo lo que esté dentro foo/bar):

 --------------------------------------------------------------
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

En tu caso:

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

Primero debe incluir las carpetas en la lista blanca , antes de poder incluir archivos en la lista blanca dentro de una carpeta determinada.


Actualización de febrero/marzo de 2016:

Tenga en cuenta que con git 2.9.x/2.10 (¿mediados de 2016?), es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo si no hay un comodín en la ruta reincluida .

Nguyễn Thái Ngọc Duy ( pclouds) está intentando agregar esta característica:

  • commit 506d8f1 para git v2.7.0, revertido en commit 76b620d git v2.8.0-rc0
  • commit 5e57f9c git v2.8.0-rc0,... revertido(!) en commit 5cee3493 git 2.8.0.

Entonces, con git 2.9+, esto podría haber funcionado, pero finalmente se revirtió:

application/
!application/language/gr/
VonC avatar Dec 18 '2013 08:12 VonC

La respuesta de @Chris Johnsen es excelente, pero con versiones más nuevas de Git (1.8.2 o posterior), hay un patrón de doble asterisco que puede aprovechar para obtener una solución un poco más abreviada:

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

De esta manera, no tendrá que "designorar" el directorio principal de la subcarpeta que desea rastrear.


Con Git 2.17.0 (no estoy seguro de qué tan temprano antes de esta versión. Posiblemente de regreso a 1.8.2), **funciona el uso del patrón combinado con exclusiones para cada subdirectorio que conduce a sus archivos. Por ejemplo:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
rpyzh avatar Sep 09 '2013 16:09 rpyzh

Descubrí que solo esto realmente funciona.

**/node_modules/*
!**/node_modules/keep-dir
Steve Kling avatar Feb 16 '2017 21:02 Steve Kling

Hay un montón de preguntas similares sobre esto, así que publicaré lo que escribí antes:

La única forma de conseguir que esto funcionara en mi máquina fue hacerlo de esta manera:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

Observe cómo debe permitir explícitamente el contenido para cada nivel que desee incluir. Entonces, si tengo subdirectorios 5 debajo de los temas, aún necesito deletrearlo.

Esto es del comentario de @Yarin aquí: https://stackoverflow.com/a/5250314/1696153

Estos fueron temas útiles:

  • ¿Cómo funcionan los patrones negados en .gitignore?
  • ¿Cómo funcionan realmente las reglas de exclusión de gitignore?

yo también lo intenté

*
*/*
**/**

y**/wp-content/themes/**

o/wp-content/themes/**/*

Nada de eso funcionó para mí tampoco. ¡Muchas pruebas y errores!

Katie avatar Apr 29 '2015 23:04 Katie