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


Tengo la aplicación de carpeta / que agrego al .gitignore. Dentro de la aplicación / carpeta está la carpeta application / language / gr. ¿Cómo puedo incluir esta carpeta? Lo he intentado

application/
!application/language/gr/

sin suerte ...


657
2018-04-03 22:48


origen


Respuestas:


Si excluyes application/, todo lo que está debajo de él siempre será excluido (incluso si algún patrón de exclusión negativa posterior ("no ignorar") pudiera coincidir con algo bajo application/)

Para hacer lo que quiera, debe "dejar de hacer" que todos los directorios principales de cualquier cosa que desee "ignorar". Por lo general, terminas escribiendo las reglas para esta situación en pares: ignoras todo en un directorio, pero no un cierto subdirectorio.

# 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 llamado dir y (implícitamente) todo debajo de él.
    Con dir /, Git nunca mirará nada bajo dir, y por lo tanto nunca aplicará ninguno de los patrones "no excluyentes" a nada bajo dir.
  • El patrón dir / * no dice nada acerca de dir en sí mismo; simplemente excluye todo bajo dir. Con dir / *, Git procesará los contenidos directos de dir, dando a otros patrones la posibilidad de "no excluir" un poco del contenido (! Dir / sub /).

1100
2018-04-04 05:22



Commit 59856de de Karsten Blees (kblees) para Git 1.9 / 2.0 (Q1 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á de nuevo.

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 a continuación)
  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.

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

Ejemplo para excluir todo excepto un directorio específico foo/bar (nota la /* - sin la barra, el comodín también excluiría todo dentro foo/bar)

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

Actualización de febrero / marzo de 2016:

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

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

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

application/
!application/language/gr/

100
2017-12-18 08:10



La respuesta de @Chris Johnsen es genial, pero con una versión más nueva de Git (1.8.2 o posterior), hay un patrón de asterisco doble que puede aprovechar para una solución de taquigrafía un poco más:

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

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

De esta forma, no es necesario que "desactive" el directorio principal de la subcarpeta que desea rastrear.


Con Git 2.17.0 (No estoy seguro de qué tan pronto antes de esta versión. Posiblemente vuelva a 1.8.2), usando el ** El patrón combinado con excluye para cada subdirectorio que conduce a su (s) archivo (s) funciona. 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

36
2017-09-09 16:30



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

La única forma en que hice 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 muy por debajo de los temas, aún necesito deletrear eso.

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

Estos fueron temas útiles:

También intenté

*
*/*
**/**

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

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

Nada de eso funcionó para mí, tampoco. ¡Un montón de rastro y error!


14
2018-04-29 23:37



Entonces, dado que muchos programadores usan nodo. el caso de uso que cumple con esta pregunta es excluir node_modules excepto un módulo module-a por ejemplo:

!node_modules/

node_modules/*
!node_modules/module-a/

4
2017-09-01 21:19



Solo otro ejemplo de recorrer la estructura del directorio para obtener exactamente lo que desea. Nota: no excluí Library/ pero Library/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings

3
2017-09-14 14:53



Solo he encontrado esto actualmente trabajos.

**/node_modules/*
!**/node_modules/keep-dir

3
2018-02-16 21:53



Especialmente para las versiones anteriores de Git, la mayoría de las sugerencias no funcionarán tan bien. Si ese es el caso, pondría un .gitignore por separado en el directorio donde quiero que se incluya el contenido, independientemente de otras configuraciones, y permitiré que se necesite.

Por ejemplo: /.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

Así que todo en / dependency_files (incluso archivos .dll) están incluidos muy bien.


3
2018-04-06 09:37



He encontrado un caso similar aquí, donde en laravel por defecto, .gitignore ignora todo usando asterix, luego anula el directorio público.

*
!public
!.gitignore

Esto no es suficiente si te encuentras con el escenario OP.

Si desea enviar una subcarpeta específica de public, digamos por ejemplo en tus public/products directorio en el que desea incluir archivos que son una subcarpeta profunda, p. para incluir public/products/a/b.jpg no se detectarán correctamente, incluso si los agrega específicamente como este !/public/products, !public/products/*, etc.

La solución es asegurarse de agregar una entrada para cada nivel de ruta como esta para anularlos a todos.

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*

3
2017-10-21 01:43



En WordPress, esto me ayudó a:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**

1
2018-05-21 15:44



Quería rastrear los archivos js de jquery production y esto funcionó:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*

-1
2018-03-30 06:58