J'ai un superprojet git qui fait référence à plusieurs sous-modules et j'essaie de verrouiller un flux de travail pour que les autres membres de mon projet puissent y travailler.
Pour cette question, disons que mon superprojet s'appelle supery
et que le sous-module s'appelle subby
. (Ensuite, c’est une simplification de ce que j’essaie de faire. Je n’utilise pas réellement les branches pour les versions, mais j’ai pensé qu’il serait plus simple de poser la question.)
Ma branche maîtresse de supery
porte la balise v1.0
Du projet git subby
référencée en tant que sous-module. La branche de supery
a appelé one.one
Et a changé la référence du sous-module pour qu'elle pointe vers la balise v1.1
De subby
.
Je peux travailler dans chacune de ces branches sans problème, mais si j'essaie de mettre à jour la branche one.one
Avec les modifications apportées à la branche master
, je reçois des conflits et je ne sais pas comment les résoudre. .
En gros, après avoir exécuté un git pull . master
Dans la branche subby
, il semble que cela crée des sous-modules supplémentaires.
Avant l'extraction/fusion, j'obtiens la réponse souhaitée de git submodule
À partir de la branche one.one
:
$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)
Mais après l'extraction, des sous-modules supplémentaires sont ajoutés lorsque je lance git submodule
:
$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.
$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)
Comment puis-je supprimer/ignorer les références de sous-modules indésirables et commettre mes conflits et modifications? Ou y a-t-il un paramètre que je peux utiliser avec mon original git pull
Pour ignorer mes sous-modules?
Je n'ai pas vu cette erreur exacte avant. Mais je devine le problème que vous rencontrez. Cela ressemble parce que le master
et le one.one
_ branches de supery
contiennent différentes références pour le sous-module subby
, lorsque vous fusionnez les modifications de master
git ne sait pas quelle référence - v1.0
ou v1.1
- devrait être conservé et suivi par le one.one
_ branche de supery
.
Si tel est le cas, vous devez sélectionner la référence souhaitée et valider cette modification pour résoudre le conflit. C'est exactement ce que vous faites avec la commande reset.
Il s'agit d'un aspect délicat du suivi des différentes versions d'un sous-module dans différentes branches de votre projet. Mais la référence de sous-module est comme n'importe quel autre composant de votre projet. Si les deux branches différentes continuent à suivre les mêmes références de sous-modules respectives après des fusions successives, alors git devrait pouvoir élaborer le modèle sans générer de conflits de fusion dans les fusions futures. D'un autre côté, si vous changez fréquemment de références de sous-modules, vous devrez peut-être supporter beaucoup de résolution de conflit.
Eh bien, ce n’est pas techniquement la gestion des conflits avec les sous-modules (c’est-à-dire: gardez ceci mais pas ça), mais j’ai trouvé un moyen de continuer à travailler ... et tout ce que je devais faire, c’était faire attention à mon git status
sortie et réinitialise les sous-modules:
git reset HEAD subby
git commit
Cela réinitialiserait le sous-module à la validation avant extraction. Ce qui dans ce cas est exactement ce que je voulais. Et dans les autres cas où j'ai besoin des modifications apportées au sous-module, je traiterai celles avec les flux de travaux standard du sous-module (maître de caisse, déroulez la balise souhaitée, etc.).
J'ai eu un peu de difficulté avec les réponses à cette question et je n'ai pas eu beaucoup de chance avec les réponses dans n semblable SO post non plus. C'est donc ce qui a fonctionné pour moi - en gardant à l'esprit que dans mon cas, le sous-module était géré par une équipe différente, le conflit provenait donc de différentes versions de sous-modules en maître et de ma branche locale du projet sur lequel je travaillais:
git status
- notez le dossier de sous-modules avec des conflitsRéinitialisez le sous-module à la dernière version validée dans la branche actuelle:
git reset HEAD path/to/submodule
À ce stade, vous avez une version de votre sous-module sans conflit que vous pouvez maintenant mettre à jour vers la dernière version dans le référentiel du sous-module:
chemin cd/vers/sous-module sous-module git pour chaque git pull origine SUBMODULE-BRANCH-NAME
Et maintenant, vous pouvez commit
et vous remettre au travail.
Commencez par trouver le hash que vous souhaitez référencer dans votre sous-module. puis courir
~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'
cela a fonctionné pour moi pour obtenir mon sous-module à la référence de hachage correcte et pour continuer mon travail sans avoir d'autres conflits.
J'ai eu ce problème avec git rebase -i Origin/master
à une branche. Je voulais prendre la version de maître de la référence de sous-module, alors j'ai simplement fait:
git reset master path/to/submodule
et alors
git rebase --continue
Cela a résolu le problème pour moi.
A obtenu de l'aide de cette discussion. Dans mon cas le
git reset HEAD subby
git commit
travaillé pour moi :)
Eh bien, dans mon répertoire parent, je vois:
$ git status
On branch master
Your branch is up-to-date with 'Origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)
Alors je viens de faire ça
git reset HEAD linux