Haciendo ramas / etiquetas

Una de las características de los sistemas de control de versiones es la posibilidad de aislar cambios en una línea separada de desarrollo. Esto se conoce como una rama. Las ramas se utilizan a menudo para probar nuevas características sin molestar la línea principal del desarrollo con errores de compilación y errores. Tan pronto como la nueva característica es lo suficiente estable, la rama de desarrollo se fusiona de nuevo en la rama principal (trunk, troncal/tronco).

Otra característica de los sistemas de control de versiones es la posibilidad de marcar revisiones particulares (por ejemplo, una versión lanzada a producción), para que pueda en cualquier momento recrear un cierto entorno o compilación. Este proceso se conoce como etiquetar.

Subversion no tiene comandos especiales para hacer ramas o etiquetas, pero en cambio utiliza lo que se denomina copias baratas. Las copias baratas son similares a los vínculos duros de Unix, que significa que en vez de hacer una copia completa en el repositorio, se crea un vínculo interno, apuntando a una revisión y árbol específicos. Como resultado, las ramas y las etiquetas son muy rápidas de crear, y casi no conllevan espacio extra en el repositorio.

Crando una rama o etiqueta

Si ha importado su proyecto con la estructura de directorios recomendados, crear una rama o una etiqueta es muy simple:

Figura 4.54. El diálogo Rama/Etiqueta

El diálogo Rama/Etiqueta


Seleccione la carpeta en su copia de trabajo de la que desea hacer una rama o una etiqueta, y luego seleccione el comando TortoiseSVNRama/Etiqueta....

The default destination URL for the new branch will be the source URL on which your working copy is based. You will need to edit that URL to the new path for your branch/tag. So instead of

http://svn.collab.net/repos/ProjectName/trunk
      

you might now use something like

http://svn.collab.net/repos/ProjectName/tags/Release_1.10
      

If you can't remember the naming convention you used last time, click the button on the right to open the repository browser so you can view the existing repository structure.

intermediate folders

When you specify the target URL, all the folders up to the last one must already exist or you will get an error message. In the above example, the URL http://svn.collab.net/repos/ProjectName/tags/ must exist to create the Release_1.10 tag.

However if you want to create a branch/tag to an URL that has intermediate folders that don't exist yet you can check the option Create intermediate folders at the bottom of the dialog. If that option is activated, all intermediate folders are automatically created.

Note that this option is disabled by default to avoid typos. For example, if you typed the target URL as http://svn.collab.net/repos/ProjectName/Tags/Release_1.10 instead of http://svn.collab.net/repos/ProjectName/tags/Release_1.10, you would get an error with the option disabled, but with the option enabled a folder Tags would be automatically created, and you would end up with a folder Tags and a folder tags.

Ahora debe elegir el origen de la copia. Aquí tiene tres opciones:

Revisión HEAD en el repositorio

La nueva rama se copia directamente en el repositorio desde la revisión HEAD. No se necesita transferir datos desde su copia de trabajo, y la rama se crea muy rápidamente.

Revisión específica en el repositorio

La nueva rama se copia directamente en el repositorio, pero puede elegir una versión anterior. Esto es útil si se olvidó de crear una etiqueta cuando lanzó una versión de su proyecto la semana pasada. Si no puede acordarse del número de revisión, pulse el botón a la derecha para mostrar el registro de revisiones, y seleccione el número de revisión desde allí. De nuevo no se transfiere datos desde su copia de trabajo, y la rama se crea muy rápidamente.

Copia de trabajo

La nueva rama es una copia idéntica de su copia de trabajo local. Si ha cambiado algunos archivos a una revisión anterior en su copia de trabajo, o si ha hecho cambios locales, esto es exactamente lo que irá a la copia. Naturalmente, esta clase de etiquetado complejo conlleva transferir datos desde su copia de trabajo al repositorio si no existe ya allí.

Si desea que su copia de trabajo se cambie automáticamente a la rama recién creada, utilice la casilla Cambiar la copia de trabajo a la nueva rama/etiqueta. Pero si lo hace, asegúrese primero que su copia de trabajo no contenga modificaciones. Si las tiene, esos cambios se mezclarán en la copia de trabajo de la rama cuando se haga el cambio.

If your working copy has other projects included with svn:externals properties, those externals will be listed at the bottom of the branch/tag dialog. For each external, the target path and the source URL is shown.

If you want to make sure that the new tag always is in a consistent state, check all the externals to have their revisions pinned. If you don't check the externals and those externals point to a HEAD revision which might change in the future, checking out the new tag will check out that HEAD revision of the external and your tag might not compile anymore. So it's always a good idea to set the externals to an explicit revision when creating a tag.

The externals are automatically pinned to either the current HEAD revision or the working copy BASE revision, depending on the source of the branch/tag:

Tabla 4.1. Pinned Revision

Copy SourcePinned Revision
Revisión HEAD en el repositorioexternal's repos HEAD revision
Revisión específica en el repositorioexternal's repos HEAD revision
Copia de trabajoexternal's WC BASE revision


externals within externals

If a project that is included as an external has itself included externals, then those will not be tagged! Only externals that are direct children can be tagged.

Pulse Aceptar para confirmar la nueva copia al repositorio. No se olvide de proporcionar un mensaje de registro. Tenga en cuenta que la copia se crea dentro del repositorio.

Tenga en cuenta que, salvo que haya optado por cambiar su copia de trabajo a la rama recién creada, crear una etiqueta o una rama no afecta a su copia de trabajo. Incluso si creó la rama desde su copia de trabajo, estos cambios se confirmarán en la rama nueva, no en el tronco, así que su copia de trabajo todavía se marcará como modificada respecto al tronco.

Otras formas de crear una rama o etiqueta.

Puede también crear una rama o etiqueta sin tener una copia de trabajo. Para ello, abra el navegador de repositorio. Allí puede arrastrar carpetas a un nuevo sitio. Debe mantener pulsada la tecla Ctrl mientras arrastra para crear una copia, si no la carpeta será movida, no copiada.

Puede también arrastrar una carpeta con el botón derecho del ratón. Una vez suele el botón del ratón podrá elegir en el menú contextual si quiere mover o copiar la carpeta. Por supuesto, para crear una rama o etiqueta debe copiar la carpeta, no moverla.

Otra manera es a partir del diálogo de log. Puedes mostrar el diálogo de log para por ejemplo el trunk, seleccionar una revisión (ya sea la revisión HEAD que se encuentra al principio u otra anterior), hacer clic con el botón derecho y escoger create branch/tag from revision....

Obtener o cambiar...

...esa (realmente no) es la cuestión. Mientras que obtener descarga todo de la rama elegida a su directorio de trabajo, TortoiseSVNCambiar... sólo transfiere los datos cambiados a su copia de trabajo. Bueno para la carga de la red, bueno para su paciencia. :-)

Para poder trabajar con su rama o etiqueta recién generada tiene varias opciones. Puede:

  • TortoiseSVNObtener para obtener una copia nueva en una carpeta vacía. Puede obtener la copia de trabajo en cualquier parte de su disco duro, y puede crear tantas copias de trabajo de su repositorio como desee.

  • Cambiar su copia de trabajo actual a la copia recién creada en el repositorio. De nuevo seleccione la carpeta superior de su proyecto y utilice TortoiseSVNCambiar... del menú contextual.

    En el siguiente diálogo, introduzca la URL de la rama que acaba de crear. Deje la opción Revisión HEAD activada y pulse Aceptar. Su copia de trabajo se cambia a la nueva rama/etiqueta.

    Cambiar trabaja igual que Actualizar, en el sentido que nunca pierde sus cambios locales. Cualquier cambio que haya hecho a su copia de trabajo que todavía no se hayan confirmado se fusionarán cuando haga el Cambio. Si no desea que esto ocurra, entonces debe o bien confirmar los cambios antes de cambiar, o revertir su copia de trabajo a una revisión ya-confirmada (típicamente HEAD).

  • Si desea trabajar en el tronco (trunk) y en la rama, pero no desea el coste de una obtención nueva, puede utilizar el Explorador de Windows para hacer una copia de la copia de trabajo obtenida, y luego TortoiseSVNCambiar... esa copia a su nueva rama.

Figura 4.55. El diálogo Cambiar

El diálogo Cambiar


Aunque Subversion por sí mismo no hace ninguna distinción entre etiquetas y ramas, la forma en la que normalmente se usan difiere un poco.

  • Las etiquetas se usan típicamente para crear una copia estática de un proyecto en una etapa concreta. Como tales normalmente no se utilizan para el desarrollo - eso es para lo que se utilizan las ramas, y por esa razón recomendamos la estructura del repositorio /trunk /branches /tags en primer lugar. Trabajando en una revisión etiquetada no es una buena idea, pero dado que sus archivos locales no están protegidos, no hay nada que le impida hacer esto por error. Sin embargo, si intenta confirmar a una ruta en el repositorio que contenga /tags/ (en inglés), TortoiseSVN le avisará.

  • Puede ser que necesite hacer más cambios a una versión que ya había etiquetado. La forma correcta de manejar esta situación es crear primero una nueva rama desde la etiqueta. Haga sus cambios en esta rama, y luego cree una nueva etiqueta para esta rama, por ejemplo Version_1.0.1.

  • Si modifica una copia de trabajo creada desde una rama y confirma, entonces los cambios irán a la nueva rama y no en el tronco. Sólo se guardan las modificaciones. El resto continúa siendo una copia barata.