Pregunta Una forma sencilla de extraer los últimos submódulos de git


Estamos usando submódulos de git para administrar un par de proyectos grandes que tienen dependencias en muchas otras bibliotecas que hemos desarrollado. Cada biblioteca es un repositorio separado que se incluye en el proyecto dependiente como un submódulo. Durante el desarrollo, a menudo queremos ir a buscar 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?


1372
2018-06-23 01:05


origen


Respuestas:


por git 1.8.2 o por encima de la opción --remote se agregó para permitir la actualización a las últimas sugerencias de sucursales remotas:

git submodule update --recursive --remote

Esto tiene el beneficio adicional de respetar cualquier rama "no predeterminada" especificada en el .gitmodules o .git/config archivos (si tiene alguno, el predeterminado es origen / maestro, en cuyo caso algunas de las otras respuestas aquí también funcionarían).

por git 1.7.3 o superior que puede usar (pero los errores a continuación sobre qué actualización todavía se aplica):

git submodule update --recursive

o:

git pull --recurse-submodules

si quieres llevar tus submódulos a los últimos commits de lo que apunta el repositorio.

Nota: si eso es la primera vez pagas un repositorio que necesitas usar --init primero:

git submodule update --init --recursive

por más viejo, git 1.6.1 o superior puede usar algo similar a (modificado para adaptarse):

git submodule foreach git pull origin master

Ver git-submódulo (1) para detalles


1748
2018-06-23 13:42



Si necesita extraer material para submódulos en el repositorio de su submódulo use

git pull --recurse-submodules

una característica que git aprendió por primera vez en 1.7.3.

Pero esto no revisará las confirmaciones correctas (a las que apunta su repositorio principal) en los submódulos

Para verificar compromisos correctos en sus submódulos, debe actualizarlos después de tirar usando

git submodule update --recursive --remote

567
2017-11-10 18:07



Nota: Esto es de 2009 y puede haber sido bueno, 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á en Windows, es posible que deba modificar la sintaxis para que funcione :)

Actualizar:

En respuesta al comentario del autor original sobre tirar todos los HEADs 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 master es la rama más actualizada, etc.

A continuación, cree un script simple que haga lo siguiente:

  1. comprobar git submodule status para repositorios "modificados". El primer carácter de las líneas de salida indica esto. Si se modifica un sub-repo, es posible que NO desee continuar.
  2. para cada repositorio listado, cd en su directorio y ejecute git checkout master && git pull. Verificar si hay errores
  3. Al final, le sugiero que imprima una pantalla para que el usuario indique el estado actual de los submódulos. ¿Quizás les pida que agreguen todos y que confirmen?

Me gustaría mencionar que este estilo no es para lo que se diseñaron los submódulos git. Normalmente, quiere decir que "LibraryX" está en la versión "2.32" y seguirá 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. ¡Se requiere cuidado!

Actualización 2:

Si se encuentra en una plataforma de Windows, es recomendable que use 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 publique un comentario.


295
2018-06-23 01:50



En init ejecutando el siguiente comando:

git submodule update --init --recursive

desde dentro del directorio de git repo, funciona mejor para mí.

Esto extraerá todos los últimos submódulos incluidos.

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 dentro del directorio de git repo, funciona mejor para mí.

Esto extraerá todos los últimos submódulos incluidos.

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.
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

289
2017-12-11 19:38



Henrik está en el camino correcto. El comando 'foreach' puede ejecutar cualquier script de shell arbitrario. Dos opciones para extraer lo último podrían ser,

git submodule foreach git pull origin master

y,

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

Eso se repetirá a través de todos inicializado submódulos y ejecutar los comandos dados.


151
2018-06-23 14:21



Lo siguiente funcionó para mí en Windows.

git submodule init
git submodule update

138
2017-07-22 13:12



Editar:

En los comentarios fue señalado (por philfreo ) que se requiere la última versión. Si hay algún submódulo anidado que deba estar en su última versión:

git submodule foreach --recursive git pull

----- comentario desactualizado a continuación -----

¿No es esta la manera oficial de hacerlo?

git submodule update --init

Lo uso todo el tiempo. Sin problemas hasta ahora.

Editar:

Acabo de descubrir que puedes usar:

git submodule foreach --recursive git submodule update --init 

Que también extraerá recursivamente todos los submódulos, es decir, dependencias.


33
2018-04-05 16:23



Como puede suceder, la rama predeterminada de sus submódulos es no  master, así es como automatizo las actualizaciones completas de submódulos de Git:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

30
2017-12-04 08:58



Primera vez

Submódulo Clon e Init

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

Descanso

Durante el desarrollo, solo extraiga y actualice el submódulo

git pull --recurse-submodules  && git submodule update --recursive

Actualizar el submódulo de Git a la última confirmación de origen

git submodule foreach git pull origin master

La forma preferida debe estar debajo

git submodule update --remote --merge

nota: los dos últimos comandos tienen el mismo comportamiento


24
2017-09-17 07:18