389 votes

Mettre à jour un sous-module avec le dernier commit

J'ai un projet A qui est une bibliothèque et il est utilisé dans un projet B.

Les deux projets A et B ont un dépôt séparé sur github MAIS à l'intérieur de B nous avons un sous-module de A.

J'ai édité quelques classes sur la bibliothèque, qui est dans le repo A, j'ai poussé sur le repo distant, donc la bibliothèque (repo A) est mise à jour.

Ces mises à jour ne se reflètent pas sur la "référence" (le submodule) ; le submodule fait référence à un commit précédent.... que dois-je faire pour mettre à jour le submodule sur git ?

4 votes

Premier coup : git submodule update --remote --merge pour s'assurer que les submodules pointent vers le hachage le plus récent (valide après git 1.8). Ensuite, livrez le pointeur vers le nouveau hachage de vos submodules en livrant les submodules : git add proj/submodule puis git commit -m 'adding new submodule' ma réponse préférée est celle-ci : stackoverflow.com/a/42175412/1601580

515voto

Kjuly Points 15089

Entrez le répertoire du sous-module :

cd projB/projA

Tirez le repo de votre projet A (sera no mettez à jour le statut git de votre parent, le projet B) :

git pull origin master

Retournez dans le répertoire racine et vérifiez la mise à jour :

cd ..
git status

Si le sous-module a été mis à jour avant, il affichera quelque chose comme ci-dessous :

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Ensuite, validez la mise à jour :

git add projB/projA
git commit -m "projA submodule updated"

UPDATE

Comme @paul l'a souligné, depuis git 1.8, nous pouvons utiliser

git submodule update --remote --merge

pour mettre à jour le sous-module avec le dernier commit distant. C'est pratique dans la plupart des cas.

42 votes

BTW, si vous n'êtes pas le propriétaire du sous-module, vous pouvez simplement faire git submodule update quand quelqu'un d'autre a mis à jour le projA (vous obtiendrez un nouvel identifiant de commit).

0 votes

Je possède le repo principal du sous-module (projet A) mais je suis un committer dans le projet B.

0 votes

@Kjuly Après le commit, comment le pousser vers le distant ? Est-ce que c'est juste git push ?

174voto

Paul Hatcher Points 193

Depuis git 1.8, vous pouvez faire

git submodule update --remote --merge

Cela mettra à jour le sous-module avec le dernier commit distant. Vous devrez alors ajouter et commiter le changement pour que le lien git dans le dépôt parent soit mis à jour :

D'abord, git l'ajoute

git add project/submodule_proj_name

puis git commit

git commit -m 'gitlink to submodule_proj_name was updated'

le git push

git push

Puis, poussez les changements, car sans cela, l'identité SHA-1 qui pointe vers le sous-module ne sera pas mise à jour et le changement ne sera donc pas visible pour les autres.

45voto

Adam Dymitruk Points 34999

Si vous mettez à jour un sous-module et que vous le commettez, vous devez vous rendre dans le repo contenant ou de niveau supérieur et y ajouter la modification.

git status

montrera quelque chose comme :

modified:
   some/path/to/your/submodule

Le fait que le sous-module est désynchronisé peut également être vu avec

git submodule

la sortie montrera :

+afafaffa232452362634243523 some/path/to/your/submodule

Le plus indique que votre sous-module pointe en avant de l'endroit où le top repo attend qu'il pointe.

Il suffit d'ajouter cette modification :

git add some/path/to/your/submodule

et le commettre :

git commit -m "referenced newer version of my submodule"

Lorsque vous mettez en ligne vos modifications, assurez-vous de mettre en ligne la modification dans le sous-module d'abord, puis la modification de référence dans le dépôt externe. De cette façon, les personnes qui mettent à jour seront toujours en mesure de réussir à exécuter

git submodule update

Vous trouverez plus d'informations sur les sous-modules ici http://progit.org/book/ch6-6.html .

0 votes

Si vous ne voyez pas de + lorsque vous exécutez git submodule assurez-vous que vous avez initialisé et importé les submodules. Les commandes pour cela sont git submodule init y git submodule update respectivement.

21voto

Andy Webov Points 83

Version à une ligne

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

5voto

Shin Points 10934

Aucune des réponses ci-dessus n'a fonctionné pour moi.

C'était la solution, du parent l'exécution du répertoire :

git submodule update --init;
cd submodule-directory;
git pull;
cd ..;
git add submodule-directory;

maintenant vous pouvez git commit y git push

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X