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.
bin
ybin/
es que el primero ignorará los archivos o carpetas, el segundo solo las carpetas. No sé la diferencia conbin/*
Respuestas:
Hay diferencias entre
www
,www/
ywww/*
.Básicamente a partir de la documentación y mis propias pruebas,
www
encuentro una coincidencia con un archivo o directorio,www/
solo coincide con un directorio, mientras quewww/*
coincide con directorios y archivos dentrowww
.Solo discutiré las diferencias entre
www/
ywww/*
aquí, ya que las diferencias entrewww
ywww/
son obvias.Porque
www/
, git ignora el directorio enwww
sí, lo que significa que git ni siquiera mirará dentro. Pero parawww/*
, git verifica todos los archivos / carpetas dentrowww
e ignora todos ellos con el patrón*
. Parece conducir a los mismos resultados, ya que git no rastreará una carpeta vacíawww
si se ignoran todos sus archivos / carpetas secundarios. Y, de hecho, los resultados no serán una diferencia para el caso de OP conwww/
o de formawww/*
independiente. Pero hace diferencias si se combina con otras reglas.Por ejemplo, ¿qué pasa si solo queremos incluir
www/1.txt
pero ignorar a todos los demás dentrowww
?Lo siguiente
.gitignore
no funcionará.Si bien lo siguiente
.gitignore
funciona, ¿por qué?Para el primero, git simplemente ignora el directorio
www
y ni siquiera mira adentro para incluirlowww/1.txt
nuevamente. La primera regla excluye el directorio principalwww
pero nowww/1.txt
, y como resultadowww/1.txt
no 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 eswww/1.txt
.Para este ejemplo, las siguientes líneas en la documentación pueden ayudar:
fuente
www/1.txt
y luegowww/
harías lo mismo que el segundo enfoque ...Solo estoy analizando la documentación y, por lo que puedo decir, solo difieren en patrones más avanzados, por ejemplo
Me hice la prueba de lo anterior, y si se reemplaza
!/foo
con!/foo/*
, usted consigue de hecho un resultado diferente.Nota
Excluirá cualquier archivo
foo
, perosolo excluirá directorios llamados foo.
fuente
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éwww
carpeta se va a versionar, en lugar de usar un nombre vacío.gitkeep
,.dummy
o el nombre que elija, ¿por qué no usar un.gitignore
allí, diciendo que ignore todos los archivos?En la raíz
.gitignore
(a), no dice nada sobre elwww
carpeta o su contenido.En la
www/.gitignore
(b) pones lo siguiente:De esta manera todo parece más organizado (al menos para mí).
fuente
Para ignorar todo en un directorio excepto los archivos de puntos, puede usar el siguiente patrón glob en su
.gitignore
:Así que no es necesario un extra
.gitignore
, simplemente agregue un.keep
archivo a suwww
directorio.fuente