web-dev-qa-db-fra.com

Comment mettre à jour uniquement des sous-modules git spécifiques?

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?

48
Calvin Cheng

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.

34
antoine

En fait, la syntaxe appropriée est:

$ git clone <remote.git>
$ cd <remote>
$ git submodule update --init -- <specific relative path to submodule>
25
malat

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.

12
micahblu

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
9
mpromonet

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 pathspec

Apprenez 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 de git 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 a submodule.active Défini sur le pathspec fourni, ou "." (Signifiant tous les sous-modules) si aucun pathspec n'est fourni.
Cela équivaut à exécuter git 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 alias

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

1
VonC