Supponendo che il repository del sottomodulo contenga un commit che si desidera utilizzare (diversamente dal commit a cui fa riferimento lo stato corrente del super-progetto), ci sono due modi per farlo.
Il primo richiede di conoscere già il commit dal sottomodulo che si desidera utilizzare. Funziona da "dentro, fuori" regolando direttamente il sottomodulo e quindi aggiornando il super-progetto. Il secondo funziona dall'esterno, trovando il commit del super-progetto che ha modificato il sottomodulo e quindi reimpostando l'indice del super-progetto per fare riferimento a un diverso commit del sottomodulo.
Alla rovescia
Se sai già che impegnano si desidera che il modulo per l'uso, cdal modulo, controllare il impegnano desiderato, quindi git adde git commitindietro nel super-progetto.
Esempio:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Spiacenti, qualcuno ha eseguito un commit di super-progetto che fa riferimento a un commit non pubblicato nel sottomodulo sub. In qualche modo, sappiamo già che vogliamo che il sottomodulo sia in commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c. Vai lì e dai un'occhiata direttamente.
Acquista nel sottomodulo
$ 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 ..
Dal momento che stiamo verificando un commit, questo produce un HEAD distaccato nel sottomodulo. Se si desidera assicurarsi che il sottomodulo stia utilizzando un ramo, utilizzare git checkout -b newbranch <commit>per creare e verificare un ramo al commit o verificare il ramo desiderato (ad es. Uno con il commit desiderato in punta).
Aggiorna il Super-progetto
Un checkout nel sottomodulo si riflette nel super-progetto come una modifica all'albero di lavoro. Quindi dobbiamo mettere in scena il cambiamento nell'indice del super-progetto e verificare i risultati.
$ git add sub
Controlla i risultati
$ 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
L'aggiornamento del sottomodulo era silenzioso perché il sottomodulo è già al commit specificato. Il primo diff mostra che l'indice e il worktree sono uguali. Il terzo diff mostra che l'unica modifica a fasi è lo spostamento del subsottomodulo su un commit diverso.
Commettere
git commit
Ciò commette la voce del sottomodulo fissa.
Fuori dentro
Se non si è sicuri del commit da utilizzare dal sottomodulo, è possibile consultare la cronologia nel superprogetto per guidare l'utente. Puoi anche gestire il reset direttamente dal super-progetto.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Questa è la stessa situazione di cui sopra. Ma questa volta ci concentreremo sul ripararlo dal super-progetto anziché immergerlo nel sottomodulo.
Trova Errant Commit del Super-progetto
$ 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, sembra che sia andato male ce5d37c, quindi ripristineremo il sottomodulo dal suo genitore ( ce5d37c~).
In alternativa, puoi prendere il commit del sottomodulo dal testo della patch ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c) e usare invece il processo "dentro, fuori" sopra.
Acquista nel Super-progetto
$ git checkout ce5d37c~ -- sub
Ciò ha reimpostato la voce del sottomodulo per subciò che era in commit ce5d37c~nel super-progetto.
Aggiorna il sottomodulo
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
L'aggiornamento del sottomodulo è andato bene (indica una HEAD staccata).
Controlla i risultati
$ 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
Il primo diff mostra che subora è lo stesso in ce5d37c~. Il secondo diff mostra che l'indice e il worktree sono uguali. Il terzo diff mostra che l'unica modifica a fasi è lo spostamento del subsottomodulo in un diverso commit.
Commettere
git commit
Ciò commette la voce del sottomodulo fissa.