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?
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"
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.
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 .
Version simple ligne
git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
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
.
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')"
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.