web-dev-qa-db-fra.com

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 référentiel A, j'ai poussé sur le référentiel distant, de sorte que la bibliothèque (référentiel A) soit mise à jour.

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

229
fatmatto

Entrez le répertoire du sous-module:

cd projB/projA

Extrayez le repo de votre projet A (will not mettra à jour le statut git de votre parent, projet B):

git pull Origin master

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

cd ..
git status

Si le sous-module mis à jour auparavant, 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"
301
Kjuly

Depuis Git 1.8 vous pouvez faire

git submodule update --remote --merge

Ceci mettra à jour le sous-module avec la dernière validation à distance. Vous devrez ensuite valider la modification pour que le lien gitlink du référentiel parent soit mis à jour.

git commit

Ensuite, appuyez sur les modifications car sans cela l'identité SHA-1 pointant sur le sous-module ne sera pas mise à jour et les modifications ne seront visibles par personne d'autre.

83
Paul Hatcher

Si vous mettez à jour un sous-module et que vous vous y engagez, vous devez accéder au référentiel contenant ou supérieur et y ajouter les modifications.

git status

montrera quelque chose comme:

modified:
   some/path/to/your/submodule

Le fait que le sous-module ne soit pas synchronisé est également visible avec

git submodule

la sortie montrera:

+afafaffa232452362634243523 some/path/to/your/submodule

Le signe plus indique que votre sous-module pointe en avant de l'endroit où le référent supérieur s'attend à ce qu'il pointe.

ajoutez simplement ce changement:

git add some/path/to/your/submodule

et le commettre:

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

Lorsque vous augmentez vos modifications, assurez-vous de commencer par les modifications dans le sous-module, puis appuyez sur la modification de référence dans le référentiel externe. De cette façon, les personnes qui mettent à jour pourront toujours exécuter avec succès

git submodule update

Plus d'informations sur les sous-modules peuvent être trouvées ici http://progit.org/book/ch6-6.html .

36
Adam Dymitruk

Version simple ligne

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

Quelques-unes des autres réponses recommandent de fusionner/commettre dans le répertoire du sous-module, ce que l’OMI peut devenir un peu brouillon.

En supposant que le serveur distant s'appelle Origin et que nous souhaitons la branche master du ou des sous-modules, j'ai tendance à utiliser:

git submodule foreach "git fetch && git reset --hard Origin/master"

Remarque: Ceci effectuera une réinitialisation matérielle de chaque sous-module. Si vous ne le souhaitez pas, vous pouvez remplacer --hard par --soft.

1
XtraSimplicity

La réponse d'Andy a fonctionné pour moi en échappant à $ path:

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

Mon projet doit utiliser la "dernière" pour le sous-module. Sous Mac OSX 10.11, git version 2.7.1, je n'avais pas besoin d'aller dans mon dossier de sous-modules pour collecter ses commits. J'ai simplement fait un habitué

git pull --rebase 

au plus haut niveau, et il a correctement mis à jour mon sous-module.

0
AnneTheAgile