Empezar con Bazaar

De ChuWiki
Saltar a: navegación, buscar

Una vez instalado Bazaar, vamos a ver unos pequeños ejemplos de cómo emepzar a trabajar con él.


Un solo desarrollador

Si tenemos un proyecto en nuestro ordenador personal y queremos tener un control de versiones sobre él, sin compartirlo en principio con otros desarrolladores, basta seguir los siguientes pasos.

En primer lugar, crear el directorio para el proyecto y situarnos en él, o bien, si ya lo tenemos creado, ir directamente a él

$ mkdir PROYECTO
$ cd PROYECTO

Metemos ahora el proyecto bajo el sistema de control de versiones de Bazaar

$ bzr init

y ya está. Ahora sólo nos queda crear nuestros fuentes, si no lo estaban ya, y añadirlos al sistema de control de versiones. Para ello, la primera vez que queramos meter un fichero o directorio nuevo, debemos ejecutar el comando bzr add. Este comando admite como parámetros ficheros y directorios. Si no ponemos nada, añadirá todo lo que encuentre recursivamente desde el directorio actual.

$ bzr add .
$ bzr add unfichero.java undirectorio/unfichero.java

Una vez añadidos los ficheros, para que el cambio tenga efecto definitivamente, debemos ejecutar el comando bzr commit, añadiendo un comentario con la opción -m. Si no añadimos este comentario, al ejecutarlo, se abrirá el editor de textos para que introduzcamos el comentario. El comando bzr commit admite además como parámetros ficheros, directorios. Si no ponemos parámetros, guardará en el sistema de control de versiones todos los ficheros pendientes de añadir, bien porque se les acabe de hacer un bzr add, bien porque hayan sido modificados.

$ bzr commit -m"un comentario"
$ bzr commit -m"otro comentario" unfichero.java

Cada vez que modifiquemos un fichero, deberemos hacer el bzr commit correspondiente para guardar los cambios.

Podemos ver las distintas versiones de cada fichero con bzr log

$ bzr log texto1.txt
------------------------------------------------------------
revno: 2
committer: chuidiang@gmail.com
branch nick: PROYECTO1
timestamp: Tue 2008-07-15 20:57:30 +0200
message:
  tocado
------------------------------------------------------------
revno: 1
committer: chuidiang@gmail.com
branch nick: PROYECTO1
timestamp: Tue 2008-07-15 20:55:00 +0200
message:
  creado

y podemos recuperar versiones antiguas con bzr revert. Por ejemplo, para recuperar la version 1 de texto1.txt

$ bzr revert -r1 texto1.txt

Para volver a obtener la última, basta con no poner la opción -r con el número de versión

$ bar revert texto1.txt

Finalmente, el comando bzr help commands nos da una lista de todos los posibles comandos y bzr comando --help nos da la ayuda del comando concreto

$ bzr help commands
add               Add specified files or directories.
annotate          Show the origin of each line in a file.
baz-import        Import an Arch or Baz archive into a bzr repository.
                  [bzrtools]
baz-import-branch Import an Arch or Baz branch into a bzr branch. [bzrtools]
bind              Convert the current branch into a checkout of the supplied
                  branch.
...
upgrade           Upgrade branch storage to current format.
version           Show version of bzr.
version-info      Show version information about this tree.
whoami            Show or set bzr user id.
zap               Remove a lightweight checkout, if it can be done safely.
                  [bzrtools]
$
$
$ bzr update --help
Purpose: Update a tree to have the latest code committed to its branch.
Usage:   bzr update [DIR]

Options:
  -v, --verbose  Display more information.
  -q, --quiet    Only display errors and warnings.
  -h, --help     Show help message.

Description:
  This will perform a merge into the working tree, and may generate
  conflicts. If you have any local changes, you will still 
  need to commit them after the update for the update to be complete.
  
  If you want to discard your local changes, you can just do a 
  'bzr revert' instead of 'bzr commit' after the update.

Aliases:  up
See also: pull, status-flags, working-trees

Un repositorio central

Si va a haber varios desarrolladores, suele ser buena idea tener un repositorio central con los fuentes oficiales del proyecto. También suele ser necesario hacer que este repositorio central esté disponible a través de red.

En primer lugar, debemos decidir si en ese repositorio central vamos a albergar uno o varios proyectos. Si sólo es uno, para inicializarlo, podemos hacer como en el caso de un solo desarrollador, es decir, elegir un directorio para el proyecto y ejecutar el comando bzr init

$ mkdir PROYECTO
$ cd PROYECTO
$ bzr init

Si vamos a albergar varios proyectos, debemos crear un directorio para todos los proyectos y luego un subdirectorio para cada uno de los proyectos. El directorio padre se inicializa con bzr init-repository, mientras que cada uno de los proyectos debe inicializarse con bzr init

$ mkdir REPOSITORIO
$ mkdir REPOSITORIO/PROYECTO1
$ mkdir REPOSITORIO/PROYECTO2
$ bzr init-respository REPOSITORIO
$ bzr init RESPOSITORIO/PROYECTO1
$ bzr init RESPOSITORIO/PROYECTO2

Ahora sólo nos queda poner esto a disposición del público a través de red. Tenemos muchas opciones:

  • Hacer el directorio accesible desde ftp, http, sftp o ssh.
  • Arrancar un servidor de Baazar. Para esta última opción ejecutamos
$ bzr serve --allow-write REPOSITORIO

donde la opción --allow-write permite escritura en el repositorio a los desarrolladores a través de Bazaar o bien, si no la ponemos, sólo podrán extraer fuentes, pero no modificarlos.

Una vez arrancado el servidor, los desarrolladores pueden obtener el proyecto localmente por medio de

$ bzr checkout bzr://servidor/REPOSITORIO/PROYECTO1 COPIA_PROYECTO1

Se creará un directorio COPIA_PROYECTO1 y ahí se copiarán todos los fuentes del proyecto. Con bzr checkout la copia trabaja directamente sobre el repositorio, de forma que loz bzr add y bzr commit que haga el desarrollador irán directamente al repositorio central.

Ramas con Bazaar

En cualquier momento podemos crear una copia de todo el repositorio, con su historia, en el directorio local que nosostros queramos. Para ello, basta con ejecutar el comando bzr branch origen destino. Por ejemplo

$ bzr branch bzr://servidor/REPOSITORIO/PROYECTO1 COPIA_PROYECTO1

También, en el caso de un solo desarrollador, podríamos hacerlo en local sobre nuestro disco, sin necesidad de servidor

$ bzr branch /path/PROYECTO /otro/path/COPIA_PROYECTO1

Podemos ahora trabajar en COPIA_PROYECTO1 de forma normal, haciendo nuestro bzr add, bzr commit, bzr add, etc. Todo lo que hagamos, se hará en nuestra copia local.

En esta situación, con dos repositorios paralelos: el original y la copia, es posible que se hagan cambios en uno de ellos, en el otro o en ambos. En algún momento suele ser necesario sincronizar dichos repositorios. Para ello tenemos los comandos bzr pull y bzr push.

Modificamos sólo en la rama

Supongamos, por ejemplo, que tocamos sólo en el repositorio copia y guardamos el fichero con un bzr commit.

$ cd /otro/path/COPIA_PROYECTO1
$ #editamos el fichero
$ vi un_fichero.txt      
$ #subimos los cambios al repositorio
$ bzr commit -m"un comentario" un_fichero.txt

Bien, ahora tenemos el repositorio local con una versión más moderna que el repositorio original. Podemos seguir modificando y añadiendo fichero todo lo que queramos. Una vez hechos todos nuestros cambios, vamos a llevarlos ahora al repositorio original, que suponemos que nadie ha tocado todavía. Para ello ejecutamos bzr push

$ cd /otro/path/COPIA_PROYECTO
$ bzr push /path/PROYECTO

Al no haber habido cambios en PROYECTO, este comando llevará nuestras nuevas versiones allí sin problemas.

Modificamos sólo en el repositorio original

Supongamos ahora que alguien ha hecho cambios en el repositorio original y que nosotros todavía no hemos tocado nuestra copia. Queremos traer esos cambios en el repositorio original a nuestra rama. Para ello usamos el comando bzr pull:

$ bzr pull /path/PROYECTO

Ahora tenemos nuestra rama actualizada con lo último del repositorio original.

Modificamos ambos repositorios a la vez

Desgraciadamente, también es posible que alguien toque el repositorio original y simultáneamente nosotros toquemos nuestra copia del repositorio. En ese caso, los comandos bzr push y bzr pull fallarán, indicando que hay conflictos entre los ficheros.

$ cd /otro/path/COPIA_PROYECTO1
$ bzr push /path/PROYECTO
bzr: ERROR: These branches have diverged.  Try using "merge" and then "push".

$ bzr pull /path/PROYECTO
bzr: ERROR: These branches have diverged. Use the merge command to reconcile them.

Primero debemos hacer un bzr merge para resolver esos conflictos (es decir, revisar los cambios hechos en el directorio original, los hechos en nuestra copia y decidir cuales son los cambios válidos). Para ello ejecutamos

$ bzr merge /path/PROYECTO

Bazaar intenta automáticamente mezclar ambos ficheros. Para ello, si se han añadido o borrado línea que en el otro lado no se han tocado, directamente las añade o borra. Si en ambos lados se ha tocado una misma línea, entonces indica que ha conflictos que no puede resolver.

En el primer caso, salvo revisar cómo ha quedado el fichero, no hay que hacer nada especial. Basta hacer un bzr commit del fichero. En el segundo caso, Bazaar deja en el fichero la línea conflictiva repetida, una vez con la versión local y otra con la del repositorio original. Debemos editar el fichero y decidir cual de las dos línea vale. Una vez hecho, debemos indicar a Bazaar que ya hemos resuelto los conflitos con bzr resolve

$ bzr resolve un_fichero.txt

y ahora ya podemos hacer el bzr commit (Bazaar no nos dejará hacerlo si no hemos resuleto previamente el conflicto).

Una vez hecho el bzr merge, el bzr resolve si hay conflictos y el bzr commit, ya tenemos nuestro repositorio copia actualizado. No sería necesario hacer un bzr pull. Sin embargo, podemos querer ahora llevar nuestros cambios al repositorio original. Para ello ejecutamos el comando bzr push

$ bzr push /path/PROYECTO

Ya tenemos sincronizados ambos repositorios.


Enlaces externos