2009-02-25 11 views
30

Digamos que las personas han estado trabajando en el tronco y en una rama de un repositorio de Subversion. Quiero descartar cualquier cambio en el tronco y reemplazarlo con una copia de la rama.Reemplazar el tronco con la rama en Subversion

Como se sugirió en another question, puedo simplemente mover o quitar el tronco, y luego copiar la rama al tronco. Pero luego, la historia del tronco se reemplaza con la historia de la rama. ¿Qué pasa si quiero conservar el historial del trunk?

Creo que lo que quiero es algo así como una fusión, pero en la que se ignoran los cambios del destino y simplemente se reemplaza con la fuente. ¿Cómo haría esto en Subversion? ¿Esto se considera una buena práctica?

+0

Aún puede acceder al historial del trunk al examinar revisiones antiguas ... –

+0

Pero cualquier herramienta que examine el historial de un archivo (por ejemplo, Subclipse) solo mostrará las revisiones en la bifurcación. Después de la fusión/copia, preferiría ver una nueva revisión en el tronco, que contenga todas las adiciones/cambios/eliminaciones de la operación de copia. –

+0

+1: Necesito hacer esto también. @JW ¿Hiciste que esto funcione? –

Respuesta

4

Combinar todos los cambios de la rama al tronco, y luego resolver todos los conflictos con

svn resolve path --accept theirs-full 

O bien, puede decirle a la fusión de hacerlo:

svn merge -rX:HEAD url/of/branch trunk\wc --accept theirs-full 

Después de una combinación de tales, tiene una copia de trabajo que se parece a la que está en la rama. Todo lo que tienes que hacer es enviar la copia de trabajo de ese tronco.

+3

¿no conservará los cambios realizados en el tronco desde el punto de ramificación (al menos cuando no está en conflicto)? Estoy bastante seguro de que el resultado de tal fusión no se garantiza que se parezca al tronco, pero usted es el experto ... – rmeador

+1

primero podría hacer una combinación inversa en el tronco para deshacer todos los cambios desde que creó la rama, luego cometer esa fusión inversa. Después de eso, puedes unir la rama al tronco. – Stefan

+0

¿qué tal un simple 'svn rm trunk' seguido de 'svn copy branch trunk' (o svn move branch trunk)? –

1

No estoy muy seguro de entender lo que estás tratando de hacer. ¿Qué desea que suceda con todos los cambios realizados en el tronco después de que se creó la rama? ¿Desea que no aparezcan en el registro cuando visualiza el historial de un archivo después de la fusión? Si es así, eso es lo que obtendrás si eliminas el enlace troncal y copias la bifurcación en su lugar: la bifurcación comparte el historial con el enlace troncal antes de ser ramificado, por lo que es el mismo excepto las revisiones realizadas después de la bifurcación.

Si desea mantener el historial de troncales, pero simplemente pisar todos los cambios realizados entre la bifurcación y la fusión, ese es un problema un poco más complicado. Creo que si haces una fusión que ignora los ancestros (hay una opción --ignore-ancestry), reemplazará el contenido del enlace troncal con la rama. También es posible que desee probar la opción --force con la fusión (tanto en lugar de y en conjunción con --ignore-ancestry). Pruébalo de diferentes maneras para ver si obtienes los resultados que deseas ...

Si eso falla, siempre puedes fusionar de forma inversa todos los cambios en el tronco desde el punto de ramificación, luego unir en la rama. Es probable que esto provoque algunos conflictos, que por supuesto querrá resolver usando la versión de su sucursal. No sé si alguna de estas ideas es óptima.

+0

Quiero la segunda de tus dos opciones: pisar todos los cambios en el maletero. –

4

Pre-1.5 esto es simple: asegúrese de que su copia de trabajo apunte a la línea principal, luego haga "svn merge url-of-trunk url-of-branch". Los cambios que recibe son delta entre el tronco y la rama, efectivamente "me dan todo lo que se necesita para que el tronco se vea como una rama".

No tengo idea si las nuevas capacidades de fusión de 1.5 cambian este escenario.

+1

La fusión de la bifurcación con el troncal podría no dar el mismo resultado que la copia del estado de la sucursal en lugar de la troncal. Ni siquiera en las versiones anteriores a la 1.5 – JanM

32

aunque es un hilo bastante viejo, pero todavía compartir mi experiencia

Recientemente hicimos esto para uno de nuestros proyectos y seguimos las directrices como:

svn copy <repos/trunk> <repos/tag/old_trunk> -m "copied old trunk as tag" 

svn delete <repos/trunk> -m "deleted trunk temporarily" 

svn copy <repos/branch/new_fetaure_branch> <repos/trunk> -m "placed new trunk with features" 

Siguiendo estos pasos mantiene la historia tronco intacto y reemplace la nueva rama de características como troncal.

+0

Si mira el historial de la troncal actual, verá el historial de la nueva rama, hasta el momento en que la copió. Para ver el historial del viejo baúl, debe especificar la revisión antes de eliminarlo. –

+0

puede ver el historial del viejo baúl en/tag/old_trunk –

+0

Uso tortuga, pero esta será mi estrategia. –

0
trunk  remplace (trunk with your branch) 
*----x  * ----> 
\   | 
    \   | 
    *--------| 
    branch 

Esta rama se creó a partir del tronco así que tenga cuidado de no eliminar brutalmente el tronco (problemas con los ancestros). En primer lugar hacer una etiqueta con su tronco, la copia de seguridad, en cualquier caso ...

Sugiero hacer así:

Usando Eclipse SVN

  1. botón derecho del ratón> Equipo rama/etiqueta (cree una etiqueta - su copia de seguridad)

  2. Equipo> cambie otra rama/etiqueta ... seleccione su bifurcación, asegúrese de que la bifurcación esté cargada correctamente.

  3. en la rama: Team> disconnect. Eliminar información SVN.

  4. Equipo> comparte proyecto ... elige tu maletero.

  5. Team> commit in your trunk.

  6. haga clic derecho ... seleccione Comparar con .. Sucursal/etiqueta -> busque su sucursal. Si todo está bien, tendrá: "No hay diferencias entre las entradas seleccionadas".

Espero que ayude.

Cuestiones relacionadas