webentwicklung-frage-antwort-db.com.de

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

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

3922
Laurie Young

Eine andere Möglichkeit, ein Verzeichnis (fast) leer zu lassen (im Repository), besteht darin, eine .gitignore -Datei in diesem Verzeichnis zu erstellen, die die folgenden vier Zeilen enthält:

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

Dann müssen Sie nicht die richtige Reihenfolge einhalten wie in m104 Lösung .

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

Den Kommentar von @ GreenAsJade dauerhaft machen:

Ich denke, es ist erwähnenswert, dass diese Lösung genau das tut, wonach die Frage gestellt wurde, aber vielleicht nicht das ist, wonach viele Leute gesucht haben, die sich diese Frage ansehen. Diese Lösung garantiert, dass das Verzeichnis leer bleibt. Es heißt "Ich möchte wirklich nie, dass Dateien hier eingecheckt werden". Im Gegensatz zu "Ich habe hier noch keine Dateien zum Einchecken, aber ich brauche das Verzeichnis hier, Dateien können später kommen".

3811
Jamie Flournoy

Das kannst du nicht. Siehe die Git FAQ .

Gegenwärtig erlaubt das Design des Git-Index (Staging-Bereich) nur die Auflistung von Dateien, und niemand, der kompetent genug ist, die Änderung vorzunehmen, um leere Verzeichnisse zuzulassen, hat sich genug um diese Situation gekümmert, um Abhilfe zu schaffen.

Verzeichnisse werden beim Hinzufügen von Dateien automatisch hinzugefügt. Das heißt, Verzeichnisse müssen nie zum Repository hinzugefügt werden und werden nicht eigenständig verfolgt.

Sie können "git add <dir>" sagen und es werden Dateien hinzugefügt.

Wenn Sie wirklich ein Verzeichnis für das Auschecken benötigen, sollten Sie eine Datei darin erstellen. .gitignore eignet sich gut für diesen Zweck; Sie können das Feld leer lassen oder die Namen der Dateien eingeben, die im Verzeichnis angezeigt werden sollen.

1046
Andy Lester

Erstellen Sie eine leere Datei mit dem Namen .gitkeep im Verzeichnis und fügen Sie diese hinzu.

672
Artur79

Sie können jederzeit eine README -Datei in das Verzeichnis einfügen und erklären, warum Sie dieses ansonsten leere Verzeichnis im Repository haben möchten.

403
John Mee
touch .keep

Unter Linux wird eine leere Datei mit dem Namen .keep erstellt. Dieser Name ist .gitkeep vorzuziehen, da der erstere für Git agnostisch ist, während der letztere für Git spezifisch ist. Zweitens sollte, wie ein anderer Benutzer bemerkt hat, die Präfixkonvention .git für Dateien und Verzeichnisse reserviert werden, die Git selbst verwendet.

Alternativ kann das Verzeichnis, wie in einem anderen Antwort vermerkt, stattdessen eine beschreibende README oder README.md Datei enthalten.

Dies setzt natürlich voraus, dass das Vorhandensein der Datei nicht zum Absturz Ihrer Anwendung führt.

304
Acumenus

Warum brauchen wir leere versionierte Ordner?

Das wichtigste zuerst:

Ein leeres Verzeichnis kann nicht Teil eines Baums unter dem Git-Versionssystem sein.

Es wird einfach nicht verfolgt. Es gibt jedoch Szenarien, in denen die "Versionierung" leerer Verzeichnisse sinnvoll sein kann, zum Beispiel:

  • einrichten einer vordefinierten Ordnerstruktur , die jedem Benutzer/Mitwirkenden des Repository zur Verfügung steht; oder in einem speziellen Fall einen Ordner für temporäre Dateien erstellen, z. B. ein Verzeichnis cache/ oder logs/ , wo wir den Ordner aber .gitignore dessen Inhalt bereitstellen wollen
  • im zusammenhang mit dem obigen funktionieren einige projekte nicht ohne ordner (was oft ein hinweis auf ein schlecht gestaltetes projekt ist, aber es ist ein häufiges reales szenario und könnte es vielleicht sein Berechtigungsprobleme angesprochen werden).

Einige Lösungsvorschläge

Viele Benutzer schlagen vor:

  1. Platzieren einer README -Datei oder einer anderen Datei mit Inhalt, um das Verzeichnis nicht leer zu machen, oder
  2. Erstellen einer .gitignore -Datei mit einer Art "umgekehrter Logik" (d. H. Um alle Dateien einzuschließen), die am Ende denselben Zweck wie Ansatz 1 erfüllt.

Während beide Lösungen sicher funktionieren , finde ich sie unvereinbar mit einem sinnvollen Ansatz zur Git-Versionierung.

  • Warum sollten Sie gefälschte Dateien oder READMEs einfügen, die Sie in Ihrem Projekt vielleicht nicht wirklich wollen?
  • Warum sollte .gitignore verwendet werden, um etwas zu tun (, das Dateien enthält), das genau das Gegenteil von dem ist, wofür es gedacht ist ( mit Ausnahme von Dateien), obwohl es möglich ist?

.gitkeep Ansatz

Verwenden Sie eine leere Datei mit dem Namen .gitkeep, um das Vorhandensein des Ordners im Versionierungssystem zu erzwingen.

Obwohl es keinen so großen Unterschied zu geben scheint:

  • Sie verwenden eine Datei, die den einzigen Zweck hat, den Ordner zu behalten. Sie geben dort keine Informationen an, die Sie nicht einfügen möchten.

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

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

  • Wenn Sie es .gitkeep nennen, wird es vom Dateinamen selbst (und auch ) zu anderen Entwicklern sehr klar und einfach. Dies ist gut für ein gemeinsames Projekt und eines der Hauptziele von ein Git-Repository), das diese Datei ist

    • Eine Datei, die nichts mit dem Code zu tun hat (aufgrund des führenden Punkts und des Namens)
    • Eine Datei, die eindeutig mit Git zusammenhängt
    • Sein Zweck ( keep ) ist klar festgelegt und konsistent und in seiner Bedeutung semantisch gegen ignore

Annahme

Ich habe den .gitkeep -Ansatz gesehen, der von sehr wichtigen Frameworks wie Laravel , Angular-CLI übernommen wurde.

276
Cranio

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

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

Andy Lester hat recht, aber wenn Ihr Verzeichnis nur leer sein muss und nicht leer leer, können Sie eine leere .gitignore -Datei als Workaround einfügen.

Abgesehen davon handelt es sich um ein Implementierungsproblem, nicht um ein grundlegendes Git-Speicherdesignproblem. Wie schon oft auf der Git-Mailingliste erwähnt, wurde dies nicht implementiert, weil niemand genug dafür gesorgt hat, einen Patch dafür einzureichen, und nicht, dass dies nicht möglich oder nicht möglich war.

65

Die Ruby on Rails Methode zum Erstellen von Protokollordnern:

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

Nun wird das Protokollverzeichnis in den Baum aufgenommen. Es ist sehr nützlich bei der Bereitstellung, sodass Sie keine Routine schreiben müssen, um Protokollverzeichnisse zu erstellen.

Die Logfiles können durch Ausgabe von

echo log/dev.log >> .gitignore

aber das wusstest du wahrscheinlich.

31
Thomas E

Git verfolgt keine leeren Verzeichnisse. Weitere Erklärungen finden Sie in der Git-FAQ . Die vorgeschlagene Problemumgehung besteht darin, eine .gitignore -Datei in das leere Verzeichnis zu kopieren. Diese Lösung gefällt mir nicht, weil der .gitignore nach der Unix-Konvention "versteckt" ist. Auch gibt es keine Erklärung, warum die Verzeichnisse leer sind.

Ich schlage vor, eine README -Datei in das leere Verzeichnis einzufügen und zu erklären, warum das Verzeichnis leer ist und warum es in Git verfolgt werden muss. Mit der README -Datei ist das Verzeichnis für Git nicht mehr leer.

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

Sie haben also einen Grund, warum Sie ein leeres Verzeichnis in Git benötigen. Tragen Sie diesen Grund in die Datei README ein. Auf diese Weise wissen andere Entwickler (und zukünftige Sie), warum das leere Verzeichnis dort sein muss. Sie wissen auch, dass Sie das leere Verzeichnis entfernen können, wenn das Problem, das das leere Verzeichnis erfordert, behoben wurde.


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

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

So erstellen Sie Platzhalter-Readme-Dateien 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 im Verzeichnis außer der Datei README zu ignorieren, fügen Sie die folgenden Zeilen in Ihr .gitignore ein:

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

Alternativ können Sie auch jede README -Datei vom Ignorieren ausschließen:

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

So listen Sie alle README auf, nachdem sie bereits erstellt wurden:

find -name README.emptydir
28
lesmana

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

Ursprünglicher Beitrag unten:

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

  1. Angenommen, Sie befinden sich in Ihrem Repository.
  2. Erstellen Sie Ihr leeres Verzeichnis:

    $ mkdir path/to/empty-folder
    
  3. Fügen Sie es mit einem Installationsbefehl und dem leeren Baum zum Index hinzu SHA-1 :

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

    Geben Sie den Befehl ein und geben Sie dann die zweite Zeile ein. Drücken Sie Enter und dann Ctrl + D um die Eingabe zu beenden. Hinweis: Das Format ist mode [SPACE] type [SPACE] SHA-1hash [ TAB] Pfad (die Registerkarte ist wichtig, die Antwortformatierung behält sie nicht bei).

  4. Das ist es! Ihr leerer Ordner befindet sich in Ihrem Index. Sie müssen sich nur verpflichten.

Diese Lösung ist kurz und funktioniert anscheinend gut ( siehe EDIT! ), aber es ist nicht so leicht zu merken ...

Der leere Baum SHA-1 kann gefunden werden, indem ein neues leeres Git-Repository, cd, erstellt und git write-tree ausgegeben wird, das den leeren Baum SHA-1 ausgibt.

EDIT:

Ich benutze diese Lösung seit ich sie gefunden habe. Es scheint genauso zu funktionieren wie das Erstellen eines Submoduls, außer 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 den Teil 040000 tree in 160000 commit umschreibt.

Darüber hinaus wird jede Datei, die unter diesem Pfad abgelegt wird, von Git nie bemerkt, da es den Eindruck hat, dass sie zu einem anderen Repository gehört. Dies ist böse, da es leicht übersehen werden kann!

Wenn Sie jedoch noch keine Git-Submodule in Ihrem Repository verwenden (und dies auch nicht tun) und der "leere" Ordner leer bleibt oder wenn Sie möchten, dass Git von seiner Existenz erfährt und seinen Inhalt ignoriert, können Sie fortfahren dieser Tweak. Der gewohnte Weg mit Submodulen zu gehen, erfordert mehr Schritte als dieser Tweak.

26
ofavre

Möglicherweise scheint das Hinzufügen eines leeren Verzeichnisses der Pfad mit dem geringsten Widerstand zu sein , da Skripts vorhanden sind, die das Vorhandensein dieses Verzeichnisses erwarten (möglicherweise, weil es ein Ziel für generierte Binärdateien ist). Ein anderer Ansatz wäre Ä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önnen Sie eine (fehlerhafte) symbolische Verknüpfung zum Verzeichnis einchecken, damit 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 möchten, können Sie einfach:

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

Wenn Sie den oft vorgeschlagenen Weg einschlagen, einen fast leeren Ordner einzuchecken, haben Sie die geringe Komplexität, den Inhalt zu löschen, ohne auch die ".gitignore" -Datei zu löschen.

Sie können alle Ihre generierten Dateien ignorieren, indem Sie Folgendes zu Ihrem Stamm-.gitignore hinzufügen:

.generated
20
nobar

Angenommen, Sie benötigen ein leeres Verzeichnis mit dem Namen 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 .gitignore-Datei zum Index hinzufügen, bevor Sie Git anweisen können, sie zu ignorieren (und alles andere im leeren Verzeichnis).

20
m104

Ich habe das Problem mit leeren Verzeichnissen auch konfrontiert. Das Problem bei der Verwendung von Platzhalterdateien besteht darin, dass Sie sie erstellen und löschen müssen, wenn sie nicht mehr benötigt werden (da später Unterverzeichnisse oder Dateien hinzugefügt wurden. Bei großen Quellbäumen kann die Verwaltung dieser Platzhalterdateien umständlich und fehlerhaft sein anfällig.

Aus diesem Grund habe ich beschlossen, ein Open-Source-Tool zu schreiben, das das Erstellen/Löschen solcher Platzhalterdateien automatisch verwaltet. Es ist für die .NET-Plattform geschrieben und läuft unter Mono (.NET für Linux) und Windows.

Schauen Sie sich einfach Folgendes an: http://code.google.com/p/markemptydirs

14
Jonny Dee

Ich mag die Antworten von @ Artur79 und @mjs, daher habe ich eine Kombination aus beiden verwendet und sie zu einem Standard für unsere Projekte gemacht.

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

Allerdings arbeiten nur eine Handvoll unserer Entwickler auf Mac oder Linux. Viel Arbeit unter Windows, und ich konnte dort keinen vergleichbaren einfachen Einzeiler finden, um das Gleiche zu erreichen. Einige hatten das Glück, Cygwin aus anderen Gründen installiert zu haben, aber es schien übertrieben, Cygwin nur dafür vorzuschreiben.

Bearbeiten für eine bessere Lösung

Da die meisten unserer Entwickler bereits Ant installiert haben, dachte ich zuerst daran, eine Ant-Build-Datei zusammenzustellen, um dies unabhängig von der Plattform zu erreichen. Dies kann immer noch gefunden werden hier

Allerdings dachte ich später, es wäre besser, dies in einen kleinen Utility-Befehl umzuwandeln, also habe ich ihn mit Python neu erstellt und veröffentlicht es zum PyPI hier . Sie können es installieren, indem Sie einfach Folgendes ausführen:

pip3 install gitkeep2

Sie können rekursiv .gitkeep Dateien erstellen und entfernen und Nachrichten hinzufügen, damit Ihre Kollegen verstehen, warum diese Verzeichnisse wichtig sind. Das letzte bisschen ist Bonus. Ich dachte, es wäre schön, wenn die .gitkeep -Dateien sich selbst dokumentieren könnten.

$ 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.

12
Mig82

Sie können und werden es leider nie können. Dies ist eine Entscheidung, die von Linus Torvald selbst getroffen wurde. Er weiß, was gut für uns ist.

Irgendwo da draußen habe ich mal was gelesen.

Ich habe Betreff: Leere Verzeichnisse .. gefunden, aber vielleicht gibt es noch ein anderes.

Man muss mit den Workarounds leben ... leider.

12
user2334883

Wenn Sie eine .gitignore -Datei hinzufügen, möchten Sie möglicherweise eine einzelne Zeile mit nur einem Sternchen * erstellen, wenn Sie eine beliebige Menge an Inhalt darin ablegen möchten (den Git ignorieren soll) Stellen Sie sicher, dass Sie den ignorierten Inhalt nicht versehentlich hinzufügen.

10
Michael Johnson

Die Lösung von Jamie Flournoy funktioniert großartig. Hier ist eine etwas verbesserte Version, um den .htaccess beizubehalten:

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

Mit dieser Lösung können Sie einen leeren Ordner festschreiben, zum Beispiel /log, /tmp oder /cache, und der Ordner bleibt leer.

8
Roman

Wie bereits erwähnt, ist es nicht möglich, leere Verzeichnisse hinzuzufügen. Hier ist jedoch ein Einzeiler, der allen Verzeichnissen leere .gitignore-Dateien hinzufügt.

Ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'

Ich habe dies in ein Rakefile für den einfachen Zugriff gesteckt.

8
Peter Hoeg

Hier ist ein Hack, aber es ist lustig, dass es funktioniert (Git 2.2.1). Ähnlich wie @Teka vorgeschlagen, aber leichter zu merken:

  • Hinzufügen eines Submoduls zu einem beliebigen Repository (git submodule add path_to_repo)
  • Dadurch werden ein Ordner und eine Datei .submodules hinzugefügt. Übernehmen Sie eine Änderung.
  • Löschen Sie die Datei .submodules und übernehmen Sie die Änderung.

Jetzt haben Sie ein Verzeichnis, das beim Auschecken von Commit erstellt wird. Interessant ist jedoch, dass Sie beim Betrachten des Inhalts des Baumobjekts dieser Datei Folgendes erhalten:

fatal: Kein gültiger Objektname b64338b90b4209263b50244d18278c0999867193

Ich würde es jedoch nicht empfehlen, da es in zukünftigen Versionen von Git möglicherweise nicht mehr funktioniert. Wodurch kann Ihr Repository beschädigt werden.

Es gibt keine Möglichkeit, Git zum Verfolgen von Verzeichnissen zu bewegen. Die einzige Lösung besteht darin, eine Platzhalterdatei in das Verzeichnis einzufügen, das Git nachverfolgen soll.

Die Datei kann beliebig benannt werden und enthalten, aber die meisten Benutzer verwenden eine leere Datei mit dem Namen .gitkeep (obwohl einige Benutzer den VCS-Agnostic .keep bevorzugen).

Das Präfix . markiert es als versteckte Datei.

Eine andere Idee wäre, eine README -Datei hinzuzufügen, die erklärt, wofür das Verzeichnis verwendet wird.

7
Zaz

Ich erstelle immer eine Funktion, um nach der gewünschten Ordnerstruktur zu suchen und diese innerhalb des Projekts für mich zu erstellen. Dies umgeht dieses Problem, da die leeren Ordner vom Proxy in Git gespeichert werden.

function check_page_custom_folder_structure () {
    if (!is_dir(TEMPLATEPATH."/page-customs"))
        mkdir(TEMPLATEPATH."/page-customs");    
    if (!is_dir(TEMPLATEPATH."/page-customs/css"))
        mkdir(TEMPLATEPATH."/page-customs/css");
    if (!is_dir(TEMPLATEPATH."/page-customs/js"))
        mkdir(TEMPLATEPATH."/page-customs/js");
}

Dies ist in PHP, aber ich bin sicher, dass die meisten Sprachen die gleiche Funktionalität unterstützen, und da die Erstellung der Ordner von der Anwendung übernommen wird, sind die Ordner immer vorhanden.

7
Mild Fuzz

Wenn Sie einen Ordner hinzufügen möchten, in dem viele vorübergehende Daten in mehreren semantischen Verzeichnissen gespeichert sind, können Sie dem Stammverzeichnis .gitignore ... einen ähnlichen Ansatz hinzufügen.

/app/data/**/*.* !/app/data/**/*.md

Dann können Sie beschreibende README.md-Dateien (oder leere Dateien, egal, solange Sie sie wie in diesem Fall mit dem *.md eindeutig als Ziel festlegen können) in jedem Verzeichnis festschreiben, um sicherzustellen, dass alle Verzeichnisse Teil bleiben des Repos, aber die Dateien (mit Erweiterungen) werden ignoriert. EINSCHRÄNKUNG: . sind in den Verzeichnisnamen nicht erlaubt!

Sie können alle diese Verzeichnisse mit xml/images-Dateien oder was auch immer füllen und mit der Zeit weitere Verzeichnisse unter /app/data/ hinzufügen, je nachdem, wie sich der Speicherbedarf für Ihre App entwickelt (mit den README.md-Dateien, die dazu dienen, eine Beschreibung von was zu brennen) jedes speicherverzeichnis ist für genau).

Sie müssen Ihren .gitignore nicht weiter ändern oder dezentralisieren, indem Sie für jedes neue Verzeichnis einen neuen .gitignore erstellen. Wahrscheinlich nicht die klügste Lösung, aber knapp und funktioniert immer für mich. Schön und einfach! ;)

enter image description here

5
ajmedway

Das kannst du nicht. Dies ist eine beabsichtigte Designentscheidung der Git-Betreuer. Grundsätzlich besteht der Zweck eines Quellcode-Verwaltungssystems wie Git darin, den Quellcode zu verwalten, und leere Verzeichnisse sind kein Quellcode. Git wird auch oft als Content-Tracker bezeichnet. Auch hier sind leere Verzeichnisse kein Inhalt (im Gegenteil) und werden daher nicht erfasst.

5
Jörg W Mittag

Hinzufügen einer weiteren Option zum Kampf.

Angenommen, Sie möchten ein Verzeichnis zu git hinzufügen, das für alle Zwecke, die mit git zusammenhängen, leer bleiben soll und dessen Inhalt niemals nachverfolgt wird. Dies wird ein .gitignore sein, wie hier mehrfach vorgeschlagen Mache den Trick.

Das Format ist wie erwähnt:

*
!.gitignore

Wenn Sie dies in der Befehlszeile auf einen Schlag tun möchten, während innerhalb das Verzeichnis ist, das Sie hinzufügen möchten, können Sie Folgendes ausführen:

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

Ich selbst habe ein Shell-Skript, mit dem ich das mache. Benennen Sie das Skript nach Ihren Wünschen und fügen Sie es entweder irgendwo in Ihren Include-Pfad ein oder verweisen Sie direkt darauf:

#!/bin/bash

dir=''

if [ "$1" != "" ]; then
    dir="$1/"
fi

echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore

Mit diesem Befehl können Sie es entweder in dem Verzeichnis ausführen, das Sie hinzufügen möchten, oder auf das Verzeichnis als ersten und einzigen Parameter verweisen:

$ ignore_dir ./some/directory

Eine weitere Option (als Antwort auf einen Kommentar von @GreenAsJade): Wenn Sie einen leeren Ordner nachverfolgen möchten, der KANN nachverfolgte Dateien in der Zukunft enthält, für den Moment jedoch leer ist, können Sie die Option deaktivieren * aus der .gitignore -Datei und check that in. Grundsätzlich heißt es in der Datei nur "nicht ignorieren me", aber ansonsten ist das Verzeichnis leer und nachverfolgt.

Ihre .gitignore -Datei würde folgendermaßen aussehen:

!.gitignore

Das war's, checken Sie ein und Sie haben ein leeres, aber nachverfolgtes Verzeichnis, in dem Sie später Dateien nachverfolgen können.

Der Grund, warum ich vorschlage, diese eine Zeile in der Datei beizubehalten, ist, dass dies dem Zweck .gitignore dient. Andernfalls könnte jemand auf der ganzen Linie darüber nachdenken, es zu entfernen. Es kann hilfreich sein, wenn Sie einen Kommentar über die Zeile setzen.

4
Mike

Manchmal muss man sich mit schlecht geschriebenen Bibliotheken oder Software auseinandersetzen, die ein "echtes" leeres und vorhandenes Verzeichnis benötigen. Wenn Sie einen einfachen .gitignore oder .keep eingeben, kann dies zu Fehlern führen. Folgendes könnte in diesen Fällen hilfreich sein, aber keine Garantie ...

Erstellen Sie zuerst das benötigte Verzeichnis:

mkdir empty

Dann fügen Sie einen defekten symbolischen Link zu diesem Verzeichnis hinzu (aber in jedem anderen Fall als dem oben beschriebenen Anwendungsfall verwenden Sie bitte ein README mit einer Erklärung):

ln -s .this.directory empty/.keep

Um Dateien in diesem Verzeichnis zu ignorieren, können Sie sie in Ihrem root .gitignore hinzufügen:

echo "/empty" >> .gitignore

Verwenden Sie zum Hinzufügen der ignorierten Datei einen Parameter, um sie zu erzwingen:

git add -f empty/.keep

Nach dem Festschreiben haben Sie eine unterbrochene symbolische Verknüpfung in Ihrem Index und git erstellt das Verzeichnis. Der fehlerhafte Link hat einige Vorteile, da er keine reguläre Datei ist und auf keine reguläre Datei verweist. Es passt also sogar zu dem Teil der Frage "(der keine Dateien enthält)", und zwar nicht in der Absicht, sondern in der Bedeutung, denke ich:

find empty -type f

Dieser Befehl zeigt ein leeres Ergebnis an, da in diesem Verzeichnis keine Dateien vorhanden sind. Daher sehen die meisten Anwendungen, die alle Dateien in einem Verzeichnis erhalten, diesen Link normalerweise nicht, zumindest wenn sie eine "Datei existiert" oder eine "lesbar" ist. Sogar einige Skripte werden dort keine Dateien finden:

$ php -r "var_export(glob('empty/.*'));"
array (
  0 => 'empty/.',
  1 => 'empty/..',
)

Ich empfehle jedoch dringend, diese Lösung nur unter besonderen Umständen zu verwenden. Ein gut geschriebenes README in einem leeren Verzeichnis ist normalerweise die bessere Lösung. (Und ich weiß nicht, ob das mit einem Windows-Dateisystem funktioniert ...)

4
Trendfischer

Eine einfache Möglichkeit, dies zu tun, besteht darin, eine .gitkeep -Datei zu dem Verzeichnis hinzuzufügen, das (derzeit) leer bleiben soll.

Siehe diese SOF-Antwort für weitere Informationen - was auch erklärt, warum manche Leute die konkurrierende Konvention des Hinzufügens einer .gitignore-Datei (wie in vielen Antworten hier angegeben) verwirrend finden.

3
arcseldon

Manchmal habe ich Repositorys mit Ordnern, die nur Dateien enthalten, die als "Inhalt" betrachtet werden. Das heißt, es handelt sich nicht um Dateien, die mir wichtig sind, versioniert zu werden, und die daher niemals festgeschrieben werden sollten. Mit der .gitignore-Datei von Git können Sie ganze Verzeichnisse ignorieren. Aber es gibt Zeiten, in denen es von Vorteil ist, den Ordner im Repo zu haben. Hier ist eine hervorragende Lösung, um dieses Bedürfnis zu erfüllen.

In der Vergangenheit habe ich eine .gitignore-Datei in das Stammverzeichnis meines Repos gestellt und den Ordner dann wie folgt ausgeschlossen:

/app/some-folder-to-exclude
/another-folder-to-exclude/*

Diese Ordner werden dann jedoch nicht Teil des Repos. Sie könnten dort so etwas wie eine README -Datei hinzufügen. Dann müssen Sie Ihrer Anwendung jedoch mitteilen, dass sie sich keine Sorgen um die Verarbeitung von README -Dateien machen soll.

Wenn Ihre App von den vorhandenen Ordnern abhängt (obwohl leer), können Sie dem betreffenden Ordner einfach eine .gitignore-Datei hinzufügen und damit zwei Ziele erreichen:

Sag Git, dass es eine Datei im Ordner gibt, die Git veranlasst, sie dem Repo hinzuzufügen. Weisen Sie Git an, den Inhalt dieses Ordners abzüglich dieser Datei selbst zu ignorieren. Hier ist die .gitignore-Datei, die Sie in Ihre leeren Verzeichnisse einfügen können:

*
!.gitignore

Die erste Zeile (*) weist Git an, alles in diesem Verzeichnis zu ignorieren. Die zweite Zeile weist Git an, die .gitignore-Datei nicht zu ignorieren. Sie können diese Datei in jeden leeren Ordner kopieren, den Sie zum Repository hinzufügen möchten.

2
Rahul Sinha

Sie können diesen Code als create_readme.php speichern und den Code PHP im Stammverzeichnis Ihres Git-Projekts ausführen.

> php create_readme.php

Es werden README Dateien zu allen Verzeichnissen hinzugefügt, die leer sind, sodass diese Verzeichnisse dann zum Index hinzugefügt werden.

<?php
    $path = realpath('.');
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),       RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        if ( is_dir($name) && ! is_empty_folder($name) ){
            echo "$name\n" ;
            exec("touch ".$name."/"."README");
        }
    }

    function is_empty_folder($folder) {
        $files = opendir($folder);
        while ($file = readdir($files)) {
            if ($file != '.' && $file != '..')
                return true; // Not empty
            }
        }
?>

Dann mach

git commit -m "message"
git Push
2
user665190

Viele haben diese Frage bereits beantwortet. Fügen Sie hier einfach eine PowerShell-Version hinzu.

Finden Sie alle leeren Ordner im Verzeichnis

Fügen Sie dort eine leere .gitkeep-Datei hinzu

Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}
0
Hainan.Z