2011-10-24 16 views
78

Tengo un submódulo git en mi repositorio principal de git. 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".¿Cómo revertir un puntero del submódulo de Git a la confirmación almacenada en el repositorio contenedor?

Entré en mi submódulo y escribí 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 he descubierto que puedo escribir git diff, tenga en cuenta el ID SHA que el puntero del submódulo solía tener, y luego la cabeza en el submódulo y 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, no dude en corregir mi terminología si hay palabras para conceptos que no conozco.

Respuesta

112

desea actualizar su submódulo por lo que está en sintonía con lo que el repositorio padre cree que debería ser. Esto es lo que el comando de actualización es para:

Desde la página de manual 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. 

Ejecutar este y todos deben estar bien:

git submodule update 
+2

De alguna manera, para mí que necesitaba para agregar '--init'. Sin él, los submódulos permanecerían en un estado con '(nuevos commits)'. Aunque mis submódulos ya estaban inicializados. – Ambidex

+0

@Ambidex sí, la opción '--init' es crucial en todo esto. Me pidieron el nombre de usuario y la contraseña porque mis submódulos se clonaron en https. Fui a ambas carpetas y configuré los controles remotos para usar el protocolo 'ssh' para el pago y envío. –

14

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, si quiere que el submódulo esté en la versión que apunta a los repores superiores, haga git submodule update --recursive. Agregue --init si acaba de clonar.

Además, git submodule sin un comando de submódulo le mostrará la confirmación que está señalando. Habrá un - o un + en frente de la confirmación si no está sincronizado.

Si mira un árbol con un submódulo, puede ver que el submódulo está marcado como commit en comparación con el resto que son blobs o árboles.

a ver que es lo particular, los puntos de compromiso WRT a submódulos se puede:

git ls-tree <some sha1, or branch, etc> Submodule/path 

a continuación, puede ver la confirmación o cualquier otra cosa, si usted tiene gusto al paso que en el registro, etc (la opción git-dir en el GIT nivel de comando le permite omitir tener que cd hasta el submódulo):

git --git-dir=Submodule/path log -1 $(<the above statement>) 
4

Uso git ls-tree HEAD en la carpeta "SuperProject" para ver a lo que compromete su submódulo fue originalmente. 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.

El uso de algunos directorios de prueba He definido, esto es lo que los comandos pueden ser:

$ 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 "SuperProject" muestra el submódulo SM2 a cometer f68bed6 pero SM2 tiene su cabeza hacia 5b8d48f. El submódulo commit f68bed6 tiene tres ramas que se pueden usar para la extracción en el directorio del submódulo.

+0

GRACIAS DAN, PERFECTO! – Alec

2

Otro caso que acabo de encontrar 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. Así que si quiero descartar totalmente los cambios unstaged en tanto mi padre y el submódulo, hago lo siguiente:

En Padres:

git reset --hard 

git submodule update 

En submódulo:

git reset --hard 
Cuestiones relacionadas