Sistemas de control de revisión

 

Daniel F. Moisset

Que es un Revision Control System?

Wikipedia dice: Revision control is an aspect of documentation control wherein changes to documents are identified by incrementing an associated number or letter code, termed the "revision level", or simply "revision".

In computer software engineering, revision control is any practice which tracks and provides controls over changes to a project's source code. Software developers sometimes use revision control software to maintain documentation and configuration files as well as source code. In theory, revision control can be applied to any type of information record.

En la práctica un RCS:

  • Administra una base de datos de documentos de texto, normalmente organizada como un arbol de archivos
  • Maneja eficientemente distintas versiones de esos archivos
    • Temporalmente (versiones nuevas y viejas)
    • Espacialmente (versiones alternativas, paralelas) [Configuration Management]
  • Guarda metadatos de los archivos, y de las versiones
    • Descripciones de los cambios (descripciones, por ej)
    • Descripciones de los branches [Configuration Management]
  • Provee operaciones para modificar, consultar la base de datos de archivos por multiples usuarios, concurrentemente.
  • Herramientas de Source Management Tool:
    • manejar arboles
    • distinguir archivos del proyecto y temporales
    • detectar cambios (nuevos, borrados)

Para que usar uno?

Un RCS/CMS/SMT tiene varios usos, tanto como para desarrolladores o no.

Seguimiento historico

Con un RCS uno puede llevar un registro de los cambios a un documento o a múltiples documentos, y consultar cualquier punto de su historia, ver su evolución, deshacer cambios, etc.

Escritura colaborativa

Los RCS permiten trabajar sobre los documentos por multiples usuarios, resolviendo problemas de sincronización. Además esto se combina con lo anterior, y se puede seguir el autor de cada cambio a cada documento

Backup, recuperacion temporal

Un repositorio de RCS puede usarse como mecanismo de Backup centralizado

Manejo de archivos de Configuración

Es práctico (por ejemplo en servidores) considerar documentos a los archivos de configuración. De esta forma se pueden revertir cambios (recientes o viejos) o poder hacer seguimiento de la historia del servidor

Desarrollo de software

La aplicación más frecuente de RCSs es desarrollo de software, ya que suelen tener estas necesidades: Se trabaja en equipo sobre un juego de documentos (el código fuente), se necesita seguimiento de cambios y autoría de cada modificación, posibilidad de revertir, hace falta documentación adicional para entender cambios viejos.

Además frecuentemente surge la necesidad de mantener lineas paralelas pero no totalmente descomunicadas de un proyecto.

Algunos RCS populares

Se pueden encontrar comparativos en http://wiki.gnuarch.org/moin.cgi/SubVersionAndCvsComparison y en http://www.dwheeler.com/essays/scm.html

CVS

CVS es probablemente el más popular de estos sistemas. Tiene como ventaja ser terriblemente estable (en cambios), estar muy testeado, y ser conocido en todos lados. Esta un poco "viejo", pero "it does the job"

Arquitectura:

  • Repositorio centralizado, working copies
  • Estructurado en modulos, revisiones de archivos, branches

Features:

  • Tagging
  • Merging
  • Clientes gráficos, addons, ...

Desventajas:

  • Problemas con el protocolo de red. (aunque se puede usar ssh)
  • Problemas al mover archivos (sobre todo al hacer merges)
  • No maneja permisos, symlinks, ...
Subversion

Subversion es un desarrollo relativamente reciente, que apunta a reimplementar algo bastante similar a CVS, pero evitando sus falencias de diseño. "an improved CVS"

Features:

  • Atomic commits
  • Versioned moves & renames
  • Puede funcionar sobre HTTP(S) (o su protocolo propio)
  • Cliente y servidor para Win32
  • Uso parecido a CVS
  • Trabajo Offline

Desventajas:

  • Aún tiene problemas con merges de archivos movidos
  • No soporta Win32
Arch

Arch propone un paradigma bastante distinto de RCS.

Arquitectura:

  • Repositorios multiples, independientes, no jerarquicos. Contienen archivos con categorías con ramas, con versiones.
  • cada revision tiene un id único universal
  • operaciones sobre todo el árbol
  • changesets

Features:

  • distribuido
  • Funciona sobre cualquier mecanismo de archivos remotos (archivos, samba, NFS, FTP, SSH, WebDAV)
  • renaming & merging adaptado a renames

Desventajas

  • Problemas con nombres de archivos permitidos (espacios, acentos) y convencionales
Otros:

ver http://www.onlamp.com/pub/a/onlamp/2004/01/29/scm_overview.html

Tutorial CVS

Basado en: info cvs

Una sesión usual

Se extraen los archivos del repositorio:

  $ cvs -d:local:/var/local/cvs checkout tc
  $ cd tc
  $ ls
  CVS         Makefile    backend.c   driver.c    frontend.c  parser.c
  # editar ...
  $ cvs diff
  $ cvs commit backend.c
  $ cvs update

Set up

Creación del repositorio :

  $ cvs -d /var/local/cvs init

E importación de los archivos :

  $ cd proyecto
  $ cvs import nombre-módulo nombre-rama tag

Otras operaciones
  $ cvs tag
  $ cvs log
  $ cvs annotate
Algunos detalles
  • Conflictos
  • Revisions vs. releases
  • Revision numbers
  • Creando branches (tag -b)
  • Merging
  • Undoing

Tutorial Subversion

Ver

Tutorial Arch

Basado en: http://www.gnu.org/software/gnu-arch/tutorial/arch.html

Empezando la sesión: setup y creacion del repositorio

Nos identificamos. El id sirve para marcar los logs, entre otras cosas :

    dwarf:~/tmp/rcs$ tla my-id "Daniel F. Moisset <dmoisset@grulic.org.ar>"
    dwarf:~/tmp/rcs$ tla my-id
    Daniel F. Moisset <dmoisset@grulic.org.ar>

Creamos un lugar donde meter el repositorio :

    dwarf:~/tmp/rcs$ mkdir {archives}

Creamos un "archive" y lo configuramos como default (usar rutas absolutas). El archivo tiene un id unico global (para eso se usa un email), doble guión, seguido de una etiqueta:

    dwarf:~/tmp/rcs$ tla make-archive dmoisset@grulic.org.ar--2004-charla ~/tmp/rcs/{archives}/2004-charla
    dwarf:~/tmp/rcs$ tla my-default-archive dmoisset@grulic.org.ar--2004-charla
    dwarf:~/tmp/rcs$ tla my-default-archive
    dmoisset@grulic.org.ar--2004-charla
    dwarf:~/tmp/rcs$ tla archives
    dmoisset@grulic.org.ar--2004-charla
        /home/dmoisset/tmp/rcs/{archives}/2004-charla
    dwarf:~/tmp/rcs$ ls \{archives\}/
    2004-charla/

Todos los archivos creados hasta ahora (en archives y en ~/.arch_params) los maneja arch.

Creación de proyectos/branches

Cada versión de una rama se denomina como categoría--rama--versionmayor.versionmenor :

    dwarf:~/tmp/rcs$ tla archive-setup charlas-grulic--presentadas--0.1
    * creating category dmoisset@grulic.org.ar--2004-charla/charlas-grulic
    * creating branch dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas
    * creating version dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1
    dwarf:~/tmp/rcs$ tla categories
    charlas-grulic
    dwarf:~/tmp/rcs$ tla branches charlas-grulic
    charlas-grulic--presentadas
    dwarf:~/tmp/rcs$ tla versions charlas-grulic--presentadas
    charlas-grulic--presentadas--0.1

Creación de trees

Un tree es un directorio de trabajo: :

    dwarf:~/tmp/rcs$ cd charlas
    dwarf:~/tmp/rcs/charlas$ ls
    RCS-bibliografia.txt  RCS.txt  yoeraotracharla.txt
    dwarf:~/tmp/rcs/charlas$ cat RCS.txt
    CVS es mucho más azul que arch
    En cambio, Subversion también.

    dwarf:~/tmp/rcs/charlas$ cat RCS-bibliografia.txt
    http://masaca.com
    dwarf:~/tmp/rcs/charlas$ tla init-tree charlas-grulic--presentadas--0.1
    dwarf:~/tmp/rcs/charlas$ ls
    {arch}/  RCS-bibliografia.txt  RCS.txt  yoeraotracharla.txt

El directorio "arch" indica que esta es la raíz de un árbol, y le permite a Arch reconocerlo :

     dwarf:~/tmp/rcs/charlas$ tla tree-root
     /home/dmoisset/tmp/rcs/charlas
     dwarf:~/tmp/rcs/charlas$ tla tree-version
     dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1

Hay algunas convenciones de nombres configurables. Por defecto uno puede markar "junk" prefijando con , y "precious" con + ; detecta source y backups de forma razonable. con tla --inventory uno puede ver archivos de distintas clasificaciones.

Manejo del repositorio
Agregar y sacar fuentes

Arch usa las convenciones de nombres para ver, pero hace una distinción con los archivos realmente clasificados. Si en el tree anterior pedimos que clasifique por nombre, tenemos: :

    dwarf:~/tmp/rcs/charlas$ tla inventory --source --names
    RCS-bibliografia.txt
    RCS.txt
    yoeraotracharla.txt

Pero si pedimos que nos clasifique no por nombre sino según lo que sabe: :

    dwarf:~/tmp/rcs/charlas$ tla inventory --source

Para agregar realmente :

    dwarf:~/tmp/rcs/charlas$ tla add *.txt
    dwarf:~/tmp/rcs/charlas$ tla delete yoeraotracharla.txt
    dwarf:~/tmp/rcs/charlas$ tla inventory --source
    RCS-bibliografia.txt
    RCS.txt

Notar que para directorios hace falta add, pero no delete

Mover fuentes
    dwarf:~/tmp/rcs/charlas$ mv RCS-bibliografia.txt RCS-bibliografia.html
    dwarf:~/tmp/rcs/charlas$ tla move RCS-bibliografia.txt RCS-bibliografia.html
Creación de revisiones
Generar el log
    dwarf:~/tmp/rcs/charlas$ vi `tla make-log`
    dwarf:~/tmp/rcs/charlas$ cat ++log.charlas-grulic--presentadas--0.1--dmoisset\@grulic.org.ar--2004-charla
    Summary: Initial import
    Keywords:

    Import inicial de las charlas

Hay que tener cuidado con el + en el nombre de archivo

Importar Una vez generado el log, importamos (subimos) el arbol al archivo: :

    dwarf:~/tmp/rcs/charlas$ tla import
    These files would be source but lack inventory ids (`tla add' or a tagline perhaps?):

    yoeraotracharla.txt

    * imported dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1

Con lo cual ahora, podemos ver que se creo una revision del arbol:

    dwarf:~/tmp/rcs/charlas$ tla revisions --summary --creator --date charlas-grulic--presentadas--0.1
    base-0
        2004-09-28 17:09:50 GMT
        Daniel F. Moisset <dmoisset@grulic.org.ar>
        Initial import
    dwarf:~/tmp/rcs/charlas$ tla cat-log charlas-grulic--presentadas--0.1--base-0
    Revision: charlas-grulic--presentadas--0.1--base-0
    Archive: dmoisset@grulic.org.ar--2004-charla
    Creator: Daniel F. Moisset <dmoisset@grulic.org.ar>
    Date: Tue Sep 28 14:09:50 ART 2004
    Standard-date: 2004-09-28 17:09:50 GMT
    Summary: Initial import
    Keywords:
    New-files: RCS-bibliografia.html RCS.txt
    New-patches: dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--base-0

Notar que cada revisión tiene un nombre global. En este caso, dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--base-0

Editar

Supongamos que queremos corregir algo en un archivo. Es buena practica crear el log, e ir editando y manteniéndolo:

    dwarf:~/tmp/rcs/charlas$ tla add yoeraotracharla.txt
    dwarf:~/tmp/rcs/charlas$ tla make-log
    /home/dmoisset/tmp/rcs/charlas/++log.charlas-grulic--presentadas--0.1--dmoisset@grulic.org.ar--2004-charla
    dwarf:~/tmp/rcs/charlas$ mcedit ++log.charlas-grulic--presentadas--0.1--dmoisset\@grulic.org.ar--2004-charla
    dwarf:~/tmp/rcs/charlas$ mcedit RCS.txt
    dwarf:~/tmp/rcs/charlas$ mcedit ++log.charlas-grulic--presentadas--0.1--dmoisset\@grulic.org.ar--2004-charla
    dwarf:~/tmp/rcs/charlas$ tla changes --diffs
    * looking for dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--base-0 to compare with
    * comparing to dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--base-0
    A  .arch-ids/yoeraotracharla.txt.id
    A  yoeraotracharla.txt
    M  RCS.txt

    * modified files

    --- orig/RCS.txt
    +++ mod/RCS.txt
    @@ -1,3 +1,2 @@
     CVS es mucho más azul que arch
    -En cambio, Subversion también.
    -
    +En cambio, Subversion tampoco.

    * added files

    --- /dev/null
    +++ /home/dmoisset/tmp/rcs/charlas/,,what-changed.charlas-grulic--presentadas--0.1--base-0--dmoisset@grulic.org.ar--2004-charla/new-files-archive/./.arch-ids/yoeraotracharla.txt.id
    @@ -0,0 +1 @@
    +Daniel F. Moisset <dmoisset@grulic.org.ar> Tue Sep 28 14:40:57 2004 16532.0
    --- /dev/null
    +++ /home/dmoisset/tmp/rcs/charlas/,,what-changed.charlas-grulic--presentadas--0.1--base-0--dmoisset@grulic.org.ar--2004-charla/new-files-archive/./yoeraotracharla.txt
    @@ -0,0 +1 @@
    +bla bla

Commit
    dwarf:~/tmp/rcs/charlas$ tla commit
    A  .arch-ids/yoeraotracharla.txt.id
    A  yoeraotracharla.txt
    M  RCS.txt
    * update pristine tree (dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--base-0 => charlas-grulic--presentadas--0.1--patch-1)
    * committed dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--patch-1
    dwarf:~/tmp/rcs/charlas$ tla revisions --summary charlas-grulic--presentadas--0.1
    base-0
        Initial import
    patch-1
        Archivo faltante, arreglos
Obteniendo revisiones

Con tla get se pueden construir nuevos directorios de trabajo, de la ultima versión o anteriores: :

    dwarf:~/tmp/rcs/charlas$ cd ..
    dwarf:~/tmp/rcs$ rm -rf charlas
    dwarf:~/tmp/rcs$ tla get charlas-grulic--presentadas--0.1 charlas
    * from import revision: dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--base-0
    * patching for revision: dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--patch-1
    * making pristine copy
    * tree version set dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1
    dwarf:~/tmp/rcs$ tla get charlas-grulic--presentadas--0.1--base-0 charlas-old
    * from import revision: dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1--base-0
    * making pristine copy
    * tree version set dmoisset@grulic.org.ar--2004-charla/charlas-grulic--presentadas--0.1
    dwarf:~/tmp/rcs$ ls charlas
    {arch}/  RCS-bibliografia.html  RCS.txt  yoeraotracharla.txt
    dwarf:~/tmp/rcs$ ls charlas-old/
    {arch}/  RCS-bibliografia.html  RCS.txt

Trabajo concurrente

Se puede ver que parches me falta:

    dwarf:~/tmp/rcs$ cd charlas-old/
    dwarf:~/tmp/rcs/charlas-old$ tla missing --summary
    patch-1
        Archivo faltante, arreglos

Para actualzar :

    dwarf:~/tmp/rcs/charlas-old$ tla update
    ...

Otros (no incluidos)
  • Manejo de archivos remotos
  • Changesets
    • Clean changesets
    • Aplicación de changesets, changesets cruzados
    • replay: una variante de update
  • Branching
  • tla changelog

 

Volver a la página principal