Soldat's log

Simplemente otro blog personal

Entradas etiquetadas ‘cvs

CVS: Manejando ramas

dejar un comentario »

Hace algunos años publiqué una breve guía práctica de CVS, incompleta. Aprovechando que tengo algo de tiempo he decidido tachar este punto de mi lista de tareas :-)

Creando una nueva rama

Antes de nada hemos de recordar que necesitamos una versión etiquetada, por ejemplo ‘v1_2′, sobre la que vamos a trabajar. Comenzamos extrayendo la versión a nuestro entorno de trabajo:

$ cvs checkout -d proyecto-1.2 -r v1_2 proyecto

Procedamos a crear la rama propiamente dicha:

$ cd proyecto-1.2
$ cvs tag -b v1_2-branch

El nombre de la rama es un gusto personal, yo prefiero añadir -branch aunque he visto -bugfixes o combinaciones de ambos.

Con estos simples pasos ya disponemos de una rama de desarrollo a la que podemos acceder, por ejemplo para hacer un cambio a la rama:

$ pwd
/home/chernando/proyecto
$ cvs up -r v1_2-branch

Si revisamos el estado de ‘main.c’ podemos ver que está incluido en una rama:

$ cvs -q status main.c
==================================================================
Working revision: 1.1.2.1 2007-03-07 19:06:39 +0100
Repository revision: 1.1.2.1 /tmp/repositorio/proyecto/main.c,v
Commit Identifier: QwJwh9fAP56fxb9s
Sticky Tag: v1_2-branch (branch: 1.1.2)
Sticky Date: (none)
Sticky Options: (none)

Importante fijarse en el cambio en la numeración, a partir de ahora en vez de avanzar con 1.X, se avanza con 1.N.X, siendo N la numeración de la rama.

Mezclando dos ramas

Bien, supongamos que queremos traernos cambios realizados desde una rama,’v1_2-branch’, a la principal. Muy fácil, haremos como si forzáramos un cambio de una versión anterior pero especificando la rama en vez de la revisión:

$ cvs update -j v1_2-branch main.c
RCS file: /tmp/repositorio/proyecto/main.c,v
retrieving revision 1.1
retrieving revision 1.1.2.1
Merging differences between 1.1 and 1.1.2.1 into main.c
$ cvs commit -m 'Cambios desde la rama v1.2' main.c

Hay un problema: no podemos hacer esta jugada dos veces seguidas sin dar conflictos :-)

Supongamos que queremos volver a traernos un cambio desde la rama ‘v1_2-branch’ con el comando update. El diferencial de cambios para hacer la mezcla se hace desde la base de la derivación de la rama, si ya hemos aplicado parte de ese diferencial en una actualización anterior provocará irremediablemente un conflicto.

La solución para evitar el engorro de trabajar con conflictos es utilizar una referencia de la rama justo después de traer los cambios. Dos opciones principales:

  • Etiquetar la rama cada vez que se traen cambios de ellas, ‘v1_2- branch-fixes-1′.
  • Utilizar las nociones de tiempo de CVS, ‘v1_2-branch:3 days ago’.

La idea intuitiva es la de señalar en el historial de la rama dos marcas de tiempo, la última que se llevo a la principal y el actual de la rama, y aplicar los cambios que se realizaron entre esos dos instantes en la rama en la principal. Por ejemplo:

$ cvs update -j v1_2-branch-fixes-1 -j v1_2branch

Escrito por chernando

2007/03/07 a 19:32

Sistemas de control de versiones distribuidos

Los sistemas de control de versiones tradicionales como CVS o subversion han facilitado enormemente el desarrollo de software. Los conceptos como repositorio, revisión y commit son de uso habitual en casi cualquier cosa en la que trabajemos pero siempre se puede rizar el rizo: los sistemas de control de versiones distribuidos.

A primera vista los dvcs son simples vcs sin un repositorio centralizado, es decir, disponemos de varios repositorios funcionalmente idénticos pero que pueden seguir líneas de desarrollo propio para más tarde sincronizarse entre ellos. A decir verdad parece una forma rebuscada de hacer copias de seguridad de un repositorio clásico.

Supongamos que estamos trabajando en un proyecto cualquiera cuya política a la hora de aceptar un commit es “no introducir código inestable”. Si queremos implementar un gran cambio tendríamos que desarrollar sin ningún vcs hasta conseguir un código maduro y poder realizar el commit, normalmente no suele ser una situación agradable.

La solución más común es la de crear una rama en la que podamos desarrollar tranquilamente y más tarde, una vez madurado el código, juntar nuestra rama con la línea principal de desarrollo. El inconveniente ahora es la gestión de las ramas –crear y destruir múltiples ramas– y hacer el merge que siempre han resultado ser operaciones complicadas e incómodas.

Este es uno de los motivos por los que Linus Torvalds no migró a subversion después de los problemas con BitKeeper: Please Stop Bugging Linus Torvalds About Subversion.

Los dvcs se centran en este problema. Ofrecen al programador mayor libertad a la hora de compartir su trabajo (ya sea con ramas privadas o controlando los cambios a commitear) sin perder en ningún momento un vcs en el que apoyar su desarrollo. Además disponemos de una copia local del repositorio maestro lo que nos permite trabajar (commit, log, diff…) sin disponer de una conexión permanente.

Algunos ejemplos:

Escrito por chernando

2006/01/25 a 9:49

Escrito en Desarrollo Software

Etiquetado con , ,