Existe-t-il un moyen d'avoir automatiquement git submodule update(ou de préférence git submodule update --initappelé chaque fois que git pullc'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 --initappelé chaque fois que git pullc'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.recursetrue 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 updatesens). 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 defetchetpullde 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),fetchetpullne 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 configpage de manuel (1.7.5) (ou dernière git configpage de manuel )git fetchpage 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 updateest 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-checkoutet post-mergeà votre .git/hooksré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/hookspour vous.
core.hooksPathpour un répertoire hooks , consultez la documentation git-configpour 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 .gitconfigconfiguration plus complexe (mon ~/.gitconfigfichier principal utilise includepour charger dans d'autres .gitconfigfichiers), et vous ne vous souvenez jamais comment convertir entre le gitformat de configuration de ligne de commande et le .gitconfigformat, voici comment l'ajouter à l'un de vos .gitconfigfichiers:
[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?