¿Hay alguna manera de tener automáticamente git submodule update(o preferiblemente git submodule update --initllamado cada vez que git pullse 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 --initllamado cada vez que git pullse 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.recurseen verdadero para habilitar el comportamiento deseado.
Puede hacer esto globalmente ejecutando:
git config --global submodule.recurse true
git pullque 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 clonetambié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 updatesentido). 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 defetchypullrecurrir 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),fetchypullsolo se repetirá en un submódulo poblado cuando su superproyecto recupere una confirmación que actualice la referencia del submódulo .
Ver:
git configpágina de manual (1.7.5) (o la última git configpágina de manual )git fetchpá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 updatesigue 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-checkouty post-mergea su .git/hooksdirectorio 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/hookspara usted.
core.hooksPathde un directorio de ganchos , consulte los documentos para git-configobtener 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 .gitconfigconfiguración más compleja (mi ~/.gitconfigarchivo principal se usa includepara cargar en otros .gitconfigarchivos), y nunca puedes recordar cómo convertir entre el gitformato de configuración de la línea de comandos y el .gitconfigformato, así es como agregarlo a cualquiera de sus .gitconfigarchivos:
[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?