Angenommen, das Repository des Submoduls enthält ein Commit, das Sie verwenden möchten (im Gegensatz zu dem Commit, auf das aus dem aktuellen Status des Superprojekts verwiesen wird), gibt es zwei Möglichkeiten.
Das erste erfordert, dass Sie das Commit bereits von dem Submodul kennen, das Sie verwenden möchten. Es funktioniert von innen nach außen, indem das Submodul direkt angepasst und das Superprojekt aktualisiert wird. Der zweite Vorgang erfolgt von außen nach innen, indem das Commit des Superprojekts ermittelt wird, mit dem das Submodul geändert wurde, und anschließend der Index des Superprojekts zurückgesetzt wird, um auf ein anderes Commit des Submoduls zu verweisen.
Von innen nach außen
Wenn Sie bereits wissen, welches Commit das Submodul verwenden soll cd
, überprüfen Sie das gewünschte Commit für das Submodul git add
und git commit
dann wieder im Superprojekt.
Beispiel:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Hoppla, jemand hat ein Superprojekt-Commit durchgeführt, das sich auf ein unveröffentlichtes Commit im Submodul bezieht sub
. Irgendwie wissen wir bereits, dass das Submodul festgeschrieben werden soll 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Gehen Sie dorthin und sehen Sie es sich direkt an.
Kasse im Submodul
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
Da wir ein Commit auschecken, erzeugt dies einen getrennten HEAD im Submodul. Wenn Sie sicherstellen möchten, dass das Submodul einen Zweig verwendet git checkout -b newbranch <commit>
, erstellen und checken Sie einen Zweig beim Festschreiben aus oder checken den gewünschten Zweig aus (z. B. einen mit dem gewünschten Festschreiben an der Spitze).
Aktualisieren Sie das Super-Projekt
Ein Checkout im Submodul spiegelt sich im Superprojekt als Änderung des Arbeitsbaums wider. Wir müssen also die Änderung im Index des Superprojekts inszenieren und die Ergebnisse überprüfen.
$ git add sub
Überprüfen Sie die Ergebnisse
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Die Aktualisierung des Submoduls war stumm, da sich das Submodul bereits im angegebenen Commit befindet. Der erste Unterschied zeigt, dass Index und Arbeitsbaum identisch sind. Der dritte sub
Unterschied zeigt, dass die einzige schrittweise Änderung darin besteht, das Submodul in ein anderes Commit zu verschieben.
Verpflichten
git commit
Dies schreibt den festen Submoduleintrag fest.
Außenseite nach innen
Wenn Sie nicht sicher sind, welches Commit Sie aus dem Submodul verwenden sollen, können Sie sich den Verlauf im Superprojekt ansehen, um sich zu orientieren. Sie können den Reset auch direkt vom Superprojekt aus verwalten.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Dies ist die gleiche Situation wie oben. Aber dieses Mal werden wir uns darauf konzentrieren, es aus dem Superprojekt heraus zu reparieren, anstatt in das Submodul einzutauchen.
Finden Sie das Errant Commit des Superprojekts
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
OK, es sieht so aus, als wäre es schlecht ce5d37c
gelaufen, also werden wir das Submodul von seinem übergeordneten ( ce5d37c~
) wiederherstellen .
Alternativ können Sie das Commit des Submoduls aus dem Patch-Text ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) übernehmen und stattdessen den obigen Prozess "Inside, Out" verwenden.
Kasse im Super-Projekt
$ git checkout ce5d37c~ -- sub
Dadurch wurde der Submoduleintrag sub
auf das zurückgesetzt , was er ce5d37c~
im Superprojekt festgeschrieben hatte.
Aktualisieren Sie das Submodul
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
Das Submodul-Update ging in Ordnung (es zeigt einen abgetrennten HEAD an).
Überprüfen Sie die Ergebnisse
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Der erste Unterschied zeigt, dass dies sub
jetzt der gleiche ist ce5d37c~
. Der zweite Unterschied zeigt, dass Index und Arbeitsbaum identisch sind. Der dritte sub
Unterschied zeigt, dass die einzige schrittweise Änderung darin besteht, das Submodul in ein anderes Commit zu verschieben.
Verpflichten
git commit
Dies schreibt den festen Submoduleintrag fest.