Est-il possible d'avoir automatiquement git submodule update
(ou de préférence git submodule update --init
appelé à chaque fois que git pull
est fait?
Vous recherchez un paramètre de configuration git ou un alias git pour vous aider.
À partir de la version 2.14, vous pouvez définir submodule.recurse
à true pour activer le comportement souhaité.
Vous pouvez le faire globalement en lançant:
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 ceci à la place:
git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'
À partir de Git 1.7.5, les sous-modules devraient être mis à jour automatiquement par défaut, comme vous le souhaitez.
[EDIT: selon les commentaires: le nouveau comportement de la version 1.7.5 consiste à automatiquement à extraire les derniers commits des sous-modules, mais non à update eux (dans le git submodule update
sens). Les informations contenues dans cette réponse sont donc pertinentes en tant qu'arrière-plan, mais ne constituent 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 un commit qui met à jour le commit du sous-module, et que ce commit ne se trouve pas déjà dans votre clone local.
Vous pouvez également le mettre à jour à chaque extraction ou jamais (comportement antérieur à la 1.7.5 je suppose).
L’option de configuration permettant de modifier ce comportement est fetch.recurseSubmodules
_ .
Cette option peut être définie sur une valeur booléenne ou sur
on-demand
.
Si vous le réglez sur un booléen, le comportement defetch
etpull
sera récursif sans condition dans les sous-modules lorsqu'il est défini sur true ou sur pas du tout lorsqu'il est défini sur false.Lorsqu'il est réglé sur
on-demand
(la valeur par défaut),fetch
etpull
ne seront renvoyés dans un sous-module rempli que lorsque son superprojet récupère un commit qui met à jour la référence du sous-module .
Voir:
git config
page de manuel (1.7.5) (ou dernière git config
page de manuel )git fetch
page de manuel (1.7.5) (ou dernière page de manuel git fetch )pour plus d'informations.
git fetch --recurse-submodules[=yes|on-demand|no]
Je suis surpris que personne n'ait mentionné utiliser des hameçons pour faire ça!
Ajoutez simplement des fichiers nommés post-checkout
et post-merge
à ton .git/hooks
répertoire des référentiels pertinents et insérez les éléments suivants dans chacun d’eux:
#!/bin/sh
git submodule update --init --recursive
Puisque vous avez spécifiquement demandé un alias, en supposant que vous souhaitiez l’avoir pour plusieurs référentiels, vous pouvez créer un alias qui les ajoute à un fichier .git/hooks
pour toi.
Un alias, comme suggéré par Kevin Ballard, est une solution parfaite. Juste pour lancer une autre option, vous pouvez également utiliser un hook post-fusion qui lance simplement git submodule update [--init]
.
Vous pouvez créer un alias pour la commande git qui gère automatiquement la mise à jour des sous-modules. Ajouter 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
}
Comme d'autres l'ont déjà mentionné, vous pouvez facilement régler ceci avec:
git config --global submodule.recurse true
Cependant, si vous êtes comme moi et que vous avez une configuration plus complexe de .gitconfig
(Mon fichier principal ~/.gitconfig
Utilise include
pour charger d'autres fichiers .gitconfig
), et vous ne pouvez jamais vous rappeler comment convertir le format de ligne de commande git
config en format .gitconfig
, voici comment l'ajouter à l'un de vos fichiers .gitconfig
:
[submodule]
recurse = true