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


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


3469
2017-09-22 16:41


Ursprung


Antworten:


Eine andere Möglichkeit, ein Verzeichnis leer zu halten (im Repository), besteht darin, ein Verzeichnis zu erstellen .gitignore Datei in dem Verzeichnis, das diese vier Zeilen enthält:

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

Dann müssen Sie die Bestellung nicht so bekommen, wie Sie es in m104 tun müssen Lösung.

Dies hat auch den Vorteil, dass Dateien in diesem Verzeichnis nicht als "nicht geparkt" angezeigt werden, wenn Sie einen Git-Status ausführen.

Herstellung @GreenAsJadeKommentar dauerhaft:

Ich denke, es ist erwähnenswert, dass diese Lösung genau das tut, wonach die Frage gefragt ist, aber nicht das, was viele Leute, die diese Frage betrachten, gesucht haben. Diese Lösung garantiert, dass das Verzeichnis leer bleibt. Dort steht: "Ich möchte wirklich nie, dass Dateien hier eingecheckt werden". Im Gegensatz zu "Ich habe noch keine Dateien, die hier einchecken, aber ich brauche das Verzeichnis hier, Dateien könnten später kommen".


3359
2018-05-31 22:10



Du kannst nicht. Siehe die Git FAQ.

Derzeit das Design des Git-Index   (Staging-Bereich) erlaubt nur Dateien zu   aufgeführt sein, und niemand kompetent genug   um die Änderung zuzulassen, um leer zu lassen   Verzeichnisse hat sich genug um   diese Situation, um es zu beheben.

Verzeichnisse werden automatisch hinzugefügt   beim Hinzufügen von Dateien in ihnen. Das   Ist, müssen Verzeichnisse nie hinzugefügt werden   in das Repository und werden nicht verfolgt   alleine.

Sie können sagen "git add <dir>" und es   fügt Dateien dort hinzu.

Wenn Sie wirklich ein Verzeichnis benötigen   Existieren in Kassen, sollten Sie ein erstellen   Datei darin. .gitignore funktioniert gut für   dieser Zweck; du kannst es leer lassen,   oder füllen Sie die Namen der Dateien, die Sie   erwarte, im Verzeichnis zu erscheinen.


981
2017-09-22 16:42



Erstellen Sie eine leere Datei namens .gitkeep im Verzeichnis und fügen Sie das hinzu.


594
2017-12-07 16:03



Sie könnten jederzeit eine README-Datei in das Verzeichnis einfügen, in der Sie erklären, warum Sie dieses Verzeichnis, das ansonsten leer ist, im Repository haben möchten.


368
2018-03-14 23:38



touch .keep

Unter Linux erstellt dies eine leere Datei namens .keep. Dieser Name ist gegenüber bevorzugt .gitkeep da ersterer Agnostic zu Git ist, während letzterer für Git spezifisch ist. Zweitens, wie ein anderer Benutzer bemerkt hat, die .git Präfixkonventionen sollten für Dateien und Verzeichnisse reserviert werden, die Git selbst verwendet.

Alternativ, wie in einem anderen angemerkt Antworten, das Verzeichnis kann eine Beschreibung enthalten README oder README.md Datei stattdessen.

Dies erfordert natürlich, dass das Vorhandensein der Datei nicht zum Bruch Ihrer Anwendung führt.


259
2018-01-29 04:29



Warum brauchen wir leere versionierte Ordner?

Das wichtigste zuerst:

Ein leeres Verzeichnis kann nicht Teil eines Baumes unter dem Git Versioning System sein.

Es wird einfach nicht verfolgt. Es gibt jedoch Szenarien, in denen die "Versionierung" eines leeren Verzeichnisses nützlich sein kann, zum Beispiel:

  • Gebäude a vordefinierte Ordnerstruktur für nützliche Projektordner und diese Struktur für jeden Benutzer / Mitwirkenden des Repositories verfügbar machen; oder, als Spezialfall des oben genannten, Erstellen eines Ordners für temporäre Dateien, so wie ein cache/ oder logs/ Verzeichnisse
  • einige Projekte geht einfach nicht ohne Ordner (Dies ist oft ein Hinweis auf ein schlecht entworfenes Projekt, aber es ist ein häufiges Szenario in der realen Welt und vielleicht könnte es, sagen wir, Berechtigungsprobleme geben).

Einige vorgeschlagene Problemumgehungen

Viele Benutzer schlagen vor:

  1. Platzieren eines README Datei oder eine andere Datei mit etwas Inhalt, um das Verzeichnis nicht leer zu machen, oder
  2. Ein ... Erstellen .gitignore Datei mit einer Art "umgekehrter Logik" (d. h. um alle Dateien einzuschließen), die am Ende dem gleichen Zweck des Ansatzes # 1 dient.

Während Beide Lösungen funktionieren sicher Ich finde sie nicht konsistent mit einer sinnvollen Herangehensweise an Git Versioning.

  • Warum sollten Sie gefälschte Dateien oder READMEs anlegen, die Sie vielleicht nicht wirklich in Ihrem Projekt haben wollen?
  • Warum verwenden? .gitignore etwas tun (halten Dateien), das ist das genaue Gegenteil dessen, wofür es gedacht ist (ohne Dateien), obwohl es möglich ist?

.gitkeep Ansatz

Benutze ein leer Datei aufgerufen .gitkeep um das Vorhandensein des Ordners im Versionssystem zu erzwingen.

Obwohl es nicht so ein großer Unterschied scheint:

  • Sie verwenden eine Datei mit dem Namen Single Zweck, den Ordner zu halten. Sie legen dort keine Informationen, die Sie nicht stellen möchten.

    Zum Beispiel sollten Sie READMEs als READMEs mit nützlichen Informationen verwenden, nicht als Entschuldigung, um den Ordner zu behalten.

    Trennung von Bedenken ist immer eine gute Sache, und Sie können noch hinzufügen .gitignore um unerwünschte Dateien zu ignorieren.

  • Benennen Sie es .gitkeep macht es sehr klar und direkt aus dem Dateinamen selbst (und auch an andere Entwickler, was für ein gemeinsames Projekt und einen der Kernzwecke eines Git-Repositories gut ist), dass diese Datei ist

    • Eine Datei, die nichts mit dem Code zu tun hat (wegen des führenden Punkts und des Namens)
    • Eine Datei, die eindeutig mit Git verwandt ist
    • Sein Sinn (behalten) ist klar formuliert und in seiner Bedeutung konsistent und semantisch entgegengesetzt ignorieren

Annahme

Ich habe das gesehen .gitkeep Ansatz von sehr wichtigen Rahmenbedingungen wie Laravel, Angular-CLI.


202
2017-12-04 23:32



Wie in anderen Antworten beschrieben, kann Git keine leeren Verzeichnisse in seinem Staging-Bereich darstellen. (Siehe Git FAQ.) Wenn jedoch für Ihre Zwecke ein Verzeichnis leer genug ist, wenn es ein enthält .gitignore Datei nur, dann können Sie erstellen .gitignore Dateien in leeren Verzeichnissen nur über:

find . -type d -empty -exec touch {}/.gitignore \;

119
2018-05-03 15:17



Andy Lester hat Recht, aber wenn dein Verzeichnis nur leer sein muss, und nicht leer leer, du kannst ein leeres legen .gitignore Datei dort als Workaround.

Abgesehen davon ist dies ein Implementierungsproblem, kein grundlegendes Git-Speicherentwurfsproblem. Wie schon oft auf der Git-Mailingliste erwähnt, ist der Grund, warum dies nicht implementiert wurde, dass sich niemand darum gekümmert hat, einen Patch dafür einzureichen, nicht dass es nicht getan werden könnte oder sollte.


57
2017-09-22 17:28



Das Ruby auf Schienen Weg:

mkdir log && touch log/.gitkeep && git add log/.gitkeep

Jetzt wird das Protokollverzeichnis in der Baumstruktur enthalten sein. Es ist bei der Bereitstellung äußerst nützlich, sodass Sie keine Routine schreiben müssen, um Protokollverzeichnisse zu erstellen.

Die Logfiles können durch Ausstellen ausgeblendet werden,

echo log/dev.log >> .gitignore

aber das wusstest du wahrscheinlich.


29
2017-10-22 13:24



Git verfolgt keine leeren Verzeichnisse. Siehe die Git FAQ für mehr Erklärung. Die vorgeschlagene Problemumgehung besteht darin, a .gitignore Datei im leeren Verzeichnis. Ich mag diese Lösung nicht, weil die .gitignore ist durch 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, die erklärt, warum das Verzeichnis leer ist und warum es in Git nachverfolgt werden muss. Mit der README-Datei ist das Verzeichnis, was Git betrifft, nicht mehr leer.

Die eigentliche Frage ist, warum brauchen Sie das leere Verzeichnis in git? Normalerweise haben Sie ein Build-Skript, das vor dem Kompilieren / Ausführen ein leeres Verzeichnis erstellen kann. Wenn nicht, dann mach eins. Das ist eine weitaus bessere Lösung, als leere Verzeichnisse in git zu setzen.

Du hast also einen Grund, warum du ein leeres Verzeichnis in git brauchst. Setzen Sie diesen Grund in die README-Datei. Auf diese Weise wissen andere Entwickler (und zukünftige Sie), warum das leere Verzeichnis dort sein muss. Sie werden auch wissen, dass Sie das leere Verzeichnis entfernen können, wenn das Problem gelöst wurde, das das leere Verzeichnis erfordert.


Verwenden Sie den folgenden Befehl, um jedes leere Verzeichnis aufzulisten:

find -name .git -prune -o -type d -empty -print

So erstellen Sie Platzhalter-READMEs in jedem leeren Verzeichnis:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

Um alles außer der README-Datei im Verzeichnis zu ignorieren, fügen Sie die folgenden Zeilen in Ihre Datei ein .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

Alternativ könntest du es einfach ausschließen jeden README-Datei wird ignoriert:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

Um alle README aufzulisten, nachdem sie bereits erstellt wurden:

find -name README.emptydir

25
2018-05-06 15:45