Pregunta

Aquí tenemos un repositorio SVN con un troncal y una rama para el desarrollo en una nueva versión.

La rama está casi lista para su lanzamiento ahora, así que decidí reintegrarla de nuevo en el tronco. Obviamente hubo algunos conflictos. Incluyendo bastantes conflictos de árbol de archivos que se han eliminado en el tronco.

Resolví todos los conflictos felizmente y confié el troncal.

El problema es que luego hicimos algunos cambios menores más en la rama, así que fui a reintegrar la rama nuevamente y se produjeron todos los mismos conflictos de árboles. Resolverlos no es un problema, pero hay bastantes y lleva un tiempo verificarlos y resolverlos manualmente, y no quiero tener que pasar por los mismos procesos de resolución cada vez que hago un cambio y me reintegro. Esperaba que SVN reconociera que la rama ya se había reintegrado una vez y solo se fusionaría desde el punto en que se había producido la última reintegración.

Cuando abro el gráfico de revisión, muestra el tronco y el punto en que se dividió la rama, pero no muestra la combinación. ¿Debería?

Servidor: WinServer2003 (R2sp2), VisualSVNServer (1.7.2). Cliente: WindowsXP (sp3), he estado usando TortoiseSVN (1.6.5) para hacer todo esto, pero también tengo instalado el cliente de línea de comandos.

Realizo la fusión asegurándome de que tengo el tronco actualizado, y utilizando TortoiseSVN para hacer una combinación, y selecciono " Reintegrar una rama " cuando se presenta con el diálogo de opciones. Establecí la profundidad de fusión en " Copia de trabajo "

¿Estoy manejando este escenario incorrectamente? ¿Debería estar haciendo algo diferente?

(Tal vez tengamos mal el diseño de nuestro repositorio. Nos bifurcamos desde el troncal, hicimos todos los cambios para la nueva versión en la rama, ahora se debe a la versión que estamos fusionando la rama de nuevo con la troncal. Quizás esta es la enfoque incorrecto, he leído que algunas personas lo hacen al revés, hacen todos los cambios en el troncal y hacen la rama solo cuando está casi listo para el lanzamiento y la rama se convierte en la versión de lanzamiento compatible)

¿Fue útil?

Solución

El siguiente es del final de este capítulo del libro SVN:

  

En Subversion 1.5, una vez que se realiza una fusión de reintegración de rama a troncal, la rama ya no se puede utilizar para continuar trabajando. No es capaz de absorber correctamente los nuevos cambios de troncales, ni tampoco puede reintegrarse de manera adecuada en el troncal. Por este motivo, si desea seguir trabajando en su rama de funciones, le recomendamos que la destruya y luego la vuelva a crear desde el tronco

Otros consejos

En esta situación, no fusionaría el código de la rama al tronco hasta que hayas completado el desarrollo.

I me se fusionaría de tronco a rama para garantizar que su sucursal esté actualizada con cualquier corrección aplicada al tronco. Realice esta actividad periódicamente para asegurarse de que su rama dev contenga todas las correcciones. Luego, en el punto en el que el desarrollo se convierte en el lanzamiento en vivo, haga la fusión de rama a troncal como una actividad única.

Mi respuesta hace algunas suposiciones que incluyen:

  • Tienes baúl vivo y dev. ramas
  • solo tienes una vida versión (es decir, no mantener legado versiones)

Espero que ayude.

Ahora es posible hacer una fusión bidireccional repetida

Una palabra de precaución. Esta respuesta explica cómo se debe hacer, pero si omite algún paso, lo lamentará. Por ejemplo, la combinación --reintegrate debe ser completamente trivial (todas las diferencias ya se resolvieron en la rama), ya que de lo contrario, perderá silenciosamente los cambios que realizó en el paso de combinación --reintegrate cuando continúe trabajando en su rama. La alternativa es, en cambio, eliminar y volver a crear la rama cada vez después de --reintegrate.


En al menos svn versión 1.6 y posteriores, puede realizar una fusión bidireccional repetida. Puede combinar desde la rama 'principal' a la rama secundaria tantas veces como desee con solo svn merge, pero cada vez que fusione la rama nuevamente con la principal, debe dar la opción

--reintegrate como se menciona en las otras respuestas.

Lo que también debe hacer es informar a su sucursal que lo integró en un segundo paso manual (con esa sucursal comprobada y actualizada) con el comando

svn merge --record-only -c 391 ^/calc/trunk

391 aquí representa el número de confirmación de fusión de la confirmación de rama de reintegración que acaba de hacer en calc / trunk.

Si lo echas de menos, es posible que aún funcione o que tengas que volver a resolver los conflictos de combinación que ya resolviste la próxima vez que lo hagas. Después del paso de solo registro, sus sucursales estarán listas para seguir trabajando o fusionándose. Es una tontería (sobre todo si eres mimado por Git como yo, donde las cosas simplemente funcionan), pero si lo haces de acuerdo con este ritual, funciona, y ambas ramas siempre están abiertas para nuevos compromisos.


Todo esto está documentado en el libro SVN en reintegrar dos veces

  

Esta combinación utiliza la sintaxis de combinación cherry-picking, que se introdujo   en la sección llamada "Cherrypicking". Continuando con la carrera.   Ejemplo de la sección llamada "Reintegrar una Rama", donde   la revisión X era la revisión 391:

$ cd my-calc-branch $ svn update Updating '.': Updated to revision
393. $ svn merge --record-only -c 391 ^/calc/trunk
--- Recording mergeinfo for merge of r391 into '.':  U   . $ svn commit -m "Block revision 391 from being merged into my-calc-branch."
 Sending        .

 Committed revision 394.
  

Ahora su rama está lista para absorber los cambios del tronco nuevamente. Después de otra sincronización de su rama al tronco, incluso puede reintegrar la rama por segunda vez. Si es necesario, puedes hacer otra combinación de solo registro para mantener viva la rama. Enjuague y repita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top