Wie kann ich einem Git-Repository ein leeres Verzeichnis (das keine Dateien enthält) hinzufügen?
Wie kann ich einem Git-Repository ein leeres Verzeichnis (das keine Dateien enthält) hinzufügen?
Antworten:
Eine andere Möglichkeit, ein Verzeichnis (fast) leer zu halten (im Repository), besteht darin, eine .gitignore
Datei in diesem Verzeichnis zu erstellen , die diese vier Zeilen enthält:
# Ignore everything in this directory
*
# Except this file
!.gitignore
Dann müssen Sie die Bestellung nicht so ausführen, wie Sie es in der Lösung von m104 tun müssen .
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, wonach viele Leute, die sich diese Frage ansehen, gesucht haben. 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 kommen möglicherweise später".
README
die .gitignore
Datei einfügen würden (als Kommentare).
Das kannst du nicht. Siehe die Git-FAQ .
Derzeit erlaubt das Design des Git-Index (Staging-Bereich) nur das Auflisten von Dateien, und niemand, der kompetent genug ist, um die Änderung vorzunehmen, um leere Verzeichnisse zuzulassen, hat sich genug um diese Situation gekümmert, um Abhilfe zu schaffen.
Verzeichnisse werden automatisch hinzugefügt, wenn Dateien hinzugefügt werden. Das heißt, Verzeichnisse müssen niemals zum Repository hinzugefügt werden und werden nicht einzeln verfolgt.
Sie können "
git add <dir>
" sagen und es werden dort Dateien hinzugefügt.Wenn Sie wirklich ein Verzeichnis benötigen, das an den Kassen vorhanden sein soll, sollten Sie eine Datei darin erstellen. .gitignore funktioniert gut für diesen Zweck; Sie können es leer lassen oder die Namen der Dateien eingeben, die voraussichtlich im Verzeichnis angezeigt werden.
git mv
da Git sich darüber beschwert, dass das neue Verzeichnis nicht unter Versionskontrolle steht
.gitignore
Trick ist eine häufige Antwort und erfüllt viele Bedürfnisse. Es ist jedoch möglich , Git Track zu einem wirklich leeren Verzeichnis zu machen, siehe meine Antwort
.gitkeep
zu diesem Zweck aufgerufen wurde.
Erstellen Sie eine leere Datei mit dem Namen .gitkeep
im Verzeichnis und fügen Sie diese hinzu.
.gitkeep
wurde von Git nicht verschrieben und wird die Leute dazu bringen, seine Bedeutung zu erraten, was sie zu Google-Suchanfragen führt, die sie hierher führen. Die .git
Präfixkonvention sollte für Dateien und Verzeichnisse reserviert sein, die Git selbst verwendet.
.git
Präfixkonvention sollte reserviert werden ..." Warum? Fordert git diese Reservierung an?
README
oder ABOUT
Datei genauso gut oder besser. Hinterlassen Sie eine Notiz für den nächsten Mann, so wie wir es alle vor URLs getan haben.
Sie können jederzeit eine README-Datei in das Verzeichnis einfügen und erläutern, warum Sie dieses ansonsten leere Verzeichnis im Repository haben möchten.
touch .keep
Unter Linux wird dadurch eine leere Datei mit dem Namen erstellt .keep
. Für das, was es wert ist, ist dieser Name für Git agnostisch, während er .gitkeep
für Git spezifisch wäre. Zweitens sollte, wie ein anderer Benutzer bemerkt hat, die .git
Präfixkonvention für Dateien und Verzeichnisse reserviert sein, die Git selbst verwendet.
Alternativ kann das Verzeichnis , wie in einer anderen Antwort angegeben , stattdessen eine Beschreibung README
oder eine README.md
Datei enthalten .
Dies setzt natürlich voraus, dass das Vorhandensein der Datei nicht dazu führt, dass Ihre Anwendung beschädigt wird.
.keep
Datei offensichtlich oder ignorieren Sie sie einfach. Wenn stattdessen die Dateien im Verzeichnis ignoriert werden sollen, ist das eine ganz andere Frage.
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
dies in allen nicht verfolgten leeren Verzeichnissen zu tun.
Das wichtigste zuerst:
Ein leeres Verzeichnis kann nicht Teil eines Baums unter dem Git-Versionsverwaltungssystem sein .
Es wird einfach nicht verfolgt. Es gibt jedoch Szenarien, in denen die "Versionierung" leerer Verzeichnisse sinnvoll sein kann, zum Beispiel:
cache/
oder logs/
Verzeichnisse, in denen wir den Ordner aber .gitignore
seinen Inhalt bereitstellen möchtenViele Benutzer schlagen vor:
README
Datei oder einer anderen Datei mit einem bestimmten Inhalt, um das Verzeichnis nicht leer zu machen, oder.gitignore
Datei mit einer Art "umgekehrter Logik" (dh um alle Dateien einzuschließen), die am Ende dem gleichen Zweck von Ansatz 1 dient.Obwohl beide Lösungen sicherlich funktionieren, finde ich sie unvereinbar mit einem sinnvollen Ansatz zur Git-Versionierung.
.gitignore
etwas (zu tun zu halten Dateien) , die genau das Gegenteil von dem , was es bedeutet , für ( mit Ausnahme von Dateien), auch wenn es möglich ist?Verwenden Sie eine leere Datei, die aufgerufen .gitkeep
wird, um das Vorhandensein des Ordners im Versionsverwaltungssystem zu erzwingen.
Obwohl es kein so großer Unterschied zu sein scheint:
Sie verwenden eine Datei, die nur dazu dient , den Ordner zu behalten. Sie geben dort keine Informationen ein, die Sie nicht einfügen möchten.
Zum Beispiel sollten Sie READMEs auch als 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 eine hinzufügen .gitignore
, um unerwünschte Dateien zu ignorieren.
Durch die Benennung .gitkeep
wird anhand des Dateinamens selbst (und auch gegenüber anderen Entwicklern , was für ein freigegebenes Projekt und einen der Hauptzwecke eines Git-Repositorys gut ist) klar und unkompliziert, dass es sich um diese Datei handelt
Ich habe den .gitkeep
Ansatz sehr wichtiger Frameworks wie Laravel , Angular-CLI gesehen .
.gitkeep
durch einen anderen Dateinamen ohne Git-Präfix ersetzt wird, erhalten Sie meine positive Bewertung. Ich denke, dies ist die beste und informativste Antwort. Grund: Ich denke, ".git *" sollte für git-vorgeschriebene Dateien reserviert werden, während dies nur ein Platzhalter ist. Meine erste Vermutung, als ich sah, dass zum Beispiel eine ".gitkeep" -Datei automatisch ignoriert wird (das wäre eine nette Funktion), aber das ist nicht der Fall, oder?
Wie in anderen Antworten beschrieben, kann Git keine leeren Verzeichnisse in seinem Staging-Bereich darstellen. (Siehe die 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 leeren Verzeichnissen nur über Folgendes erstellen :
find . -type d -empty -exec touch {}/.gitignore \;
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
find * -type d -empty -exec touch {}/.gitignore \;
find . -name .DS_Store -exec rm {} \;
und dann die bevorzugte Variante aus dieser Antwort zu verwenden. Stellen Sie sicher, dass Sie dies nur im richtigen Ordner ausführen!
.gitignore
hat keinen Einfluss auf die -empty
Flagge des find
Befehls. In meinem Kommentar geht es darum, die .DS_Store
Dateien in einem Verzeichnisbaum zu entfernen , damit das -empty
Flag angewendet werden kann.
Andy Lester ist richtig, aber wenn Ihr Verzeichnis muss nur leer sein, und nicht leer leer, können Sie eine leere setzen .gitignore
Datei dort als Behelfslösung.
Abgesehen davon ist dies ein Implementierungsproblem, kein grundlegendes Problem beim Entwurf des Git-Speichers. Wie schon oft auf der Git-Mailingliste erwähnt, ist der Grund dafür, dass dies nicht implementiert wurde, dass sich niemand genug darum gekümmert hat, einen Patch dafür einzureichen, und nicht, dass dies nicht möglich oder nicht möglich war.
Die Methode zur Erstellung von Ruby on Rails- Protokollordnern:
mkdir log && touch log/.gitkeep && git add log/.gitkeep
Jetzt 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 Protokolldateien können durch Ausgabe von,
echo log/dev.log >> .gitignore
aber das wusstest du wahrscheinlich.
Git verfolgt keine leeren Verzeichnisse. Weitere Erklärungen finden Sie in den Git-FAQ . Die vorgeschlagene Problemumgehung besteht darin, eine .gitignore
Datei in das leere Verzeichnis zu stellen. Ich mag diese Lösung nicht, weil sie .gitignore
durch die Unix-Konvention "versteckt" ist. Es gibt auch keine Erklärung, warum die Verzeichnisse leer sind.
Ich schlage vor, eine README-Datei in das leere Verzeichnis zu legen, um 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 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 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 README-Datei ein. Auf diese Weise wissen andere Entwickler (und zukünftige Sie), warum das leere Verzeichnis vorhanden 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-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 im Verzeichnis außer der README-Datei zu ignorieren, fügen Sie die folgenden Zeilen in Ihr Verzeichnis ein .gitignore
:
path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir
Alternativ können Sie einfach jede README-Datei vom Ignorieren ausschließen:
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
So listen Sie jede README-Datei auf, nachdem sie bereits erstellt wurde:
find -name README.emptydir
WARNUNG: Wie sich herausstellt, funktioniert diese Optimierung nicht wirklich. Entschuldigen Sie die Unannehmlichkeiten.
Originaler Beitrag unten:
Ich habe beim Spielen mit Git-Interna eine Lösung gefunden!
Erstellen Sie Ihr leeres Verzeichnis:
$ mkdir path/to/empty-folder
Fügen Sie es mit einem Installationsbefehl und dem leeren Baum SHA-1 zum Index hinzu :
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
Geben Sie den Befehl ein und geben Sie die zweite Zeile ein. Drücken Sie Enterund dann Ctrl+, Dum Ihre Eingabe zu beenden. Hinweis: Das Format ist Modus [SPACE] Typ [SPACE] SHA-1hash [TAB] -Pfad (die Registerkarte ist wichtig, die Antwortformatierung behält sie nicht bei).
Das ist es! Ihr leerer Ordner befindet sich in Ihrem Index. Alles was Sie tun müssen, ist ein Commit.
Diese Lösung ist kurz und funktioniert anscheinend gut ( siehe BEARBEITEN! ), Aber es ist nicht so einfach, sich daran zu erinnern ...
Der leere Baum SHA-1 kann gefunden werden, indem ein neues leeres Git-Repository erstellt cd
und ausgegeben wird git write-tree
, das den leeren Baum SHA-1 ausgibt.
BEARBEITEN:
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 git submodule init|update
. Das Problem ist, dass git update-index
das 040000 tree
Teil neu geschrieben wird 160000 commit
.
Darüber hinaus wird jede Datei, die unter diesem Pfad abgelegt wird, von Git nie bemerkt, da sie glaubt, zu einem anderen Repository zu gehören. Das 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 diese Optimierung. Der übliche Weg mit Submodulen erfordert mehr Schritte als diese Optimierung.
git svn dcommit
mit dem gewünschten Ergebnis möglich?
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 (und alles andere im leeren Verzeichnis) zu ignorieren.
echo bla > file
Sie keine, file: File exists
da >
die Datei überschrieben wird, wenn sie bereits vorhanden ist, oder eine neue erstellt wird, wenn sie nicht vorhanden ist.
/bin/sh
kulturelle Annahme! * Wenn "hier" ist csh
und die Variable noclobber
gesetzt ist, erhalten Sie in der Tat file: File exists
. Wenn jemand "Ich verstehe das" sagt, gehe nicht davon aus, dass er ein Idiot ist, und antworte "Nein, tust du nicht". * c2.com/cgi/wiki?AmericanCulturalAssumption
Vielleicht scheint das Hinzufügen eines leeren Verzeichnisses der Weg des geringsten Widerstands zu sein, da Sie Skripte haben, die erwarten, dass dieses Verzeichnis existiert (möglicherweise weil es ein Ziel für generierte Binärdateien ist). Ein anderer Ansatz wäre, Ihre Skripte zu ändern, 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 einen (fehlerhaften) symbolischen Link 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 Ansatz wählen, einen fast leeren Ordner einzuchecken, haben Sie die geringe Komplexität, den Inhalt zu löschen, ohne auch die Datei ".gitignore" zu löschen.
Sie können alle generierten Dateien ignorieren, indem Sie Ihrem root .gitignore Folgendes hinzufügen:
.generated
.generated
Verzeichnis anfangs nicht vorhanden ist. Es wird nicht mehr kaputt sein, wenn Sie Ihren Build machen.
Ich habe das Problem auch mit leeren Verzeichnissen 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, mit dem das Erstellen / Löschen solcher Platzhalterdateien automatisch verwaltet werden kann. Es wurde 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
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 unter Mac oder Linux. Viel Arbeit unter Windows und ich konnte keinen vergleichbaren einfachen Einzeiler finden, um dasselbe dort zu erreichen. Einige hatten das Glück, Cygwin aus anderen Gründen installiert zu haben , aber Cygwin nur dafür zu verschreiben, schien übertrieben.
Bearbeiten Sie für eine bessere Lösung
Da die meisten unserer Entwickler Ant bereits installiert haben, dachte ich zuerst daran, eine Ant-Build-Datei zusammenzustellen, um dies unabhängig von der Plattform zu erreichen. Dies kann noch gefunden werden werden
Später dachte ich jedoch , es wäre besser, daraus einen kleinen Dienstprogrammbefehl zu machen, also habe ich ihn mit Python neu erstellt und hier im PyPI veröffentlicht . Sie können es installieren, indem Sie einfach Folgendes ausführen:
pip3 install gitkeep2
Sie können damit .gitkeep
Dateien rekursiv erstellen und entfernen sowie Nachrichten hinzufügen, damit Ihre Kollegen verstehen, warum diese Verzeichnisse wichtig sind. Dieses letzte Bit ist ein 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.
Sie können und werden es leider nie können. Dies ist eine Entscheidung, die Linus Torvald selbst getroffen hat. Er weiß, was gut für uns ist.
Irgendwo da draußen, wo ich einmal gelesen habe, wird geschimpft.
Ich habe Re: Empty-Verzeichnisse gefunden , aber vielleicht gibt es noch eines.
Sie müssen mit den Problemumgehungen leben ... leider.
Wenn Sie beim Hinzufügen einer .gitignore
Datei eine beliebige Menge an Inhalten einfügen (die Git ignorieren soll), möchten Sie möglicherweise eine einzelne Zeile mit nur einem Sternchen *
hinzufügen, um sicherzustellen, dass Sie den ignorierten Inhalt nicht versehentlich hinzufügen .
Es gibt keine Möglichkeit, Git dazu zu bringen, Verzeichnisse zu verfolgen. Die einzige Lösung besteht darin, eine Platzhalterdatei innerhalb des Verzeichnisses hinzuzufügen, das Git verfolgen soll.
Die Datei kann benannt werden und alles enthalten, was Sie wollen, aber die meisten Leute verwenden eine leere Datei mit dem Namen .gitkeep
(obwohl einige Leute den VCS-Agnostiker bevorzugen .keep
).
Das Präfix .
markiert es als versteckte Datei.
Eine andere Idee wäre, eine README
Datei hinzuzufügen , in der erklärt wird, wofür das Verzeichnis verwendet wird.
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 für einen einfachen Zugriff in ein Rakefile gesteckt.
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Die Lösung von Jamie Flournoy funktioniert hervorragend. Hier ist eine etwas verbesserte Version, um Folgendes beizubehalten .htaccess
:
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
Mit dieser Lösung können Sie beispielsweise einen leeren Ordner festschreiben /log
, /tmp
oder /cache
der Ordner bleibt leer.
Ich erstelle immer eine Funktion, um nach meiner gewünschten Ordnerstruktur zu suchen und sie für mich innerhalb des Projekts 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. Da die Erstellung der Ordner von der Anwendung übernommen wird, sind die Ordner immer vorhanden.
.gitkeep
Konvention ist eine viel bessere Praxis.
Hier ist ein Hack, aber es ist lustig, dass es funktioniert (Git 2.2.1). Ähnlich wie @Teka vorgeschlagen, aber leichter zu merken:
git submodule add path_to_repo
).submodules
. Übernehmen Sie eine Änderung..submodules
Datei löschen und Änderung übernehmen.Jetzt haben Sie ein Verzeichnis, das beim Auschecken des Commits erstellt wird. Interessant ist jedoch, dass Sie beim Betrachten des Inhalts des Baumobjekts dieser Datei Folgendes erhalten:
Schwerwiegend: Kein gültiger Objektname b64338b90b4209263b50244d18278c0999867193
Ich würde es jedoch nicht empfehlen, es zu verwenden, da es in zukünftigen Versionen von Git möglicherweise nicht mehr funktioniert. Dadurch kann Ihr Repository beschädigt werden.
Viele haben diese Frage bereits beantwortet. Fügen Sie hier einfach eine PowerShell-Version hinzu.
Suchen 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}
Wenn Sie einen Ordner hinzufügen möchten, der viele vorübergehende Daten in mehreren semantischen Verzeichnissen enthält, besteht ein Ansatz darin, Ihrem Stammverzeichnis .gitignore Folgendes hinzuzufügen ...
/app/data/**/*.*
!/app/data/**/*.md
Dann können Sie beschreibende README.md-Dateien (oder leere Dateien, spielt keine Rolle, solange Sie sie wie *.md
in diesem Fall eindeutig als Ziel festlegen können ) in jedem Verzeichnis festschreiben, um sicherzustellen, dass alle Verzeichnisse Teil des Repos bleiben, außer dem Dateien (mit Erweiterungen) werden ignoriert. EINSCHRÄNKUNG: .
In den Verzeichnisnamen sind keine zulässig!
Sie können alle diese Verzeichnisse mit XML- / Bilddateien oder was auch immer füllen und weitere Verzeichnisse unter hinzufügen /app/data/
Laufe der Zeit wenn sich der Speicherbedarf für Ihre App entwickelt (wobei die README.md-Dateien dazu dienen, eine Beschreibung der einzelnen Speicherverzeichnisse einzubrennen genau).
Sie müssen Ihr Verzeichnis nicht weiter ändern .gitignore
oder dezentralisieren, indem Sie .gitignore
für jedes neue Verzeichnis ein neues erstellen . Wahrscheinlich nicht die klügste Lösung, aber in Bezug auf Gitignore knapp und funktioniert immer für mich. Schön und einfach! ;)
Eine einfache Möglichkeit, dies zu tun, besteht darin .gitkeep
, dem Verzeichnis, das Sie (derzeit) leer halten möchten, eine Datei hinzuzufügen .
Weitere Informationen finden Sie in dieser SOF-Antwort . Dies erklärt auch, warum manche Leute die konkurrierende Konvention des Hinzufügens einer Gitignore-Datei (wie in vielen Antworten hier angegeben) verwirrend finden.
Hinzufügen einer weiteren Option zum Kampf.
Angenommen, Sie möchten ein Verzeichnis hinzufügen, git
das für alle damit verbundenen Zwecke git
leer bleibt und dessen Inhalt niemals nachverfolgt wird, .gitignore
wie dies hier mehrfach vorgeschlagen wurde, reicht aus.
Das Format ist wie erwähnt:
*
!.gitignore
Wenn Sie dies nun auf einen Schlag über die Befehlszeile tun möchten, können Sie in dem Verzeichnis, das Sie hinzufügen möchten, 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 dieser Option können Sie sie 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 (in Reaktion auf einen Kommentar von @GreenAsJade), wenn Sie einen leeren Ordner verfolgen mögen , dass MAY verfolgt Dateien in der Zukunft enthält, wird aber jetzt leer sein, können Sie die ommit *
aus der .gitignore
Datei, und prüfen Sie, dass in. Grundsätzlich heißt es in der Datei nur: "Ignoriere mich nicht ", aber ansonsten ist das Verzeichnis leer und wird nachverfolgt.
Ihre .gitignore
Datei würde folgendermaßen aussehen:
!.gitignore
Das war's, checken Sie das ein und Sie haben ein leeres, aber nachverfolgtes Verzeichnis, in dem Sie Dateien zu einem späteren Zeitpunkt nachverfolgen können.
Der Grund, warum ich vorschlage, diese eine Zeile in der Datei beizubehalten, ist, dass sie den .gitignore
Zweck angibt. Andernfalls könnte jemand auf der ganzen Linie daran denken, es zu entfernen. Es kann hilfreich sein, wenn Sie einen Kommentar über der Zeile platzieren.
Manchmal muss man sich mit schlecht geschriebenen Bibliotheken oder Software auseinandersetzen, die ein "echtes" leeres und vorhandenes Verzeichnis benötigen. Setzen Sie eine einfache .gitignore
oder .keep
könnte sie brechen und einen Fehler verursachen. Folgendes könnte in diesen Fällen helfen, aber keine Garantie ...
Erstellen Sie zuerst das benötigte Verzeichnis:
mkdir empty
Dann fügen Sie diesem Verzeichnis einen fehlerhaften symbolischen Link hinzu (aber in jedem anderen Fall als dem oben beschriebenen Anwendungsfall verwenden Sie bitte einen README
mit einer Erklärung):
ln -s .this.directory empty/.keep
Um Dateien in diesem Verzeichnis zu ignorieren, können Sie sie in Ihrem Stammverzeichnis hinzufügen .gitignore
:
echo "/empty" >> .gitignore
Verwenden Sie einen Parameter, um die ignorierte Datei hinzuzufügen:
git add -f empty/.keep
Nach dem Commit haben Sie einen fehlerhaften symbolischen Link in Ihrem Index und git erstellt das Verzeichnis. Der fehlerhafte Link hat einige Vorteile, da es sich nicht um eine reguläre Datei handelt und auf keine reguläre Datei verweist. Es passt also sogar zu dem Teil der Frage "(der keine Dateien enthält)", nicht durch die Absicht, sondern durch die 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 abrufen, diesen Link normalerweise nicht, zumindest wenn sie eine "Datei vorhanden" oder eine "lesbar" haben. Selbst einige Skripte finden dort keine Dateien:
$ 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 README
in ein leeres Verzeichnis geschriebenes Gut ist normalerweise eine bessere Lösung. (Und ich weiß nicht, ob dies mit einem Windows-Dateisystem funktioniert ...)
Beim Lesen der Antworten von @ofavre und @ stanislav-bashkyrtsev unter Verwendung defekter GIT-Submodulreferenzen zum Erstellen der GIT-Verzeichnisse bin ich überrascht, dass noch niemand diese einfache Änderung der Idee vorgeschlagen hat, das Ganze vernünftig und sicher zu machen:
Anstatt ein gefälschtes Submodul in GIT zu hacken , fügen Sie einfach ein leeres echtes hinzu .
Ein GIT-Repository mit genau einem Commit:
commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000
Keine Nachricht, keine festgeschriebenen Dateien.
So fügen Sie Ihrem GIT-Repo ein leeres Verzeichnis hinzu:
git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir
So konvertieren Sie alle vorhandenen leeren Verzeichnisse in Submodule:
find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;
Git speichert den neuesten Commit-Hash beim Erstellen der Submodul-Referenz, sodass Sie sich keine Sorgen machen müssen, dass ich (oder GitLab) diesen zum Einfügen schädlicher Dateien verwende. Leider fand ich keinen Weg zu Kraft , die ID begehen wird während der Prüfung verwendet wird , so dass Sie manuell , dass die Referenz haben werden überprüfen ID begehen ist e84d7b81f0033399e325b8037ed2b801a5c994e0
mitgit submodule status
nach dem Hinzufügen des Repo.
Noch keine native Lösung, aber die beste wahrscheinlich wir ohne jemanden bekommen ihre Hände haben kann wirklich , wirklich in der GIT-Codebasis schmutzig wird.
Sie sollten in der Lage sein, genau dieses Commit neu zu erstellen, indem Sie (in einem leeren Verzeichnis) Folgendes verwenden:
# Initialize new GIT repository
git init
# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)
git config --local user.name "Nobody"
git config --local user.email "none"
# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)
export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"
export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"
# Add root commit
git commit --allow-empty --allow-empty-message --no-edit
Das Erstellen reproduzierbarer GIT-Commits ist überraschend schwierig…
Das kannst du nicht. Dies ist eine absichtliche Entwurfsentscheidung 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 nicht inhaltlich (im Gegenteil), sodass sie nicht nachverfolgt werden.
Sie können diesen Code als create_readme.php speichern und den PHP- Code aus dem 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 dem 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
checkout
Bei aktuellen Git-Versionen ist dies jedoch nicht der Fall.