Utilisation de l'historique

Votre dépôt Subversion est comme une machine à remonter le temps. Il garde une trace de tous les changements jamais propagés et permet de parcourir cet historique en examinant aussi bien les versions précédentes des fichiers et des répertoires que les métadonnées associées. D'une simple commande Subversion, vous pouvez extraire (ou restaurer) une copie de travail du dépôt tel qu'il était à n'importe quelle date ou numéro de révision passée. Cependant, vous voulez parfois juste sonder le passé sans y retourner.

Plusieurs commandes renvoient des informations sur l'historique des données présentes dans le dépôt :

svn log

fournit beaucoup d'informations : les messages de propagation avec la date et l'auteur de la révision ainsi que les chemins qui ont été modifiés à chaque révision.

svn diff

affiche les détails, ligne par ligne, d'un changement donné.

svn cat

récupère le fichier tel qu'il existait à une révision donnée et l'affiche à l'écran.

svn list

liste les fichiers contenus dans un répertoire à une révision donnée.

Affichage de l'historique

Pour connaître l'historique d'un fichier ou d'un répertoire, utilisez la commande svn log. Elle affiche la liste des gens qui ont modifié le fichier ou le répertoire en question, le numéro de chaque révision où il a changé, l'heure et la date de cette révision et, s'il y en avait un, le message associé à la propagation :

$ svn log
------------------------------------------------------------------------
r3 | sally | 2008-05-15 23:09:28 -0500 (jeu. 15 Mai 2008) | 1 ligne

Ajout des lignes include et correction du nombre de tranches de fromage.
------------------------------------------------------------------------
r2 | harry | 2008-05-14 18:43:15 -0500 (mer. 14 Mai 2008) | 3 lignes

Ajout des méthodes main().
------------------------------------------------------------------------
r1 | sally | 2008-05-10 19:50:31 -0500 (sam. 10 Mai 2008) | 1 ligne

Import initial
------------------------------------------------------------------------

Notez que, par défaut, l'historique est affiché en ordre chronologique inverse. Si vous voulez afficher un intervalle de révisions donné dans un ordre particulier ou juste une seule révision, ajoutez l'option --revision (-r) :

$ svn log -r 5:19    # affiche l'historique a partir de la révision 5
                     # jusqu'à la révision 19 dans l'ordre chronologique

$ svn log -r 19:5    # affiche l'historique à partir de la révision 5
                     # jusqu'à la révision 19 dans l'ordre
                     # chronologique inverse

$ svn log -r 8       # affiche l'historique de la révision 8

Vous pouvez aussi afficher l'historique d'un fichier ou d'un répertoire particulier. Par exemple :

$ svn log machin.c
…
$ svn log http://machin.com/svn/trunk/code/machin.c
…

Ceci n'affiche le contenu de l'historique que pour les révisions dans lesquelles le fichier de travail (ou l'URL) a changé.

Si vous voulez obtenir plus d'informations sur un fichier ou un répertoire, svn log accepte également l'option --verbose (-v). Comme Subversion autorise les déplacements et les copies de répertoires et de fichiers, il est important de pouvoir tracer ces modifications de chemin dans le système de fichiers. Ainsi, en mode verbeux, svn log affiche la liste des déplacements au cours de la révision concernée :

$ svn log -r 8 -v
------------------------------------------------------------------------
r8 | sally | 2008-05-21 13:19:25 -0500 (mer. 21 Mai 2008) | 1 ligne
Chemins modifiés :
M /trunk/code/machin.c
M /trunk/code/bidule.h
A /trunk/code/doc/LISEZMOI

Machination du bidule.

------------------------------------------------------------------------

svn log accepte aussi l'option --quiet (-q), qui permet de ne pas afficher le contenu du message de propagation. En combinaison avec --verbose, svn log n'affiche que les noms des fichiers qui ont changé.

Détail des modifications passées

Nous avons déjà vu la commande svn diff, qui affiche les différences entre fichiers au format diff unifié ; nous l'avons utilisée pour afficher les modifications locales effectuées sur notre copie de travail avant de les propager vers le dépôt.

En fait, il y a trois façons différentes d'utiliser svn diff :

  • Examiner des modifications locales.

  • Comparer votre copie de travail au dépôt.

  • Comparer des révisions du dépôt.

Modifications locales

Comme nous l'avons vu précédemment, svn diff, s'il est invoqué sans option, compare les fichiers de votre copie de travail à leurs versions « originales » gardées en cache dans la zone .svn :

$ svn diff
Index: regles.txt
===================================================================
--- regles.txt	(révision 3)
+++ regles.txt	(copie de travail)
@@ -1,4 +1,5 @@
 Être attentif envers les autres
 Liberté = Responsabilité
 Tout dans la modération
-Mâcher la bouche ouverte
+Mâcher la bouche fermée
+Écouter quand les autres parlent
$

Comparaison d'une copie de travail au dépôt

Si un seul numéro de révision est fourni à l'option --revision (-r), votre copie de travail est comparée à la révision spécifiée du dépôt :

$ svn diff -r 3 regles.txt
Index: regles.txt
===================================================================
--- regles.txt	(révision 3)
+++ regles.txt	(copie de travail)
@@ -1,4 +1,5 @@
 Être attentif envers les autres
 Liberté = Responsabilité
 Tout dans la modération
-Mâcher la bouche ouverte
+Mâcher la bouche fermée
+Écouter quand les autres parlent
$

Comparaison de révisions du dépôt

Si deux numéros de révision sont fournis à l'option --revision (-r), séparés par le caractère deux-points (:), les deux révisions sont directement comparées :

$ svn diff -r 2:3 regles.txt
Index: regles.txt
===================================================================
--- regles.txt	(révision 2)
+++ regles.txt	(révision 3)
@@ -1,4 +1,4 @@
 Être attentif envers les autres
-Liberté = Glace Au Chocolat
+Liberté = Responsabilité
 Tout dans la modération
 Mâcher la bouche ouverte
$

Une autre façon de comparer une révision à la précédente, plus conviviale, est d'utiliser l'option --change (-c) :

$ svn diff -c 3 regles.txt
Index: regles.txt
===================================================================
--- regles.txt	(révision 2)
+++ regles.txt	(révision 3)
@@ -1,4 +1,4 @@
 Être attentif envers les autres
-Liberté = Glace Au Chocolat
+Liberté = Responsabilité
 Tout dans la modération
 Mâcher la bouche ouverte
$

Enfin, vous pouvez comparer des révisions du dépôt même si vous n'avez pas de copie de travail en local sur votre ordinateur, simplement en incluant l'URL appropriée sur la ligne de commande :

$ svn diff -c 5 http://svn.exemple.com/depot/exemple/trunk/texte/regles.txt
…
$

Navigation dans le dépôt

Grâce aux commandes svn cat et svn list, vous pouvez afficher des révisions variées des fichiers et répertoires sans changer la révision de votre copie de travail. En fait, vous n'avez même pas besoin d'avoir une copie de travail pour les utiliser.

svn cat

Si vous voulez examiner une version antérieure d'un fichier et pas nécessairement les différences entre deux fichiers, vous pouvez utiliser svn cat :

$ svn cat -r 2 regles.txt
Être attentif envers les autres
Liberté = Glace Au Chocolat
Tout dans la modération
Mâcher la bouche ouverte
$

Vous pouvez également rediriger la sortie de svn cat directement dans un fichier :

$ svn cat -r 2 regles.txt > regles.txt.v2
$

svn list

La commande svn list liste les fichiers présents dans le dépôt sans pour autant les télécharger :

$ svn list http://svn.apache.org/repos/asf/subversion/
README
branches/
developer-resources/
mk.xiv/
site/
svn-logos/
tags/
trunk/

Si vous désirez une liste plus détaillée, passez l'option --verbose (-v) et vous obtenez alors quelque chose comme ceci :

$ svn list -v http://svn.apache.org/repos/asf/subversion/
 904709 hwright               30 janv., 03:06 ./
 880872 cmpilato         5362 16 nov., 18:49 README
 904644 danielsh              29 janv., 23:05 branches/
 861356 lgo                   27 août 2006 developer-resources/
 868798 brane                 02 janv. 2008 mk.xiv/
 904663 cmpilato              30 janv., 00:19 site/
 863801 anonymou              02 sept. 2002 svn-logos/
 901971 cmpilato              22 janv., 04:39 tags/
 904709 hwright               30 janv., 03:06 trunk/

Les colonnes vous indiquent la révision à laquelle le fichier ou le répertoire a été modifié pour la dernière fois, qui est l'auteur de ce changement, la taille du fichier si c'en est un, la date de dernière modification et le nom de l'élément.

[Avertissement] Avertissement

La commande svn list sans argument prend pour cible l'URL du dépôt correspondant au répertoire local en cours, pas le répertoire en cours de la copie de travail. Après tout, si vous voulez voir le contenu de votre répertoire local, vous pouvez utiliser ls, tout simplement (ou l'équivalent sur votre système non-Unix).

Anciennes versions d'un dépôt

En plus de toutes les commandes citées précédemment, vous pouvez utiliser svn update et svn checkout avec l'option --revision pour ramener une copie de travail complète « dans le passé » : [8]

$ svn checkout -r 1729 # extrait une nouvelle copie de travail
                       # à la révision r1729
…
$ svn update -r 1729 # met à jour une copie de travail existante
                     # à la révision r1729
…
[Astuce] Astuce

Beaucoup de nouveaux utilisateurs de Subversion essaient d'utiliser svn update comme dans l'exemple précédent pour annuler des changements propagés, mais ça ne marche pas, puisque vous ne pouvez pas propager des changements obtenus en ramenant à une vieille version une copie de travail, si les fichiers modifiés ont subi des modifications depuis. Voir la section intitulée « Résurrection des éléments effacés » pour une description de la manière d' « annuler » une propagation.

Enfin, si vous êtes en train de réaliser une version officielle et que vous voulez extraire vos fichiers de Subversion sans avoir ces satanés répertoires .svn, vous pouvez utiliser svn export pour créer une copie locale de tout ou partie de votre dépôt sans les répertoires .svn. De même que pour svn update et svn checkout, vous pouvez passer l'option --revision à svn export :

$ svn export http://svn.exemple.com/svn/depot1 # Exporte la dernière révision
…
$ svn export http://svn.exemple.com/svn/depot1 -r 1729
# Exporte la révision r1729
…


[8] Vous voyez, on vous avait bien dit que Subversion était une machine à remonter le temps.