2 votes

Le sous-module Git n'est pas affiché comme modifié après la fusion de la branche où il a été mis à jour

Question originale

Je travaille sur un dépôt git contenant plusieurs sous-modules, dont l'un présente un comportement étrange : Je travaille sur une branche de fonctionnalités, appelons-la featureBranch . Cette branche a été créée à partir de mon develop branche. Pendant que je travaillais sur ma fonctionnalité, quelqu'un a mis à jour le sous-module et a livré les changements à develop . Mon référentiel ressemble maintenant à ceci :

* 10000003 (HEAD -> featureBranch) Work on my feature
| * 10000002 (develop) Update submodule
|/
* 10000001 some commit

Pour être à jour, je souhaite fusionner le fichier actuel des develop en featureBranch via git merge develop . Lors de l'exécution d'un git status je m'attendrais à voir des changements dans le sous-module, puisque mon sous-module n'est, bien sûr, pas encore mis à jour avec la fonction develop Le statut de l'entreprise. Or, ce n'est pas le cas. Après la fusion, aucune modification du sous-module n'est affichée et le sous-module reste dans l'état des commits 10000003 y 10000001 .

Il s'agit d'une description simplifiée de mon dépôt et du nombre de commits. J'ai essayé de reproduire cela avec un exemple de dépôt minimal, mais je n'y suis pas parvenu. Dans un cas minimal, tout fonctionne comme prévu, avec le sous-module montrant les changements après la fusion et un message d'erreur git submodule update l'appel à la mise en place de l'étape de l'engagement 10000002 . Je peux cependant le reproduire dans mon référentiel productif via reset --hard et un nouveau merge develop aussi souvent que je le souhaite.

En dehors de la ligne de commande, j'utilise occasionnellement GitKraken, qui a des problèmes connus avec les submodules. Je ne peux donc pas l'exclure comme source de ce problème, mais comme cela se produit également lorsque j'utilise exclusivement la ligne de commande, cela ne me semble pas probable.

Quelqu'un a-t-il une idée de la raison pour laquelle un changement de sous-module dans une branche où il a été modifié n'est pas reporté sur une branche où le sous-module n'a pas été modifié ? Toute indication sera appréciée.

Remarques

Il s'est avéré que la simplification de ma question n'était pas valable. En réalité, featureBranch originaire de develop il y a longtemps. Il y a eu des fusions de develop à featureBranch de temps en temps, et je soupçonne que certaines de ces fusions, ainsi que les develop divergeant des origines" et quelques "hard resets" entre les deux en sont la source. En raison de l'enchevêtrement de l'histoire, il est très difficile de déterminer la véritable raison, et je n'ai pas le temps de tout démêler.

Après la fusion develop en featureBranch et en ajoutant un autre commit modifiant le commit du sous-module en question, j'ai regardé le sous-module via l'historique des fichiers de GitKrakens, et étrangement il montre ce qui suit (lire de bas en haut) :

+Commit 183 //new commit id
-Commit ad7 //commit id from develop the submodule should have been on after merge,
              but it actually was on ccc and did not show any changes!

**This is where the merge happened. Below is the file history from featureBranch

+Commit ccc //new commit id
-Commit ff9 //old commit id

+Commit ff9 //new commit id
-Commit bb6 //old commit id

+Commit bb6 //new commit id
-Commit 3f9 //old submodule commit id

Je reste très perplexe à ce sujet, mais je ne vais pas poursuivre mes recherches. Si quelqu'un peut faire la lumière sur cette question, j'en serais très heureux.

1voto

Marcelo Filho Points 534

Vous devez d'abord considérer les sous-modules comme des dépôts parallèles.

Votre dépôt principal (qui contient les sous-modules) ne vise que les commits dans l'historique du sous-module. Par exemple : Lorsque vous fusionnez le module développer dans votre branche de la caractéristique les hachages de validation des sous-modules dans développer seront désormais les mêmes dans la branche de la caractéristique MAIS vous devez les mettre à jour manuellement (et c'est pourquoi vous devriez éviter les interfaces graphiques).

Après l'exécution de la fusion git submodule update et vous aurez toutes les mises à jour (s'il y en a) des sous-modules. De même, si vous utilisez des sous-modules dans une branche spécifique et que vous souhaitez les mettre à jour avec le dernier commit, exécutez git submodule update --remote .

Vous y trouverez un bon aperçu du fonctionnement des sous-modules : https://git-scm.com/book/en/v2/Git-Tools-Submodules

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