Ich möchte den Verzeichnisnamen eines Git-Submoduls in meinem Git-Superprojekt ändern.
Nehmen wir an, ich habe den folgenden Eintrag in meiner .gitmodules
Datei:
[submodule ".emacs.d/vimpulse"]
path = .emacs.d/vimpulse
url = git://gitorious.org/vimpulse/vimpulse.git
Was muss ich eingeben, um das .emacs.d/vimpulse
Verzeichnis zu verschieben, .emacs.d/vendor/vimpulse
ohne es zuerst zu löschen (
hier und hier erklärt ) und dann erneut hinzuzufügen.
Braucht Git wirklich den gesamten Pfad im Submodul-Tag?
[submodule ".emacs.d/vimpulse"]
oder ist es auch möglich, nur den Namen des Teilprojekts zu speichern?
[submodule "vimpulse"]
git
git-submodules
thisch
quelle
quelle
git mv
Befehl direkt in der Frage.git mv
. Verwenden Siedeinit
dannrm
wie angegeben stackoverflow.com/a/18892438/8047 .git mv
funktioniert nur für Submodule, keine Notwendigkeit für etwas anderes.1.8.5
Verschieben von Submodulen nativ mit demgit mv
Befehl unterstützt ( aus den Versionshinweisen, die zuerst von @thisch selbst verlinkt wurden). Auch hier beantwortetgit mv
Verschiebt das Submodul im Arbeitsbereich und aktualisiert die .git-Dateien des Submoduls korrekt, aber der Unterordner im Ordner .git / modules des übergeordneten Repos bleibt gleich - ist das in Ordnung? (Ich benutze Git 2.19.0 unter Windows)Antworten:
Hinweis: Wie in den Kommentaren erwähnt, bezieht sich diese Antwort auf die Schritte, die bei älteren Versionen von git erforderlich sind. Git bietet jetzt native Unterstützung für das Verschieben von Submodulen:
Der Vorgang ähnelt dem Entfernen eines Submoduls (siehe Wie entferne ich ein Submodul? ):
.gitmodules
und ändern Sie den Pfad des Submoduls entsprechend und fügen Sie ihn in den Index mit eingit add .gitmodules
.mkdir -p new/parent
).mv -vi old/parent/submodule new/parent/submodule
).git add new/parent
).git rm --cached old/parent/submodule
..git/modules/old/parent/submodule
mit seinem gesamten Inhalt nach.git/modules/new/parent/submodule
..git/modules/new/parent/config
Datei, und stellen Sie sicher, dass das Arbeitsbaumelement auf die neuen Speicherorte verweist. In diesem Beispiel sollte dies der Fall seinworktree = ../../../../../new/parent/module
. Normalerweise sollten sich..
an dieser Stelle zwei weitere Verzeichnisse im direkten Pfad befinden.Bearbeiten Sie die Datei
new/parent/module/.git
, und stellen Sie sicher, dass der Pfad darin auf den richtigen neuen Speicherort im Hauptprojektordner verweist..git
In diesem Beispiel alsogitdir: ../../../.git/modules/new/parent/submodule
.git status
Die Ausgabe sieht für mich danach so aus:Übernehmen Sie abschließend die Änderungen.
quelle
path
Konfiguration als auch den Namen des Submoduls aktualisieren . Wenn Sie beispielsweise foo / module nach bar / module verschieben, müssen Sie in .gitmodules den Abschnitt[submodule "foo/module"]
in[submodule "bar/module"]
und unter demselben Abschnittpath = foo/module
in ändernpath = bar/module
. Außerdem müssen Sie in .git / config den Abschnitt[submodule "foo/module"]
in ändern[submodule "bar/module"]
.fatal: 'git status --porcelain' failed in...
nur .git-Dateien oder -Verzeichnisse im Submodul löschen..git/modules/old/parent/submodule
, Verschieben an den neuen Speicherort, Aktualisierengitdir
inold/parent/submodule/.git
...git mv old/submod new/submod
funktioniert es wie erwartet und erledigt die gesamte Installation für Sie. Sie möchten wahrscheinlich Git 1.9.3+ verwenden, da es Korrekturen für das Verschieben von Submodulen enthält.Die modernste Antwort aus Vallorics Kommentar oben:
git mv old/submod new/submod
git status
.)git commit
und Sie können loslegen!Erledigt!
quelle
1.9.3
Ausnahme eines Submoduls innerhalb des verschobenen Submoduls. Das erforderte eine manuelle Bereinigung.1.8.5
wie beschrieben in der Release Notes ..gitmodules
Datei überprüfen, wird die Dateiold/submod
weiterhin als Bezeichnung für das Submodul verwendet, während der Pfad geändert wurde. Um auch die Beschriftung zu ändern, müssen Sie anscheinend den Verzeichnispfad des Moduls verschieben.git
und die Beschriftung dann manuell ändern.gitmodules
.In meinem Fall wollte ich ein Submodul aus einem Verzeichnis in ein Unterverzeichnis verschieben, z. B. "AFNetworking" -> "ext / AFNetworking". Dies sind die Schritte, die ich befolgt habe:
[core] worktree
Zeile. Meins änderte sich von../../../AFNetworking
zu../../../../ext/AFNetworking
gitdir
. Meins änderte sich von../.git/modules/AFNetworking
zu../../git/modules/ext/AFNetworking
git add .gitmodules
git rm --cached AFNetworking
git submodule add -f <url> ext/AFNetworking
Schließlich sah ich im Git-Status:
Et voila. Das obige Beispiel ändert nicht die Verzeichnistiefe, was einen großen Unterschied zur Komplexität der Aufgabe macht, und ändert auch nicht den Namen des Submoduls (was möglicherweise nicht wirklich notwendig ist, aber ich habe es getan, um mit dem übereinzustimmen würde passieren, wenn ich ein neues Modul an diesem Pfad hinzufügen würde.)
quelle
[Update: 26.11.2014] Wie Yar unten ausführlich zusammenfasst , stellen Sie sicher, dass Sie die URL des Submoduls kennen , bevor Sie etwas unternehmen. Wenn unbekannt, öffnen
.git/.gitmodules
und untersuchen Sie den Schlüsselsubmodule.<name>.url
.Was für mich funktionierte, war das Entfernen des alten Submoduls mit
git submodule deinit <submodule>
gefolgt vongit rm <submodule-folder>
. Fügen Sie dann das Submodul erneut mit dem neuen Ordnernamen hinzu und schreiben Sie fest. Wenn Sie den Git-Status vor dem Festschreiben überprüfen, wird das alte Submodul in den neuen Namen umbenannt und das Git-Modul geändert.quelle
Der Trick scheint zu verstehen, dass das
.git
Verzeichnis für Submodule jetzt im Master-Repository unter gespeichert.git/modules
ist und jedes Submodul eine.git
Datei hat, die darauf verweist. Dies ist das Verfahren, das Sie jetzt benötigen:.git
Datei im Arbeitsverzeichnis des Submoduls und ändern Sie den darin enthaltenen Pfad so, dass er auf das richtige Verzeichnis im Verzeichnis des Master-Repositorys verweist.git/modules
..git/modules
Verzeichnis des Master-Repositorys ein und suchen Sie das Verzeichnis, das Ihrem Submodul entspricht.config
Datei und aktualisieren Sie denworktree
Pfad so, dass er auf den neuen Speicherort des Arbeitsverzeichnisses des Submoduls verweist..gitmodules
Datei im Stammverzeichnis des Master-Repositorys und aktualisieren Sie den Pfad zum Arbeitsverzeichnis des Submoduls.git add -u
git add <parent-of-new-submodule-directory>
(Es ist wichtig, dass Sie das übergeordnete Verzeichnis und nicht das Submodulverzeichnis selbst hinzufügen .)Ein paar Anmerkungen:
[submodule "submodule-name"]
Zeilen in.gitmodules
und.git/config
müssen übereinstimmen, müssen aber nichts anderem entsprechen..git
Verzeichnis müssen korrekt aufeinander verweisen..gitmodules
und.git/config
Dateien sollten synchronisiert werden.quelle
Die Zeichenfolge in Anführungszeichen nach "[Submodul" spielt keine Rolle. Sie können es in "foobar" ändern, wenn Sie möchten. Es wird verwendet, um den passenden Eintrag in ".git / config" zu finden.
Wenn Sie die Änderung vornehmen, bevor Sie "git submodule init" ausführen, funktioniert dies daher einwandfrei. Wenn Sie die Änderung vornehmen (oder die Änderung durch Zusammenführen übernehmen), müssen Sie entweder .git / config manuell bearbeiten oder "git submodule init" erneut ausführen. Wenn Sie Letzteres tun, bleibt ein harmloser "gestrandeter" Eintrag mit dem alten Namen in .git / config übrig.
quelle
git submodule sync
die Änderung.git/config
automatisch anSie können einfach ein neues Submodul hinzufügen und das alte Submodul mit Standardbefehlen entfernen. (sollte versehentliche Fehler in .git verhindern)
Beispieleinrichtung:
Beispiel: Verschieben Sie 'jquery' nach 'vendor / jquery / jquery':
Bonusmethode für große Submodule:
Wenn das Submodul groß ist und Sie nicht auf den Klon warten möchten, können Sie das neue Submodul mit dem alten als Ursprung erstellen und dann den Ursprung wechseln.
Beispiel (verwenden Sie das gleiche Beispielsetup)
quelle
newPath
.Die angegebene Lösung hat bei mir nicht funktioniert, eine ähnliche Version jedoch ...
Dies ist bei einem geklonten Repository der Fall, daher sind die Git-Repos des Submoduls in den Top-Repositorys .git dir enthalten. Alle Kationen stammen aus dem obersten Repository:
Bearbeiten Sie .gitmodules und ändern Sie die Einstellung "path =" für das betreffende Submodul. (Sie müssen weder die Bezeichnung ändern noch diese Datei zum Index hinzufügen.)
Bearbeiten Sie .git / modules / name / config und ändern Sie die Einstellung "worktree =" für das betreffende Submodul
Lauf:
Ich frage mich, ob es einen Unterschied macht, ob die Repositorys atomare oder relative Submodule sind, in meinem Fall war es relativ (Submodul / .git ist ein Verweis zurück auf topproject / .git / modules / submodule).
quelle
Verwenden Sie einfach das Shell-Skript git-submodule-move .
quelle
Ich habe gestern gerade diese Tortur durchgemacht und diese Antwort hat perfekt funktioniert. Hier sind meine Schritte zur Klarheit:
more .gitmodules
Sie diese Option, da das Submodul nach dem Löschen nicht mehr vorhanden sein wirddeinit
,rm
und dannsubmodule add
BEISPIEL
BEFEHLE
HINWEIS: git mv macht das nicht. Überhaupt.
quelle
git mv
sollte in den allerletzten Versionen von Git besser sein.mv
. Vielen Dank!