Donc, la mise à jour de tous mes sous-modules se fait en exécutant
git submodule foreach 'git pull Origin master'
Comment mettre à jour un sous-module spécifique, situé dans say bundle/syntastic
, sans mettre à jour d'autres sous-modules?
Je me retrouve là-bas en cherchant comment mettre à jour un sous-module spécifique uniquement, ce qui signifie pour moi, mettre à jour un sous-module vers la référence indiquée par son super-repo. Ce qui n'est pas la question ni la réponse mais seulement le titre.
Donc, dans l'espoir d'aider d'autres comme moi, la réponse au titre de la question est:
git submodule update <specific path to submodule>
ce qui mettra ce sous-module dans l'état de l'arbitre engagé dans le super repo.
En fait, la syntaxe appropriée est:
$ git clone <remote.git>
$ cd <remote>
$ git submodule update --init -- <specific relative path to submodule>
Si vous venez de cloner un dépôt avec des sous-modules, vous pouvez cloner un sous-module spécifique avec:
git submodule update --init submoduleName
Cela clonera le maître de ce sous-module, à partir de leur, vous pouvez cd dans le sous-module et tirer toutes les branches dont vous avez besoin.
Depuis la documentation du sous-module git
--remote Cette option n'est valide que pour la commande update. Au lieu d'utiliser le SHA-1 enregistré du superprojet pour mettre à jour le sous-module, utilisez l'état de la branche de suivi à distance du sous-module. La télécommande utilisée est la télécommande de la branche (branch..remote), par défaut sur Origin.
Pour mettre à jour un sous-module spécifique, vous pouvez utiliser:
git submodule update --remote <path to the submodule>
Dans votre cas, ce devrait être:
git submodule update --remote bundle/syntastic
Comment mettre à jour un sous-module spécifique, situé dans disons
bundle/syntastic
, Sans mettre à jour d'autres sous-modules?
Avec Git 2.13 (et l'aide de submodule.<name>.update
Config setting ):
git clone --recurse-submodules="bundle/syntastic"
git config submodule.syntastic.update "git pull Origin master"
La deuxième ligne (à exécuter une seule fois) est nécessaire car la commande clone --recurse-submodules[=<pathspec]
équivaut à exécuter git submodule update --init --recursive <pathspec>
Immédiatement après la fin du clone.
Et cela ne ferait que retirer le sous-module sur son gitlink enregistré SHA1, pas au plus tard à distance Origin/master
SHA1.
En ajoutant le paramètre de configuration submodule.<name>.update
, vous vous assurez que le clone sélectif du sous-module sera suivi d'une mise à jour, uniquement pour ce sous-module.
Dans le cadre de la fonction "sous-module actif" de Git 2.13 (Q2 2017) (voir " Ignorer les nouveaux commits pour git submodule
"), vous avez ceci commit bb62e0a de Brandon Williams (bmwill
) :
clone
: apprendre à--recurse-submodules
à prendre éventuellement une pathspecApprenez au clone
--recurse-submodules
À prendre éventuellement un argument pathspec qui décrit quels sous-modules doivent être initialisés et clonés de manière récursive.
Si aucune spécification de chemin n'est fournie,--recurse-submodules
Initialisera et clonera récursivement tous les sous-modules en utilisant une spécification de chemin par défaut de ".
".
Afin de construire des pathspec plus complexes,--recurse-submodules
Peut être donné plusieurs fois.Cela configure également l'option de configuration '
submodule.active
' Pour être la spécification de chemin donnée, de sorte que toute future invocation degit submodule update
Suivra la spécification de chemin.De plus, le commutateur '
--recurse
' Est supprimé de la documentation et marqué caché dans le tableau d'options, pour rationaliser les options des sous-modules. Un simple '--recurse
' Ne transmet pas ce qui est récursif, par ex. cela pourrait signifier des répertoires ou des arbres (c.f.ls-tree
).
Dans de nombreuses autres commandes, nous avons déjà "--recurse-submodules
" Pour signifier la récurrence dans les sous-modules, alors annoncez cette orthographe ici comme étant la véritable option.
Ainsi, la page de manuel git clone --recursive
indique maintenant:
--recurse-submodules[=<pathspec]:
Une fois le clone créé, initialisez et clonez les sous-modules en fonction de la pathspec fournie .
Si aucune spécification de chemin n'est fournie, tous les sous-modules sont initialisés et clonés.
Les sous-modules sont initialisés et clonés en utilisant leurs paramètres par défaut.
Le clone résultant asubmodule.active
Défini sur le pathspec fourni, ou ".
" (Signifiant tous les sous-modules) si aucun pathspec n'est fourni.
Cela équivaut à exécutergit submodule update --init --recursive
Immédiatement après la fin du clone. Cette option est ignorée si le référentiel cloné n'a pas d'arbre de travail/d'extraction (c.-à-d. Si l'un des--no-checkout
/-n
,--bare
, Ou--mirror
Est donné )
Exemple du test t/t7400-submodule-basic.sh
:
git clone --recurse-submodules="." \
--recurse-submodules=":(exclude)sub0" \
--recurse-submodules=":(exclude)sub2" \
multisuper multisuper_clone
Cela clonerait et mettrait à jour tous les sous-modules, sauf sub0
Et sub2
.
Bonus, avec Git 2.22 (Q2 2019) "git clone --recurs
" Fonctionne mieux.
Voir commit 5c38742 (29 avril 2019) par Nguyễn Thái Ngọc Duy (pclouds
) .
(Fusionné par Junio C Hamano - gitster
- in commit 2cfab6 , 19 mai 2019)
parse-options
: N'émettez pas "d'option ambiguë" pour les aliasModifiez la machine d'analyse des options de sorte que, par exemple "
clone --recurs ...
" Ne génère pas d'erreur car "clone
" comprend à la fois "--recursive
" Et "--recurse-submodules
" Pour signifier la même chose.Initialement, "clone" comprenait simplement - récursif jusqu'à ce que l'alias
--recurses-submodules
Soit ajouté dans ccdd3da ("clone
: Ajoutez l'option--recurse-submodules
Comme alias pour--recursive
" , 04/11/2010, Git v1.7.4-rc0).
Depuis bb62e0a ("clone
: apprendre à--recurse-submodules
À prendre éventuellement une pathspec", 2017-03-17, Git v2.13.0-rc0) le formulaire plus long a été promu par défaut.Mais en raison de la façon dont les machines d'analyse des options fonctionnent, cela a abouti à la situation plutôt absurde de:
$ git clone --recurs [...] error: ambiguous option: recurs (could be --recursive or --recurse-submodules)
Ajoutez
OPT_ALIAS()
pour exprimer ce lien entre deux ou plusieurs options et utilisez-le dans git-clone.