Aktualisieren Sie ein Submodul auf das neueste Commit

269

Ich habe ein Projekt A, das eine Bibliothek ist und in einem Projekt B verwendet wird.

Beide Projekte A und B haben ein separates Repository auf Github, aber innerhalb von B haben wir ein Submodul von A.

Ich habe einige Klassen in der Bibliothek bearbeitet, die sich im Repo A befindet. Ich habe auf das Remote-Repo gedrückt, damit die Bibliothek (Repo A) aktualisiert wird.

Diese Aktualisierungen spiegeln nicht die "Referenz" (das Submodul) wider, auf die sich das Submodul auf ein vorheriges Commit bezieht. Was soll ich tun, um das Submodul auf Git zu aktualisieren?

Fett
quelle

Antworten:

358

Geben Sie das Submodulverzeichnis ein:

cd projB/projA

Ziehen Sie das Repo von Ihrem Projekt A ( aktualisiert nicht den Git-Status Ihres Elternteils, Projekt B):

git pull origin master

Gehen Sie zurück zum Stammverzeichnis und überprüfen Sie das Update:

cd ..
git status

Wenn das Submodul zuvor aktualisiert wurde, wird Folgendes angezeigt:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Übernehmen Sie dann das Update:

git add projB/projA
git commit -m "projA submodule updated"

AKTUALISIEREN

Wie @paul betonte, können wir seit Git 1.8 verwenden

git submodule update --remote --merge

um das Submodul auf das neueste Remote-Commit zu aktualisieren. In den meisten Fällen ist dies praktisch.

Kjuly
quelle
35
Übrigens, wenn Sie nicht der Eigentümer des Submoduls sind, können Sie dies einfach tun, git submodule updatewenn jemand anderes das projA aktualisiert hat (Sie erhalten eine neue Commit-ID).
Juli
Ich besitze das Submodul Main Repo (Projekt A), aber ich bin ein Committer im Projekt B.
Fat
@Kjuly Wie schiebt man es nach dem Commit auf die Fernbedienung? Ist es nur git push?
KR29
1
@ KR29 richtig, und der volle cmd ist git push <remote> <branch>zB git push origin dev.
Juli
2
git submodule updateFunktioniert nur ohne Flags, wenn ein Commit gezogen wurde (in Projekt B), das die Refs auf die betreffenden Submodule (Projekt A) aktualisiert. Um Projekt B so zu aktualisieren, dass es auf HEADden Remote-Tracking-Zweig für Projekt A verweist, gehen Sie git submodule update --remote --mergewie in der Antwort von Paul Hatcher unten gezeigt vor.
Ben Burns
108

Seit Git 1.8 kannst du das machen

git submodule update --remote --merge

Dadurch wird das Submodul auf das neueste Remote-Commit aktualisiert. Sie müssen die Änderung dann festschreiben, damit der Gitlink im übergeordneten Repository aktualisiert wird

git commit

Und dann pushen Sie die Änderungen, da ohne dies die SHA-1-Identität, die auf das Submodul zeigt, nicht aktualisiert wird und die Änderung für niemanden sichtbar ist.

Paul Hatcher
quelle
Auch wenn ich es tue git commit, sehen es alle anderen immer noch nicht. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N
1
Haben Sie nach Ihrem Commit einen "Git Push" durchgeführt? Denken Sie daran, dass Commit nur Ihr lokales Repository ändert. Sie müssen es auf die Fernbedienung übertragen, damit alle anderen es sehen können
Paul Hatcher,
In dieser Antwort fehlt (wird jedoch in anderen Antworten unten angegeben): Die aktualisierten Submodule müssen git addvor dem Festschreiben bereitgestellt werden.
Joshng
1
@joshng Ich habe das Gefühl, dass jeder, der an dem Punkt ist, an dem er an Submodulen arbeitet, das verstehen würde. Dies ist der einzige Beitrag, der mir geholfen hat, vielen Dank.
Husk Rekoms
38

Wenn Sie ein Submodul aktualisieren und es festschreiben, müssen Sie zum enthaltenen Repo oder übergeordneten Repo gehen und dort die Änderung hinzufügen.

git status

zeigt so etwas wie:

modified:
   some/path/to/your/submodule

Die Tatsache, dass das Submodul nicht synchron ist, kann auch mit gesehen werden

git submodule

Die Ausgabe zeigt:

+afafaffa232452362634243523 some/path/to/your/submodule

Das Pluszeichen zeigt an, dass Ihr Submodul vor die Stelle zeigt, auf die das Top-Repo erwartet.

Fügen Sie einfach diese Änderung hinzu:

git add some/path/to/your/submodule

und begebe es:

git commit -m "referenced newer version of my submodule"

Wenn Sie Ihre Änderungen hochschieben, stellen Sie sicher, dass Sie zuerst die Änderung im Submodul und dann die Referenzänderung im äußeren Repo hochschieben. Auf diese Weise können Personen, die ein Update durchführen, immer erfolgreich ausgeführt werden

git submodule update

Weitere Informationen zu Submodulen finden Sie hier http://progit.org/book/ch6-6.html .

Adam Dymitruk
quelle
Wenn +beim Ausführen git submodulekein angezeigt wird , stellen Sie sicher, dass Sie die Submodule initialisiert und importiert haben. Die Befehle für diese sind , git submodule initund git submodule update, respectively.
Fureigh
19

Einzeilige Version

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
Andy Webov
quelle
2

Einige der anderen Antworten empfehlen das Zusammenführen / Festschreiben im Verzeichnis des Submoduls, was IMO etwas chaotisch werden kann.

Angenommen, der Remote-Server heißt originund wir möchten den masterZweig der Submodule, dann verwende ich normalerweise:

git submodule foreach "git fetch && git reset --hard origin/master"

Hinweis: Dies wird ein Hard - Reset auf jedem Modul durchführen - wenn Sie dies nicht wünschen, können Sie ändern --hardzu --soft.

XtraSimplicity
quelle
1

Mein Projekt sollte das 'neueste' für das Submodul verwenden. Unter Mac OS X 10.11, Git-Version 2.7.1, musste ich nicht in meinen Submodul-Ordner gehen, um seine Commits zu sammeln. Ich habe nur einen Stammgast gemacht

git pull --rebase 

auf der obersten Ebene, und es hat mein Submodul korrekt aktualisiert.

AnneTheAgile
quelle
0

Andys Antwort funktionierte für mich, indem er $ path entkam:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"
Miguel Fernandes Muldy
quelle
Wahrscheinlich war der Grund, warum die Antwort von @Andy Webov kein Entkommen erforderte, der, dass sie einfache Anführungszeichen um den Pfad verwendeten, z. '$path'
S0AndS0