Löscht Git leere Ordner?

Löscht Git leere Ordner?

Ich habe alle Dateien aus einem Verzeichnis in meinem Arbeitsordner gelöscht, aber das Verzeichnis selbst existiert noch. Nachdem ich die Änderungen in ein Remote-Repository übertragen habe (GitHub) Ich habe mein Projekt überprüft und festgestellt, dass das Verzeichnis verschwunden ist. Ist es möglich, dass Git leere Ordner löscht?

Antwort1

Warum wird das Verzeichnis nicht angezeigt?

Git verfolgt keine Verzeichnisse, sondern nur Dateien.

Wenn sich in einem Verzeichnis keine Dateien befinden, „existiert“ dieses Verzeichnis für Git nicht, wenn Dateien hinzugefügt oder entfernt werden. Insbesondere verschwindet ein Verzeichnis aus dem Index von Git, wenn Sie alle Dateien daraus gelöscht und diese Änderung dem Index hinzugefügt haben. Umgekehrt wird ein Verzeichnis nicht hinzugefügt, git addwenn es leer ist.

Mit anderen Worten: Wenn Sie das Verzeichnis lokal in Ihrem Dateibrowser sehen können, es aber von GitHub verschwunden ist, haben Sie höchstwahrscheinlich alle Dateien aus dem Verzeichnis entfernt, diese Änderung zum Index hinzugefügt und sie festgeschrieben und gepusht.

Wie verfolge ich dann ein leeres Verzeichnis?

Wenn Sie ein leeres Verzeichnis explizit verfolgen möchten, müssen Sie darin eine Datei erstellen. Da Git leere Verzeichnisse nicht verfolgt, müssen Sie es dazu überreden, indem Sie dem Index von Git eine Datei im Verzeichnis hinzufügen.

Normalerweise speichert man eine Datei namens .gitkeepin einem Verzeichnis, das man verfolgen möchte, das aber vorerst leer bleiben soll. Sie können der Dateibeliebigein anderer Name, aber der Name .gitkeepist eine Konvention. Die .gitkeepDatei wird (da sie mit einem beginnt .) auf den meisten Systemen nicht in Dateilisten angezeigt.

Manche Benutzer möchten dort auch stattdessen .gitkeepeine Datei ablegen README, idealerweise mit einer kurzen Beschreibung, warum das Verzeichnis überhaupt existieren muss.

Beispiel

$ mkdir foo
$ git init
$ git add .
$ git ls-files   # which files does Git know about?
                 # apparently, none
$ touch foo/bar  # create a file in the directory
$ git add .
$ git ls-files   # does Git know about it now?
foo/bar          # yep!

Dabei foowird das Verzeichnis erst dann zum Index hinzugefügt, wenn sich eine Datei darin befindet.

Was wenn ichWirklichMöchten Sie ein leeres Verzeichnis verfolgen?

Im Prinzip erlaubt die zugrundeliegende Datenstruktur Git, ein leeres Verzeichnis zu speichern, da es durch einen leeren „Baum“ repräsentiert würde. Weitere InformationenHierUndHier.

Antwort2

Fügen Sie die folgende .gitignoreDatei zu den Ordnern hinzu, die Sie in Ihr Repo aufnehmen möchten.

# Ignore everything in this directory
*
# Except this file
!.gitignore

Das Hinzufügen .gitkeepfunktioniert, ist aber keine offizielle Lösung. Siehehttps://stackoverflow.com/questions/7229885/was-sind-die-unterschiede-zwischen-gitignore-und-gitkeep

Antwort3

Git löscht möglicherweise Ordner, wenn Sie es git cleanmit -dffx(möglicherweise sogar mit einer Teilmenge dieser Optionen) ausgeführt haben.

Wie @TRiG in den Kommentaren erwähnt, wird das Verzeichnis, wenn Sie es committen, nicht beispielsweise in GitHub angezeigt, weil Git keine Verzeichnisse verfolgt (es verfolgt Dateien) – der Baum, in dem sich diese Dateien befanden, ist nicht mehr relevant, weil keine Dateien vorhanden sind und es daher keinen Baum gibt.

Ohne weitere Details ist es für uns praktisch unmöglich, Ihre zugrunde liegenden Fragen richtig zu beantworten (was ist passiert?).

Antwort4

Verwenden Sie unter Linux/MAC OSX den folgenden Einzeiler, um leere Platzhalterdateien rekursiv zu erstellen/in den Ordnern abzulegen, damit sie von Git nicht ignoriert werden:

find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;

Hoffe, das hilft jemandem.

verwandte Informationen