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