Obtenga los últimos cambios para todos los submódulos de git
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?
Si es la primera vez que consulta un repositorio, --init
primero debe usar:
git submodule update --init --recursive
Para git 1.8.2 o superior, --remote
se 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 .gitmodules
o .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.
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
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.
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 git
no 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 master
es la sucursal más actualizada, etc.
Después de esto, cree un script simple que haga lo siguiente:
- busque
git submodule status
repositorios "modificados". El primer carácter de las líneas de salida indica esto. Si se modifica un subrepo, es posible que NO desee continuar. - para cada repositorio enumerado, ingrese a su directorio y ejecútelo
git checkout master && git pull
. Compruebe si hay errores. - 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.
Henrik va por buen camino . El git submodule foreach
comando 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.