2011-01-06 19 views
108

¿Hay una manera de tener automáticamente git submodule update (o preferiblemente git submodule update --init llamado cuando git pull se hace?¿Hay alguna manera de hacer que git pull actualice automáticamente los submódulos?

Buscando un entorno git config, o un alias de git para ayudar con esto.

+3

Relacionados: http://stackoverflow.com/questions/1899792/why-is-git-submodule-update-not-automatic – philfreo

+0

¿Por qué un alias git es preferible a un alias de shell? – wnoise

+14

Los alias de git son agradables porque encapsula el comando en el espacio de nombre "git". También puede preguntar por qué todos los comandos de git comienzan con "git" en lugar de tener sus propios nombres. –

Respuesta

99

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

Si desea argumentos que se pasarán a git pull, a continuación, utilizar esto en su lugar:

git config --global alias.pullall '!f(){ git pull "[email protected]" && git submodule update --init --recursive; }; f' 
+3

recuerde usar "git config - global" si quiere este alias en todos los repositorios git que usa – yoyo

8

un alias, como se sugiere por Kevin Ballard, es una solución perfectamente buena. Solo para lanzar otra opción, también puedes usar un gancho post-merge que simplemente ejecuta git submodule update [--init].

39

A partir de Git 1.7.5 debería actualizar los submódulos automáticamente de forma predeterminada como lo desea.

[EDIT: por comentarios: el nuevo comportamiento 1.7.5 es automáticamente ir a buscar la última se compromete a submódulos, pero no a actualización ellos (en el sentido git submodule update). Entonces la información en esta respuesta es relevante como fondo, pero no es una respuesta completa en sí misma. Aún necesita un alias para extraer y actualizar submódulos en un comando.]

El comportamiento predeterminado, "bajo demanda", es actualizar los submódulos siempre que obtenga un compromiso que actualice la confirmación del submódulo, y este compromiso no es ya localizado en tu clon local.
También puede tenerlo actualizado en cada búsqueda o nunca (pre-1.7.5 comportamiento supongo).
La opción de configuración para cambiar este comportamiento es fetch.recurseSubmodules.

Esta opción se puede establecer en un valor booleano o en on-demand.
Al establecerlo en un valor booleano se cambia el comportamiento de fetch y pull para que se repita incondicionalmente en los submódulos cuando se establece en verdadero o no se repite en absoluto cuando se establece en falso.

Cuando se establece en on-demand (el valor predeterminado), fetch y pullsólo recursiva en un submódulo poblada cuando su SuperProject recupera de una confirmación que actualiza la referencia del submódulo.

Ver:

para más información.

git fetch --recurse-submodules[=yes|on-demand|no] 
+27

Tenga cuidado: como explican las respuestas a continuación, esto solo capta los cambios automáticamente, aún tiene que hacer una actualización de submódulo - por lo que la respuesta alias es correcta. – Artem

+4

@Artem es correcto. Esta respuesta, aunque útil, no aborda toda la pregunta. Esta configuración simplemente realiza una 'git fetch', no una' git submodule update'. –

+2

Esta respuesta es altamente engañosa. Incluso cuando se usa con 'git pull', en lugar de' git fetch', esta opción solo hace que * fetching * sea recursiva. No cambiará en absoluto lo que se comprueba en los submódulos. Por lo tanto, 'git submodule update' sigue siendo necesaria, como lo señala @Artem. –

3

Puede crear un alias para el comando git que maneja automáticamente la actualización del submódulo. Agregue lo siguiente a su.bashrc

# make git submodules usable 
# This overwrites the 'git' command with modifications where necessary, and 
# calls the original otherwise 
git() { 
    if [[ [email protected] == clone* ]]; then 
     gitargs=$(echo "[email protected]" | cut -c6-) 
     command git clone --recursive $gitargs 
    elif [[ [email protected] == pull* ]]; then 
     command git "[email protected]" && git submodule update --init --recursive 
    elif [[ [email protected] == checkout* ]]; then 
     command git "[email protected]" && git submodule update --init --recursive 
    else 
     command git "[email protected]" 
    fi 
} 
+1

En lugar de un alias para git, puede agregar alias a git a través del comando alias o creando comandos en su ruta que comiencen con git- (git-bettermodule) – idbrii

21

¡Me sorprende que nadie haya mencionado el uso de los ganchos git para hacer esto!

Sólo añadir archivos denominados post-checkout y post-merge a su .git/hooks directorio de los repositorios pertinentes, y poner lo siguiente en cada uno de ellos:

#!/bin/sh 
git submodule update --init --recursive 

Ya que specfically pedirá un alias, suponiendo que desea tener esta para muchos repositorios, puede crear un alias que los agregue al repositorio .git/hooks por usted.

+0

¿Hay alguna manera de hacer de esto una configuración global? ¿O uno que obtienes automáticamente cuando revisas el repositorio? –

+0

La última versión de git, 2.9, ha [agregado una configuración llamada 'core.hooksPath' para un directorio de ganchos] (https://github.com/blog/2188-git-2-9-has-been-released# git-tidbits-gitbits-tidgits), vea los documentos para 'git-config' para más detalles. – taleinat

+0

En cuanto a algo que se recibe automáticamente al momento de pagar, busqué pero no pude encontrar nada por el estilo. Una fuente mencionó que esto no se admite a propósito por cuestiones de seguridad, ya que podría usarse fácilmente para ejecutar código arbitrario en máquinas cliente. – taleinat

Cuestiones relacionadas