Les deux exemples de la question sont en fait de très mauvais exemples qui peuvent entraîner une perte de données!
Mon conseil: ne jamais ajouter /*
aux répertoires dans des fichiers .gitignore, sauf si vous avez une bonne raison!
Une bonne raison serait par exemple ce que Jefromi a écrit: "si vous avez l'intention de dés-ignorer ultérieurement quelque chose dans le répertoire" .
La raison pour laquelle cela ne devrait pas être fait autrement est que l'ajout /*
aux répertoires fonctionne d'une part de la manière qu'il ignore correctement tout le contenu du répertoire, mais d'autre part, il a un effet secondaire dangereux:
Si vous exécutez git stash -u
(pour cacher temporairement les fichiers suivis et non suivis) ou git clean -df
(pour supprimer les fichiers non suivis mais gardez les fichiers ignorés) dans votre référentiel, tous les répertoires qui sont ignorés avec un ajout /*
seront irréversiblement supprimés !
Quelques antécédents
J'ai dû l'apprendre à la dure. Quelqu'un dans mon équipe ajoutait /*
à certains répertoires de notre .gitignore. Au fil du temps, j'ai eu des occasions où certains répertoires disparaissaient soudainement. Répertoires contenant des gigaoctets de données locales nécessaires à notre application. Personne ne pouvait l'expliquer et je déteste toujours télécharger à nouveau toutes les données. Après un certain temps, j'ai eu une idée que cela pourrait avoir à voir avec git stash
. Un jour, je voulais nettoyer mon dépôt local (tout en gardant les fichiers ignorés) et j'utilisais git clean -df
et encore mes données avaient disparu. Cette fois, j'en ai eu assez et j'ai enquêté sur le problème. J'ai finalement pensé que la raison en était l'annexe /*
.
Je suppose que cela peut s'expliquer d'une manière ou d'une autre par le fait qu'il directory/*
ignore tout le contenu du répertoire mais pas le répertoire lui-même. Ainsi, il n'est ni considéré comme suivi ni ignoré lorsque les choses sont supprimées. Même si git status
et git status --ignored
donnez une image légèrement différente à ce sujet.
Comment se reproduire
Voici comment reproduire le comportement. J'utilise actuellement Git 2.8.4.
Un répertoire appelé localdata/
avec un fichier factice ( important.dat
) sera créé dans un dépôt git local et le contenu sera ignoré en le mettant /localdata/*
dans le .gitignore
fichier. Lorsque l'une des deux commandes git mentionnées est exécutée maintenant, le répertoire sera (de manière inattendue) perdu.
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 vous faites un git status --ignored
ici, vous obtiendrez:
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/
Maintenant non plus
git stash -u
git stash pop
ou
git clean -df
Dans les deux cas, le répertoire prétendument ignoré localdata
disparaîtra!
Je ne sais pas si cela peut être considéré comme un bug, mais je suppose que c'est au moins une fonctionnalité dont personne n'a besoin.
Je vais signaler cela à la liste de développement git et voir ce qu'ils en pensent.
.gitignore
différence entre les fichiers et les répertoires qu'il ignore? par exemple,data
vsdata/
signifie-t-il des choses différentes?