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 :
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.
affiche les détails, ligne par ligne, d'un changement donné.
récupère le fichier tel qu'il existait à une révision donnée et l'affiche à l'écran.
liste les fichiers contenus dans un répertoire à une révision donnée.
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é.
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.
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 $
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 $
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 … $
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.
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 $
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 | |
---|---|
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). |
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 | |
---|---|
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 …