Suponiendo que el repositorio del submódulo contiene un compromiso que desea usar (a diferencia del compromiso al que se hace referencia desde el estado actual del superproyecto), hay dos formas de hacerlo.
El primero requiere que ya conozca la confirmación del submódulo que desea usar. Funciona desde adentro hacia afuera ajustando directamente el submódulo y luego actualizando el superproyecto. El segundo funciona desde el "afuera, adentro" al encontrar la confirmación del superproyecto que modificó el submódulo y luego restablecer el índice del superproyecto para referirse a una confirmación de submódulo diferente.
De adentro hacia afuera
Si ya sabe qué confirmación desea que use el submódulo, cd
en el submódulo, verifique la confirmación que desea, git add
y luego git commit
vuelva al superproyecto.
Ejemplo:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Vaya, alguien realizó una confirmación de superproyecto que se refiere a una confirmación no publicada en el submódulo sub
. De alguna manera, ya sabemos que queremos que el submódulo esté en commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Ve allí y échale un vistazo directamente.
Pagar en el submódulo
$ 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 ..
Como estamos revisando un commit, esto produce un HEAD separado en el submódulo. Si desea asegurarse de que el submódulo esté usando una rama, use git checkout -b newbranch <commit>
para crear y pagar una rama en la confirmación o retirar la rama que desea (por ejemplo, una con la confirmación deseada en la punta).
Actualizar el superproyecto
Un pago en el submódulo se refleja en el superproyecto como un cambio en el árbol de trabajo. Por lo tanto, debemos organizar el cambio en el índice del superproyecto y verificar los resultados.
$ git add sub
Verifica los resultados
$ 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
La actualización del submódulo fue silenciosa porque el submódulo ya está en la confirmación especificada. La primera diferencia muestra que el índice y el árbol de trabajo son iguales. El tercer diferencial muestra que el único cambio por etapas es mover el sub
submódulo a una confirmación diferente.
Cometer
git commit
Esto confirma la entrada de submódulo arreglado.
De fuera hacia dentro
Si no está seguro de qué confirmación debe usar desde el submódulo, puede ver el historial en el superproyecto para guiarlo. También puede administrar el reinicio directamente desde el superproyecto.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Esta es la misma situación que la anterior. Pero esta vez nos centraremos en solucionarlo desde el superproyecto en lugar de sumergirnos en el submódulo.
Encuentra el compromiso errante del superproyecto
$ 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, parece que salió mal ce5d37c
, así que restauraremos el submódulo desde su padre ( ce5d37c~
).
Alternativamente, puede tomar la confirmación del submódulo del texto del parche ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) y utilizar el proceso anterior "adentro, afuera" en su lugar.
Pagar en el Superproyecto
$ git checkout ce5d37c~ -- sub
Esto restableció la entrada del submódulo para sub
lo que estaba en commit ce5d37c~
en el superproyecto.
Actualice el submódulo
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
La actualización del submódulo salió bien (indica un HEAD separado).
Verifica los resultados
$ 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
La primera diferencia muestra que sub
ahora es lo mismo en ce5d37c~
. El segundo diferencial muestra que el índice y el árbol de trabajo son iguales. El tercer diferencial muestra que el único cambio por etapas es mover el sub
submódulo a una confirmación diferente.
Cometer
git commit
Esto confirma la entrada de submódulo arreglado.