Estamos usando submódulos git para administrar un par de proyectos grandes que dependen de muchas otras bibliotecas que hemos desarrollado. Cada biblioteca es un repositorio separado que se incorpora al proyecto dependiente como un submódulo. Durante el desarrollo, a menudo queremos tomar la última versión de cada submódulo dependiente.
¿Git tiene un comando incorporado para hacer esto? Si no, ¿qué tal un archivo por lotes de Windows o similar que pueda hacerlo?
git
git-submodules
Brad Robinson
fuente
fuente
Respuestas:
Si es la primera vez que revisa un repositorio, debe usarlo
--init
primero:Para git 1.8.2 o superior, la opción
--remote
se agregó para admitir la actualización a los últimos consejos de sucursales remotas:Esto tiene el beneficio adicional de respetar cualquier rama "no predeterminada" especificada 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 trucos sobre qué actualización todavía se aplica):
o:
si desea llevar sus submódulos a los últimos commits en lugar del commit actual al que apunta el repositorio.
Ver git-submodule (1) para más detalles.
fuente
git submodule update --recursive
hoy en día.git submodule foreach "(git checkout master; git pull)&"
origin master
al final de este comando podría tener resultados inesperados si algunos de sus submódulos están rastreando una rama o nombre de ubicación diferente de ese submódulo en particular. Obvio para algunos, pero probablemente no para todos.git submodule update --recursive
busca ver qué revisión ha almacenado el repositorio principal para cada submódulo, luego verifica esa revisión en cada submódulo. No NO tire las últimas confirmaciones para cada submódulo.git submodule foreach git pull origin master
ogit pull origin master --recurse-submodules
es lo que desea si tiene la intención de actualizar cada submódulo al último desde sus repositorios de origen. Solo entonces obtendrá cambios pendientes en el repositorio principal con hashes de revisión actualizados para submódulos. Revisa eso y estarás bien.Hasta que se solucione el error , por primera vez debe ejecutar
fuente
git pull --recurse-submodules
nigit submodule update --recursive
no , no initialize recién submódulos añadió. Para inicializarlos necesitas ejecutargit submodule update --recursive --init
. Cita del manual : si el submódulo aún no se ha inicializado y solo desea utilizar la configuración tal como está almacenada en .gitmodules, puede inicializar automáticamente el submódulo con la opción --init.git submodule update --recursive --remote
que también se actualizan los submódulos a la última revisión remota en lugar del SHA-1 almacenado.En init ejecutando el siguiente comando:
desde el directorio git repo, funciona mejor para mí.
Esto extraerá todos los últimos submódulos incluidos.
Explicado
Después de esto, solo puede ejecutar:
desde el directorio git repo, funciona mejor para mí.
Esto extraerá todos los últimos submódulos incluidos.
fuente
Nota: Esto es de 2009 y puede haber sido bueno entonces, pero ahora hay mejores opciones.
Usamos esto Se llama
git-pup
:Simplemente colóquelo en un directorio bin adecuado (/ usr / local / bin). Si está en Windows, es posible que deba modificar la sintaxis para que funcione :)
Actualizar:
En respuesta al comentario del autor original acerca de extraer 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ía identificar qué es realmente HEAD para un submódulo. Eso podría ser tan simple como decir quemaster
es la rama más actualizada, etc.Después de esto, cree un script simple que haga lo siguiente:
git submodule status
repositorios "modificados". El primer carácter de las líneas de salida indica esto. Si se modifica un repositorio secundario, es posible que NO desee continuar.git checkout master && git pull
. Verificar errores.Me gustaría mencionar que este estilo no es realmente para lo que se diseñaron los submódulos git. Por lo general, desea 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á haciendo con el script descrito, pero de manera más automática. Se requiere cuidado!
Actualización 2:
Si está en una plataforma de Windows, es posible que desee ver el uso de Python para implementar el script, ya que es muy capaz en estas áreas. Si estás en Unix / Linux, entonces sugiero solo un script bash.
¿Necesita alguna aclaración? Solo publica un comentario.
fuente
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
y luego úsalogit pup
sin ningún script.git submodule init
después del primer tirón que tenía submódulos incluidos, para que todo comenzara a funcionar correctamente.Henrik está en el buen camino. El comando 'foreach' puede ejecutar cualquier script de shell arbitrario. Dos opciones para sacar lo último podrían ser,
y,
Eso iterará a través de todos los submódulos inicializados y ejecutará los comandos dados.
fuente
Lo siguiente funcionó para mí en Windows.
fuente
Editar :
En los comentarios se señaló (por philfreo ) que se requiere la última versión. Si hay submódulos anidados que necesitan estar en su última versión:
----- Comentario desactualizado a continuación -----
¿No es esta la forma oficial de hacerlo?
Lo uso todo el tiempo. No hay problemas hasta ahora.
Editar:
Acabo de descubrir que puedes usar:
Lo que también extraerá recursivamente todos los submódulos, es decir, dependencias.
fuente
git submodule update --init --recursive
git submodule foreach --recursive git pull
Como puede suceder que la rama predeterminada de sus submódulos no sea así
master
, así es como automatizo las actualizaciones completas de submódulos de Git:fuente
Primera vez
Submódulo de clonación e inicio
Descanso
Durante el desarrollo, simplemente extraiga y actualice el submódulo
Actualice el submódulo Git a la última confirmación de origen
La forma preferida debe estar debajo
nota: los dos últimos comandos tienen el mismo comportamiento
fuente
git submodule update
hizo el truco. Ahora estoy descargando datos de submódulos que faltan en el primer paso del clon. Gracias. No soy bueno en git: CNo sé desde qué versión de git funciona, pero eso es lo que estás buscando:
También lo uso
git pull
para actualizar el repositorio raíz:fuente
Las respuestas anteriores son buenas, sin embargo, estábamos usando git-hooks para facilitar esto, pero resulta que en git 2.14 , puede establecer
git config submodule.recurse
en verdadero para permitir que los submódulos se actualicen cuando acceda a su repositorio de git.Sin embargo, esto tendrá el efecto secundario de impulsar todos los cambios de submódulos que tenga si están en ramas, pero si ya necesita ese comportamiento, esto podría hacer el trabajo.
Se puede hacer usando:
fuente
git submodule init
antemano si tu submódulo aún no está inicializado.Git para Windows 2.6.3 :
git submodule update --rebase --remote
fuente
Desde el nivel superior en el repositorio:
Esto cambiará todas las ramas para desarrollar y extraer lo último
fuente
git submodule foreach git pull origin master
Tuve que agregar la rama que quería buscar. Aparte de eso, funcionó perfectamente.Hice esto adaptando la respuesta de gahooa anterior :
Integrarlo con un git
[alias]
...Si su proyecto principal tiene algo como esto en
.gitmodules
:Agregue algo como esto dentro de su .gitconfig
Luego, para actualizar sus submódulos, ejecute:
Tengo un ejemplo en el repositorio de configuración de mi entorno .
fuente
Todo lo que necesitas hacer ahora es un simple
git checkout
Solo asegúrese de habilitarlo a través de esta configuración global:
git config --global submodule.recurse true
fuente
Aquí está la línea de comandos para extraer de todos sus repositorios git, ya sean submódulos o no:
Si lo ejecuta en su repositorio git superior, puede reemplazarlo
"$ROOT"
en.
.fuente
Creo que tendrás que escribir un guión para hacer esto. Para ser honesto, podría instalar Python para hacerlo de manera que se puede utilizar
os.walk
paracd
que cada directorio y emitir los comandos apropiados. El uso de python o algún otro lenguaje de script, que no sea por lotes, le permitiría agregar / eliminar fácilmente subproyectos sin tener que modificar el script.fuente
Observación: no es una manera muy fácil, pero viable y tiene sus propios pros únicos.
Si se desea clonar solo la
HEAD
revisión de un repositorio y soloHEAD
s de todos sus submódulos (es decir, para retirar "troncal"), se puede usar el siguiente script de Lua . A veces, un comando simplegit submodule update --init --recursive --remote --no-fetch --depth=1
puede provocar ungit
error irrecuperable . En este caso, uno necesita limpiar el subdirectorio del.git/modules
directorio y clonar el submódulo manualmente usando elgit clone --separate-git-dir
comando. La única complejidad es encontrar la URL , la ruta del.git
directorio del submódulo y la ruta del submódulo en el árbol de superproyectos.Observación: el script solo se prueba con el
https://github.com/boostorg/boost.git
repositorio. Sus peculiaridades: todos los submódulos alojados en el mismo host y.gitmodules
contienen solo URL relativas .fuente