.gitignore excluir carpeta pero incluir subcarpeta específica


Tengo la carpeta application/ que agrego a la .gitignore. Dentro de la carpeta application/ se encuentra la carpeta application / language / gr. ¿Cómo puedo incluir esta carpeta? He intentado esto

application/
!application/language/gr/

Sin suerte...

 680
Author: Matt, 2011-04-04

11 answers

Si excluyes application/, entonces todo lo que esté debajo de él siempre será excluido (incluso si algún patrón de exclusión negativo posterior ("unignore") podría coincidir con algo debajo de application/).

Para hacer lo que quieras, tienes que "unignore" cada directorio padre de cualquier cosa que quieras "unignore". Normalmente terminas escribiendo reglas para esta situación en pares: ignora todo en un directorio, pero no algún subdirectorio en particular.

# 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 significativa:

  • El patrón dir/ excluye un directorio llamado dir y (implícitamente) todo lo que está debajo de él.
    Con dir/, Git nunca mirará nada bajo dir, y por lo tanto nunca aplicará ninguno de los patrones "un-exclude" a nada bajo dir.
  • El patrón dir/* no dice nada acerca de dir en sí mismo; solo excluye todo bajo dir. Con dir/*, Git procesará el contenido directo de dir, dando a otros patrones la oportunidad de "des-excluir" un poco de la contenido (!dir/sub/).
 1144
Author: Chris Johnsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-24 21:24:49

Commit 59856de de Karsten Blees (kblees) para Git 1.9/2.0 (Q1 2014) aclara ese caso:

gitignore.txt: clarify recursive nature of excluded directories

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 padre de ese archivo. (*)
(*: a menos que se cumplan ciertas condiciones en git 2.8+, ver más abajo)
Git no lista directorios excluidos por razones de rendimiento, por lo que cualquier patrón en los archivos contenidos no tiene efecto, sin importar dónde se definan.

Ponga 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 el /* - sin la barra diagonal, 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 (mediados de 2016?), podría ser posible volver a incluir un archivo si un directorio padre de ese archivo está excluido si no hay comodín en la ruta re-included.

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

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

application/
!application/language/gr/
 107
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-28 19:40:12

La respuesta de@Chris Johnsen es genial, pero con una versión más reciente de Git (1.8.2 o posterior), hay un patrón de asterisco doble que puedes aprovechar para una solución abreviada 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 manera no tiene que "unignore" el directorio padre de la subcarpeta que desea rastrear.


Con Git 2.17.0 (No estoy seguro de cuán temprano antes de esta versión. Posiblemente de vuelta a 1.8.2), usando el patrón ** combinado con excludes para cada subdirectorio que conduce a su(s) archivo (s) funciona (n). Para 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
 42
Author: rpyzh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 16:28:49

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

La única manera de que esto funcionara en mi máquina era 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 tiene que permitir explícitamente el contenido para cada nivel que desea incluir. Así que si tengo subdirectorios 5 profundamente bajo temas, todavía tengo que deletrear eso.

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

Estos fueron útiles temas:

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
Author: Katie S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:11

He encontrado que solo esto en realidad funciona.

**/node_modules/*
!**/node_modules/keep-dir
 5
Author: Steve Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-16 21:53:07

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

!node_modules/

node_modules/*
!node_modules/module-a/
 4
Author: Abdennour TOUMI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-01 21:19:56

Solo otro ejemplo de caminar por la estructura de directorios 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
Author: Adrian Dunston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-14 14:53:28

Especialmente para las versiones más antiguas de Git, la mayoría de las sugerencias no funcionarán tan bien. Si ese es el caso, pondría una por separado .gitignore en el directorio donde quiero que el contenido se incluya independientemente de otras configuraciones y permitir allí lo que se necesita.

Por ejemplo: /.gitignore

# ignore all .dll files
*.dll

/ dependency_files/.gitignore

# include everything
!*

Así que todo en / dependency_files (par.archivos dll) se incluyen muy bien.

 3
Author: Breit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-23 08:59:40

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

*
!public
!.gitignore

Esto no es suficiente si se encuentra con el escenario OP.

Si desea confirmar una subcarpeta específica de public, por ejemplo, en su directorio public/products desea incluir archivos que son una subcarpeta profunda, por ejemplo, para incluir public/products/a/b.jpg no se detectarán correctamente, incluso si los agrega específicamente de esta manera !/public/products, !public/products/*, etc..

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

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
 3
Author: blamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-21 01:49:33

En WordPress, esto me ayudó:

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
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-21 15:44:57

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

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*
 -1
Author: Indrek Ruubel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-30 06:58:28