Supondo que o repositório do submódulo contenha uma confirmação que você deseja usar (diferente da confirmação que é referenciada no estado atual do superprojeto), há duas maneiras de fazê-lo.
O primeiro requer que você já conheça o commit do submódulo que deseja usar. Funciona de dentro para fora, ajustando diretamente o submódulo e atualizando o superprojeto. O segundo funciona de “fora para dentro”, localizando o commit do superprojeto que modificou o submódulo e, em seguida, redefinindo o índice do superprojeto para se referir a um commit do submódulo diferente.
De dentro para fora
Se você já sabe que cometem você deseja que o sub-módulo para uso, cd
a sub-módulo, consulte a cometer você quer, então git add
e git commit
-lo de volta na super-projeto.
Exemplo:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Ops, alguém fez um commit do superprojeto que se refere a um commit não publicado no submódulo sub
. De alguma forma, já sabemos que queremos que o submódulo esteja no commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Vá lá e confira diretamente.
Fazer checkout no 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 verificando um commit, isso produz um HEAD desanexado no submódulo. Se você quiser ter certeza de que o submódulo está usando uma ramificação, use git checkout -b newbranch <commit>
para criar e efetuar check-out de uma ramificação no commit ou check-out do branch que você deseja (por exemplo, um com o commit desejado na ponta).
Atualizar o superprojeto
Um check-out no submódulo é refletido no superprojeto como uma alteração na árvore de trabalho. Portanto, precisamos organizar a mudança no índice do superprojeto e verificar os resultados.
$ git add sub
Confira os 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
A atualização do submódulo foi silenciosa porque o submódulo já está no commit especificado. O primeiro diff mostra que o índice e a árvore de trabalho são iguais. O terceiro diff mostra que a única alteração faseada é mover o sub
submódulo para uma confirmação diferente.
Confirmar
git commit
Isso confirma a entrada do sub-módulo corrigido.
De fora para dentro
Se você não tiver certeza de qual commit você deve usar no submódulo, consulte o histórico no superprojeto para guiá-lo. Você também pode gerenciar a redefinição diretamente do superprojeto.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Esta é a mesma situação que acima. Mas desta vez vamos nos concentrar em corrigi-lo do superprojeto, em vez de mergulhar no submódulo.
Encontre o compromisso incorreto do superprojeto
$ 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 deu errado ce5d37c
, então vamos restaurar o submódulo a partir do pai ( ce5d37c~
).
Como alternativa, você pode pegar o commit do submódulo no texto do patch ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) e usar o processo "dentro, fora" acima.
Checkout no Superprojeto
$ git checkout ce5d37c~ -- sub
Isso redefiniu a entrada do sub-módulo para sub
o que estava no commit ce5d37c~
no superprojeto.
Atualize o submódulo
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
A atualização do submódulo foi OK (indica um HEAD desanexado).
Confira os 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
O primeiro diff mostra que sub
agora é o mesmo em ce5d37c~
. O segundo diff mostra que o índice e a árvore de trabalho são iguais. O terceiro diff mostra que a única mudança faseada está movendo o sub
submódulo para um commit diferente.
Confirmar
git commit
Isso confirma a entrada do sub-módulo corrigido.