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?

34voto

ofavre Punkte 3878

WARNUNG: Dieser Tweak funktioniert nicht wirklich, wie sich herausstellt. Wir entschuldigen uns für die Unannehmlichkeiten.

Originalbeitrag unten:

Ich habe eine Lösung gefunden, als ich mit Git-Interna spielte!

  1. Angenommen, Sie befinden sich in Ihrem Repository.

  2. Erstellen Sie Ihr leeres Verzeichnis:

    $ mkdir path/to/empty-folder
  3. Fügen Sie sie mit einem Plumbing-Befehl und dem leeren Baum in den Index ein SHA-1 :

    $ git update-index --index-info
    040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904    path/to/empty-folder

    Geben Sie den Befehl und dann die zweite Zeile ein. Drücken Sie Enter und dann Ctrl + D um Ihre Eingabe zu beenden. Hinweis: Das Format ist Modus [SPACE] Typ [SPACE] SHA-1hash [TAB] Pfad (der Tabulator ist wichtig, die Formatierung der Antwort behält ihn nicht bei).

  4. Das war's! Ihr leerer Ordner befindet sich in Ihrem Index. Alles, was Sie noch tun müssen, ist die Übertragung.

Diese Lösung ist kurz und funktioniert offenbar gut ( siehe den EDIT! ), aber es ist nicht so einfach, sich daran zu erinnern...

Der leere Baum SHA-1 kann durch Erstellen eines neuen leeren Git-Repositorys gefunden werden, cd in sie hinein und geben git write-tree der den leeren Baum SHA-1 ausgibt.

EDIT:

Ich verwende diese Lösung, seit ich sie gefunden habe. Sie scheint genau so zu funktionieren wie das Erstellen eines Submoduls, nur dass nirgendwo ein Modul definiert ist. Dies führt zu Fehlern bei der Ausgabe von git submodule init|update . Das Problem ist, dass git update-index überschreibt die 040000 tree einfließen 160000 commit .

Außerdem wird jede Datei, die unter diesem Pfad abgelegt wird, von Git nicht bemerkt, da es denkt, dass sie zu einem anderen Repository gehört. Das ist unangenehm, da es leicht übersehen werden kann!

Wenn Sie jedoch noch keine Git-Submodule in Ihrem Repository verwenden (und dies auch nicht vorhaben) und der "leere" Ordner leer bleiben soll oder wenn Sie möchten, dass Git von seiner Existenz weiß und seinen Inhalt ignoriert, können Sie diese Änderung vornehmen. Der übliche Weg mit Submodulen erfordert mehr Schritte als dieser Tweak.

32voto

m104 Punkte 1088

Nehmen wir an, Sie benötigen ein leeres Verzeichnis namens tmp :

$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp

Mit anderen Worten: Sie müssen die Datei .gitignore in den Index aufnehmen, bevor Sie Git anweisen können, sie (und alles andere in dem leeren Verzeichnis) zu ignorieren.

32voto

Thomas E Punkte 3724

El Ruby on Rails Erstellung des Protokollordners:

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

Jetzt wird das Protokollverzeichnis in den Baum aufgenommen. Das ist beim Deployment sehr nützlich, so dass Sie keine Routine schreiben müssen, um Log-Verzeichnisse zu erstellen.

Die Logdateien können durch die Ausgabe von,

echo log/dev.log >> .gitignore

aber das wussten Sie wahrscheinlich.

24voto

Mig82 Punkte 4136

Mir gefallen die Antworten von @Artur79 und @mjs, so dass ich eine Kombination aus beidem verwende und sie zu einem Standard für unsere Projekte gemacht habe.

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

Allerdings arbeitet nur eine Handvoll unserer Entwickler mit Mac oder Linux. Viele arbeiten unter Windows, und ich konnte keinen gleichwertigen einfachen Einzeiler finden, um dort das Gleiche zu erreichen. Einige hatten das Glück, dass sie Cygwin aus anderen Gründen installiert, aber Cygwin nur dafür zu verschreiben, schien mir zu viel des Guten.

Bearbeiten für eine bessere Lösung

Da also die meisten unserer Entwickler bereits über Ameise installiert hatte, dachte ich als erstes daran, eine Ant-Build-Datei zu erstellen, um dies unabhängig von der Plattform zu erreichen. Diese kann immer noch gefunden werden aquí

Allerdings Später dachte ich, es wäre besser, daraus ein kleines Dienstprogramm zu machen, also habe ich es mit Python neu erstellt und in der PyPI veröffentlicht aquí . Sie können es installieren, indem Sie es einfach ausführen:

pip3 install gitkeep2

Damit können Sie Folgendes erstellen und entfernen .gitkeep Dateien rekursiv, und Sie können ihnen auch Nachrichten hinzufügen, damit Ihre Kollegen verstehen, warum diese Verzeichnisse wichtig sind. Der letzte Punkt ist ein Bonus. Ich dachte, es wäre schön, wenn die .gitkeep Dateien könnten selbstdokumentierend sein.

$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH

  Add a .gitkeep file to a directory in order to push them into a Git repo
  even if they're empty.

  Read more about why this is necessary at: https://git.wiki.kernel.org/inde
  x.php/Git_FAQ#Can_I_add_empty_directories.3F

Options:
  -r, --recursive     Add or remove the .gitkeep files recursively for all
                      sub-directories in the specified path.
  -l, --let-go        Remove the .gitkeep files from the specified path.
  -e, --empty         Create empty .gitkeep files. This will ignore any
                      message provided
  -m, --message TEXT  A message to be included in the .gitkeep file, ideally
                      used to explain why it's important to push the specified
                      directory to source control even if it's empty.
  -v, --verbose       Print out everything.
  --help              Show this message and exit.

Ich hoffe, Sie finden es nützlich.

22voto

Brent Bradburn Punkte 45995

Vielleicht wäre das Hinzufügen eines leeren Verzeichnisses der richtige Weg, um der Weg des geringsten Widerstands weil Sie Skripte haben, die erwarten, dass dieses Verzeichnis existiert (vielleicht weil es ein Ziel für generierte Binärdateien ist). Ein anderer Ansatz wäre, dass ändern Sie Ihre Skripte, um das Verzeichnis nach Bedarf zu erstellen .

mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed

In diesem Beispiel könnten Sie einen (defekten) symbolischen Link auf das Verzeichnis einchecken, so dass Sie ohne das Präfix ".generated" darauf zugreifen können (dies ist jedoch optional).

ln -sf .generated/bin bin
git add bin

Wenn Sie Ihren Quellbaum bereinigen wollen, können Sie dies einfach tun:

rm -rf .generated ## this should be in a "clean" script or in a makefile

Wenn Sie den oft vorgeschlagenen Ansatz wählen, einen fast leeren Ordner einzuchecken, haben Sie das Problem, den Inhalt zu löschen, ohne auch die ".gitignore"-Datei zu löschen.

Sie können alle von Ihnen erzeugten Dateien ignorieren, indem Sie Folgendes zu Ihrer Root-.gitignore hinzufügen:

.generated

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