web-dev-qa-db-fra.com

Est-il possible de faire en sorte que git pull mette à jour automatiquement les sous-modules?

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.

164
philfreo

À 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
114
Kane

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'
111
Lily Ballard

À 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 de fetch et pull 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 et pull 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:

pour plus d'informations.

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

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.

29
taleinat

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].

8
Cascabel

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
}
5
Branden Ghena

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
5
JacobEvelyn