Avant de commencer, vous devriez savoir le minimum sur la manière d'identifier une révision particulière dans votre dépôt. Comme vous l'avez appris dans the section called “Révisions”, une révision est un “instantané” de votre dépôt à un moment particulier dans le temps. A mesure que vous continuez à propager des modifications et que votre dépôt grossit, vous avez besoin d'un mécanisme pour retrouver ces instantanés.
Vous indiquez ces révisions en utilisant l'option
--revision (-r) suivie
de la révision souhaitée (svn --revision REV) ou
vous pouvez indiquer un intervalle en séparant deux révisions par deux
points (svn --revision REV1:REV2). Et Subversion
vous permet de faire référence à ces révisions par numéro, identifiant
symbolique ou date.
Lorsque vous créez un nouveau dépôt Subversion, il commence sa “vie” à la revision zero et chaque propagation successive incrémente de un le numéro de révision. Après chacune de vos propagations réussies, le client Subversion vous informe du nouveau numéro de révision :
$ svn commit --message "Nombre de tranches de fromage corrigé." Sending sandwich.txt Transmitting file data . Committed revision 3.
A chaque fois que vous voudrez, dans le futur, faire référence à cette révision (nous verrons comment et pourquoi vous pourriez vouloir le faire plus tard dans ce chapitre), vous pourrez le faire avec le numéro “3”.
Le client Subversion est capable de reconnaître un certain
nombre d'identifiants de révision symboliques.
Ces identifiants
peuvent être utilisés en tant qu'argument de l'option
--revision à la place d'un nombre entier, et sont
interprétés comme des numéros de révision spécifiques par
Subversion :
Chaque répertoire dans votre copie de travail contient
un répertoire d'administration nommé .svn.
Pour chaque fichier dans un répertoire, Subversion en garde
une copie dans la zone d'administration.
Cette copie est une copie non modifiée (pas de substitution de
mots-clés, pas de conversion des caractères de fin de ligne,
rien) du fichier tel qu'il existe dans la dernière révision
(appelée la révision de “BASE”) que vous avez récupérée
dans votre copie de travail en effectuant une mise à jour (update).
Nous appelons ce fichier la copie originale
[9]
de votre fichier, et c'est toujours une copie exacte, à l'octet près,
du fichier tel qu'il existe dans le dépôt.
La dernière révision dans le dépôt.
La révision “originale” d'un élément de votre copie de travail.
The last revision in which an item changed before (or
at) BASE.
The revision just before the last
revision in which an item changed. (Technically,
COMMITTED - 1.)
PREV, BASE et
COMMITTED ne peuvent être utilisés que
pour des chemins locaux, pas sur des URL.
Voici quelques exemples concrets d'utilisation d'identifiants de révision symboliques. Ne vous inquiétez pas si le sens des commandes vous échappe pour l'instant; nous les expliquerons plus en détail durant ce chapitre :
$ svn diff --revision PREV:COMMITTED foo.c
# affiche les derniers changements propagés pour foo.c
$ svn log --revision HEAD
# affiche l'entrée de journal de la dernière propagation dans le dépôt
$ svn diff --revision HEAD
# compare votre copie de travail (modifications locales incluses) avec
# la dernière version du dépôt
$ svn diff --revision BASE:HEAD foo.c
# compare votre “copie originale” de foo.c (sans modifications
# locales) avec la dernière version dans le dépôt
$ svn log --revision BASE:HEAD
# affiche toutes les entrées de journal apparues depuis votre
# dernière mise à jour (svn update)
$ svn update --revision PREV foo.c
# Annule la dernière propagation effectuée pour foo.c
# (la révision dans votre copie de travail pour foo.c est décrémentée)
Ces identifiants vous permettent d'accomplir de nombreuses opérations courantes (et utiles) sans avoir à préciser un numéro de révision spécifique ou à vous souvenir de l'exacte révision de votre copie de travail.
Partout où vous pouvez utiliser un numéro de révision ou un identifiant de révision symbolique, vous pouvez aussi indiquer une date entre accolades “{}”. Vous pouvez accéder à un ensemble de changements dans le dépôt en utilisant ensemble des dates et des numéros de révision !
Voici quelques exemples de formats de date que Subversion accepte. N'oubliez pas d'utiliser des guillemets pour délimiter les dates qui contiennent des espaces.
$ 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}
…
Lorsque vous indiquez une date en tant que révision, Subversion cherche la plus récente révision du dépôt par rapport à cette date :
$ svn log --revision {2002-11-28}
------------------------------------------------------------------------
r12 | ira | 2002-11-27 12:31:51 -0600 (Wed, 27 Nov 2002) | 6 lines
…
Vous pouvez aussi utiliser un intervalle de dates. Subversion cherchera toutes les révisions entre les dates demandées, ces dernières incluses :
$ svn log --revision {2002-11-20}:{2002-11-29}
…
Comme mentionné précédemment, vous pouvez mélanger dates et numéros de révisions :
$ svn log --revision {2002-11-20}:4040
Il existe une subtilité dans la manière qu'a Subversion de gérer les dates qui pourrait être une source de dysfonctionnement et dont les utilisateurs devraient être conscients. Etant donné que la date d'une révision est stockée en tant que propriété de révision — une propriété modifiable et non versionnée — les dates de révision peuvent être modifiées ou supprimées et donc fausser complètement la chronologie. Cela corromprait les conversions internes date/révision effectuées par Subversion.
[9] En anglais, deux termes sont utilisés pour faire référence à ce fichier : pristine copy ou text-base version (NDT)