Obtenga los últimos cambios para todos los submódulos de git

Resuelto Brad Robinson asked hace 15 años • 23 respuestas

Estamos usando submódulos de git para administrar un par de proyectos grandes que dependen de muchas otras bibliotecas que hemos desarrollado. Cada biblioteca es un repositorio independiente que se incorpora al proyecto dependiente como un submódulo. Durante el desarrollo, a menudo queremos simplemente obtener la última versión de cada submódulo dependiente.

¿Cómo obtengo los últimos cambios para todos los submódulos de git?

Brad Robinson avatar Jun 23 '09 08:06 Brad Robinson
Aceptado

Si es la primera vez que consulta un repositorio, --initprimero debe usar:

git submodule update --init --recursive

Para git 1.8.2 o superior, --remotese agregó la opción para admitir la actualización a los últimos consejos de sucursales remotas:

git submodule update --recursive --remote

Esto tiene el beneficio adicional de respetar las ramas "no predeterminadas" especificadas en los archivos .gitmoduleso .git/config(si tiene alguna, la predeterminada es origen/maestro, en cuyo caso algunas de las otras respuestas aquí también funcionarían).

Para git 1.7.3 o superior, puede usar (pero los siguientes errores sobre qué actualización aún se aplican):

git submodule update --recursive

o:

git pull --recurse-submodules

si desea llevar sus submódulos a las últimas confirmaciones en lugar de la confirmación actual a la que apunta el repositorio.

Consulte git-submodule(1) para obtener más detalles.

Henrik Gustafsson avatar Jun 23 '2009 13:06 Henrik Gustafsson
git pull --recurse-submodules --jobs=10

una característica que Git aprendió por primera vez en 1.8.5.

Hasta que se solucione el error , por primera vez es necesario ejecutar

Actualización del submódulo de git --init --recursive

Alexander Bartosh avatar Nov 10 '2011 18:11 Alexander Bartosh

Al iniciar ejecutando el siguiente comando:

git submodule update --init --remote --recursive

desde el directorio de repositorio de git, funciona mejor para mí.

Esto extraerá todas las últimas novedades, incluidos los submódulos.

Explicado

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

Después de esto puedes simplemente ejecutar:

git submodule update --recursive

desde el directorio de repositorio de git, funciona mejor para mí.

Esto extraerá todas las últimas novedades, incluidos los submódulos.

abc123 avatar Dec 11 '2014 19:12 abc123

Nota: Esto es de 2009 y puede que haya sido bueno entonces, pero ahora hay mejores opciones.

Usamos esto. Se llama git-pup:

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

Simplemente colóquelo en un directorio bin adecuado (/usr/local/bin). Si estás en Windows, es posible que tengas que modificar la sintaxis para que funcione :)

Actualizar:

En respuesta al comentario del autor original acerca de incorporar todos los HEAD de todos los submódulos, esa es una buena pregunta.

Estoy bastante seguro de que gitno tiene un comando para esto internamente. Para hacerlo, necesitará identificar qué es realmente HEAD para un submódulo. Eso podría ser tan simple como decir masteres la sucursal más actualizada, etc.

Después de esto, cree un script simple que haga lo siguiente:

  1. busque git submodule statusrepositorios "modificados". El primer carácter de las líneas de salida indica esto. Si se modifica un subrepo, es posible que NO desee continuar.
  2. para cada repositorio enumerado, ingrese a su directorio y ejecútelo git checkout master && git pull. Compruebe si hay errores.
  3. Al final, le sugiero que imprima una pantalla para el usuario para indicar el estado actual de los submódulos; ¿quizás pedirle que agregue todos y confirme?

Me gustaría mencionar que este estilo no es realmente para lo que se diseñaron los submódulos de git. Por lo general, desea decir que "LibraryX" está en la versión "2.32" y permanecerá así hasta que le indique que "actualice".

Eso es, en cierto sentido, lo que estás haciendo con el script descrito, pero de forma más automática. ¡Se requiere cuidado!

Actualización 2:

Si está en una plataforma Windows, es posible que desee considerar el uso de Python para implementar el script, ya que es muy capaz en estas áreas. Si utiliza Unix/Linux, le sugiero simplemente un script bash.

¿Necesitas alguna aclaración? Simplemente publique un comentario.

gahooa avatar Jun 23 '2009 01:06 gahooa

Henrik va por buen camino . El git submodule foreachcomando puede ejecutar cualquier script de shell arbitrario. Dos opciones para obtener lo último podrían ser:

git submodule foreach git pull origin master

y:

git submodule foreach /path/to/some/cool/script.sh

Eso recorrerá todos los submódulos inicializados y ejecutará los comandos dados.

mturquette avatar Jun 23 '2009 14:06 mturquette