Fusionner une branche dans le tronc

125

Je suis confronté à un problème particulier avec SVN merge. Je veux fusionner d'une branche de développement à un tronc. Nous avons plusieurs branches de développement coupées du tronc en même temps.

Je fusionne l'une de ces branches avec le tronc avec cette commande:

svn merge trunk branch_1

Je vois des changements qui ne font pas partie de cette branche, fusionnés dans le tronc. Qu'est-ce que je fais mal ?

Version SVN:

Client de ligne de commande Subversion, version 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.

Vanchinathan Chandrasekaran
la source
7
Je sais que ce n'est pas une réponse, mais si vous avez plusieurs branches actives simultanément, vous feriez probablement mieux de passer à mercurial ou git. Ps: Je ne suis pas fanatique, je travaille avec svn depuis ~ 7 ans ;-)
zerkms
2
Quel avantage cela procure-t-il? Pourquoi passer à git ou mercurial est un meilleur choix?
Vanchinathan Chandrasekaran le
3
car git et mercurial supportent bien mieux les branches. Avantages: vous ne poserez pas de telles questions et aurez moins de maux de tête sur la création et la maintenance des branches (actuellement je travaille dans un projet avec plus de 1000 branches, dans svn c'était un enfer de travailler avec elles)
zerkms
Je recommande de regarder dans Svnmerge.py et de revoir cet article .
chown

Réponses:

215

Votre svn mergesyntaxe est erronée.

Vous souhaitez récupérer une copie de travail de trunk, puis utiliser l' svn merge --reintegrateoption:

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

Voir le chapitre du livre SVN sur la fusion pour plus de détails.


Notez qu'au moment où elle a été écrite, c'était la bonne réponse (et elle a été acceptée), mais les choses ont évolué. Voir la réponse de topek et http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate

blahdiblah
la source
4
L'option --reintegrate n'est pas obligatoire, la branche (dans 1.6) peut être fusionnée avec n'importe quelle destination un nombre illimité de fois
Lazy Badger
1
Vraiment? Sans risquer de refaire les mêmes changesets? Pouvez-vous fournir un lien vers des preuves corroborantes de cela, s'il vous plaît.
Neutrino
--reintegraten'est en effet pas obligatoire mais vraiment recommandé dans ce cas. J'ai essayé de m'en passer --reintegrateet je me suis retrouvé avec des centaines de conflits. Avec --reintegrate, pas de conflits et tout allait bien!
tibo le
17
L' --reintegrateoption est simple et efficace, MAIS il faut noter que "Une fois qu'une --reintegratefusion est faite de branche en tronc, la branche n'est plus utilisable pour d'autres travaux. Elle ne peut pas absorber correctement les nouveaux changements de tronc, ni être correctement réintégrée à nouveau. " comme expliqué par le livre que vous avez lié.
Pino
3
@daveL, les fusions en avant d'un tronc à l'autre ont du sens pour moi. Cependant, j'ai trouvé une fonctionnalité avancée pour "garder une branche réintégrée en vie" (voir stackoverflow.com/a/10163059/685806 ), en outre elle est appliquée automatiquement par les versions de client plus récentes.
Pino
78

Si votre répertoire de travail pointe vers le tronc, vous devriez pouvoir fusionner votre branche avec:

svn merge https://HOST/repository/branches/branch_1

assurez-vous d'émettre cette commande dans le répertoire racine de votre coffre

Topek
la source
7
À partir de SVN 1.8. c'est la bonne réponse. Voir subversion.apache.org/docs/release-notes/…
GreenAsJade
@blahdiblah, l'extrait de code contient beaucoup d'informations superflues. Il y a une raison pour laquelle le résumé des études est lu plus que toute autre partie d'une étude. Il en va de même pour les tests UX, minimiser les taux de rebond, etc. C'est le même principe.
ahnbizcad
avec 1.7, vous pouvez fusionner sans l'option --reintegrate, et continuer à développer sur la branche et continuer à fusionner. Malheureusement, 1.8 forcera cela à être une réintégration, et il ne semble pas y avoir de moyen de l'empêcher. Cela signifie que dès que vous fusionnez, vous ne pouvez pas utiliser la branche sans passer par la redoutable "danse du maintien en vie"
John Little
3
N'oubliez pas de remettre ensuite la copie de travail du tronc dans le référentiel après la fusion!
John
16

Faites une mise à jour svn dans le coffre, notez le numéro de révision.

Depuis le coffre:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

Vous pouvez vérifier où la branche a été coupée du tronc en faisant un journal svn

svn log --stop-on-copy
Mike K.
la source
Comme il y a plusieurs branches de développement actives en même temps, cela ne fonctionnait pas non plus pour moi, cette commande apportait également des modifications à partir d'autres branches. Peut-être s'agit-il d'un problème avec le client SLik SVN?
Vanchinathan Chandrasekaran le
Bien que ce ne soit pas inexact, il existe des moyens plus simples de fusionner avec des versions plus récentes de svn(comme celle qu'OP utilise).
blahdiblah
@VanchinathanChandrasekaran, dans la commande, vous spécifiez le nom de la branche car svn://path/to/branch/branchNamecela ne devrait extraire que les modifications de cette branche et non des autres branches. Si c'est le cas, nous sommes en danger!
Fredrick Gauss
1

La syntaxe est erronée, elle devrait plutôt être

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
lwpro2
la source