Cómo actualizar correctamente una rama de la característica de la línea externa?

StackOverflow https://stackoverflow.com/questions/2146426

  •  23-09-2019
  •  | 
  •  

Pregunta

SVN libro dice :

...Another way of thinking about this pattern is that your weekly sync of trunk to branch is analogous to running svn update in a working copy, while the final merge step is analogous to running svn commit from a working copy

Me parece que este enfoque muy poco práctico en grandes desarrollos, por varias razones, en su mayoría relacionados con la etapa de reinserción.

  1. A partir de SVN v1.5, la fusión se lleva a cabo revoluciones por rev. Cherry-picking las áreas a ser fusionadas US causaría para resolver los conflictos tronco-rama dos veces (un tronco cuando la fusión de las revisiones a la FB, y una vez más cuando la fusión de la espalda).
  2. Tamaño del repositorio:. Los cambios del tronco podrían ser importantes para una gran base de código, y la copia de los ficheros de diferencias (a diferencia de la copia SVN) de tronco en otros lugares pueden ser una sobrecarga significativa

En su lugar, hacer lo que llamamos "re-ramificación". En este caso, cuando se necesita una parte significativa de los cambios del tronco, una nueva rama de la característica se abre desde el tronco actual, y la combinación es siempre hacia abajo (función ramas - ramas> estables -> tronco). Esto no va a lo largo de las directrices de libros SVN y los desarrolladores ven como dolor adicional.

¿Cómo se maneja esta situación?

¿Fue útil?

Solución 2

Después de la investigación:

Después de muchas sesiones de reflexión en VisionMap, incluyendo discusiones F2F Artyom, la apertura de una caja de libro de SVN, etc - parece que esto no es posible hacerlo. Una rama de la característica no es totalmente como copia de trabajo. La única forma de trabajo para actualizar es recrear una nueva rama, como se describió anteriormente.

Otros consejos

  

A partir de SVN v1.5, la fusión se lleva a cabo revoluciones por rev. Cherry-picking las áreas a ser fusionadas US causaría para resolver los conflictos tronco-rama dos veces (uno cuando la fusión de las revisiones troncales para el FB, y una vez más cuando la fusión de la espalda)

A continuación, usted está haciendo algo mal!

Vamos a ver:

trunk    fb
 ---------\
 r1-10    |
 r11-20   |
 r20-30   |

En general, si desea que los cambios realizados en 11-20, a continuación, la mejor práctica es la de integrar a 1-20 fb y obtener todo lo que hay.

A continuación, cuando se hace fb, fusión 20-30 y después copiar fb en el tronco (sin combinación!).

Si decide fusionar solamente r11: 20, bien, al final tendrá que fusionar r1: 10 y r20: 30 y luego Copiar fb en el tronco.

No hay manera de combinar los cambios dos veces!

Asumo que es probable que sí lo siguiente:

copy trunk->fb
merge 11:20 -> fb.
merge fb-1:30 -> trunk !!!!! WRONG

No se puede hacer esto ya que sería fusionar 11:20 dos veces. Siempre se debe combinar código en una dirección solamente.

Forma correcta:

copy trunk->fb
merge 1:20 -> fb.
merge 21:30 -> fb (now fb=trunk+feature)
copy fb -> trunk

Editar

Así que los pasos correctos son:

  1. Crea rama de la característica (FB) del tronco (tronco copia de rama de la característica con SVN-copia)

    FB_0=trunk_0
    
  2. Trabajo en FB.

    FB_1=FB_0 + change_a
    
  3. Combinar todos los próximos cambios desde el tronco a FB.

    trunk_1=trunk_0 + tr_change_a;
    FB_2 = FB_1 + (trunk_1 - trunk_0) == trunk_0 + change_a + tr_change_a
    
  4. Trabajo en FB

    FB_3 = FB_2 + change_b
    
  5. Combinar todos los próximos cambios sin combinar desde el tronco a FB.

    trunk_2=trunk_1 + tr_change_n;
    FB_4 = FB_3 + (trunk_2 - trunk_1) == trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    
  6. En este punto tenemos una rama de la característica que consiste en todos y nuevas características todos los cambios en el tronco. Así que sólo tienes que copiar la diferencia entre dos ramas.

    trunk_3 = trunk_2 + (FB_4 - trunk_2) = FB_4 = trunk_0 + change_a + change_b + tr_change_a + tr_change_b
    

    Ahora FB borra como maletero tiene todos los cambios que necesitamos.

    El último paso es ejecutado por:

    svn merge /path/to/trunk@LatestRev /path/to/branches/fb@LatestRev .
    svn ci
    

    O en ordinaria diferencia toma lenguaje entre el tronco y la rama y ponerlos en el tronco haciéndolos equivalentes.

Este patrón se describe en http://svnbook.red-bean.com/en/1.4/svn.branchmerge.commonuses.html#svn.branchmerge.commonuses.patterns.feature

Ahora bien, si esto no funciona para usted, entonces no entiendo la pregunta.

Edit2: Para svn-1,5

Cuando se trabaja con SVN-1.5 que puede fusionarse mucho más simple:

Cuando se trabaja en la rama de la característica que acaba fusiona cambios de tiempo tronco a tiempo:

$ svn merge /path/to/trunk
Solve conflicts
$ svn ci

Se alinear su FB con todos los cambios en el tronco. Al final de FB se ejecuta este procedimiento una vez más para asegurarse de que todo está actualizada. La vas al tronco y de ejecución

$ svn merge --reintegrate /path/to/fb
$ svn ci

En el último no debe haber conflictos si está trabajando como se muestra.

Somos una empresa pequeña, por lo que no sabe si esta solución va a aplicar a su situación. Lo que hacemos es una fusión de revoluciones por rev desde el tronco a la rama estable. Podemos hacerlo de 2 formas diferentes: - solución realmente necesario, fusionar justo después de comprometerse con el tronco - fix peligroso / cambio. Esperamos algunos días hasta que el cambio está a prueba en el tronco y luego fusionar

Con esta fusión continua evitamos toneladas de conflictos.

Mis 2 centavos.

Lamentablemente todo lo mencionado puede ser pensado como hacks. Actualización desde el tronco en una rama puede dar lugar a problemas muy graves cuando la lleve de nuevo al tronco y abre la posibilidad de que el peor de todos los conflictos, los conflictos de árboles. Esto se debe a que los directorios no son tratados como ciudadanos de primera clase. El mejor enfoque es utilizar Mercurial con el extensión SVN SVN como su cliente estándar. Se le permite seguir usando SVN al obtener el poder de la manipulación de la carpeta de Mercurial.

A continuación, en el lado wworkstation se puede utilizar una serie de enfoques que proporciona una serie de características para adaptarse a muchas situaciones de más de uno de SVN. Puede utilizar parches regulares, colas de parche, actualización de una copia local del tronco sin afectar el tronco común y varios otros enfoques.

Este enfoque funciona alrededor de todos los lados downn de SVN. Tenía interruptor de tto a este enfoque debido a circunstancias similares. Incluso si usted no utiliza este enfoque de inmediato al menos debe probarlo lo antes posible.

Yo creo que tenga que romper una lanza para @Artyom aquí. Yo también creo que si usted tiene que

  

resolver los conflictos tronco-rama dos veces

algo está mal. Y creo que el argumento @Artyoms / solución es bastante sólido.

Creo que una de las cosas de menor importancia @Artyom podría haber escrito más claro es que en el final donde "copiar" fb a trunk no utiliza svn copy pero svn merge (o svn merge --reintegrate). Esta podría ser la razón por la que no encuentra el patrón de "copia de combinación" en patrones comunes de ramificación .

Como estoy luchando con la comprensión de lo que está haciendo hasta ahora, no estoy seguro de qué más decir.

Esto es lo que escucho:

  

En lugar de ello, hacemos lo que llamamos   "Re-ramificación". En este caso, cuando una   parte significativa de los cambios del tronco es   es necesario, se abre una nueva rama de la característica   desde el tronco actual, ...

Ahora tiene una nueva rama (llamémosle b2) que es equivalente a tronco, ¿verdad? Y donde es la "parte significativa del tronco cambios necesarios"? Asumo en fb?

  

... y la fusión es   siempre hacia abajo (ramas de funciones ->   tronco -.> ramas estables)

Pero a medida que acaba de crear b2 del tronco no hay nada que se funden en el tronco, no? Y no se está fusionando los cambios de B2 a fb o bien (ya que esto sería lo mismo que la fusión de tronco para fb ...). Entonces, ¿cómo los "trozos significativos de cambios" se meten en fb? Y una vez que están allí, ¿por qué se desea combinar de nuevo al tronco (ya que se trata de dónde venían en el primer lugar)?

En realidad los siguientes enlaces la sección denominada“Tracking Merges manualmente " y / o la sección llamada“Fusionar una rama completa con otra " proporcionada en la documentación de SVN 1.4 (lo sé, no se utiliza SVN 1.4, pero creo que se aplica de todos modos) Común de ramificación podría ayudar a aclarar algunas cosas. Estos enlaces están "desaparecidas" en la documentación (probablemente debido a la nueva opción --reintegrate en merge) 1.5.

Realmente parece estar fusión de los mismos cambios dos veces y realmente cree que no debe (necesidad de) hacer eso.

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