Estoy tratando de entender más claramente la .gitignore
sintaxis y, en particular, en lo que respecta a https://github.com/github/gitignore gitignores.
Veo que la barra diagonal inicial se usa para hacer coincidir solo los nombres de ruta relacionados con la ubicación del .gitignore
archivo (de http://git-scm.com/docs/gitignore ):
Una barra inclinada coincide con el comienzo de la ruta. Por ejemplo, "/*.c" coincide con "cat-file.c" pero no con "mozilla-sha1 / sha1.c".
Pero, ¿qué sucede cuando elimino la barra inclinada? Por lo que entendí, hay dos casos:
- Si el patrón no contiene una barra (o contiene solo una barra al final, lo que significa que debe coincidir con un directorio), la búsqueda se realiza dentro de todo el árbol de directorios. Por ejemplo, el patrón
dir/
coincidirá<root>/dir
,<root>/a/dir
,<root>/a/b/c/.../dir
, etc., donde<root>
es la ubicación del.gitignore
archivo. - Si el patrón contiene una barra, que no está en la posición final (no es el último carácter), entonces solo coincide con los nombres de ruta relativos a la
.gitignore
ubicación del archivo.
Estos son los ejemplos que hice para verificar este comportamiento:
# Directory structure:
<root>
├─ dir/
│ └─ test
├─ src/
│ ├─ dir/
│ │ └─ test
test file is there only because Git does not track empty directories.
Primer examen:
# .gitignore
dir/
# git status
nothing to commit
Entonces Git está ignorando ambos dir
directorios. Esto es consistente con el caso número 1: el patrón no tiene barras (excepto la que sigue), por lo que Git está observando todo el árbol de directorios, ignorando todo lo que coincide con el patrón.
Segunda prueba:
# .gitignore
/dir/
# git status
Untracked files:
src/
Aquí, Git ignora solo el dir
directorio directamente debajo del directorio raíz, gracias a la barra inclinada inicial en el patrón.
Tercera prueba:
# .gitignore
dir/*
# git status
Untracked files:
src/
Esto es consistente con el caso número 2: el patrón tiene una barra en su interior, por lo que se considera como un nombre de ruta a partir del directorio raíz.
Ahora es el momento de la verdadera pregunta. Consideremos este archivo gitignore : cuando ignoran el directorio downloader/
, por ejemplo, ¿no están realmente ignorando todos los downloader
directorios que se encuentran en todo el árbol de directorios? Esto es lo que me impulsa a pensar desde lo que vi sobre el funcionamiento de Git antes.
Entonces, si tengo un módulo personalizado con un downloader
directorio dentro de él, ¿se ignorará inesperadamente, así como el normal en la raíz de Magento? Esta es una pregunta un poco retórica porque en realidad ya me pasó, produciendo un error realmente difícil de encontrar.
Entonces, en el .gitignore
archivo Magento (al que me refiero solo como ejemplo, por cierto) muchos de los patrones contienen barras, por lo que se comparan correctamente con los nombres de ruta que comienzan desde la raíz, pero hay algunos casos, como downloader/
o errors/
ese , si no me equivoco, son potencialmente peligrosos y probablemente deberían cambiarse por /downloader/
y /errors/
.
Como pregunta más general, ¿debería utilizar siempre la barra inclinada inicial para los patrones que no contienen barras inclinadas (excepto para la final) cuando quiero seleccionar un nombre de ruta explícitamente comenzando desde la raíz, y no usarlo para patrones que contienen barras inclinadas, o debería ¿Utiliza siempre la barra inclinada para mayor claridad? ¿Qué piensa usted al respecto?
Gracias por leer y perdón por la publicación tan larga.
Respuestas:
Solo quería resumir para una posible referencia futura rápida: la barra inclinada ancla la coincidencia a la raíz. Por lo tanto, en el ejemplo siguiente, sin la barra, el comodín también excluiría todo dentro de foo porque tomaría
*
y se movería recursivamente hacia abajo en el árbol. Sin embargo, con/*
, excluye todo excepto la carpeta foo y su contenido:fuente
Has respondido tu propia pregunta por completo. Si observa el repositorio de github / gitignore más de cerca, verá que la mayoría de los archivos usan reglas inconsistentes sobre cómo se escriben los patrones; es muy probable que la mayoría fueron aportados por personas que no se molestaron en leer la documentación ni probar las cosas como lo hizo usted.
Entonces, si eso ayuda: tienes razón, ten confianza.
Si ves errores en proyectos colaborativos como este, no dudes en aportar tu conocimiento. Incluso hay un precedente si necesita fortalecer aún más su confianza.
fuente