Wie kann ich ein leeres Verzeichnis (das keine Dateien enthält) zu einem Git-Repository hinzufügen?
Antworten
Zu viele Anzeigen?Warum sollten wir leere versionierte Ordner brauchen?
Das Wichtigste zuerst:
Ein leeres Verzeichnis kann nicht Teil eines Baums unter dem Git-Versionssystem sein .
Es wird einfach nicht nachverfolgt. Es gibt jedoch Szenarien, in denen die "Versionierung" leerer Verzeichnisse sinnvoll sein kann, zum Beispiel:
- Gerüstbau a vordefinierte Ordnerstruktur und macht ihn jedem Benutzer/Beitragenden des Repositorys zugänglich; oder, als Spezialfall des oben Genannten, die Erstellung eines Ordners für temporäre Dateien wie zum Beispiel ein
cache/
ologs/
Verzeichnisse, in denen wir den Ordner angeben wollen, aber.gitignore
seine Inhalte - Im Zusammenhang mit dem oben Gesagten, einige Projekte wird ohne einige Ordner nicht funktionieren (was oft ein Hinweis auf ein schlecht konzipiertes Projekt ist, aber es ist ein häufiges Szenario in der Praxis, und vielleicht gibt es z. B. Probleme mit der Zulassung, die gelöst werden müssen).
Einige vorgeschlagene Abhilfemaßnahmen
Viele Benutzer schlagen vor:
- Platzierung einer
README
Datei oder eine andere Datei mit einem bestimmten Inhalt, damit das Verzeichnis nicht leer ist, oder - Erstellen einer
.gitignore
Datei mit einer Art "umgekehrter Logik" (d.h. um alle Dateien einzuschließen), die am Ende dem gleichen Zweck wie Ansatz 1 dient.
Während beide Lösungen funktionieren sicher Ich halte sie für unvereinbar mit einem sinnvollen Ansatz für die Git-Versionierung.
- Warum sollen Sie gefälschte Dateien oder READMEs in Ihr Projekt einfügen, die Sie vielleicht gar nicht haben wollen?
- Warum verwenden
.gitignore
um eine Sache zu tun ( unter Dateien), die genau das Gegenteil von dem ist, wofür sie gedacht ist ( ohne Dateien), obwohl dies möglich ist?
.gitkeep-Ansatz
Verwenden Sie eine leer Datei namens .gitkeep
um das Vorhandensein des Ordners im Versionierungssystem zu erzwingen.
Auch wenn es nicht so aussieht, als ob das ein großer Unterschied wäre:
-
Sie verwenden eine Datei, die die einzeln Zweck der Aufbewahrung des Ordners. Sie legen dort keine Informationen ab, die Sie nicht haben wollen.
Zum Beispiel sollten Sie READMEs als, nun ja, READMEs mit nützlichen Informationen verwenden, nicht als Vorwand, um den Ordner zu behalten.
Die Trennung von Belangen ist immer eine gute Sache, und Sie können immer noch eine
.gitignore
um unerwünschte Dateien zu ignorieren. -
Die Namensgebung
.gitkeep
macht es durch den Dateinamen selbst sehr klar und einfach (und auch für andere Entwickler (was für ein gemeinsames Projekt gut ist und einer der Hauptzwecke eines Git-Repositorys), dass diese Datei- Eine Datei, die nichts mit dem Code zu tun hat (wegen des führenden Punkts und des Namens)
- Eine Datei mit eindeutigem Bezug zu Git
- Sein Zweck ( behalten. ) ist eindeutig und konsistent und in seiner Bedeutung semantisch entgegengesetzt zu ignorieren.
Adoption
Ich habe die .gitkeep
Ansatz, der von sehr wichtigen Rahmenwerken wie Laravel , Angular-CLI .
Wie in anderen Antworten beschrieben, ist Git nicht in der Lage, leere Verzeichnisse in seinem Staging-Bereich darzustellen. (Siehe die Git-FAQ .) Wenn jedoch für Ihre Zwecke ein Verzeichnis leer genug ist, wenn es eine .gitignore
Datei zu erstellen, dann können Sie .gitignore
Dateien in leeren Verzeichnissen nur über:
find . -type d -empty -exec touch {}/.gitignore \;
Andy Lester hat recht, aber wenn Ihr Verzeichnis nur leer sein soll und nicht leer leer ist, können Sie eine leere .gitignore
Datei als Abhilfe einfügen.
Nebenbei bemerkt ist dies ein Implementierungsproblem und kein grundsätzliches Problem bei der Entwicklung von Git-Speicher. Wie bereits mehrfach auf der Git-Mailingliste erwähnt wurde, ist der Grund, warum dies nicht implementiert wurde, dass es niemanden interessiert hat, einen Patch dafür einzureichen, und nicht, dass es nicht gemacht werden könnte oder sollte.
Git verfolgt keine leeren Verzeichnisse. Siehe die Git-FAQ für weitere Erklärungen. Die vorgeschlagene Abhilfe besteht darin, ein .gitignore
Datei in dem leeren Verzeichnis. Ich mag diese Lösung nicht, weil die .gitignore
ist nach Unix-Konvention "versteckt". Es gibt auch keine Erklärung, warum die Verzeichnisse leer sind.
Ich schlage vor, eine README-Datei in das leere Verzeichnis zu legen, in der erklärt wird, warum das Verzeichnis leer ist und warum es in Git nachverfolgt werden muss. Wenn die README-Datei vorhanden ist, ist das Verzeichnis für Git nicht mehr leer.
Die eigentliche Frage ist, warum Sie das leere Verzeichnis in Git benötigen? Normalerweise haben Sie eine Art Build-Skript, das das leere Verzeichnis vor dem Kompilieren/Ausführen erstellen kann. Wenn nicht, dann erstellen Sie eines. Das ist eine weitaus bessere Lösung, als leere Verzeichnisse in Git anzulegen.
Sie haben also einen Grund, warum Sie ein leeres Verzeichnis in Git benötigen. Schreiben Sie diesen Grund in die README-Datei. Auf diese Weise wissen andere Entwickler (und Sie in Zukunft), warum das leere Verzeichnis dort sein muss. Sie werden auch wissen, dass Sie das leere Verzeichnis entfernen können, wenn das Problem, das das leere Verzeichnis erfordert, gelöst ist.
Um jedes leere Verzeichnis aufzulisten, verwenden Sie den folgenden Befehl:
find -name .git -prune -o -type d -empty -print
Um Platzhalter-READMEs in jedem leeren Verzeichnis zu erstellen:
find -name .git -prune -o -type d -empty -exec sh -c \
"echo this directory needs to be empty because reasons > {}/README.emptydir" \;
Um alles im Verzeichnis außer der README-Datei zu ignorieren, fügen Sie die folgenden Zeilen in Ihr .gitignore
:
path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir
Alternativ könnten Sie auch einfach ausschließen jede README-Datei nicht ignoriert wird:
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
Um alle READMEs aufzulisten, nachdem sie bereits erstellt wurden:
find -name README.emptydir