5353 Stimmen

Wie kann ich ein leeres Verzeichnis zu einem Git-Repository hinzufügen?

Wie kann ich ein leeres Verzeichnis (das keine Dateien enthält) zu einem Git-Repository hinzufügen?

379voto

Cranio Punkte 9330

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/ o logs/ 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:

  1. Platzierung einer README Datei oder eine andere Datei mit einem bestimmten Inhalt, damit das Verzeichnis nicht leer ist, oder
  2. 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 .

141voto

mjs Punkte 60362

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 \;

80voto

Aristotle Pagaltzis Punkte 106298

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.

43voto

vidur punj Punkte 3198

Fügen Sie eine .gitkeep-Datei in diesem Verzeichnis hinzu und übertragen Sie sie.

touch .gitkeep 

es ist der Standard, dem Git folgt.

42voto

Lesmana Punkte 23924

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X