viernes, 25 de septiembre de 2009

Manejo de ramas en Subversion desde Eclipse

En este artículo vamos a ver cómo trabajar desde Eclipse con las ramas de desarrollo de un proyecto gestionado en Subversion.

Lo primero que vamos a hacer es crear una rama del proyecto, en la cual podríamos desarrollar una nueva característica del proyecto o corregir un error. Para crear esta rama hacemos clic sobre el proyecto con el botón derecho del ratón y vamos a Team -> Branch/Tag:

Para Subversion es lo mismo una rama (branch) que una etiqueta (tag). Una estiqueta es una rama sobre la que no se incluyen cambios. A continuación seleccionamos el directorio remoto donde se almacenará esta rama. Por convencion, todas las ramas se guardan bajo el directorio branches del repositorio:

Seleccionamos la revisión sobre la que se va a crear la rama. Como queremos que se haga sobre la última versión del desarrollo, seleccionamos la opción por defecto (HEAD):

Por último podemos incluir un comentario e indicar que queremos que nuestra copia local del proyecto se cambie a esta rama para poder desarrollar sobre ella:

Tras esto ya se habra creado la rama, con lo que tendremos la siguiente estructura en nuestro repositorio:

Además, la copia local sobre la que estamos trabajando desde Eclipse habrá pasado a ser la de la rama. Cualquier modificación que hagaos y subamos al repositorio no afectará al trunk del proyecto, sino que solo afectará a dicha rama.

Ahora haremos todas las modificaciones que queramos sobre dicha rama ya las subiremos al repositorio haciendo Commit. Periódicamente deberemos actualizar dicha rama con los posibles cambio que haya podido haber en el trunk, para que nuestra copia no se desvíe del desarrollo principal. Para esto deberemos hacer merges del trunk sobre nuestra rama, haciendo clic con el botón derecho del ratón y yendo a Team -> Merge:

Seleccionamos el tipo de merge que vamos a realizar. Como lo que queremos hacer es actualizar una rama con las modificaciones del trunk, elegimos la primera opción, Merge a range of versions:

Si la copia local no está actualizada saldrá un mensaje para que hagamos un Update. A continuación, elegimos desde donde nos queremos actualizar, que, como hemos dicho, será el trunk:

Hacemos Finish en la siguiente pantalla con las opciones que aparecen por defecto, para que me avise de los posibles conflictos que aparezcan en el merge y me deje decidir:

Si se han hecho cambios en el trunk mientras nosotros trabajabamos en nuestra rama, aparecerán conflictos. La pantalla siguiente nos avisa de que hay un conflicto en una clase que debemos resolver, para lo que se lanzará un editor gráfico:

El editor nos permitirá corregir manualmente los confictos en esta clase:

Una vez corregidos los conflicto, salvamos el fichero y lo cerramos. Aparece la siguiente pantalla:

Indicamos que ya hemos resuelto los conflictos y finalizará el merge:

Cuando hayamos finalizado de trabajar con esta rama habrá que reintegrarla en el trunk haciendo un merge de forma similar. En primer lugar cambiamos la copia local por una vista del trunk:


Después hacemos un merge con la opción Reintegrate a branch:

Seleccionamos la rama que queremos reintegrar:

El resto del proceso es similar a lo anteriormente visto.

Hemos visto cómo trabajar con una rama en paralelo a la línea principal del desarrollo manteniendo la sincronía con ésta y cómo reintegrar esta rama con todos sus cambios a la línea principal.

15 comentarios:

  1. Excelente, llevo poco tiempo trabajando con branchs y al final aprendí mas o menos lo que has escrito pero a base de tortazos (prueba y error).

    Hay si hubiera buscado este blog antes!!.

    El artículo es claro y sencillo de comprender, y me ha aclarado justo lo que quería aclarar

    ResponderEliminar
  2. Me alegro de que te haya sido útil.

    De todas maneras, seguro que los tortazos que te diste te ha servido para entenderlo mejor.

    ResponderEliminar
  3. Muchas gracias Jorge! Muy útil :) Una pregunta, has hecho algún post explicando cómo se hace un merge desde una branch al trunk (actualizar el trunk con cambios echos en un branch)? o conoces algún sitio donde esté bien explicado? (he mirado en otras partes pero no he encontrado sitios que esté explicado claramente).

    Gracias! :)

    Laia

    ResponderEliminar
  4. Pues es justo lo que explico en la parte final del artículo...

    ResponderEliminar
  5. Excelente entrada, me ha sido muy útil. He trabajado ya algunos días con el pero ahora tengo un problema, al tratar de reintegrar un branch al trunk me dice: "The working copy should not have any switched children. Switch back switched children in working copy before merging" y los archivos en conflicto tienen el siguiente icono http://yfrog.com/mnlbkp ¿alguna idea?

    ResponderEliminar
  6. Gracias, me sirvió bastante tu blog, en ninguna parte explicaban la lógica en desarrollo ... solo como subir y updatear ...

    ResponderEliminar
  7. Muchisimas gracias, es realmente dificil encontrar material con explicaciones tan claras.

    ResponderEliminar
  8. Alguien sabe porque me puede estar dando este problema al crear una rama de mi proyecto principal
    Esto es lo que pone la consola de Eclipse:

    copy -rHEAD http://localhost/post http://localhost/branches/post/1.0
    RA layer request failed

    svn: OPTIONS of 'http://localhost': 200 OK (http://localhost)

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Por cierto, una gran guía Jorge. Muchas gracias por el aporte

    ResponderEliminar
  11. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  12. Nada ya he solucionado el problema, por si a alguien le hace falta.... Es necesario crear los branches en el mismo repositorio del proyecto, con lo que es conveniente tener una carpeta trunk con el proyecto principal y una de branches para las ramas.

    Cuando tratas de crear otro repo para las ramas e intentes crear una te sucederá lo que me ha pasado a mi :P

    ResponderEliminar
  13. No se desde que fecha la reintegración de ramas como svn desde eclipse ha cambiado, por la interfaz, la opción de reintegrar ramas ya no existe. No sé si animarías a documentarlo?

    ResponderEliminar
  14. Genial tutorial, muy bien explicado! Gracias

    ResponderEliminar
  15. Hola, tengo una duda/problema, quiero hacer un commit creando un nuevo tag a partir de otro ya existente.
    No tengo subido el codigo a la rama trunk porque estos nuevos cambios son un fix de la version anterior.
    Es decir, tengo la version 1.1.1 subido a un tag.He realizado cambios en esta version, y lo quiero subir a svn directamente a un nuevo tag con version 1.1.2, sin pasar por el trunk , como puedo hacer esto ¿?

    ResponderEliminar