¿Cuál es la diferencia entre Git ignorando el directorio y el directorio / *?

108

Estoy confundido acerca de cuál es la forma correcta de ignorar el contenido de un directorio en git.

Supongamos que tengo la siguiente estructura de directorio:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

¿Cuál es la diferencia entre poner esto?

www

¿Y esto?

www/*

La razón por la que hago esta pregunta es: en git, si un directorio está vacío, git no incluirá ese directorio vacío en el repositorio. Así que estaba probando la solución que es agregar un archivo .gitkeep adicional debajo del directorio para que no esté vacío. Cuando estaba probando esa solución, si estaba en el archivo .gitignore, escribo como a continuación:

www
!*.gitkeep

No funciona (mi intención es ignorar todos los contenidos en www pero mantener el directorio). Pero si intento lo siguiente:

www/* 
!*.gitkeep

¡Entonces funciona! Entonces creo que debe haber algunas diferencias entre los dos enfoques.

Aaron Shen
fuente
Una simple diferencia entre biny bin/es que el primero ignorará los archivos o carpetas, el segundo solo las carpetas. No sé la diferencia conbin/*
Colonel Panic

Respuestas:

203

Hay diferencias entre www, www/y www/*.

Básicamente a partir de la documentación y mis propias pruebas, wwwencuentro una coincidencia con un archivo o directorio, www/solo coincide con un directorio, mientras que www/*coincide con directorios y archivos dentro www.

Solo discutiré las diferencias entre www/y www/*aquí, ya que las diferencias entre wwwy www/son obvias.

Porque www/, git ignora el directorio en wwwsí, lo que significa que git ni siquiera mirará dentro. Pero para www/*, git verifica todos los archivos / carpetas dentro wwwe ignora todos ellos con el patrón *. Parece conducir a los mismos resultados, ya que git no rastreará una carpeta vacía wwwsi se ignoran todos sus archivos / carpetas secundarios. Y, de hecho, los resultados no serán una diferencia para el caso de OP con www/o de forma www/*independiente. Pero hace diferencias si se combina con otras reglas.

Por ejemplo, ¿qué pasa si solo queremos incluir www/1.txtpero ignorar a todos los demás dentro www?

Lo siguiente .gitignoreno funcionará.

www/
!www/1.txt

Si bien lo siguiente .gitignorefunciona, ¿por qué?

www/*
!www/1.txt

Para el primero, git simplemente ignora el directorio wwwy ni siquiera mira adentro para incluirlo www/1.txtnuevamente. La primera regla excluye el directorio principal wwwpero no www/1.txt, y como resultado www/1.txtno se puede " incluir de nuevo ".

Pero para el último, git primero ignora todos los archivos / folers debajo www, y luego incluye uno de ellos nuevamente, que es www/1.txt.

Para este ejemplo, las siguientes líneas en la documentación pueden ayudar:

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.

Landys
fuente
No crees que www/1.txt y luego www/harías lo mismo que el segundo enfoque ...
Naveed Butt
8

Solo estoy analizando la documentación y, por lo que puedo decir, solo difieren en patrones más avanzados, por ejemplo

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

Me hice la prueba de lo anterior, y si se reemplaza !/foocon !/foo/*, usted consigue de hecho un resultado diferente.

Nota

foo

Excluirá cualquier archivo foo, pero

foo/

solo excluirá directorios llamados foo.

djechlin
fuente
3

Aparte de las respuestas perfectamente buenas que ya ha obtenido, debe tener en cuenta que puede tener .gitignore tenerlas en cualquier parte de su proyecto, incluidas las subcarpetas.

Entonces, si desea ignorar todos los archivos dentro www, pero qué wwwcarpeta se va a versionar, en lugar de usar un nombre vacío .gitkeep, .dummyo el nombre que elija, ¿por qué no usar un .gitignoreallí, diciendo que ignore todos los archivos?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

En la raíz .gitignore(a), no dice nada sobre elwww carpeta o su contenido.

En la www/.gitignore(b) pones lo siguiente:

# ignore all files in this folder except this .gitignore
*
!.gitignore

De esta manera todo parece más organizado (al menos para mí).

Carlos Campderrós
fuente
1

Para ignorar todo en un directorio excepto los archivos de puntos, puede usar el siguiente patrón glob en su .gitignore:

www/[^.]*

Así que no es necesario un extra .gitignore, simplemente agregue un .keeparchivo a su wwwdirectorio.

Koen.
fuente