Cuando usar barra inclinada inicial en gitignore

108

Estoy tratando de entender más claramente la .gitignoresintaxis 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 .gitignorearchivo (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:

  1. 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 .gitignorearchivo.
  2. 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 .gitignoreubicació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 dirdirectorios. 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 dirdirectorio 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 downloaderdirectorios 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 downloaderdirectorio 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 .gitignorearchivo 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.

Swahnee
fuente
8
Gran pregunta y muy buena explicación, también me molestó esto y su investigación me dejó las cosas claras. Después de leer esto, diría que es una buena práctica comenzar siempre las rutas con barra inclinada si deben comenzar desde la raíz, hace que la intención sea más obvia.
Martinsos
4
Gracias :) Estoy de acuerdo con su nota sobre el uso de barras diagonales para hacer las intenciones más explícitas.
Swahnee
8
Esto debería ser parte de la documentación .gitignore. ¡Mucho más fácil de entender!
rmorrin
Me encantaría ver esta gran publicación dividida en secciones de preguntas y respuestas ...
Barett

Respuestas:

25

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:

$ cat .gitignore
/*
!/foo
solsticio333
fuente
24

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.

tne
fuente