¿Cuál es la diferencia entre "git submodule foreach git pull origin master" y "git pull origin master –recurse-submodules"

Tengo un repository de dotfiles donde todos mis complementos de vim se almacenan como submodules, por lo que son fáciles de actualizar cuando tienen cambios. Pensé que estos dos commands hicieron lo mismo, pero me di count de que no debía ser así.

Sabía que tenía actualizaciones para desplegar en varios submodules, así que ejecuté git pull origin master --recurse-submodules desde la raíz del repository padre. Parecía iterar sobre cada submodule, pero solo obtenía actualizaciones de sus repositorys de origen.

Cuando ejecuté git submodule foreach git pull origin master , realmente ejecuté git pull origin master dentro de cada repository, haciendo tanto la búsqueda como la fusión.

¿Cuál es el punto de usar --recurse-submodules ? Estoy un poco confundido acerca de lo que realmente está tratando de hacer y Google fue un poco críptico con lo que encontré. Pensé que tal vez la gente inteligente tendría una explicación más simple.

Esa opción es principalmente para get todas las confirmaciones de submodule, no solo para extraer una twig específica como maestra, por los motivos detallados en las dos siguientes confirmaciones:
(tenga en count que hay un error corregido en Git 2.11, ver al final de esta respuesta)

Para git pull , esta opción se ha introducido en ( commit 7dce19d, Nov. 2010, git 1.7.4-rc0) :

fetch / pull : agregue la opción --recurse-submodules

Hasta ahora, había que llamar a " git submodule update " (sin la -N|--no-fetch ) o algo así como " git submodule foreach git fetch " para get nuevas confirmaciones en submodules poblados desde su control remoto.

Esto podría llevar a posts " (commits not present) " en la salida de " git diff --submodule " (que es usado por " git gui " y " gitk ") después de traer o tirar nuevos commits en el superproyecto y es un obstáculo para implementar el pago recursivo de submodules.
Además, la " git submodule update " no puede get cambios cuando está desconectada, por lo que fue muy fácil olvidarse de search los cambios del submodule antes de desconectarse solo para descubrir más tarde que son necesarios.

Este parche agrega la --recurse-submodules " --recurse-submodules " para search de forma recursiva cada submodule poblado de la url configurada en .git/config del submodule al final de cada " git fetch " o durante " git pull " en el superproyecto. Las routes de los submodules se toman del índice.


Commit 88a2197 (marzo de 2011, git 1.7.5-rc1) explica un poco más:

fetch / pull : recurse en los submodules cuando sea necesario

Para poder acceder a todas las confirmaciones de submodules poblados a los que hace reference el superproyecto, basta con dejar que " git fetch " se repita en un submodule cuando los nuevos commits captados en el superproyecto registran nuevos commits para él.

  • Tener estos commits presentes es extremadamente útil cuando se usa la opción " --submodule " para " git diff " (que es lo que hacen " git gui " y " gitk " desde 1.6.6), ya que todos los submodules se comprometen para crear una salida descriptiva puede ser accedido.
  • Además, la fusión de confirmaciones de submodule (agregadas en 1.7.3) depende de que las confirmaciones de submodule en cuestión estén presentes para funcionar .
  • Por último, esto habilita la operación desconectada cuando se usan submodules , ya que todos los commits necesarios para una " git submodule update -N " exitosa git submodule update -N "se han obtenido automáticamente.

Así que elegimos este modo como pnetworkingeterminado para search y tirar.


 git pull origin master --recurse-submodules git submodule foreach git pull origin master 

El primero debe tirar, no solo search, y ser equivalente al segundo. Tal vez este es un problema de order de parameters:

 git pull --recurse-submodules origin master 

Sin embargo, no es la forma recomendada de actualizar el submodule para una twig determinada: consulte la siguiente sección.


Tenga en count que la forma correcta de extraer realmente del maestro sería registrar la twig maestra en el submodule , lo que hace que el maestro de seguimiento del submodule:

 git config -f .gitmodules submodule.<path>.branch <branch> 

Entonces git submodule update --remote --recursive una simple git submodule update --remote --recursive .
Y la bifurcación a search / tirar se registra en el repository padre (en el file .gitmodules ), por lo que ni siquiera tiene que recordar en qué twig desea que se actualice su submodule.


Actualizar Git 2.11 (Q4 2011)

Tener un submodule cuyo repository " .git " esté corrupto de alguna manera causó algunos commands que se repiten en los submodules en bucle para siempre.

Ver commit 10f5c52 (01 Sep 2016) por Junio ​​C Hamano ( gitster ) .
(Fusionada por Junio ​​C Hamano – gitster – in commit 293c232 , 12 de septiembre de 2016)

¿Cuál es el punto de usar --recurse-submodules ?

--recurse-submodules hará submodules dentro de un submodule (en realidad es recursivo ). git submodule foreach git pull origin master no lo hará, solo hará los submodules inmediatos.