ignorar - gitignore java
.gitignore excluye carpeta pero incluye subcarpeta específica (12)
El problema:
- Desea excluir la carpeta de la
application
. - Quieres incluir la
application/language/gr/
folder.
La solución:
Explicación: ¿Qué está pasando?
-
application/
simplemente excluirá la carpeta de la aplicación y todo lo que esté debajo de ella. -
application/*
(pero esta vez con un asterisco*
final) excluirá la carpeta de la aplicación, pero esta vez le permitirá volver a incluir archivos y directorios secundarios.
Si desea volver a incluir archivos / directorios, entonces:
- Usa el
!
para identificar los archivos / directorios que desea volver a incluir.
!application/language/gr/
Extracciones clave
parent-folder-to-exclude/*
!parent-folder-to-exclude/child-folder-to-include/
(Esperamos que lo anterior sea muy, muy claro y sencillo para usted: si tiene alguna pregunta, solo publique un comentario y trataré de aclarar).
Tengo la aplicación de carpeta / que agrego a .gitignore. Dentro de la aplicación / carpeta está la carpeta application / language / gr. ¿Cómo puedo incluir esta carpeta? He intentado esto
application/
!application/language/gr/
sin suerte ...
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/**
Entonces, ya que muchos programadores usan nodo. El caso de uso que satisface esta pregunta es excluir los módulos de node_modules
excepto un módulo module-a
por ejemplo:
!node_modules/
node_modules/*
!node_modules/module-a/
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 separado en el directorio donde deseo que se incluya el contenido, independientemente de otras configuraciones y permita que se haga lo necesario.
Por ejemplo: /.gitignore
# ignore all .dll files
*.dll
/dependency_files/.gitignore
# include everything
!*
Así que todo en / dependency_files (incluso los archivos .dll) están incluidos muy bien.
Hay un montón de preguntas similares sobre esto, así que publicaré lo que escribí antes:
La única forma en que conseguí 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 debe permitir explícitamente el contenido para cada nivel que desee incluir. Así que si tengo subdirectorios 5 bajo temas, todavía tengo que explicarlo.
Esto es del comentario de @Yarin aquí: https://.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 tambien lo intenté
*
*/*
**/**
y **/wp-content/themes/**
o /wp-content/themes/**/*
Nada de eso funcionó para mí, tampoco. Mucho rastro y error!
He encontrado un caso similar aquí, en el que, por defecto, en .gitignore
, .gitignore
ignora todo el uso de asterix, y luego invalida el directorio público.
*
!public
!.gitignore
Esto no es suficiente si se ejecuta en el escenario OP.
Si desea comprometer una subcarpeta específica de public
, digamos que, por ejemplo, en su directorio public/products
desea incluir archivos en una subcarpeta en profundidad, por ejemplo, para incluir public/products/a/b.jpg
, no se detectarán correctamente, incluso si ¡Los agrega específicamente así !/public/products
!public/products/*
, etc.
La solución es asegurarse de agregar una entrada para cada nivel de ruta como este para anularlos a todos.
*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
La respuesta de @Chris Johnsen es excelente, pero con una versión más reciente de Git (1.8.2 o posterior), hay un patrón de doble asterisco que puede aprovechar para una solución taquigráfica 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 "desmarcar" el directorio principal de la subcarpeta que desea rastrear.
Con Git 2.17.0 (No estoy seguro de cómo antes de esta versión. Posiblemente, de nuevo a 1.8.2), el uso del patrón **
combinado con excluye para cada subdirectorio que conduce a su 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
Quería rastrear los archivos js de jquery production y esto funcionó:
node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*
Sólo he encontrado que esto realmente funciona.
**/node_modules/*
!**/node_modules/keep-dir
Si excluye la application/
, entonces todo lo que esté debajo de ella siempre se excluirá (incluso si algún patrón de exclusión negativo posterior ("unignore") podría coincidir con algo debajo de la application/
).
Para hacer lo que quiere, tiene que "desmarcar" cada directorio principal de cualquier cosa que quiera "desasignar". Por lo general, terminas escribiendo reglas para esta situación en pares: ignorar 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 llamadodir
y (implícitamente) todo lo que está debajo de él.
Condir/
, Git nunca mirará nada bajodir
, y por lo tanto nunca aplicará ninguno de los patrones de "no-exclusión" a nada debajo dedir
. - El patrón
dir/*
no dice nada acerca dedir
sí mismo; solo excluye todo bajodir
. Condir/*
, Git procesará los contenidos directos dedir
, dando a otros patrones la oportunidad de "no excluir" un poco del contenido (!dir/sub/
).
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
Commit 59856de de Karsten Blees (kblees) para Git 1.9 / 2.0 (Q1 2014) aclara ese caso:
gitignore.txt
: aclara 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 de la primera "!
" 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 inclinada, el comodín también excluiría todo lo que esté dentro defoo/bar
):
--------------------------------------------------------------
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
--------------------------------------------------------------
En tu caso:
application/*
!application/**/
!application/language/gr/**
Primero debe incluir en la lista blanca las carpetas , antes de poder incluir en la lista blanca los archivos dentro de una carpeta determinada.
Actualización febrero / marzo 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 principal de ese archivo si no hay un carácter comodín en la ruta que se vuelve a incluir .
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.
Así que con git 2.9+, esto podría haber funcionado, pero finalmente se revirtió:
application/
!application/language/gr/