¿Cuál es la diferencia entre añadir bin
, bin/
, bin/*
y bin/**
en mi archivo .gitignore? He estado usando bin/
, pero mirando otros archivos .gitignore (en el archivo de eclipse, la estrella doble y la única se usan juntas de esta manera: tmp/**/*
¿qué pasa con eso?) Veo que los dos primeros patrones también se usan ampliamente. ¿Alguien puede explicar las diferencias entre los tres?
89
**
: stackoverflow.com/questions/1470572/…Respuestas:
bin
coincide con cualquier archivo o directorio llamado 'bin'.bin/
coincide con cualquier directorio llamado 'bin', lo que en efecto significa todo su contenido ya que Git no rastrea los directorios solo.bin/*
coincide con todos los archivos y directorios directamente en cualquierbin/
. Esto evita que Git encuentre automáticamente archivos en sus subdirectorios, pero si, digamos,bin/foo
se crea un subdirectorio, esta regla no coincidirá confoo
el contenido.bin/**
coincide con todos los archivos y directorios de cualquierbin/
directorio y todos sus subdirectorios.La palabra "cualquiera" es fundamental aquí, ya que las reglas no son relativas a la raíz del repositorio y se aplican en cualquier parte del árbol del sistema de archivos. Debe comenzar las reglas con a
/
(o!/
dejar de ignorar) lo que significa la raíz del repositorio, no la raíz del sistema, para que coincida solo con lo que se pretendía.ADVERTENCIA: Usted debe no utilizar reglas como
dir/*
,/dir/**
, etc. solos a menos que también Dejar de ignorar algo que existe dentro de ese directorio . Omita el asterisco o podría perder permanentemente muchos datos de ciertas invocaciones degit gc
,git stash
y más.Realmente no sé qué
tmp/**/*
se supone que debo hacer. Inicialmente pensé que podría usarse para hacer coincidir archivos en los subdirectorios,tmp/
pero no archivos directamente presentes entmp/
sí mismo. Pero una prueba simple parece sugerir que esto ignora todos los archivos en formatotmp/
.fuente
bin/
ybin/**
?bin/
que ignorará el directorio bin, mientrasbin/**
que incluirá el directorio bin pero no ninguno de sus contenidosbin/
ignorará el directorio en sí (incluidos todos los subdirectorios y archivos), mientrasbin/**
que ignorará todos los archivos en el directorio bin y sus subdirectorios, pero no el directorio bin en sí. Si eso es exacto o no, no estoy seguro.bin/** \n !bin/*
(ya que no veo cómo forzar un salto de línea en mini-Markdown)bin
los partidos tanto un archivo con el nombrebin
y el contenido de labin
carpeta. En tercer lugar,bin/*
coincide con los archivos de sus subdirectorios. ¿Ustedes siquiera probaron esto?bin
ybin/
difieren solo en que este último solo coincidirá con un directorio.bin/**/*
es el mismo quebin/**
(aparentemente desde 1.8.2, según la respuesta de @ VonC).El asunto difícil, que me acaba de pasar una hora o así que rasga mi pelo otra vez, es que
bin/
ybin/**
no son absolutamente lo mismo! Dado que el primero ignora el directorio como un todo, y el segundo ignora cada uno de los archivos dentro de él, y a git en casi todos los casos no le importan los directorios, normalmente no hay diferencia. Sin embargo, si intenta!
anular el ignorar una subruta, encontrará que git (ejem) la ignora si ignora el directorio principal. (de nuevo, en lugar del contenido del directorio)Esto es más claro con el ejemplo, por lo que para un repositorio recién iniciado configurado así:
Existen los siguientes archivos sin seguimiento:
Pero puede ver que los siguientes archivos no se ignoran:
Y si intentas agregar, obtienes:
Considero este comportamiento un error. (Todo esto está encendido
git version 1.8.4.msysgit.0
)fuente
dir/
ydir/**
re. no ignorar con!
ocurre porque "No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo" [fuente ]. Confuso, pero hecho por motivos de rendimiento. Consulte una pregunta de SO relacionada .Tenga en cuenta que, estrictamente hablando, git no rastrea directorios, solo archivos. Por lo tanto, no es posible agregar un directorio, solo su contenido .
En el contexto de
.gitignore
sin embargo, git pretende entender los directorios por la única razón de que¿Qué significa esto para los patrones de exclusión? Veámoslos en detalle:
bin
Esto ignora
bin
.bin
Puede
bin
incluir en la lista blanca archivos y carpetas ignorados agregando!
entradas posteriores , pero no puede incluir en la lista blanca el contenido de las carpetas nombradasbin
bin/
Igual que el anterior, excepto que no coincide con los archivos nombrados
bin
. Agregar un final/
le dice a git que coincida solo con los directorios.bin/*
Esto ignora
bin
bin
bin/**
Esto ignora
bin
bin
fuente
Acabo de hacer un nuevo repositorio y probé algunas cosas. Aquí están mis resultados:
NUEVOS RESULTADOS
git versión 2.10.1.windows.1
bin
directorio con varias capas de profundidadbin.txt
Test.txt
bin/a/b/bin.txt
bin/a/b/Test.txt
bin/a/bin/bin.txt
bin/a/bin/Test.txt
bin/a/bin.txt
bin/a/Test.txt
bin/bin.txt
bin/Test.txt
bin
a gitignore: Resultadosbin
directorio (y más profundo) ahora se ignorabin
abin/
la gitignore: Resultadosbin/
parabin/*
bin/*
parabin/**
bin/**
parabin/**/
bin/bin.txt
ybin/Test.txt
ya no son ignoradosbin/**/
parabin/**/*
bin/bin.txt
ybin/Test.txt
vuelven a ser ignoradosANTIGUOS RESULTADOS
versión de git: 2.7.0.windows.1
bin
directorio con varias capas de profundidadbin/a/b/Test.txt
bin/a/bin/Test.txt
bin/a/Test.txt
bin/Test.txt
bin
a gitignore: Resultadosbin
directorio (y más profundo) ahora se ignorabin
abin/
la gitignore: Resultadosbin
directorio (y más profundo) aún se ignora (sin cambios)bin/
parabin/*
bin
directorio (y más profundo) aún se ignora (sin cambios)bin/*
parabin/**
bin
directorio (y más profundo) aún se ignora (sin cambios)bin/**
parabin/**/
bin/Test.txt
ya no se ignorabin/**/
parabin/**/*
bin
directorio (y más profundo) se ignora nuevamentefuente
Tenga en cuenta que '
**
', cuando se combina con un subdirectorio (**/bar
), debe haber cambiado de su comportamiento predeterminado, ya que la nota de la versión de git1.8.2 ahora menciona:La regla a recordar (y que ayuda a comprender la diferencia de intenciones detrás de esa sintaxis) es:
No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo.
Normalmente, si desea excluir archivos de una subcarpeta de una carpeta ignorada f, debería hacer:
Es decir:
f/
, la carpetaf/
se ignoraría y las reglas siguientesf
no importarían.f/**
lograr lo mismo quef/
, pero ignorar todos los subelementos (archivos y subcarpetas).Eso le da la oportunidad a la lista blanca (excluir de gitignore) las subcarpetas:
!f/**/
.f
subcarpetas , puede agregar una regla para excluir un archivo ( )!f/a/sub/folder/someFile.txt
fuente
Hay otra diferencia entre
bin/*
ybin/
.bin/
coincidefoo/bin/test.txt
(como se esperaba), perobin/*
no, lo que parece extraño, pero está documentado: https://git-scm.com/docs/gitignoreLa razón de esto parece ser estas reglas:
Entonces, si el patrón termina con una barra, la barra se elimina y se trata como un patrón de shell glob, en cuyo caso
bin
coincidefoo/bin/test.txt
. Si termina con/*
, la barra no se elimina y se pasa a fnmatch, que no coincide en los subdirectorios.Sin embargo, no ocurre lo mismo con
foo/bin/
yfoo/bin/*
, porque incluso después de eliminar la barra inclinadafoo/bin/
, todavía contiene una barra, por lo que se trata como un patrón fnmatch, no como un glob. Es decir, no coincidirábar/foo/bin/test.txt
fuente