¿Hay alguna manera de tener automáticamente git submodule update
(o preferiblemente git submodule update --init
llamado cada vez que git pull
se hace?
Buscando una configuración de git, o un alias de git para ayudar con esto.
¿Hay alguna manera de tener automáticamente git submodule update
(o preferiblemente git submodule update --init
llamado cada vez que git pull
se hace?
Buscando una configuración de git, o un alias de git para ayudar con esto.
Respuestas:
A partir de Git 2.14 , puede usarlo git pull --recurse-submodules
(y asignarle el alias que desee).
A partir de Git 2.15 , puede establecer submodule.recurse
en verdadero para habilitar el comportamiento deseado.
Puede hacer esto globalmente ejecutando:
git config --global submodule.recurse true
git pull
que también obtenga un submódulo y se ejecute submodule update
. Esto realmente necesita ser la respuesta aceptada ahora
git config --global submodule.recurse true
git clone
también. Y actívelo por defecto. De lo contrario, siempre habrá una gran resistencia al uso de submódulos, ya que los módulos de las personas siempre se desincronizan :-(
commit
, fetch
, pull
, etc.) están diseñados para ser aplicado solamente al repositorio actual. un submódulo es otro repositorio y no debería verse afectado por comandos ejecutados en el repositorio principal de forma predeterminada. Este es un tipo de decisión de diseño del desarrollador de git.
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
Si desea que los argumentos se pasen a git pull, use esto en su lugar:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
Comenzando con 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 las últimas confirmaciones de submódulos, pero no a actualizar ellos (en el git submodule update
sentido). Por lo tanto, la información en esta respuesta es relevante como fondo, pero no es una respuesta completa en sí misma. Todavía necesita un alias para extraer y actualizar submódulos en un comando.]
El comportamiento predeterminado, "a pedido", es actualizar los submódulos cada vez que obtiene una confirmación que actualiza la confirmación del submódulo, y esta confirmación aún no se encuentra en su clon local.
También puede actualizarlo en cada búsqueda o nunca (supongo que antes del comportamiento 1.7.5).
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
.
Establecerlo en un valor booleano cambia el comportamiento defetch
ypull
recurrir incondicionalmente a submódulos cuando se establece en verdadero o no recurrir en absoluto cuando se establece en falso.Cuando se establece en
on-demand
(el valor predeterminado),fetch
ypull
solo se repetirá en un submódulo poblado cuando su superproyecto recupere una confirmación que actualice la referencia del submódulo .
Ver:
git config
página de manual (1.7.5) (o la última git config
página de manual )git fetch
página de manual (1.7.5) (o la última página de manual de git fetch )para más información.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, no a git submodule update
.
git pull
, en lugar de git fetch
, esta opción solo hace que la búsqueda sea recursiva. No cambiará el commit que está desprotegido en los submódulos. Así que git submodule update
sigue siendo necesario, según lo observado por @Artem.
¡Me sorprende que nadie haya mencionado usar git hooks para hacer esto!
Simplemente agregue los archivos con nombre post-checkout
y post-merge
a su .git/hooks
directorio de los repositorios relevantes, y ponga lo siguiente en cada uno de ellos:
#!/bin/sh
git submodule update --init --recursive
Como solicitó específicamente un alias, suponiendo que desea tenerlo para muchos repositorios, puede crear un alias que los agregue a un repositorio .git/hooks
para usted.
core.hooksPath
de un directorio de ganchos , consulte los documentos para git-config
obtener más detalles.
git pull --rebase
:(
Puede crear un alias para el comando git que maneja automáticamente la actualización de submódulos. 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 [[ $@ == clone* ]]; then
gitargs=$(echo "$@" | cut -c6-)
command git clone --recursive $gitargs
elif [[ $@ == pull* ]]; then
command git "$@" && git submodule update --init --recursive
elif [[ $@ == checkout* ]]; then
command git "$@" && git submodule update --init --recursive
else
command git "$@"
fi
}
Como otros han mencionado, puede configurarlo fácilmente con:
git config --global submodule.recurse true
Sin embargo, si eres como yo y tienes una .gitconfig
configuración más compleja (mi ~/.gitconfig
archivo principal se usa include
para cargar en otros .gitconfig
archivos), y nunca puedes recordar cómo convertir entre el git
formato de configuración de la línea de comandos y el .gitconfig
formato, así es como agregarlo a cualquiera de sus .gitconfig
archivos:
[submodule]
recurse = true
La única forma en que pude actualizar los submódulos y submódulos anidados:
git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;
Estaba luchando para crear el alias a través de la terminal debido a los corchetes, así que tuve que agregar esto manualmente a .gitconfig para global:
[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"
¿Alguna sugerencia sobre cómo ejecutar los comandos o el alias automáticamente?