Submódulos de actualización de Git de forma recursiva

282

Mi proyecto de estructura

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

¿Cómo puedo actualizar submódulos de forma recursiva? Ya probé algunos comandos git (en ProjectA root)

git submodule foreach git pull origin master

o

git submodule foreach --recursive git pull origin master

pero no puede extraer archivos de Twig.

Complez
fuente
¿Qué tal git-deep ?
Mathew Kurian

Respuestas:

607
git submodule update --recursive

También es probable que desee utilizar la opción --init que hará que inicialice los submódulos no inicializados:

git submodule update --init --recursive

Nota: en algunas versiones anteriores de Git , si usa la --initopción, los submódulos ya inicializados pueden no actualizarse. En ese caso, también debe ejecutar el comando sin --initopción.

Drewag
fuente
1
¿Qué tal recursivo agregar submódulo? "git submodule add FrameworkA.git" simplemente extrae los archivos de FrameworkA.
Completo
2
Simplemente puede hacer un "git submodule add blah" y luego "git submodule update --init --recursive".
drewag
¿Es esto diferente a mi camino a continuación?
William Entriken
3
@Irineau La nota sobre los submódulos ya inicializados que no se actualizan si --initse usa no coincide con mis experiencias en Git 2.2.2. Veo submódulos de nivel superior y anidados que ya se han inicializado, obteniendo el commit correcto verificado cuando lo uso git submodule update --init --recursive, y creo que la afirmación de que necesita ejecutar el comando con y sin --inites simplemente incorrecta. A menos que alguien pueda mostrar evidencia de que este es el comportamiento o demostrar que ha cambiado entre versiones y que alguna vez fue cierto, planeo editarlo por completo.
Mark Amery
3
@ MarkAmery, recuerdo que esto es un problema en alguna versión de git que no puedo recordar. Lo acabo de probar en 1.9.3 y el problema ya no parece existir. Actualicé la respuesta para referirme a una vaga "versión anterior". Si alguien puede especificar qué versión cambió este comportamiento, sería genial.
drewag
35

La forma en que uso es:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master
William Entriken
fuente
66
Trabajé cambiando la última línea a:git submodule foreach git pull --ff-only origin master
Gilad Peleg
2
También agregaría --recursive a la última línea: "git submodule foreach --recursive git merge origin master" de lo contrario, puede obtener un submódulo sucio cuando este haya actualizado un submódulo.
Michael Scott Cuthbert
He estado buscando esto durante las últimas tres horas. Gracias Señor. Para añadir a esto, también se puede utilizar estos comandos para cometer, tales como: git submodule foreach --recursive 'git commit -a | :'. Lo :hace bucle independientemente del resultado. Ver enlace stackoverflow.com/questions/19728933/… .
Pidgeon incipiente
17

Como puede suceder que la rama predeterminada de sus submódulos no lo sea master (lo que sucede mucho en mi caso), así es como automatizo las actualizaciones completas de submódulos de Git:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
Sebastien Varrette
fuente
Intenté agregar este comando en mi Makefile genérico, pero todavía estoy atrapado en hacer que GNU Make ignore la interpretación de la secuencia $ (...), a pesar de su presencia entre comillas simples. Alguien tiene una idea?
Sebastien Varrette
Su comando es lo que necesitaba gracias! Pero entiendo: ¿ Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.dónde Core está el submódulo
Sanandrea
Además, supongo que debes resolver este comentario stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi el
no tener la opción recursiva significa que esto solo funciona si sus submódulos no incluyen submódulos nuevamente.
erikbwork
15

En Git reciente (estoy usando v2.15.1), lo siguiente fusionará los cambios de submódulos aguas arriba en los submódulos de forma recursiva:

git submodule update --recursive --remote --merge

Puede agregar --initpara inicializar cualquier submódulo no inicializado y usar--rebase si desea volver a crear una base en lugar de fusionar.

Debe confirmar los cambios después:

git add . && git commit -m 'Update submodules to latest revisions'
mrts
fuente
Esto, pensé que estaba haciendo algo mal, pero tu respuesta me confirmó que git submodule update --remote my-dir/my-submodulefunciona igual de bien
iomv