Beide Beispiele in der Frage sind eigentlich sehr schlechte Beispiele, die zu Datenverlust führen können!
*Mein Rat: Niemals anhängen `/` zu Verzeichnissen in .gitignore-Dateien, es sei denn, Sie haben einen guten Grund!**
Ein guter Grund wäre zum Beispiel das, was Jefromi geschrieben hat: "wenn Sie beabsichtigen, etwas im Verzeichnis nachträglich zu ent-ignorieren" .
Der Grund, warum es sonst nicht gemacht werden sollte, ist, dass das Anhängen von /*
auf Verzeichnisse funktioniert zwar einerseits so, dass es alle Inhalte des Verzeichnisses ordentlich ignoriert, hat aber andererseits einen gefährlichen Nebeneffekt:
Wenn Sie Folgendes ausführen git stash -u
(um verfolgte und nicht verfolgte Dateien vorübergehend zu speichern) oder git clean -df
(um nicht verfolgte, aber ignorierte Dateien zu löschen) in Ihrem Projektarchiv, alle Verzeichnisse, die ignoriert werden, mit einem angehängten /*
wird unwiderruflich gelöscht !
Einige Hintergrundinformationen
Das musste ich auf die harte Tour lernen. Jemand in meinem Team fügte /*
zu einigen Verzeichnissen in unserer .gitignore. Im Laufe der Zeit kam es vor, dass bestimmte Verzeichnisse plötzlich verschwanden. Verzeichnisse mit Gigabytes an lokalen Daten, die von unserer Anwendung benötigt werden. Niemand konnte sich das erklären und ich musste immer alle Daten neu herunterladen. Nach einer Weile kam ich auf die Idee, dass es mit folgenden Dingen zu tun haben könnte git stash
. Eines Tages wollte ich mein lokales Projektarchiv bereinigen (wobei ich ignorierte Dateien beibehielt) und ich verwendete git clean -df
und wieder waren meine Daten weg. Diesmal hatte ich genug und untersuchte das Problem. Schließlich fand ich heraus, dass der Grund die angehängten /*
.
Ich gehe davon aus, dass sich das irgendwie dadurch erklären lässt, dass directory/*
ignoriert zwar alle Inhalte des Verzeichnisses, nicht aber das Verzeichnis selbst. Daher wird es weder als verfolgt noch ignoriert, wenn Dinge gelöscht werden. Auch wenn git status
y git status --ignored
geben ein etwas anderes Bild davon.
Wie man sich vervielfältigt
So lässt sich das Verhalten reproduzieren. Ich verwende derzeit Git 2.8.4.
Ein Verzeichnis namens localdata/
mit einer Dummy-Datei darin ( important.dat
) wird in einem lokalen Git-Repository erstellt, und der Inhalt wird ignoriert, indem man /localdata/*
in die .gitignore
Datei. Wenn nun einer der beiden genannten Git-Befehle ausgeführt wird, geht das Verzeichnis (unerwartet) verloren.
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
Wenn Sie eine git status --ignored
hier erhalten Sie:
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/
Tun Sie nun entweder
git stash -u
git stash pop
o
git clean -df
In beiden Fällen wurde das angeblich ignorierte Verzeichnis localdata
wird weg sein!
Ich bin mir nicht sicher, ob dies als Fehler angesehen werden kann, aber ich denke, es ist zumindest eine Funktion, die niemand braucht.
Ich werde das an die Git-Entwicklungsliste weiterleiten und sehen, was sie darüber denken.