¡Ambos ejemplos en la pregunta son en realidad muy malos ejemplos que pueden conducir a la pérdida de datos!
Mi consejo: ¡nunca agregue /*
a directorios en archivos .gitignore, a menos que tenga una buena razón!
Una buena razón sería, por ejemplo, lo que escribió Jefromi: "si tiene la intención de ignorar posteriormente algo en el directorio" .
La razón por la que de otra manera no debería hacerse es que agregar /*
a directorios funciona, por un lado, de la manera en que ignora adecuadamente todos los contenidos del directorio, pero por otro lado tiene un efecto secundario peligroso:
Si ejecuta git stash -u
(para almacenar temporalmente archivos rastreados y no rastreados) o git clean -df
(para borrar archivos no rastreados pero mantener ignorados) en su repositorio, todos los directorios que se ignoran con un anexo /*
se eliminarán irreversiblemente .
Algunos antecedentes
Tenía que aprender esto de la manera difícil. Alguien en mi equipo estaba agregando /*
algunos directorios en nuestro .gitignore. Con el tiempo tuve ocasiones en que ciertos directorios desaparecerían repentinamente. Directorios con gigabytes de datos locales que necesita nuestra aplicación. Nadie podía explicarlo y siempre me gusta volver a descargar todos los datos. Después de un tiempo tuve la noción de que podría tener que ver con eso git stash
. Un día quería limpiar mi repositorio local (mientras mantenía los archivos ignorados) y estaba usando git clean -df
y nuevamente mis datos desaparecieron. Esta vez tuve suficiente e investigé el problema. Finalmente pensé que la razón es la adjunta /*
.
Supongo que puede explicarse de alguna manera por el hecho de que directory/*
ignora todo el contenido del directorio pero no el directorio en sí. Por lo tanto, no se considera rastreado ni ignorado cuando las cosas se eliminan. Aunque git status
y git status --ignored
dar una imagen ligeramente diferente en él.
Como reproducir
Aquí es cómo reproducir el comportamiento. Actualmente estoy usando Git 2.8.4.
Se creará un directorio llamado localdata/
con un archivo ficticio en él ( important.dat
) en un repositorio git local y el contenido se ignorará al colocarlo /localdata/*
en el .gitignore
archivo. Cuando se ejecuta uno de los dos comandos git mencionados ahora, el directorio se perderá (inesperadamente).
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
Si haces un git status --ignored
aquí, obtendrás:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
Ahora tampoco
git stash -u
git stash pop
o
git clean -df
En ambos casos, el directorio supuestamente ignorado localdata
desaparecerá.
No estoy seguro de si esto puede considerarse un error, pero supongo que es al menos una característica que nadie necesita.
Informaré eso a la lista de desarrollo de git y veré qué piensan al respecto.
.gitignore
diferencia entre archivos y directorios que ignora? por ejemplo, ¿data
vsdata/
significa cosas diferentes?