2010-12-07 6 views
8

Disons que j'ai deux branches dans RepoX appelées BranchA et BranchB. RepoX a également un sous-module appelé SubmoduleY.Git: fusion et sous-modules

BranchA a Sous-moduleY à la révision 'abc', BranchB a sous-moduleY à la révision 'def'. Supposons que je souhaite fusionner BranchA en BranchB, mais je souhaite que SubmoduleY de BranchB pointe vers sa version d'origine de 'def'. Je vois deux manières de le faire:

Méthode 1:

  1. Commander BranchB.
  2. Déplacez SubmoduleY vers la révision 'abc' pour rendre la fusion réelle indolore (nous ne voulons pas faire de fusion au niveau du sous-module pour le moment).
  3. Validez la nouvelle révision pour SubmoduleY (nous ne pouvons pas la faire flotter pour la fusion).
  4. Fusionner BranchA dans BranchB. Résolvez les conflits.
  5. Renvoyer le sous-moduleY à la révision 'def'.
  6. Validez la nouvelle révision pour SubmoduleY.
  7. Poussez les modifications jusqu'au rapport principal.

Méthode 2:

Identique à la méthode 1, mais au lieu de faire l'étape 6, rebase et se débarrasser de la sous-module supplémentaire commettras de l'étape 3.

Les deux semblent avoir des inconvénients gênants:

La méthode 1 place deux validations supplémentaires dans l'historique.

La méthode 2 oublie toutes les modifications à faire avec les révisions de sous-module car ces validations sont supprimées. Par conséquent, toute fusion ultérieure devra faire face à quelques problèmes à nouveau.

Y a-t-il un meilleur moyen?

Répondre

7

Vous pouvez faire une variante sur votre méthode 1, mais faites la validation qui introduit la modification dans la version de sous-module (à l'étape 6) avec --amend afin qu'elle modifie l'état du sous-module dans la validation de fusion. En d'autres termes, ce serait:

$ git checkout b 
$ git merge a 
Merge made by recursive. 
example.txt | 1 + 
sY   | 2 +- 
2 files changed, 2 insertions(+), 1 deletions(-) 
create mode 100644 example.txt 
$ cd sY 
$ git checkout def 
[... you get the "detached HEAD" warning ...] 
$ cd .. 
$ git add sY 
$ git commit --amend 

Notez que je ne l'ai pas pris la peine d'essayer d'éviter d'avoir les sous-modules à différentes versions avant de fusionner, comme vous le suggérez dans votre question. S'il y a un conflit, vous pouvez simplement choisir d'ajouter le sous-module au def pour le résoudre. S'il n'y a pas de conflit, les étapes que j'ai mentionnées ci-dessus devraient fonctionner correctement.

+0

Belle solution! Merci. – Ben