Git-Update-Submodule rekursiv

282

Meine Projektstruktur

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

Wie kann ich Submodule rekursiv aktualisieren? Ich habe bereits einige Git-Befehle ausprobiert (im ProjectA-Stammverzeichnis).

git submodule foreach git pull origin master

oder

git submodule foreach --recursive git pull origin master

kann aber keine Dateien von Twig ziehen.

complez
quelle
Wie wäre es mit git-deep ?
Mathew Kurian

Antworten:

607
git submodule update --recursive

Möglicherweise möchten Sie auch die Option --init verwenden, mit der nicht initialisierte Submodule initialisiert werden:

git submodule update --init --recursive

Hinweis: Wenn Sie in einigen älteren Versionen von Git die --initOption verwenden, werden bereits initialisierte Submodule möglicherweise nicht aktualisiert. In diesem Fall sollten Sie den Befehl auch ohne --initOption ausführen .

Drawag
quelle
1
Wie wäre es mit einem rekursiven Add-Submodul? "git submodule add FrameworkA.git" zieht einfach Dateien von FrameworkA.
Complez
2
Sie können einfach ein "git submodule add blah" und dann "git submodule update --init --recursive" ausführen.
Drawag
Ist das anders als mein Weg unten?
William Entriken
3
@Irineau Der Hinweis, dass bereits initialisierte Submodule bei Verwendung nicht aktualisiert werden --init, stimmt nicht mit meinen Erfahrungen mit Git 2.2.2 überein. Ich sehe sowohl Top-Level- als auch verschachtelte Submodule, die bereits initialisiert wurden und bei meiner Verwendung das richtige Commit auschecken git submodule update --init --recursive, und ich denke, die Behauptung, dass Sie den Befehl mit und ohne ausführen müssen, --initist einfach falsch. Sofern nicht jemand Beweise dafür vorlegen kann, dass dies das Verhalten ist, oder nachweisen kann, dass es zwischen den Versionen geändert wurde und einmal wahr war, habe ich vor, es insgesamt zu bearbeiten.
Mark Amery
3
@ MarkAmery, ich erinnere mich, dass dies ein Problem in einer Version von Git ist, an die ich mich nicht erinnern kann. Ich habe es gerade in 1.9.3 getestet und das Problem scheint nicht mehr zu existieren. Ich habe die Antwort aktualisiert, um auf eine vage "ältere Version" zu verweisen. Wenn jemand angeben kann, welche Version dieses Verhalten geändert hat, wäre das großartig.
Drawag
35

Die Art, wie ich benutze, ist:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master
William Entriken
quelle
6
Ich arbeitete daran, die letzte Zeile zu ändern:git submodule foreach git pull --ff-only origin master
Gilad Peleg
2
Ich würde auch --recursive zur letzten Zeile hinzufügen: "git submodule foreach --recursive git merge origin master", sonst können Sie ein schmutziges Submodul erhalten, wenn es selbst ein Submodul aktualisiert hat.
Michael Scott Cuthbert
Ich habe in den letzten drei Stunden danach gesucht. Danke mein Herr. Um dies hinzuzufügen, können Sie diese Befehle auch zum Festschreiben verwenden, z git submodule foreach --recursive 'git commit -a | :'. Das :macht es Schleife unabhängig vom Ergebnis. Siehe Link stackoverflow.com/questions/19728933/… .
Jung Pidgeon
17

Da es vorkommen kann, dass der Standardzweig Ihrer Submodule nicht vorhanden ist master (was in meinem Fall häufig vorkommt), automatisiere ich auf diese Weise die vollständigen Git-Submodul-Upgrades:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
Sebastien Varrette
quelle
Ich habe versucht, diesen Befehl in mein generisches Makefile aufzunehmen, aber ich bin immer noch festgefahren, damit GNU Make die Interpretation der $ (...) - Sequenz ignoriert , obwohl sie in einfachen Anführungszeichen steht. Hat jemand eine Idee?
Sebastien Varrette
Ihr Befehl ist das, was ich brauchte, danke! Aber ich Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.Core
verstehe
Ich denke auch, dass Sie diesen Kommentar herausfinden
Ahmad AlMughrabi
Wenn Sie die rekursive Option nicht haben, funktioniert dies nur, wenn Ihre Submodule keine Submodule mehr enthalten.
Erikbwork
15

In der letzten Version von Git (ich verwende v2.15.1) werden die folgenden Änderungen des Upstream-Submoduls rekursiv in die Submodule zusammengeführt:

git submodule update --recursive --remote --merge

Sie können hinzufügen --init, um nicht initialisierte Submodule zu initialisieren und zu verwenden--rebase wenn Sie eine Neubasis anstelle einer Zusammenführung wünschen.

Sie müssen die Änderungen anschließend festschreiben:

git add . && git commit -m 'Update submodules to latest revisions'
mrts
quelle
Ich dachte, ich mache etwas falsch, aber Ihre Antwort hat mir bestätigt, dass es git submodule update --remote my-dir/my-submodulegenauso gut
funktioniert