working - ¿Cómo revertir un puntero de Git Submodule a la confirmación almacenada en el repositorio contenedor?
github git submodules (5)
Desea actualizar su submódulo para que esté sincronizado con lo que el repositorio principal cree que debería ser. Esto es para lo que es el comando de actualización:
Desde la página de manual del submódulo:
Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will make the submodules HEAD be detached unless --rebase or --merge is specified or the key submodule.$name.update is set to rebase or merge.
Ejecuta esto y todo debería estar bien:
git submodule update
Tengo un submódulo git en mi repositorio git principal. Según tengo entendido, el repo principal almacena un valor SHA (en alguna parte ...), apuntando a la confirmación específica del submódulo al que está "vinculado".
Entré en mi submódulo y git checkout some_other_branch
. No tengo idea de qué compromiso vine.
Me gustaría revertir ese puntero para que el repositorio principal y el submódulo estén sincronizados de nuevo.
Mi primer instinto (probablemente ingenuo) fue decir git reset --hard
- que parece funcionar para todo lo demás. Para mi sorpresa, no funcionó para este escenario.
Así que me he dado cuenta de que puedo escribir git diff
, tener en cuenta la ID SHA que solía tener el puntero del submódulo, y luego dirigirme al submódulo y al git checkout [SHA ID]
... pero seguramente debe haber una manera más fácil?
Como todavía estoy aprendiendo sobre los submódulos de git, siéntete libre de corregir mi terminología si hay palabras para conceptos que no conozco.
La respuesta aquí de alguna manera no resolvió mi problema específico con el submódulo, así que en caso de que te pase también, intenta lo siguiente ...
git submodule foreach git reset --hard
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
Otro caso con el que me encontré es si hay un cambio no evaluado en el submódulo que desea descartar. La actualización del submódulo git no eliminará ese cambio, ni se reiniciará. Hard en el directorio padre. Necesitas ir al directorio de submódulos y hacer un reinicio de git --hard. Entonces, si quiero descartar por completo los cambios no planificados tanto en mi padre como en mi submódulo, hago lo siguiente:
En el padre:
git reset --hard
git submodule update
En Submódulo:
git reset --hard
Para cambiar la confirmación a la que apunta un submódulo, debe verificar esa versión en el submódulo, luego volver al contenedor que contiene, agregar y confirmar ese cambio.
O bien, si desea que el submódulo esté en la versión a la que apunta el repositorio superior, realice la git submodule update --recursive
. Agregue --init
si acaba de clonar.
Además, el git submodule
sin un comando de submódulo le mostrará la confirmación a la que está apuntando. Habrá un - o un + en frente de la confirmación si no está sincronizado.
Si observa un árbol con un submódulo, puede ver que el submódulo está marcado como un commit
en oposición al resto que son blobs o árboles.
para ver lo que un compromiso específico señala los submódulos, puede:
git ls-tree <some sha1, or branch, etc> Submodule/path
a continuación, puede ver la confirmación o cualquier otra cosa si lo desea pasando eso al registro, etc. (la opción git-dir
en el nivel de comando git le permite omitir tener que realizar una copia de seguridad en el submódulo):
git --git-dir=Submodule/path log -1 $(<the above statement>)
Use git ls-tree HEAD
en la carpeta "superproyecto" para ver en qué cometió originalmente su submódulo. Luego, cambie al directorio de submódulos y use git log --oneline --decorate
para ver en qué rama está la confirmación original. Finalmente, git checkout original-commit-branch
.
Utilizando algunos directorios de prueba que configuré, así es como se verían los comandos:
$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337 sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch ''master''
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)
El "superproyecto" muestra el submódulo sm2 en commit f68bed6
pero sm2 tiene su HEAD en 5b8d48f
. El submódulo commit f68bed6
tiene tres ramas que se pueden usar para el checkout en el directorio del submódulo.