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?
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
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:
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.git checkout master && git pull
. Compruebe si hay errores.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.
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.