Control de versiones centralizado con Bazaar

Bazaar es un sistema de control de versiones distribuído, que en lo personal me ha resultado muy fácil y cómodo de utilizar.

Probablemente una de sus mejores características es que permite ser bastante flexible en cuanto a los flujos de trabajo que puedes utilizar con él — esto es parte fundamental de la filosofía de Bazaar — ya que si bien está diseñado para trabajar perfectamente de modo distribuído, también se adapta de forma excelente a un flujo de trabajo centralizado, en cuyo esquema adopta un modo de trabajo muy similar a Suversion pero manteniendo ciertas ventajas propias de los sistemas distribuidos, como contar con una copia local del repositorio, acceso local al historial de cambios (y poder consultar rápidamente el registro de cambios), poder realizar commits locales al no tener conexión a internet, volver rápidamente a versiones anteriores, etc.

El modo particular de implementar un flujo centralizado de control de versiones con Bazaar puede variar, pero detallaré algunas de sus posibilidades.

Flujos centralizados y descentralizados

Algunas consideraciones sobre estas formas de organizar el trabajo antes de pasar a la implementación (aunque si ya quieres poner las manos en la masa puedes adelantarte al próximo apartado).

Es necesario hacer notar que en Bazaar, como en otros sistemas distribuidos, ocurre que por lo general el directorio que contiene los archivos del proyecto sobre el que estamos trabajando (la copia de trabajo o árbol de trabajo) mantiene también una copia del repositorio (el lugar donde se almacena el historial de cambios).

Al utilizar un flujo descentralizado, cada copia de trabajo + repositorio es una rama de desarrollo (una branch, que desde ya se puede ver que es un modelo distinto a lo que sucede en SVN), donde los commits son locales y las contribuciones entre distintas ramas se comparten empujando (push) los cambios a otro repositorio.

En un flujo centralizado, mantendremos un repositorio central y varias copias de trabajo (que normalmente tienen el repositorio, pero también pueden no tenerlo como lo veremos más adelante) que hacen commit a este repositorio central. En Bazaar, el concepto fundamental que distingue un flujo centralizado de uno descentralizado es el “bind” (que se puede traducir como “ligar” o “enlazar”, pero también como “obligado a”): una copia de trabajo que está enlazada a otro repositorio es un checkout, y sus commits son enviados automáticamente a el repositorio al cual está enlazada; si no está enlazada es un branch, con commits locales que se comparten vía push.

A partir de esto, es posible crear diversos modos de colaboración, incluyendo híbridos entre flujos centralizados y descentralizados… pero vamos a lo que nos interesa en esta entrada, que es el flujo centralizado.

A partir de un repositorio en un servidor

Esta opción debería resultar bastante sencilla para quienes han trabajado anteriormente con otros sistemas como Subversion. Básicamente, los pasos a seguir son:

  1. Crear un repositorio en una máquina que hará las veces de servidor
  2. Crear las copias de trabajo (checkout) en cada equipo que colaborará en el proyecto
  3. Al hacer modificaciones en las copias de trabajo, los cambios se envían al repositorio que está en el servidor central

La implementación del modelo es muy sencilla:

  1. En el servidor:
    1. En la carpeta donde están los archivos del proyecto (por ejemplo, /var/bzr/miproyecto.com), inicializar el repositorio con bzr init
    2. Luego, agregar los archivos del proyecto con bzr add
    3. Realizar el primer commit con bzr commit. Ingresar el mensaje del commit (Bazaar no admite mensajes de commit vacíos) y ya está lista la primera revisión del repositorio
    4. Para aplicar los cambios del repositorio al árbol de trabajo: bzr update
  2. En el cliente:
    1. Hacer un checkout del repositorio: bzr checkout bzr+ssh://miservidor.com/var/bzr/miproyecto.com — en caso de que el espacio en disco sea una preocupación muy importante, puedes hacer un checkout “liviano”, es decir, que sólo se limitará a la copia de trabajo sin el historial de cambios (esto sería idéntico a lo que sucede en SVN, aunque con esto lógicamente no podrás efectuar operaciones locales) con bzr checkout --lightweight bzr+ssh://miservidor.com/var/bzr/miproyecto.com
    2. Para enviar los cambios al repositorio: bzr commit. En caso que por algún motivo no tengas conexión a internet pero quieres guardar tus cambios en el repositorio local que acompaña a tu copia de trabajo, puedes hacerlo con bzr commit --local. La próxima vez que hagas un commit, se enviarán todos los cambios al repositorio central. Esto no funciona en un checkout “liviano”.
    3. Para bajar cambios desde el repositorio: bzr update

A partir de una copia de trabajo local

En caso de que ya hubiésemos comenzado a trabajar en un proyecto de forma local y queremos crear un repositorio centralizado donde otros puedan colaborar, los pasos a seguir serían:

  1. Inicializar un repositorio local
  2. Empujar la rama a un servidor
  3. Ligar la copia local al repositorio remoto

Lo que se puede implementar del siguiente modo:

  1. En el directorio donde está nuestro proyecto, inicializar un repositorio con bzr init
  2. Agregar los archivos del proyecto con bzr add
  3. Realizar el primer commit al repositorio con bzr commit
  4. Empujar el repositorio al servidor: bzr push bzr+ssh://miservidor.com/var/bzr/miproyecto.com
  5. Convertir la copia de trabajo local en un checkout: bzr bind bzr+ssh://miservidor.com/var/bzr/miproyecto.com
  6. En adelante, los cambios a la copia de trabajo local se enviarán al servidor con bzr commit y se pueden obtener los cambios con bzr update

Luego, los otros miembros de tu equipo pueden obtener su copia de trabajo según los pasos indicados anteriormente.

Referencias

Como se puede ver, Bazaar es tan sencillo como flexible. A partir de las configuraciones básicas es posible idear múltiples formas de trabajo que potencien la colaboración de los equipos de desarrollo. Como siempre, la documentación oficial siempre ofrece un buen punto de partida para comenzar a conocer el sistema, en especial la guía para usuarios que está bastante amplia.

Espero que esta breve guía haya servido para considerar Bazaar como una buena opción para el control de versiones.