Question Un moyen facile de tirer le dernier de tous les sous-modules git


Nous utilisons des sous-modules git pour gérer quelques grands projets qui dépendent de nombreuses autres bibliothèques que nous avons développées. Chaque bibliothèque est un dépôt séparé introduit dans le projet dépendant en tant que sous-module. Pendant le développement, nous voulons souvent simplement aller chercher la dernière version de chaque sous-module dépendant.

Est-ce que git a une commande intégrée pour le faire? Si non, que diriez-vous d'un fichier batch Windows ou similaire qui peut le faire?


1372
2018-06-23 01:05


origine


Réponses:


Pour git 1.8.2 ou au-dessus de l'option --remote a été ajouté pour prendre en charge la mise à jour des dernières astuces des branches distantes:

git submodule update --recursive --remote

Cela a l'avantage supplémentaire de respecter toutes les branches "non par défaut" spécifiées dans le .gitmodules ou .git/config fichiers (si vous en avez, par défaut est origin / master, auquel cas certaines des autres réponses fonctionneraient aussi).

Pour git 1.7.3 ou ci-dessus, vous pouvez utiliser (mais les astuces ci-dessous autour de ce que la mise à jour s'applique toujours):

git submodule update --recursive

ou:

git pull --recurse-submodules

si vous voulez tirer vos sous-modules vers les derniers commits et non vers ce que le repo indique.

Note: Si c'est la première fois vous passez en caisse un repo que vous devez utiliser --init premier:

git submodule update --init --recursive

Pour plus vieux, git 1.6.1 ou ci-dessus, vous pouvez utiliser quelque chose de similaire à (modifié pour convenir):

git submodule foreach git pull origin master

Voir git-submodule (1) pour plus de détails


1748
2018-06-23 13:42



Si vous avez besoin de tirer des choses pour les sous-modules dans vos dépôts de sous-modules, utilisez

git pull --recurse-submodules

une caractéristique git apprise en 1.7.3.

Mais cela ne vérifie pas les validations appropriées (celles que votre référentiel maître pointe vers) dans les sous-modules

Pour vérifier les validations appropriées dans vos sous-modules, vous devez les mettre à jour après avoir tiré en utilisant

git submodule update --recursive --remote

567
2017-11-10 18:07



Note: Ceci est à partir de 2009 et peut-être bien alors, mais il existe de meilleures options maintenant.

Nous utilisons cela. C'est appelé git-pup:

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

Placez-le simplement dans un répertoire bin approprié (/ usr / local / bin). Si sur Windows, vous devrez peut-être modifier la syntaxe pour le faire fonctionner :)

Mettre à jour:

En réponse au commentaire de l'auteur original sur l'insertion de tous les HEADs de tous les sous-modules - c'est une bonne question.

Je suis assez sûr que git n'a pas de commande pour cela en interne. Pour ce faire, vous devez identifier ce que HEAD est réellement pour un sous-module. Cela pourrait être aussi simple que de dire master est la branche la plus à jour, etc ...

Après cela, créez un script simple qui fait ce qui suit:

  1. vérifier git submodule status pour les référentiels "modifiés". Le premier caractère des lignes de sortie l'indique. Si un sous-dépôt est modifié, vous ne pouvez PAS continuer.
  2. pour chaque repo répertorié, cd dans son répertoire et exécutez git checkout master && git pull. Vérifiez les erreurs.
  3. À la fin, je vous suggère d'imprimer un affichage à l'utilisateur pour indiquer l'état actuel des sous-modules - peut-être les inviter à ajouter tout et valider?

Je voudrais mentionner que ce style n'est pas vraiment ce que les sous-modules git ont été conçus. Typiquement, vous voulez dire "LibraryX" est à la version "2.32" et restera ainsi jusqu'à ce que je le dise "upgrade".

C'est, dans un sens, ce que vous faites avec le script décrit, mais de manière plus automatique. Des soins sont nécessaires!

Mise à jour 2:

Si vous êtes sur une plate-forme Windows, vous pouvez vouloir utiliser Python pour implémenter le script car il est très performant dans ces domaines. Si vous êtes sur unix / linux, alors je suggère juste un script bash.

Besoin de clarifications? Juste poster un commentaire.


295
2018-06-23 01:50



Sur init, exécutez la commande suivante:

git submodule update --init --recursive

à partir du répertoire repo git, fonctionne le mieux pour moi.

Cela tirera tous les derniers sous-modules y compris.

Expliqué

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

Après cela, vous pouvez simplement exécuter:

git submodule update --recursive

à partir du répertoire repo git, fonctionne le mieux pour moi.

Cela tirera tous les derniers sous-modules y compris.

Expliqué

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

289
2017-12-11 19:38



Henrik est sur la bonne voie. La commande 'foreach' peut exécuter n'importe quel script shell arbitraire. Deux options pour tirer le dernier pourrait être,

git submodule foreach git pull origin master

et,

git submodule foreach /path/to/some/cool/script.sh

Cela va parcourir tous initialisé sous-modules et exécuter les commandes données.


151
2018-06-23 14:21



Ce qui suit a fonctionné pour moi sur Windows.

git submodule init
git submodule update

138
2017-07-22 13:12



modifier:

Dans les commentaires a été souligné (par philfreo ) que la dernière version est requise. S'il y a des sous-modules imbriqués qui doivent être dans leur dernière version:

git submodule foreach --recursive git pull

----- Commentaire obsolète ci-dessous -----

N'est-ce pas la façon officielle de le faire?

git submodule update --init

Je l'utilise à chaque fois. Aucun problème jusqu'à présent.

Modifier:

Je viens de trouver que vous pouvez utiliser:

git submodule foreach --recursive git submodule update --init 

Qui va également récursivement tirer tous les sous-modules, c'est-à-dire les dépendances.


33
2018-04-05 16:23



Comme il peut arriver que la branche par défaut de vos sous-modules soit ne pas  master, c'est ainsi que j'automatise les mises à jour complètes des sous-modules Git:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

30
2017-12-04 08:58



Première fois

Cloner et sous-module d'initialisation

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

Du repos

Pendant le développement, tirez et mettez à jour le sous-module

git pull --recurse-submodules  && git submodule update --recursive

Mettre à jour le sous-module Git vers le dernier commit sur l'origine

git submodule foreach git pull origin master

La voie préférée devrait être ci-dessous

git submodule update --remote --merge

note: les deux dernières commandes ont le même comportement


24
2017-09-17 07:18



Je ne sais pas depuis quelle version de git cela fonctionne, mais c'est ce que vous cherchez:

git submodule update --recursive

Je l'utilise avec git pull pour mettre à jour le dépôt racine, aussi:

git pull && git submodule update --recursive

18
2017-09-30 14:10



Regarder http://lists.zerezo.com/git/msg674976.html qui introduit un paramètre --track


6
2017-11-14 02:39