Pregunta Actualizar el submódulo de Git a la última confirmación de origen


Tengo un proyecto con un submódulo de Git. Es de una URL ssh: // ... y está en la confirmación A. El Commit B se ha enviado a esa URL, y quiero que el submódulo recupere la confirmación y cambie a ella.

Ahora, mi entendimiento es que git submodule update debería hacer esto, pero no es así. No hace nada (sin salida, código de salida de éxito). Aquí hay un ejemplo:

$ mkdir foo
$ cd foo
$ git init .
Initialized empty Git repository in /.../foo/.git/
$ git submodule add ssh://user@host/git/mod mod
Cloning into mod...
user@host's password: hunter2
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 131 (delta 54), reused 0 (delta 0)
Receiving objects: 100% (131/131), 16.16 KiB, done.
Resolving deltas: 100% (54/54), done.
$ git commit -m "Hello world."
[master (root-commit) 565b235] Hello world.
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 mod
# At this point, ssh://user@host/git/mod changes; submodule needs to change too.
$ git submodule init
Submodule 'mod' (ssh://user@host/git/mod) registered for path 'mod'
$ git submodule update
$ git submodule sync
Synchronizing submodule url for 'mod'
$ git submodule update
$ man git-submodule 
$ git submodule update --rebase
$ git submodule update
$ echo $?
0
$ git status
# On branch master
nothing to commit (working directory clean)
$ git submodule update mod
$ ...

También intenté git fetch mod, que parece hacer una búsqueda (¡pero no puede, porque no está pidiendo una contraseña!), pero git log y git show negar la existencia de nuevos compromisos. Hasta ahora solo he estado rm-ing el módulo y volver a agregarlo, pero esto es a la vez erróneo en principio y tedioso en la práctica.


612
2018-04-29 05:41


origen


Respuestas:


los git submodule update comando realmente le dice a Git que quiere que sus submódulos comprueben cada una de las confirmaciones ya especificadas en el índice del superproyecto. Si quieres actualizar sus submódulos a la última confirmación disponible desde su control remoto, tendrá que hacer esto directamente en los submódulos.

Entonces en resumen:

# get the submodule initially
git submodule add ssh://bla submodule_dir
git submodule init

# time passes, submodule upstream is updated
# and you now want to update

# change to the submodule directory
cd submodule_dir

# checkout desired branch
git checkout master

# update
git pull

# get back to your project root
cd ..

# now the submodules are in the state you want, so
git commit -am "Pulled down update to submodule_dir"

O, si eres una persona ocupada:

git submodule foreach git pull origin master

1068
2018-04-29 05:50



Git 1.8.2 presenta una nueva opción --remote eso permitirá exactamente este comportamiento. Corriendo

git submodule update --remote --merge

obtendrá los últimos cambios de la corriente ascendente en cada submódulo, los fusionará y revisará la última revisión del submódulo. Como los documentos Ponlo:

--remoto

Esta opción solo es válida para el comando de actualización. En lugar de usar el SHA-1 grabado del superproyecto para actualizar el submódulo, use el estado de la rama de seguimiento remoto del submódulo.

Esto es equivalente a correr git pull en cada submódulo, que generalmente es exactamente lo que quieres.


313
2018-01-17 20:24



en el directorio primario de su proyecto ejecute:

git submodule update --init 

o si tiene submódulos recursivos ejecute:

git submodule update --init --recursive

a veces esto no funciona, es porque de alguna manera tiene cambios locales en el directorio del submódulo local mientras se está actualizando el submódulo.

La mayoría de las veces, el cambio local puede no ser el que desea comprometer. Puede suceder debido a una eliminación de archivos en su submódulo, etc. De ser así, realice un reinicio en su directorio de submódulos local y en el directorio principal de su proyecto ejecute de nuevo:

git submodule update --init --recursive 

93
2018-06-18 08:25



Su proyecto principal apunta a una confirmación particular en la que debería estar el submódulo. Qué git submodule update lo que se hace es intentar verificar que se confirme en cada submódulo que se ha inicializado. El submódulo es en realidad un repositorio independiente: al crear un nuevo compromiso en el submódulo y presionar para que no sea suficiente, también debe agregar explícitamente la nueva versión del submódulo en el proyecto principal.

Entonces, en tu caso, deberías encontrar la confirmación correcta en el submódulo; supongamos que es la sugerencia del maestro:

cd mod
git checkout master
git pull origin master

Ahora regrese al proyecto principal, organice el submódulo y comprométalo:

cd ..
git add mod
git commit -m "Updating the submodule 'mod' to the latest version"

Ahora inserta tu nueva versión del proyecto principal:

git push origin master

A partir de este punto, si alguien más actualiza su proyecto principal, entonces git submodule update para ellos, actualizará el submódulo, suponiendo que se haya inicializado.


63
2018-04-29 06:12



Parece que se mezclan 2 escenarios diferentes en esta discusión:

escenario 1

Utilizando los punteros del repositorio padre para los submódulos, quiero verificar el compromiso en cada submódulo, al que apunta el repositorio padre, posiblemente después de iterar primero a través de todos los submódulos y actualizar / extraerlos del control remoto.

Esto es, como se señaló, hecho con

git submodule foreach git pull origin BRANCH
git submodule update

Escenario 2, que creo que es a lo que OP apunta

Han sucedido cosas nuevas en 1 o más submódulos, y quiero 1) extraer estos cambios y 2) actualizar el repositorio padre para apuntar a la confirmación HEAD (última) de este / estos submódulos.

Esto se haría por

git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH

No es muy práctico, ya que tendría que codificar n rutas de acceso a todos los n submódulos en, p. un script para actualizar los punteros de confirmación del repositorio padre.

Lo que sería genial sería una iteración automatizada a través de cada submódulo, actualizando el puntero repo padre (usando git add) para apuntar al encabezado de los submódulo (s).

Para esto, hice este pequeño bash-script:

git-update-submodules.sh


17
2018-01-14 15:46



Claro y simple, para buscar los submódulos:

git submodule update --init --recursive

y ahora continúe actualizándolos a la última rama maestra (por ejemplo):

git submodule foreach git pull origin master

11
2017-08-17 20:48



@Jason es correcto de una manera, pero no del todo.

actualizar

Actualiza los submódulos registrados   es decir, clonar los submódulos y   verificar la confirmación especificada en el   índice del repositorio contenedor.   Esto hará que los submódulos HEAD sean   separado, a menos que --rebase o --merge sea   especificado o la clave   submódulo. $ name.update está configurado para   rebase o fusionar.

Por lo tanto, la actualización del submódulo de git no funciona, pero la cosa es que se trata de la confirmación en el índice del repositorio contenedor. Todavía no sabe nada del nuevo compromiso en sentido ascendente. Vaya a su submódulo, obtenga la confirmación que desea y comprometa el estado del submódulo actualizado en el repositorio principal y luego haga la git submodule update


4
2018-04-29 06:01



Aquí hay un excelente one-liner para actualizar todo a lo último en master:

git submodule foreach 'git fetch origin --tags; git checkout master; git pull' && git pull && git submodule update --init --recursive

Gracias a Mark Jaquith


0
2017-07-28 04:29