Y a-t-il un moyen de faire automatiquement mettre à jour les sous-modules avec git pull?

Existe-t-il un moyen d’avoir automatiquement la git submodule update (ou de préférence la git submodule update --init appelée à chaque fois que git pull est terminé?

Vous recherchez un paramètre de configuration git ou un alias git pour vous aider.

A partir de git 2.14, vous pouvez définir submodule.recurse sur true pour activer le comportement souhaité.

Vous pouvez le faire globalement en exécutant:

 git config --global submodule.recurse true 

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

Si vous voulez que les arguments soient passés à git pull, utilisez plutôt ceci:

 git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f' 

À partir de Git 1.7.5, il devrait automatiquement mettre à jour les sous-modules par défaut, comme vous le souhaitez.

[EDIT: par commentaires: le nouveau comportement 1.7.5 consiste à récupérer automatiquement les derniers commits pour les sous-modules, mais pas à les mettre à jour (au sens de la git submodule update ). L’information contenue dans cette réponse est donc pertinente en tant que contexte, mais ne constitue pas une réponse complète en soi. Vous avez toujours besoin d’un alias pour extraire et mettre à jour les sous-modules en une seule commande.]

Le comportement par défaut, “à la demande”, consiste à mettre à jour les sous-modules chaque fois que vous récupérez une validation qui met à jour la validation du sous-module, et que cette validation ne se trouve pas déjà dans votre clone local.
Vous pouvez également le faire mettre à jour à chaque extraction ou jamais (comportement antérieur à 1.7.5, je suppose).
L’option de configuration pour modifier ce comportement est fetch.recurseSubmodules .

Cette option peut être définie sur une valeur booléenne ou on-demand .
Le définir sur un booléen modifie le comportement de l’ fetch et de l’ pull pour qu’il se répète inconditionnellement dans les sous-modules lorsqu’il est défini sur vrai ou qu’il ne se déclenche pas du tout lorsqu’il est défini sur faux.

Lorsqu’il est défini on-demand (la valeur par défaut), fetch et pull ne se déclenchent que dans un sous-module rempli lorsque son superprojet récupère un commit qui met à jour la référence du sous-module .

Voir:

  • Page de manuel de git config (1.7.5) (ou la dernière page de manuel de git config )
  • git fetch man page (1.7.5) (ou la dernière page de manuel de git fetch )

pour plus d’informations.

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

Je suis surpris que personne n’ait mentionné l’utilisation de crochets git pour faire cela!

Ajoutez simplement des fichiers nommés post-checkout et post-merge dans votre .git/hooks des référentiels concernés, et insérez les éléments suivants dans chacun d’eux:

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

Étant donné que vous avez demandé un alias de manière spécifique, en supposant que vous souhaitiez l’avoir pour de nombreux référentiels, vous pouvez créer un alias qui les ajoute à un .git/hooks de référentiel pour vous.

Un alias, tel que suggéré par Kevin Ballard, est une solution parfaite. Juste pour lancer une autre option, vous pouvez également utiliser un hook post-fusion qui exécute simplement la git submodule update [--init] .

Vous pouvez créer un alias pour la commande git qui gère automatiquement la mise à jour des sous-modules. Ajoutez ce qui suit à votre .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 }