Beide Beispiele in der Frage sind tatsächlich sehr schlechte Beispiele, die zu Datenverlust führen können!
Mein Rat: Niemals /*
an Verzeichnisse in .gitignore-Dateien anhängen , es sei denn, Sie haben einen guten Grund!
Ein guter Grund wäre zum Beispiel, was Jefromi schrieb: "Wenn Sie beabsichtigen, später etwas im Verzeichnis zu ignorieren" .
Der Grund, warum dies sonst nicht getan werden sollte, ist, dass das Anhängen /*
an Verzeichnisse einerseits so funktioniert, dass alle Inhalte des Verzeichnisses ordnungsgemäß ignoriert werden, andererseits aber eine gefährliche Nebenwirkung hat:
Wenn Sie in Ihrem Repository 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), werden alle Verzeichnisse, die mit einem angehängten ignoriert /*
werden, irreversibel gelöscht !
Einige Hintergrundinformationen
Ich musste das auf die harte Tour lernen. Jemand in meinem Team hat /*
an einige Verzeichnisse in unserem .gitignore angehängt. Im Laufe der Zeit hatte ich Gelegenheiten, in denen bestimmte Verzeichnisse plötzlich verschwanden. Verzeichnisse mit Gigabyte lokaler Daten, die von unserer Anwendung benötigt werden. Niemand konnte es erklären und ich musste immer alle Daten erneut herunterladen. Nach einer Weile bekam ich eine Vorstellung, dass es damit zu tun haben könnte git stash
. Eines Tages wollte ich mein lokales Repo bereinigen (während ignorierte Dateien beibehalten wurden) und ich benutzte git clean -df
und wieder waren meine Daten weg. Diesmal hatte ich genug und untersuchte das Problem. Ich habe endlich herausgefunden, dass der Grund der angehängte ist /*
.
Ich gehe davon aus, dass directory/*
dies irgendwie dadurch erklärt werden kann, dass alle Inhalte des Verzeichnisses ignoriert werden, nicht jedoch das Verzeichnis selbst. Daher wird es weder als verfolgt betrachtet noch ignoriert, wenn Dinge gelöscht werden. Auch wenn git status
und git status --ignored
ein etwas anderes Bild darauf geben.
Wie zu reproduzieren
Hier erfahren Sie, wie Sie das Verhalten reproduzieren. Ich benutze derzeit Git 2.8.4.
Ein Verzeichnis localdata/
mit einer Dummy-Datei ( important.dat
) wird in einem lokalen Git-Repository erstellt und der Inhalt wird durch Einfügen /localdata/*
in die .gitignore
Datei ignoriert . Wenn jetzt 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 machen, 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/
Jetzt entweder tun
git stash -u
git stash pop
oder
git clean -df
In beiden Fällen ist das angeblich ignorierte Verzeichnis localdata
verschwunden!
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 der Git-Entwicklungsliste melden und sehen, was sie darüber denken.
.gitignore
differenzierbare zwischen Dateien und Verzeichnissen , dass es ignoriert? Bedeutetdata
vs zum Beispieldata/
verschiedene Dinge?