version-control tortoisesvn merge-tracking

version control - ¿Qué estoy haciendo mal con la fusión de SVN?



version-control tortoisesvn (4)

Cuando SVN con el seguimiento de combinación funciona, es realmente bueno, me encanta. Pero sigue torciéndose. Estamos utilizando TortoiseSVN. Continuamente recibimos el siguiente mensaje:

Error: la reintegración solo se puede usar si las revisiones 1234 a 2345 se fusionaron previamente de / Trunk a la fuente de reintegración, pero este no es el caso

Para referencia, este es el método que estamos usando:

  1. Crear una rama
  2. Desarrollar en la rama.
  3. Ocasionalmente, combine un rango de revisiones desde el Tronco a la Rama
  4. Cuando la rama es estable, reintegrar una rama de la rama al tronco
  5. Eliminar la rama

I Fusionar un rango de revisiones desde el troncal a la rama (dejando el rango en blanco, por lo que debe ser todas las revisiones) justo antes de la operación de reintegración, por lo que la rama debe estar correctamente sincronizada con el tronco.

En este momento, el Troncal tiene múltiples propiedades de seguimiento de fusión SVN asociadas. ¿Deberia? ¿O no debería una Reintegración agregar información de seguimiento de fusión?

¿Hay algo mal con nuestro proceso? Esto hace que SVN sea inutilizable: 1 de cada 3 reintegraciones me obliga a sumergirme y hackear la información de seguimiento de fusión.


Este problema a veces ocurre cuando se ha hecho una combinación parcial de troncal a rama en el pasado. Una fusión parcial es cuando se realiza una fusión en todo el árbol pero solo se confirma una parte. Esto le dará archivos en su árbol que tienen datos mergeinfo que no están sincronizados con el resto del árbol.

El mensaje de error --reintegrate anterior debería enumerar los archivos con los que svn está teniendo problemas (al menos lo hace en svn 1.6).

Tu también puedes:

  1. Combine los archivos de problemas manualmente desde el tronco a la rama, utilizando el rango del mensaje de error. Nota: debes restar 1 del inicio del rango, por lo que el comando que ejecutarías sería:

    cd <directory of problem file in branch working copy> svn merge -r1233:2345 <url of file in trunk> svn commit

    o

  2. Si está seguro de que el contenido de los archivos en su rama es correcto y solo quiere marcar los archivos como fusionados, puede usar la --record-only para svn merge :

    cd <directory of problem file in branch working copy> svn merge --record-only -r1233:2345 <url of file in trunk> svn commit

(Creo que puedes usar --record-only en todo el árbol, pero no lo he probado y deberías estar absolutamente seguro de que no hay fusiones reales que deban provenir del tronco)


Sospecho que no estás siguiendo las instrucciones de combinación correctamente:

"Ahora, use svn merge con la opción --reintegrate para replicar los cambios de su rama nuevamente en el tronco. Necesitará una copia de trabajo de / trunk. Puede obtener uno haciendo un svn checkout, dragando una copia de trabajo de tronco antigua. desde algún lugar de su disco, o mediante el uso del interruptor svn (consulte la sección "Traversing Branches"). Su copia de trabajo troncal no puede tener ediciones locales o contener una mezcla de revisiones (consulte la sección llamada "Copias de trabajo de revisión mixta"). Si bien estas suelen ser las mejores prácticas para fusionarse de todos modos, son necesarias cuando se utiliza la opción --reintegrate.

Una vez que tenga una copia de trabajo limpia del tronco , estará listo para volver a unir su rama: "

Tengo pocos problemas con la fusión.


Su problema es que está tratando de usar Reintegrate merge en una rama que ha sido "dañada" al tener una "half merge" ya hecha. Mi consejo es ignorar la reintegración y atenerse a la fusión de revisiones si este es su flujo de trabajo.

Sin embargo, la razón principal por la que recibe errores es porque SVN está realizando algunas comprobaciones por usted. En este caso, si la combinación tiene mergeinfo extra de archivos individuales allí, entonces svn producirá una inestabilidad y evitará que se fusione, principalmente porque este caso puede producir errores que tal vez no note. Esto se denomina una fusión de subárbol en la terminología de reintegración de svn (lea la sección Reintegrarse al rescate, en particular la polémica verificación de reintegración al final).

Puede detener la grabación de mergeinfo cuando realice las fusiones intermedias, o simplemente dejar la rama en paz hasta que esté lista, entonces la fusión recogerá los cambios realizados en el troncal. Creo que también puede omitir esta comprobación solo fusionando todo el tronco a la rama, no archivos individuales, lo que mantiene a Mergeinfo a salvo para la reintegración final al final.

EDITAR:

@randomusername : Creo que (nunca se miró con tanta atención ) el movimiento es que cae en la trampa de ''fusión parcial''. Una característica interesante de SVN es que puede realizar un pago disperso: solo obtenga una copia parcial de un árbol. Cuando fusionas un árbol parcial, SVN no puede decir que todo se fusionó como obviamente no lo fue, por lo que registra el mergeinfo de manera ligeramente diferente. Esto no ayuda con la reintegración ya que la reintegración tiene que fusionar todo con el tronco, y ahora encuentra que algunos bits se modificaron sin ser fusionados, por lo que se queja. Un movimiento parece más o menos lo mismo: una parte del árbol ramificado ahora aparece de forma diferente en el mergeinfo de lo que espera. No me molestaría en reintegrarme, y seguiría con la combinación normal del rango de revisión. Es una buena idea, pero tratar de ser demasiadas cosas para demasiados usuarios en demasiadas circunstancias diferentes.

La historia completa para mergeinfo está aquí.


Salto de conejito podría ser la solución.

Básicamente, en lugar de fusionar continuamente los cambios de troncales en una sola rama ( branches/foo , llamémosla), cuando desee extraer esos cambios de troncales:

  1. Copie el tronco a una nueva rama ( branches/foo2 ).
  2. Combinar en los cambios de la rama antigua (combinar branches/foo en branches/foo2 ).
  3. Eliminar la rama antigua (eliminar branches/foo ).