Cambiando la copia local de trabajo

El comando svn switch transforma una copia local de trabajo existente en una rama diferente. Aunque este comando no es estrictamente necesario para trabajar con ramas, representa un buen atajo para los usuarios. En nuestro ejemplo anterior, tras crear su rama privada, obtuvo una nueva copia local del nuevo directorio del repositorio. En su lugar, puede pedirle a Subversion que cambie su copia local de /calc/trunk para que refleje la ubicación de la nueva rama

$ cd calc

$ svn info | grep URL
URL: http://svn.example.com/repos/calc/trunk

$ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
U   integer.c
U   button.c
U   Makefile
Updated to revision 341.

$ svn info | grep URL
URL: http://svn.example.com/repos/calc/branches/my-calc-branch

Tras cambiar a la rama, su copia local no diferirá en nada a una copia local nueva obtenida del mismo directorio. Y normalmente es más eficiente usar este comando, dado que a menudo las ramas sólo difieren entre sí en pocas cosas. El servidor manda únicamente el conjunto mínimo de cambios necesarios para hacer que su copia local de trabajo refleje el directorio de la rama.

El comando svn switch también permite usar la opción --revision (-r), por lo que no siempre tendrá que cambiar su copia local a la punta de la rama.

Por supuesto, la mayoría de los proyectos son más complicados que nuestro ejemplo calc, y contienen múltiples subdirectorios. Los usuarios de Subversion frecuentemente siguen un algoritmo específico al usar ramas:

  1. Copiar el 'tronco' entero a un nuevo directorio rama.

  2. Cambiar sólo parte de la copia de trabajo del tronco para que refleje esa rama.

En otras palabras, si un usuario sabe que el trabajo que quiere realizar sólo ocurrirá en un subdirectorio específico, usará svn switch para mover sólo ese subdirectorio a la rama. (¡A veces los usuarios cambian un único fichero de su copia local a la rama!) De ese modo, sigue pudiendo recibir modificaciones normales del 'tronco' en su copia local, pero las porciones que cambió a otra rama quedarán inmunes (a no ser que alguien envíe un cambio a esa rama). Esta característica añade una nueva dimensión al concepto de copia local mezclada—no sólo pueden tener las copias locales una mezcla de revisiones, sino también una mezcla de rutas de repositorio.

Si su copia local contiene un número de sub árboles cambiados a otras ubicaciones del repositorio, sigue funcionando de forma normal. Cuando la actualice, recibirá los parches propios de cada sub árbol. Cuando envíe cambios, sus cambios locales seguirán siendo aplicados como un cambio atómico único al repositorio.

Tenga en cuenta que a pesar de que su copia local de trabajo puede reflejar una mezcla de lugares de repositorio, todos estos lugares deben estar dentro del mismo repositorio. Los repositorios de Subversion todavía no son capaces de comunicarse unos con otros; esta característica está planeada para una versión de Subversion posterior a la 1.0.[18]

Dado que svn switch es esencialmente una variante de svn update, comparte el mismo comportamiento; cualquier modificación local en su copia de trabajo es preservada cuando obtiene nuevos datos del repositorio. Esto le permite realizar toda una variedad de trucos ingeniosos.

Por ejemplo, suponga que tiene una copia local de /calc/trunk y realiza un número de cambios sobre ella. De repente se da cuenta de que se suponía que tenía que realizar esos cambios en una rama. ¡No hay problema! Cambie su copia local del tronco a la rama con svn switch, y seguirá manteniendo sus cambios locales. Ahora puede probarlos y enviar los cambios a la rama del repositorio.



[18] Usted puede, no obstante, usar svn switch con el parámetro --relocate si la URL de su servidor cambia y no desea abandonar su copia de trabajo existente. Vea la sección svn switch en Capítulo 9, Referencia completa de Subversion para obtener más información y un ejemplo.