Revisiones: Números, Palabras Clave, y Fechas, ¡Dios Mío!

Antes de continuar, usted debería saber un poco acerca de como identificar una revisión particular en su repositorio. Como aprendió en “Revisiones”, una revisión es una instantánea de su repositorio en un momento particular en el tiempo. A medida que continúe depositando y haciendo crecer su repositorio, usted necesita un mecanismo para identificar estas instantáneas.

Usted puede especificar estas revisiones usando --revision (-r) junto con la revisión que desee (svn --revision REV) o puede especificar un rango separando dos revisiones con dos puntos (svn --revision REV1:REV2). Y Subversion le permite referirse a estas revisiones por número, palabra clave, o fecha.

Números de revisión

Cuando usted crea un nuevo repositorio de Subversion, este comienza su vida en la revisión cero y cada envío sucesivo incrementa el número de revisión en uno. Después de completar su envío, el cliente de Subversion le informa del nuevo número de revisión:

$ svn commit --message "Corrected number of cheese slices."
Sending        sandwich.txt
Transmitting file data .
Committed revision 3.

Si en cualquier punto del futuro usted quiere referirse a esa revisión (veremos cómo y por qué podríamos querer hacer esto más adelante en este capítulo), puede referirse a ella como 3.

Palabras clave de la revisión

El cliente de Subversion entiende una cantidad de palabras clave de la revisión. Estas palabras clave pueden ser usadas en vez del número entero como argumento a la opción --revision, y son resueltos como números específicos de revisión por Subversion:

[Nota] Nota

Cada directorio en su copia de trabajo contiene un subdirectorio administrativo llamado .svn. Para todos los ficheros en un directorio, Subversion mantiene una copia de cada fichero en el área administrativa. Esta copia es una copia no modificada (ninguna expansión de palabra clave, ninguna traducción del fin de línea, nada de nada) del fichero tal como existió en la última revisión (llamada la revisión BASE) que usted actualizó a su copia de trabajo. Nos referimos a este fichero como copia prístina o versión basada en texto de su fichero, y siempre es una copia byte-a-byte exacta del fichero tal como existe en el repositorio.

HEAD

La última revisión en el repositorio.

BASE

La revisión prístina de un elemento en la copia de trabajo.

COMMITTED

La última revisión en la que un elemento cambió antes (o en) BASE.

PREV

La revisión inmediatamente anterior a la última revisión en la cual un elemento cambió. (Técnicamente, COMMITTED - 1.)

[Nota] Nota

PREV, BASE, y COMMITTED pueden ser usadas para referirse a rutas locales, pero no a URLs.

Aquí hay algunos ejemplos de palabras clave de revisión en acción. No se preocupe si los comandos no tienen sentido todavía; estaremos explicando estos comandos a medida que avancemos por el capítulo:

$ svn diff --revision PREV:COMMITTED foo.c
# shows the last change committed to foo.c

$ svn log --revision HEAD
# shows log message for the latest repository commit

$ svn diff --revision HEAD
# compares your working file (with local mods) to the latest version
# in the repository.

$ svn diff --revision BASE:HEAD foo.c
# compares your pristine foo.c (no local mods) with the 
# latest version in the repository

$ svn log --revision BASE:HEAD
# shows all commit logs since you last updated

$ svn update --revision PREV foo.c
# rewinds the last change on foo.c.
# (foo.c's working revision is decreased.)

Estas palabras clave le permiten realizar muchas operaciones comunes (y útiles) sin tener que buscar números específicos de revisión o recordar la revisión exacta de su copia de trabajo.

Fechas de revisión

Dondequiera que usted especifique un número de revisión o palabra clave de revisión, usted también puede especificar una fecha dentro de llaves {}. ¡Puede incluso tener acceso a un rango de cambios en el repositorio usando fechas y revisiones juntas!

Aquí hay ejemplos de los formatos de fecha que admite Subversion. Recuerde usar comillas alrededor de cualquier fecha que contenga espacios.

$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
…

Cuando usted especifica una fecha como revisión, Subversion encuentra la revisión más reciente en el repositorio a esa fecha:

$ svn log --revision {2002-11-28}
------------------------------------------------------------------------
r12 | ira | 2002-11-27 12:31:51 -0600 (Wed, 27 Nov 2002) | 6 lines
…

También puede especificar un rango de fechas. Subversion encontrará todas las revisiones entre ambas fechas, inclusive:

$ svn log --revision {2002-11-20}:{2002-11-29}
…

Como señalamos, también puede mezclar fechas y revisiones:

$ svn log --revision {2002-11-20}:4040

Los usuarios deberían estar enterados de una sutileza que puede convertirse en un obstáculo al tratar con fechas en Subversion. Como la marca de tiempo de una revisión es guardada como una propiedad de la revisión— una propiedad sin versionar, modificable — las marcas de tiempo de las revisiones pueden cambiarse para representar una falsificación completa de la verdadera cronología, o incluso borrarla totalmente. Esto causará estragos en la conversión interna fecha-a-revisión que realiza Subversion.