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, cd
al modulo, controllare il impegnano desiderato, quindi git add
e git commit
indietro 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 sub
sottomodulo 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 sub
ciò 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 sub
ora è 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 sub
sottomodulo in un diverso commit.
Commettere
git commit
Ciò commette la voce del sottomodulo fissa.