web-dev-qa-db-fra.com

Réintégration de la branche Subversion

Lorsqu'une branche est réintégrée dans le tronc, cette branche est-elle effectivement morte?

Pouvez-vous apporter des modifications à la branche après la réintégration et les fusionner à nouveau dans le coffre à une date ultérieure?

68
Aaron Smith

Vous pouvez le faire techniquement, votre branche n'est ni morte ni désactivée, mais il n'est pas recommandé de fusionner de branche en tronc après réintégration.

Vous pouvez trouver une discussion complète sur la raison de cela, ici: Subversion merge reintegrate

Fondamentalement, il est dit qu'il est possible de fusionner à nouveau vos modifications dans le tronc, mais comme la réintégration vous oblige à fusionner du tronc à la branche avant l'opération de réintégration, vous serez confronté à la fusion réfléchissante/cyclique, ce qui est très problématique dans Subversion 1.5 .
Selon l'article, il est recommandé de supprimer votre branche réintégrée immédiatement après la réintégration et d'en créer une nouvelle avec le même nom (ou un nom différent).

Il s'agit d'un comportement Subversion connu qui sera traité dans la prochaine version (probablement en 1.6)


79
Pini Reznik

En fait, vous devez faire un --record-only fusionner du tronc dans votre branche de la révision qui a été créée par le --reintegrate commit:

$ cd trunk
$ svn merge --reintegrate ^my-branch 
$ svn commit

Committed revision 555. 
# This revision is ^^^^ important

Et maintenant vous l'enregistrez

$ cd my-branch
$ svn merge --record-only -c 555 ^trunk 
$ svn commit

Vous êtes heureux de garder la succursale maintenant

Vous trouverez plus d'informations dans Chapitre 4. Branchement et fusion, Fusion avancée.

17
krico

Après avoir réintégré une branche dans le tronc, vous devez effectuer l'une des deux opérations suivantes:

  • Supprimez votre branche . C'est le plus simple, mais il est plus difficile de voir l'historique de la branche.

  • Dites à votre branche de ne pas fusionner le commit de réintégration . Si vous réintégrez le tronc et le validez en tant que révision X, vous pouvez exécuter cette commande sur votre branche: svn merge --record-only -c X url-to-trunk. Cependant, vous ne devriez pas le faire si vous avez apporté des modifications dans le cadre de la validation, à l'exception de la fusion elle-même. Toute autre modification ne sera jamais réintroduite dans votre succursale.

8
JW.

Quelques conseils sur la fusion des modifications si quelqu'un apporte plusieurs fois des modifications à la branche (avant 1.5): Rappelez-vous à quelle révision vous avez fait la fusion! Soit écrire les numéros de révision quelque part, o (ce qui est plus facile) faire une balise. (Vous pouvez bien sûr le découvrir plus tard, mais c'est un PITA.)

Exemple:

Vous avez une disposition de référentiel comme celle-ci:

/your_project
  /trunk
  /branches
  /tags

Disons que c'est une application Web et que vous avez prévu de faire une version. Vous créeriez une balise, et à partir de cela (ou du tronc) une branche dans laquelle vous feriez les corrections de bugs:

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0

De cette façon, vous pouvez intégrer les nouvelles fonctionnalités dans le coffre. Toutes les corrections de bugs se produiraient uniquement dans la branche bugfix et avant chaque version, vous créez une balise de la version actuelle (maintenant de la branche bugfix).

Supposons que vous ayez fait un bon nombre de corrections de bogues et que vous les ayez publiées sur le serveur de production et que vous ayez désespérément besoin d'une de ces fonctionnalités dans le tronc actuel:

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2

Vous pouvez maintenant simplement intégrer les changements entre 1.0.0 et 1.0.2 dans votre tronc (en supposant que vous êtes dans votre copie de travail):

svn merge http://rep/your_project/tag/1.0.0 http://rep/your_project/tag/1.0.2 .

C'est ce dont vous devez vous souvenir. Vous avez déjà fusionné les modifications entre 1.0.0 et 1.0.2 sur le tronc. Supposons qu'il y ait plus de changements dans la version de production actuelle:

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2
    /1.0.3
    /1.0.4

Vous êtes maintenant prêt à publier la nouvelle version de trunk, mais les dernières modifications de vos corrections de bugs sont toujours manquantes:

svn merge http://rep/your_project/tag/1.0.2 http://rep/your_project/tag/1.0.4 .

Maintenant, vous avez tous les modifications ont été fusionnées sur votre tronc, et vous pouvez faire votre version (n'oubliez pas de la tester d'abord).

/your_project
  /trunk
  /branches
    /1.0.0-bugfixes
    /1.1.0-bugfixes
  /tags
    /1.0.0
    /1.0.1
    /1.0.2
    /1.0.3
    /1.0.4
    /1.1.0
3
Mauli

Comme tout le monde l'a déjà dit ici: la branche n'est pas morte et l'engagement dans la branche peut continuer très bien.

Parfois, même si vous souhaitez supprimer la branche après la fusion. La seule solution fiable consiste à supprimer la branche. L'inconvénient est qu'il est alors plus difficile de retrouver la succursale si vous souhaitez la consulter, par exemple, pour des raisons historiques. Ainsi, beaucoup de gens laissent traîner les branches "importantes" et acceptent de ne pas les changer. Je souhaite qu'il y ait un moyen de marquer une branche morte/en lecture seule, garantissant ainsi que personne ne peut s'y engager jusqu'à nouvel ordre.

2
Alexander

Non, la branche est toujours vivante, mais, à ce moment, c'est exactement la même chose que le tronc. Si vous continuez à développer sur la branche, vous êtes libre de refusionner avec le tronc plus tard.

2
Ben Hoffstein

Vous pouvez fusionner d'une branche vers le tronc, ou du tronc vers une branche, autant de fois que vous le souhaitez.

1
Chris Marasti-Georg

Tout d'abord, vous devez mettre à niveau votre client et serveur Subversion si vous utilisez toujours Subversion 1.7 ou une version antérieure. Il n'y a aucune raison d'utiliser de très anciennes versions de Subversion. Depuis 2016, la version actuelle est Subversion 1.9. SVN 1.8 est également pris en charge maintenant et reçoit toujours des corrections de bugs.

Le problème que vous posez a été résolu dans Subversion 1.8. À partir de SVN 1.8, --reintegrate option a été déconseillée . Les fusions de réintégration sont désormais effectuées automatiquement . Voir Entrée des notes de publication de Subversion 1.8 liée à l'amélioration .

Lire SVNBook 1.8 | Réintégrer une branche :

Si vous choisissez de ne pas supprimer votre branche après sa réintégration dans le tronc, vous pouvez continuer à effectuer des fusions de synchronisation à partir du tronc, puis réintégrer la branche à nouveau. Si vous procédez ainsi, seules les modifications apportées à votre branche après la première réintégration sont fusionnées dans le tronc.

...

Seul Subversion 1.8 prend en charge cette réutilisation d'une branche de fonctionnalité. Les versions antérieures nécessitent une gestion particulière avant qu'une branche de fonctionnalité puisse être réintégrée plus d'une fois. Voir la version antérieure de ce chapitre pour plus d'informations: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

1
bahrep