Wie kann ich ein leeres Verzeichnis (das keine Dateien enthält) zu einem Git-Repository hinzufügen?
Antworten
Zu viele Anzeigen?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!
-
Angenommen, Sie befinden sich in Ihrem Repository.
-
Erstellen Sie Ihr leeres Verzeichnis:
$ mkdir path/to/empty-folder
-
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).
-
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.
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.
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.
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.
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