Existe-t-il un moyen d'avoir automatiquement git submodule update
(ou de préférence git submodule update --init
appelé chaque fois que git pull
c'est fait?
Vous recherchez un paramètre de configuration git ou un alias git pour vous aider.
Existe-t-il un moyen d'avoir automatiquement git submodule update
(ou de préférence git submodule update --init
appelé chaque fois que git pull
c'est fait?
Vous recherchez un paramètre de configuration git ou un alias git pour vous aider.
Réponses:
Depuis Git 2.14 , vous pouvez l'utiliser git pull --recurse-submodules
(et l'aliaser comme bon vous semble).
Depuis Git 2.15 , vous pouvez définir submodule.recurse
true pour activer le comportement souhaité.
Vous pouvez le faire globalement en exécutant:
git config --global submodule.recurse true
git pull
également la récupération d'un sous-module et son exécution submodule update
. Cela doit vraiment être la réponse acceptée maintenant
git config --global submodule.recurse true
git clone
. Et activez-le par défaut. Sinon, il y aura toujours une énorme résistance à l'utilisation des sous-modules, car les modules des gens seront toujours désynchronisés :-(
commit
, fetch
, pull
, etc.) sont conçus pour être appliqués que dans le référentiel courant. un sous-module est un autre référentiel et ne devrait pas être affecté par les commandes exécutées dans le référentiel parent par défaut. c'est une sorte de décision de conception par le développeur git.
git config --global alias.pullall '!git pull && git submodule update --init --recursive'
Si vous voulez que des 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 mettre à jour les sous-modules automatiquement par défaut comme vous le souhaitez.
[EDIT: par commentaires: le nouveau comportement 1.7.5 consiste à récupérer automatiquement les derniers commits des sous-modules, mais pas à les mettre à jour (dans le git submodule update
sens). Les informations contenues dans cette réponse sont donc pertinentes en tant que contexte, mais ne sont pas une réponse complète en soi. Vous avez toujours besoin d'un alias pour extraire et mettre à jour des 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 cette validation 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 pour modifier ce comportement est fetch.recurseSubmodules
.
Cette option peut être définie sur une valeur booléenne ou sur
on-demand
.
Le paramétrer sur un booléen change le comportement defetch
etpull
de reconditionner inconditionnellement en sous-modules lorsqu'il est défini sur true ou de ne pas récurser du tout lorsqu'il est défini sur false.Lorsqu'il est défini sur
on-demand
(la valeur par défaut),fetch
etpull
ne récursive 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 de git fetch )pour plus d'informations.
git fetch --recurse-submodules[=yes|on-demand|no]
git fetch
, pas un git submodule update
.
git pull
, plutôt que git fetch
, cette option rend uniquement la récupération récursive. Cela ne changera pas du tout quel commit est extrait dans les sous-modules. Il git submodule update
est donc toujours nécessaire, comme l'a noté @Artem.
Je suis surpris que personne n'ait mentionné utiliser de git hooks pour ce faire!
Ajoutez simplement les fichiers nommés post-checkout
et post-merge
à votre .git/hooks
répertoire des référentiels pertinents, et mettez 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 de nombreux référentiels, vous pouvez créer un alias qui les ajoute à un référentiel .git/hooks
pour vous.
core.hooksPath
pour un répertoire hooks , consultez la documentation git-config
pour plus de détails.
git pull --rebase
:(
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
}
Comme d'autres l'ont mentionné, vous pouvez facilement régler cela avec:
git config --global submodule.recurse true
Cependant, si vous êtes comme moi et avez une .gitconfig
configuration plus complexe (mon ~/.gitconfig
fichier principal utilise include
pour charger dans d'autres .gitconfig
fichiers), et vous ne vous souvenez jamais comment convertir entre le git
format de configuration de ligne de commande et le .gitconfig
format, voici comment l'ajouter à l'un de vos .gitconfig
fichiers:
[submodule]
recurse = true
La seule façon dont j'ai pu mettre à jour les sous-modules et les sous-modules imbriqués:
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;
J'avais du mal à créer l'alias via le terminal en raison des crochets, j'ai donc dû l'ajouter manuellement à .gitconfig pour 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;"
Des suggestions sur la façon d'exécuter les commandes ou l'alias automatiquement?