Fusionar una rama en el tronco

125

Estoy enfrentando un problema peculiar con SVN merge. Quiero fusionarme de una rama de desarrollo a una troncal. Tenemos múltiples ramas de desarrollo cortadas del tronco al mismo tiempo.

Estoy fusionando una de esas ramas al tronco con este comando:

svn merge trunk branch_1

Veo cambios que no son parte de esta rama, fusionándose en el tronco. Qué estoy haciendo mal ?

Versión SVN:

Cliente de línea de comandos de Subversion, versión 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.

Vanchinathan Chandrasekaran
fuente
77
Sé que esta no es una respuesta, pero si tienes varias ramas activas simultáneamente, entonces probablemente sea mejor que cambies a mercurial o git. Ps: no soy un fanático, he estado trabajando con svn durante ~ 7 años ;-)
zerkms
2
¿Qué ventaja ofrece? ¿Por qué cambiar a git o mercurial es una mejor opción?
Vanchinathan Chandrasekaran
3
porque git y mercurial tienen mucho mejor soporte de ramas. Ventajas: no hará tales preguntas y tendrá menos dolores de cabeza para crear y mantener sucursales (actualmente estoy trabajando en un proyecto con> 1000 sucursales, en svn fue un infierno trabajar con ellas)
zerkms
Recomiendo buscar en Svnmerge.py y revisar este artículo .
Chown

Respuestas:

215

Tu svn mergesintaxis está mal.

Desea retirar una copia de trabajo de trunky luego usar la svn merge --reintegrateopción:

$ 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>.

Vea el capítulo del libro SVN sobre fusión para más detalles.


Tenga en cuenta que en el momento en que se escribió, esta era la respuesta correcta (y fue aceptada), pero las cosas han seguido adelante. Vea la respuesta de topek y http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate

blahdiblah
fuente
44
--la opción de reintegración no es obligatoria, la sucursal (en 1.6) puede fusionarse con cualquier destino cualquier cantidad de veces
Lazy Badger
1
De Verdad? ¿Sin correr el riesgo de volver a combinar los mismos conjuntos de cambios? ¿Puede proporcionar un enlace para corroborar la evidencia de esto, por favor?
Neutrino
--reintegratede hecho no es obligatorio, pero realmente se recomienda en este caso. He tratado de hacerlo sin --reintegratey terminé con cientos de conflictos. ¡Sin --reintegrateconflictos y todo estuvo bien!
tibo
17
La --reintegrateopción es simple y efectiva, PERO debe tenerse en cuenta que "Una vez que --reintegratese realiza una fusión de rama a tronco, la rama ya no se puede usar para más trabajo. No puede absorber correctamente los nuevos cambios en el tronco, ni se puede reintegrar adecuadamente al maletero de nuevo ". como se explica en el libro que ha vinculado.
Pino
3
@daveL, las fusiones hacia adelante de tronco a rama tienen sentido para mí. Sin embargo, he encontrado una función avanzada para "mantener viva una rama reiterada" (consulte stackoverflow.com/a/10163059/685806 ), además, se aplica automáticamente en las versiones más recientes del cliente.
Pino
78

Si su directorio de trabajo apunta al tronco, entonces debería poder fusionar su rama con:

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

asegúrese de emitir este comando en el directorio raíz de su troncal

topek
fuente
77
A partir de SVN 1.8. Esta es la respuesta correcta. Ver subversion.apache.org/docs/release-notes/…
GreenAsJade
@blahdiblah el fragmento de código tiene mucha información extraña. Hay una razón por la cual el resumen de estudios obtiene órdenes de magnitud de lectura más que cualquier otra parte de un estudio. Lo mismo ocurre con las pruebas UX, minimizando las tasas de rebote, etc. Es todo el mismo principio.
ahnbizcad
con 1.7 podría fusionarse sin la opción --reintegrate, y seguir desarrollando en la rama y seguir fusionándose. Lamentablemente, 1.8 obligará a que esto sea una reintegración, y no parece haber una manera de evitarlo. Esto significa que tan pronto como te fusionas, no puedes usar la rama sin pasar por el temido "baile de mantener vivo"
John Little
3
¡No olvide volver a enviar la copia de trabajo de la troncal al repositorio después de la fusión!
John
16

Haga una actualización de svn en el tronco, anote el número de revisión.

Desde el maletero:

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

Puede verificar dónde se cortó la rama del tronco haciendo un registro svn

svn log --stop-on-copy
Mike K.
fuente
Como hay varias ramas de desarrollo que están vivas al mismo tiempo, esto tampoco funcionaba para mí, este comando también estaba introduciendo cambios de otras ramas. ¿Puede ser esto un problema con el cliente SLik SVN?
Vanchinathan Chandrasekaran
Si bien esto no es inexacto, hay formas más fáciles de fusionarse con versiones más recientes de svn(como la que está utilizando OP).
blahdiblah
@VanchinathanChandrasekaran, en el comando se especifica el nombre de la rama, ya svn://path/to/branch/branchNameque solo debe extraer los cambios de esa rama y no de otras ramas. Si es así, ¡estamos en peligro!
Fredrick Gauss
1

La sintaxis es incorrecta, debería ser

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