Una forma sencilla de extraer lo último de todos los submódulos de git

Estamos utilizando submódulos git para gestionar un par de grandes proyectos que tienen dependencias de muchas otras bibliotecas que hemos desarrollado. Cada biblioteca es un repositorio separado traído al proyecto dependiente como un submódulo. Durante el desarrollo, a menudo queremos ir a coger la última versión de cada submódulo dependiente.

¿Tiene git un comando incorporado para hacer esto? Si no, ¿qué tal un archivo por lotes de Windows o algo similar que pueda hacerlo?

Solución

Si es la primera vez que se hace un checkout de un repo es necesario usar primero --init:

git submodule update --init --recursive

Para git 1.8.2 o superior se ha añadido la opción --remote para soportar la actualización a las últimas puntas de las ramas remotas:

git submodule update --recursive --remote

Esto tiene la ventaja añadida de respetar cualquier rama "no predeterminada" especificada en los archivos .gitmodules o .git/config (si tienes alguno, el predeterminado es origin/master, en cuyo caso algunas de las otras respuestas aquí funcionarían también).

Para git 1.7.3 o superior se puede utilizar (pero los inconvenientes de abajo sobre lo que hace la actualización todavía se aplican):

git submodule update --recursive

o:

git pull --recurse-submodules

si quieres tirar de tus submódulos a los últimos commits en lugar de a los que apunta el repo.

Ver git-submodule(1) para más detalles

Comentarios (20)

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

Nosotros 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

Sólo tienes que ponerlo en un directorio bin adecuado (/usr/local/bin). Si estás en Windows, puede que tengas que modificar la sintaxis para que funcione :)

Actualización:

En respuesta al comentario del autor original sobre la extracción de todos los HEADs de todos los submódulos - es una buena pregunta.

Estoy bastante seguro de que git no tiene un comando para esto internamente. Para hacerlo, tendrías que identificar qué es realmente el HEAD de un submódulo. Eso podría ser tan simple como decir que master es la rama más actualizada, etc...

Siguiendo esto, crea un simple script que haga lo siguiente:

  1. comprobar el estado del submódulo git para los repositorios "modificados". El primer carácter de las líneas de salida lo indica. Si un sub-repo está modificado, no se debe proceder.
  2. Para cada repositorio de la lista, entre en su directorio y ejecute git checkout master && git pull. Compruebe si hay errores.
  3. Al final, le sugiero que imprima una pantalla al usuario para indicar el estado actual de los submódulos -- ¿quizás pedirle que los añada todos y los confirme?

Me gustaría mencionar que este estilo no es realmente para lo que los submódulos git fueron diseñados. Típicamente, quieres decir que "LibraryX" está en la versión "2.32" y permanecerá así hasta que le diga que "actualice".

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

Actualización 2:

Si usted está en una plataforma de Windows, es posible que desee buscar en el uso de Python para implementar la secuencia de comandos, ya que es muy capaz en estas áreas. Si usted está en unix/linux, entonces sugiero sólo un script bash.

¿Necesitas alguna aclaración? Sólo tienes que publicar un comentario.

Comentarios (6)

Creo que tendrás que escribir un script para hacer esto. Para ser honesto, yo podría instalar python para hacerlo de manera que puedas usar os.walk para cd a cada directorio y emitir los comandos apropiados. Usando python o algún otro lenguaje de scripting, que no sea por lotes, te permitiría añadir/eliminar subproyectos fácilmente sin tener que modificar el script.

Comentarios (0)