Nous utilisons des submodules git pour gérer deux grands projets qui ont des dépendances avec de nombreuses autres bibliothèques que nous avons développées. Chaque bibliothèque est un dépôt distinct intégré au projet dépendant sous la forme d'un submodule. 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 faire cela ? Si ce n'est pas le cas, que diriez-vous d'un fichier batch Windows ou similaire qui pourrait le faire ?
Si c'est la première fois que vous vérifiez un repo, vous devez d'abord utiliser --init
:
git submodule update --init --recursive
Pour git 1.8.2 ou supérieur, l'option --remote
a été ajoutée pour supporter la mise à jour vers les derniers tips des branches distantes :
git submodule update --recursive --remote
Ceci a l'avantage supplémentaire de respecter toute branche "non par défaut" spécifiée dans les fichiers .gitmodules
ou .git/config
(si vous en avez, la branche 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 problèmes ci-dessous concernant la mise à jour s'appliquent toujours) :
git submodule update --recursive
ou :
git pull --recurse-submodules
si vous voulez tirer vos sous-modules vers les derniers commits au lieu de ce vers quoi le repo pointe.
Voir [git-submodule(1)][1] pour plus de détails.
[1] : https://www.kernel.org/pub/software/scm/git/docs/git-submodule.html
**Note : Ceci est de 2009 et peut avoir été bon alors mais il y a de meilleures options maintenant.
Nous utilisons ceci. Il s'appelle 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
Il suffit de le mettre dans un répertoire bin approprié (/usr/local/bin). Si vous êtes sous Windows, vous devrez peut-être modifier la syntaxe pour qu'il fonctionne :)
Mise à jour:
En réponse au commentaire de l'auteur original concernant la récupération de tous les HEADs de tous les submodules, c'est une bonne question.
Je suis presque sûr que git
n'a pas de commande pour cela en interne. Pour ce faire, il faudrait identifier ce qu'est réellement le HEAD d'un sous-module. Cela pourrait être aussi simple que de dire que master
est la branche la plus à jour, etc...
Ensuite, créez un script simple qui fait ce qui suit :
git submodule status
pour les dépôts "modifiés". Le premier caractère des lignes de sortie l'indique. Si un sous-repère est modifié, vous pouvez NE PAS vouloir continuer.git checkout master && git pull
. Vérifiez les erreurs.Je voudrais mentionner que ce style n'est pas vraiment ce pour quoi les submodules git ont été conçus. Typiquement, vous voulez dire que "LibraryX" est à la version "2.32" et restera ainsi jusqu'à ce que je lui dise de "mettre à jour".
C'est, dans un sens, ce que vous faites avec le script décrit, mais de manière plus automatique. La prudence est de mise !
Mise à jour 2:
Si vous êtes sur une plateforme Windows, vous pouvez envisager d'utiliser Python pour implémenter le script car il est très compétent dans ces domaines. Si vous êtes sur unix/linux, je suggère un script bash.
Vous avez besoin d'éclaircissements ? N'hésitez pas à poster un commentaire.
Je pense que vous devrez écrire un script pour faire cela. Pour être honnête, je pourrais installer python pour le faire afin que vous puissiez utiliser os.walk
pour cd
à chaque répertoire et lancer les commandes appropriées. Utiliser python ou un autre langage de script, autre que batch, vous permettrait d'ajouter/supprimer facilement des sous-projets sans avoir à modifier le script.