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 distinct introduit dans le projet dépendant en tant que sous-module. Pendant le développement, nous voulons souvent aller chercher la dernière version de chaque sous-module dépendant.
Git a-t-il une commande intégrée pour ce faire? Sinon, que diriez-vous d'un fichier de commandes Windows ou similaire qui peut le faire?
git
git-submodules
Brad Robinson
la source
la source
Réponses:
Si c'est la première fois que vous extrayez un repo, vous devez d'
--init
abord l' utiliser :Pour git 1.8.2 ou supérieur, l'option a
--remote
été ajoutée pour prendre en charge la mise à jour des derniers conseils des succursales distantes:Cela a l'avantage supplémentaire de respecter toutes les branches "non par défaut" spécifiées dans les fichiers
.gitmodules
ou.git/config
(si vous en avez, la valeur par défaut est origin / master, auquel cas certaines des autres réponses ici fonctionneraient également).Pour git 1.7.3 ou supérieur, vous pouvez utiliser (mais les pièges ci-dessous concernant la mise à jour s'appliquent toujours):
ou:
si vous voulez tirer vos sous-modules vers les dernières validations au lieu de la validation actuelle vers laquelle le repo pointe.
Voir git-submodule (1) pour plus de détails
la source
git submodule update --recursive
nos jours.git submodule foreach "(git checkout master; git pull)&"
origin master
à la fin de cette commande peut avoir des résultats inattendus si certains de vos sous-modules suivent un nom de branche ou d'emplacement différent de ce sous-module particulier. Évident pour certains, mais probablement pas pour tout le monde.git submodule update --recursive
recherche la révision que le référentiel parent a stockée pour chaque sous-module, puis vérifie cette révision dans chaque sous-module. Il ne tire PAS les derniers commits pour chaque sous-module.git submodule foreach git pull origin master
ougit pull origin master --recurse-submodules
est ce que vous voulez si vous avez l'intention de mettre à jour chaque sous-module au plus tard à partir de leurs référentiels d'origine. Ce n'est qu'alors que vous obtiendrez les modifications en attente dans le référentiel parent avec des hachages de révision mis à jour pour les sous-modules. Enregistrez-les et vous êtes bon.Jusqu'à ce que le bug soit corrigé, pour la première fois, vous devez exécuter
la source
git pull --recurse-submodules
nigit submodule update --recursive
ne pas initialize nouvellement ajouté sous - modules. Pour les initialiser, vous devez exécutergit submodule update --recursive --init
. Citation du manuel : Si le sous-module n'est pas encore initialisé et que vous souhaitez simplement utiliser le paramètre tel qu'il est stocké dans .gitmodules, vous pouvez initialiser automatiquement le sous-module avec l'option --init.git submodule update --recursive --remote
qui met également à jour les sous-modules vers la dernière révision à distance au lieu du SHA-1 stocké.À l'initialisation, exécutez la commande suivante:
à partir du répertoire git repo, fonctionne le mieux pour moi.
Cela tirera tous les derniers sous-modules, y compris.
Expliqué
Après cela, vous pouvez simplement exécuter:
à partir du répertoire git repo, fonctionne le mieux pour moi.
Cela tirera tous les derniers sous-modules, y compris.
la source
Remarque: cela date de 2009 et peut-être bien alors, mais il existe de meilleures options maintenant.
Nous utilisons cela. Cela s'appelle
git-pup
:Placez-le simplement dans un répertoire bin approprié (/ usr / local / bin). Si sous Windows, vous devrez peut-être modifier la syntaxe pour la faire fonctionner :)
Mise à jour:
En réponse au commentaire de l'auteur original sur le retrait de toutes les TÊTES de tous les sous-modules - c'est une bonne question.
Je suis presque sûr que cela
git
n'a pas de commande pour cela en interne. Pour ce faire, vous devez identifier ce qu'est réellement HEAD pour un sous-module. Cela pourrait être aussi simple que de dire quemaster
c'est la branche la plus à jour, etc ...Ensuite, créez un script simple qui effectue les opérations suivantes:
git submodule status
référentiels "modifiés". Le premier caractère des lignes de sortie l'indique. Si un sous-repo est modifié, vous ne voudrez PAS continuer.git checkout master && git pull
. Vérifiez les erreurs.Je voudrais mentionner que ce style n'est pas vraiment ce pour quoi les sous-modules git ont été conçus. En règle générale, vous voulez dire que "LibraryX" est à la version "2.32" et restera ainsi jusqu'à ce que je lui dise de "mettre à niveau".
C'est, dans un sens, ce que vous faites avec le script décrit, mais de manière plus automatique. Il faut faire attention!
Mise à jour 2:
Si vous êtes sur une plate-forme Windows, vous voudrez peut-être envisager d'utiliser Python pour implémenter le script car il est très capable dans ces domaines. Si vous êtes sous unix / linux, alors je suggère juste un script bash.
Besoin de clarifications? Postez simplement un commentaire.
la source
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
puis l'utiliser commegit pup
sans aucun script.git submodule init
après la première traction avec des sous-modules inclus, afin que tout commence à fonctionner correctement.Henrik est sur la bonne voie. La commande 'foreach' peut exécuter n'importe quel script shell arbitraire. Deux options pour tirer le tout dernier pourraient être,
et,
Cela parcourra tous les sous-modules initialisés et exécutera les commandes données.
la source
Ce qui suit a fonctionné pour moi sur Windows.
la source
Modifier :
Dans les commentaires, il a été souligné (par philfreo ) que la dernière version est requise. S'il existe des sous-modules imbriqués qui doivent être dans leur dernière version:
----- Commentaire obsolète ci-dessous -----
N'est-ce pas la façon officielle de procéder?
Je l'utilise à chaque fois. Aucun problème jusqu'à présent.
Éditer:
Je viens de découvrir que vous pouvez utiliser:
Ce qui tirera également récursivement tous les sous-modules, c'est-à-dire les dépendances.
la source
git submodule update --init --recursive
git submodule foreach --recursive git pull
Comme il peut arriver que la branche par défaut de vos sous-modules ne soit pas
master
, voici comment j'automatise les mises à niveau complètes des sous-modules Git:la source
Première fois
Sous-module Clone et Init
Du repos
Pendant le développement, il suffit de tirer et de mettre à jour le sous-module
Mettre à jour le sous-module Git vers le dernier commit sur l'origine
Le moyen préféré doit être ci-dessous
note: les deux dernières commandes ont le même comportement
la source
git submodule update
fait l'affaire. Maintenant, je télécharge des données de sous-modules manquantes dans la première étape du clone. Je vous remercie. Je ne suis pas bon en git: CJe ne sais pas depuis quelle version de git cela fonctionne, mais c'est ce que vous recherchez:
Je l'utilise également
git pull
pour mettre à jour le référentiel racine:la source
Les réponses ci-dessus sont bonnes, mais nous utilisions git-hooks pour rendre cela plus facile, mais il s'avère que dans git 2.14 , vous pouvez définir
git config submodule.recurse
true pour activer les sous-modules à mettre à jour lorsque vous tirez vers votre référentiel git.Cela aura pour effet secondaire de pousser tous les changements de sous-modules que vous avez s'ils sont sur des branches, mais si vous avez déjà besoin de ce comportement, cela pourrait faire le travail.
Peut être fait en utilisant:
la source
git submodule init
avant la main si votre sous-module n'est pas encore initialisé.Git pour Windows 2.6.3 :
git submodule update --rebase --remote
la source
Du niveau supérieur dans le référentiel:
Cela va changer toutes les branches pour développer et tirer les dernières
la source
git submodule foreach git pull origin master
J'ai dû ajouter la branche que je voulais récupérer. à part ça, fonctionnait parfaitement.Je l'ai fait en adaptant la réponse de gahooa ci - dessus :
Intégrez-le avec un git
[alias]
...Si votre projet parent a quelque chose comme ça dans
.gitmodules
:Ajoutez quelque chose comme ça dans votre .gitconfig
Ensuite, pour mettre à jour vos sous-modules, exécutez:
J'en ai un exemple dans mon référentiel de configuration d'environnement .
la source
Tout ce que vous devez faire maintenant est simple
git checkout
Assurez-vous simplement de l'activer via cette configuration globale:
git config --global submodule.recurse true
la source
Voici la ligne de commande pour extraire de tous vos référentiels git qu'ils soient ou non des sous-modules:
Si vous l'exécutez dans votre référentiel git supérieur, vous pouvez le remplacer
"$ROOT"
dans.
.la source
Je pense que vous devrez écrire un script pour ce faire. Pour être honnête, je peux installer python pour le faire afin que vous puissiez utiliser
os.walk
tocd
pour chaque répertoire et émettre les commandes appropriées. L'utilisation de python ou d'un autre langage de script, autre que batch, vous permettrait d'ajouter / supprimer facilement des sous-projets sans avoir à modifier le script.la source
Remarque: pas trop facile, mais réalisable et il a ses propres avantages uniques.
Si l'on veut cloner uniquement la
HEAD
révision d'un référentiel et seulementHEAD
s de tous ses sous-modules (c'est-à-dire pour extraire "trunk"), alors on peut utiliser le script Lua suivant . Parfois, une simple commandegit submodule update --init --recursive --remote --no-fetch --depth=1
peut entraîner unegit
erreur irrécupérable . Dans ce cas, il faut nettoyer le sous-répertoire du.git/modules
répertoire et cloner le sous-module manuellement à l'aide de lagit clone --separate-git-dir
commande. La seule complexité est de trouver l' URL , le chemin du.git
répertoire du sous-module et le chemin du sous-module dans l'arborescence du superprojet.Remarque: le script n'est testé que par rapport au
https://github.com/boostorg/boost.git
référentiel. Ses particularités: tous les sous-modules hébergés sur le même hôte et.gitmodules
ne contiennent que des URL relatives .la source