blob: e71f4f3fbaa5b837ac5596d56ba2a3fd0095a0c1 [file]
@node Utilisation des clients
@chapter Utilisation des clients
Comment bien utiliser votre client Subversion en 11 étapes.
Ce chapitre décrit plus en détail les commandes client.
Pour une vue d'ensemble du mode de développement
``copier-modifier-fusionner'' avec un clients de type CVS,
@xref{Concepts}.
Avant de commencer à lire, retenez que votre principale source
d'information lorsque vous utilisez @samp{svn} est : @samp{svn help}. Le
client en ligne de commande de Subversion est lui-même documenté et à tout
moment @samp{svn help<sous-commande>} décrira la syntaxe, les drapeaux, et
le comportement de @command{sous-commande}.
Ce chapitre ne couvre nullement chaques options de chaques commandes
secondaire des clients. Au lieu de cela, c'est une introduction, une
conversation autour des tâches les plus communes que vous rencontrerez.
Dans le doute, recourez à l'aide fournie par @samp{svn help}.
@menu
* descente::
* Cycle de Travail Classique::
* Historique::
* Branche et Etiquetage::
* Propriétés::
* Modules::
* Révisions::
* Autres commandes::
* Configuration d exécution::
@end menu
@c ------------------------------------------------------------------
@node descente
@section descente
La plupart du temps, vous commencerez l'utilisation d'un dépôt Subversion
en réalisant une @dfn{descente} de votre projet. l'opération de
``descendre'' vous fournit une copie de la tête (dernière révision) du dépôt
Subversion que vous descendez.
@example
$ svn co http://svn.collab.net/repos/svn/trunk
A trunk/subversion.dsw
A trunk/svn_check.dsp
A trunk/COMMITTERS
A trunk/configure.in
A trunk/IDEAS
@dots{}
Checked out revision 2499.
@end example
Bien que l'exemple descend le répertoire trunk, vous pouvez de la même
manière descendre n'importe quel sous-répertoire du dépôt en spécifiant le
sous-répertoire dans URL à descendre.
@example
$ svn co http://svn.collab.net/repos/svn/trunk/doc/handbook
A handbook/svn-handbook.texi
A handbook/getting_started.texi
A handbook/outline.txt
A handbook/license.texi
A handbook/repos_admin.texi
A handbook/client.texi
Checked out revision 2499.
@end example
Puisque Subversion utilise le model ``copier-modifier-fusionner'' au-lieu
de ``verrouiller-modifier-déverrouiller'', vous êtes imédiatement prêt
pour modifier les fichiers que vous venez de descendre. Ensemble des
fichiers descendu est votre @dfn{copie de travail}. Vous pouvez aussi
supprimer toute votre copie de travail sans conséquence (sauf si vous
étiez sur le point de @dfn{remonter} des modifications, un nouveau fichier
voir un répertoire). La suppression d'une copie de travail ne nécessite
pas d'en informer le serveur Subversion.
Tout les répertoire de la copie de travail ont un @dfn{espace
d'administration}, un sous-répertoire nommé @file{.svn}. La @command{ls}
ne montre pas par défaut ce répertoire. Quoique vous fassiez, ne
supprimez et ne changez rien dans cet espace d'administration ! Pour
gérer votre copie de travail, Subversion en a besoin.
Vous pouves exécuter @samp{svn help checkout} pour connaitre les options
de la ligne de commande permettant la descente: vous pouvez spécifier un
répertoire après l'url de votre dépôt. Ceci mettra votre copie de travail
dans le répertoire spécifié. Par exemple:
@example
$ svn co http://svn.collab.net/repos/svn/trunk subv
A subv/subversion.dsw
A subv/svn_check.dsp
A subv/COMMITTERS
A subv/configure.in
A subv/IDEAS
@dots{}
Checked out revision 2499.
@end example
@c ------------------------------------------------------------------
@node Cycle de Travail Classique
@section Cycle de Travail Classique
Subversion a de nombreuses fonctions et options, mais dans une utilisation
quotidien classique vous en utiliserez qu'un nombre limité d'elles. Dans
cette section nous présentons les opérations les plus classiques qui
sont rencontrées lorsque vous travaillez avec Subversion.
Le cycle typique d'utilisation de Subversion ressemble à ceci :
@itemize @bullet
@item
Mise à jour de votre copie de travail
@item
Faire des modifications
@item
Examiner vos modifications
@item
Fusionner les modifications des autres
@item
Remonter vos modifications
@end itemize
@c ---------------
@subsection Mise à jour de votre copie de travail (@samp{svn update})
En travaillant en équipe sur un projet, vous allez @dfn{mettre à jour}
votre copie de travail: c'est-à-dire, récupérer les modifications des
autres développeurs dans votre copie de travail. @samp{svn update}
provoque la synchronisation de votre copie de travail avec la dernière
révision du dépôt.
@example
$ svn update
U ./foo.c
U ./bar.c
Updated to revision 2.
@end example
Dans cet exemple, une autre personne a remonté des modifications de
@file{foo.c} et @file{bar.c} depuis la dernière fois que vous
avez mise à jour, Subversion à mise à jour vour copie de travail
pour inclure ces modifications.
Examinons la sortie de @samp{svn update} un peu plus. Lorsque le serveur
envoie des modifications à votre copie de travail, un code est affiché a
côté de chaque élément:
@table @b
@item U @file{foo}
Le fichier @file{foo} a été mise à jour ((U)pdated) (modifications reçues
du serveur) dans votre copie de travail.
@item A @file{foo}
Le fichier ou répertoire @file{foo} a été (A)jouté à votre copie de
travail.
@item D @file{foo}
Le fichier ou réportoire @file{foo} a été supprimé ((D)eleted) de votre
copie de travail.
@item R @file{foo}
Le fichier ou répertoire @file{foo} a été (R)emplacé dans votre copie de
travail; c'est-à-dire, @file{foo} a été supprimé, et un nouvelle élément
avec le même mot a été ajouté. Bien qu'il est le même nom, le dépôt les
considère comme des objects distincts avec des historiques distincts.
@item G @file{foo}
Le fichier @file{foo} a reçu de nouvelles modifications du dépôt, mais il
a aussi des modifications réalisées par vous-même. Les modifications
n'intéragissent pas entre elles cependant, donc Subversion a pu fusionner
(mer(G)ed) les modifications du dépôts dans le fichier sans problème.
@item C @file{foo}
Le fichier a reçu des modifications conflictuelles du serveur. les
modifications du server recouvre vous propres modifications du fichier.
Inutile de paniquer cependant. Ce recouvrement doit est résolu par un
humain (peut-être vous); nous aborderons cette situation plus loin.
@end table
@subsection Faire des modifications (@samp{svn add}, @samp{svn rm}, @samp{svn cp}, @samp{svn mv})
Maintenant vous pouvez travailler et réaliser quelques modifications dans
votre copie de travail.
Nous vérons quel type de modification vous pouvez faire dans à votre
copie de travai.
@table @b
@item Modification de fichier
c'est le type de changement le plus simple. Contrairement à d'autre
système de contrôle de version, nous n'avez pas besoin de dire à
Subversion que vous avez l'intention de modifier un fichier; faites le.
Plus tard, Subversion est capable de détecter automatiquement quel fichier
a été modifié.
@item Modification d'arborescence
Vous pouvez demander à Subversion de ``marquer'' des fichiers et des
répertoire pour la suppresion ou d'addition dans le dépôt. Evidament,
aucun ajout ou suppresion n'est réalisé dans le dépôt sans une remontée
explite de votre part.
@end table
Pour faire des modifications de fichiers, utilisez votre éditeur de texte,
votre traitement de texte, ou n'importe quelle méthode. Un fichier ne doit
pas nécessairement être au format texte; les fichiers binaires sont
également parfaitement pris en charge.
Il y a au moins quatre sous-commandes Subversion pour faire des
modifications de l'arborescence. Une aide détaillée peut être abtenue avec
@samp{svn help}. Néanmoins, voici un résumé:
@table @command
@item @samp{svn add foo}
Programme l'ajout de @file{foo} dans le dépôt. Lors de votre prochaine
remontée, @file{foo} deviendra un fils permanent de son répertoire
parent. Notons que si @file{foo} est un répertoire, seul le répertoire
sera programmé pour l'ajout. Si vous voulez ajouter son contenu également,
ajouté le drapeau @option{--recursive}.
@item @samp{svn rm @file{foo}}
Programme la suppression de @file{foo} dans le dépôt. @file{foo} est un
fichier, Subversion le fait disparaitre de la copie de travail -- mais il
peut être restauré avec @samp{svn revert} (voir plus loin). Si
@file{foo} est un répertoire, il est simplement programmé pour la
suppression. Après votre remontée, @file{foo} n'existera plus dans la
copie de travai ni dans le dépôt.
@item @samp{svn cp foo bar}
Crée un nouvelle élément @file{bar} qui est un double de @file{foo}.
@file{bar} est automatique programmé pour l'addition. Lors de l'ajout
de @file{bar} au dépôt à la prochaine remontée, c'est une
copie-historique qui est enregistré (enregistre que le contenu initiale de
@file{bar} vient de @file{foo}).
@item @samp{svn mv foo bar}
C'est commande est équivalente à @samp{svn cp foo bar; svn rm foo}.
C'est-à-dire, @file{bar} est programmé pour l'addition en tant que copie
de @file{foo}, et @file{foo} est programmé pour la suppresion.
@end table
Nous venons de voir des exemples de modifications de votre copie de
travail. Néanmoins, il y a des cas d'utilisation qui modifient directement
le dépôt. Ceci arrive généralement lorsqu'une sous-commande opère
directement sur une URL, au-lieu d'un chemin de votre copie de travail.
(En particulier, des utilisations spécifiques de @samp{svn mkdir},
@samp{svn cp}, @samp{svn mv} et @samp{svn rm} peuvent fonctionner avec des
URLs. Regarder ce que vous retourne @samp{svn help} sur ces commandes
pour plus de détails.)
@subsection Examinez vos modifications (@samp{svn status}, @samp{svn diff}, @samp{svn revert})
Donc maintenant que vous avez fini vos modification@dots{} vous vous dites:
Quelle sont les modifications que j'ai fait ? Comment les consulter?
Subversion a été optimisé pour vous aider dans cette tâche, et il est
capable de faire plein de choses sans accéder au dépôt ou utiliser le
réseau. Votre copie de travail possède une copie de référence caché de
chaque fichier et répertoire dans l'espace @file{.svn}. Cette copie de
référence correspond au dernier état connu du dépôt. Grâce à çà,
Subversion peut rapidement vous montrer les modifications faites sur
votre copie de travail, ou eventuellement vous permettre d'annuler vos
modification dans le répertoire de copie.
La commande @samp{svn staus} est votre ami; devenez intime avec elle.
Vous utiliserez @samp{svn status} probablement plus que n'importe
quelle autre commande.
Si vous exécutez la commande @samp{svn status} à la racine de votre copie
de travail sans arguments, elle donnera toutes les modifications de
fichiers et d'arborescence que vous avez fait. Cet exemple est fait pour
montrer tous les différents codes d'état que @samp{svn status} peut
retourner. Les texte à l'intérieur de @samp{[]} n'est pas imprimé par
@samp{svn status}.
@example
$ svn status
_ L ./abc.c [svn a un verrou dans son répertoire .svn pour abc.c]
M ./bar.c [Le contenu de bar.c a des modifications locales]
_M ./baz.c [baz.c a uniquement des modifications de propriété]
? ./foo.o [svn ne gère pas foo.o]
! ./foo.c [svn gère foo.c mais un autre programme l'a supprimé]
A + ./moved_dir [ajout avec l'historique de là où il vient]
M + ./moved_dir/README [ajout avec historique et a des modifications locales]
D ./stuff/fish.c [le fichier est programmé pour la suppression]
A ./stuff/things/bloo.h [le fichier est programmé pour l'ajout]
@end example
Le format de sortie de @samp{svn status} affiche quatre colonnes de
caractères suivi par plusieurs espaces suivi par le nom du fichier ou du
répertoire. La première colonne donne l'état du fichier ou répertoire
et/ou de son contenu. Les code utilisé sont
@table @b
@item _ @file{fichier_ou_répertoire}
Le fichier ou répertoire n'a pas été ajouté ou supprimé. Si
@file{fichier_ou_répertoire} est un fichier, son contenu n'a pas été
modifié.
@item A @file{fichier_ou_répertoire}
Le fichier ou répertoire @file{fichier_ou_répertoire} a été programmé pour
être ajouté au dépôt.
@item M @file{fichier}
Le contenu du fichier @file{fichier} a été modifié.
@item D @file{fichier_ou_répertoire}
Le fichier ou répertoire @file{fichier_ou_répertoire} a été programmé pour
être supprimé du dépôt.
@item ? @file{fichier_ou_répertoire}
Le fichier ou répertoire @file{fichier_ou_répertoire}, n'est pas pris en
compte par le système de contrôle de révision. Vos pouvez supprimer
l'affichage des fichiers marqués d'un point d'intérogation en ajoutant
l'option @option{--quiet} (@option{-q}), ou en utilisant la propriété
@samp{svn:ignore} sur répertoire parent, @xref{Propriétés}.
@item ! @file{fichier_ou_répertoire}
Le fichier ou répertoire @file{fichier_ou_répertoire} est sous le contrôle
de révision mais il est manquant dans la copie de travail. Ceci peut
arriver si le fichier ou le répertoire est supprimé en utilisant une
commande non-Subversion. Pour restaurer le fichier ou répertoire manquant,
vous pouvez utiliser @samp{svn update} (récupération depuis le dépôt) ou
@samp{svn revert fichier_ou_répertoire} (récupération avec la copie de
référence caché dans @file{.svn}).
@end table
La seconde colonne donne l'état des propriétés du fichier ou du
répertoire, @xref{Propriétés}. Si un @samp{M} apparait dans la seconde
colonne, alors les propriétés ont été modifiées, sinon un espace est
affiché. Si uniquement les propriétés du fichier ou du répertoire sont
modifiées, alors il y a @samp{_M} d'affiché pour la première et seconde
colonnes. Le premier @samp{_} est affiché pour montrer clairement que les
propriétés sont modifiées mais pas le contenu.
La troisième colonne affiche uniquement un espace ou un @samp{L} qui
signifie que @command{svn} a verrouillé l'élément dans l'espace
@file{.svn} de la copie de travail. Vous verrez un @samp{L} si vous
exécuté @samp{svn status} dans un répertoire où @samp{svn commit} est
en cours d'attente de l'édition de la description des modifications. S'il
n'y a pas d'exécution en cours de commande @command{svn} alors il est
probable qu'un commande @command{svn} se soit arrêté de force et le verrou
ainsi laissé doit être levé en exécutant @samp{svn cleanup}. Les verroux
apparaissent typiquement lorsqu'une commande Subversion a été interrompue
avant qu'elle soit totalement réalisée.
La quatrième colonne vous montrera un espace ou un @samp{+} qui signifie
que le fichier ou répertoire est programmé pour être ajouté ou modifié,
avec un historique joint supplémentaire. Ceci arrive typiquement lorsque
vous utilisez @samp{svn cp} ou @samp{svn mv} sur un fichier ou un
répertoire. Si vous voyez @samp{A @ @ +}, ceci signifie que l'élément est
programmé pour être ajouté avec un historique joint. L'élément peut-être
un fichier ou la racine d'une arborescence copiée. @samp{_ @ @ +}
signifie qu'un élément fait parti d'une arborescence programmée pour ajout
avec historique. C'est-à-dire que l'élément accompagne un de ses
répertoires parents qui est programmé pour la copie. @samp{M @ @ +}
signifie que le fichier fait parti d'une arborescence programmée pour
ajout avec historique, @emph{et} qu'il a des modifications locales.
Lorsque vous remonterez les modifications, en premier le père est ajouté
avec historique (copié), ce qui signifie que ce fichier existera
automatiquement dans cette copie. Les modifications locales du fichier
seront appliquées à cette copie juste après.
Par défaut, @samp{svn status} ignore les fichiers qui correspondent aux
aux motifs @samp{*.o}, @samp{*.lo}, @samp{*.la}, @samp{#*#}, @samp{*.rej},
@samp{*~} et @samp{.#*}. Si vous voulez ajouter d'autre motifs à cette
liste par défaut, edité la propriété @samp{svn:ignore} du répertoire
parent. Si vous voulez voir l'état de tous les fichiers en ignorant les
motifs par défaut de @samp{svn status} et ceux de @samp{svn:ignore},
utilisez l'option de la ligne de commande @option{--no-ignore}.
Si un chemin est donné à la commande, les informations fournies seront
limités à ce chemin.
@example
$ svn status stuff/fish.c
D stuff/fish.c
@end example
Cette commande a aussi un mode verbeux, @option{--verbose} (@option{-v}),
qui montrera l'état de @emph{tous} les éléments dans votre copie de
travail:
@example
$ svn status -v
M 44 23 joe ./README
_ 44 30 frank ./INSTALL
M 44 20 frank ./bar.c
_ 44 18 joe ./stuff
_ 44 35 mary ./stuff/trout.c
D 44 19 frank ./stuff/fish.c
_ 44 21 mary ./stuff/things
A 0 ? ? ./stuff/things/bloo.h
_ 44 36 joe ./stuff/things/gloo.c
@end example
Ceci est la ``forme long'' de l'affichage de @samp{svn status}. La
premier colonne est inchangée. La seconde colonne fournie le numéro de
révision de la copie de travail de l'élément. La troisième et quatrième
colonne montre la révision de dernière modification de l'élément et qui
l'a modifié.
Enfin, il y a le drapeau @option{--show-update} (@option{-u}), qui
contact le dépôt et ajoute des informations sur ce qui est dépassé:
@example
$ svn status -u -v
M * 44 23 joe ./README
M 44 20 frank ./bar.c
_ * 44 35 mary ./stuff/trout.c
D 44 19 frank ./stuff/fish.c
A 0 ? ? ./stuff/things/bloo.h
@end example
Remarquer les deux astérisques: si vous lancez @samp{svn up} maintenant,
vous recevrez des modifications pour @file{README} et @file{trout.c}.
Soyez prudent. Vous devez absorber ces modifications du serveur pour
@file{README} avant de le remonter au risque de voir votre remontée
refusée car votre fichier est dépassé (plus d'information sur ce sujet
plus bas).
L'autre façon d'examiner les modification est d'utiliser la commande
@samp{svn diff}. Vous pouvez voir @emph{exactement} toutes les
modifications faites avec la commande @samp{svn diff} sans arguments,
qui affiche les modifications de fichier dans le format ``unified diff''.
@example
$ svn diff
Index: ./bar.c
===================================================================
--- ./bar.c
+++ ./bar.c Mon Jul 15 17:58:18 2002
@@ -1,7 +1,12 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <stdio.h>
int main(void) @{
- printf("Sixty-four slices of American Cheese...\n");
+ printf("Sixty-five slices of American Cheese...\n");
return 0;
@}
Index: ./README
===================================================================
--- ./README
+++ ./README Mon Jul 15 17:58:18 2002
@@ -193,3 +193,4 @@
+Note to self: pick up laundry.
Index: ./stuff/fish.c
===================================================================
--- ./stuff/fish.c
+++ ./stuff/fish.c Mon Jul 15 17:58:18 2002
-Welcome to the file known as 'fish'.
-Information on fish will be here soon.
Index: ./stuff/things/bloo.h
===================================================================
--- ./stuff/things/bloo.h
+++ ./stuff/things/bloo.h Mon Jul 15 17:58:18 2002
+Here is a new file to describe
+things about bloo.
@end example
la commande @samp{svn diff} génère ce résultat en comparant votre copie de
travail avec la référence dans @file{.svn}. Les fichier programmés pour
l'ajout sont affichés avec tout leur contenu en ajout, les fichiers pour
la suppression sont affiché avec tout leur contenu en suppression.
Maintenant supposons que vous voyez cette affichage et réalisez que vos
modifications à @file{README} sont érronées; peut-être avez-vous éditer
le mauvais fichier.
La commande @samp{svn revert} répond à ce type de problème. Elle
supprime tous les modifications.
@example
$ svn revert README
Reverted ./README
@end example
Le fichier est ramener a son état avant modification en l'écrasant avec la
copie de référence de @file{.svn}. Remarquer aussi que @samp{svn revert}
peut annuler toutes opérations programmées -- Dans le cas où vous décidez
que vous ne voulez pas ajouter un nouveau fichier, ou que vous ne voulez
pas supprimer un fichier.
Dernier point, ces trois commandes (@samp{svn status}, @samp{svn diff},
@samp{svn revert}) peuvent être utilisées sans accès réseau (sauf
@samp{svn status -u}). Ceci facilite la gestion de vos modifications en
cour lorsque vous voyagez en avion@dots{}
@subsection Fusionner les modifications des autres (résolution de conflit)
Vous avez vu comment la commande @samp{svn status -u} peut vous aider
a déterminer les risques de conflit. Supposons que vous lancez
@samp{svn update} et quelque chose d'intéressant se produit:
@example
$ svn up
U ./INSTALL
G ./README
C ./bar.c
@end example
Le codes U et G ne nous intéressent pas ici; ces fichiers ont proprement
intégrés les changements du dépôt.
Le @samp{C} signifie que nous somme en présence d'un conflit. Les conflits
ont lieu lorsque les modifications du dépôt recouvrent les votres. Ce
problème doit être résolu manuellement.
Lorsqu'un conflit arrive:
@itemize @bullet
@item
Un @samp{C} est affiché durant la mise à jour et Subversion mémorise que le
fichier est en ``conflit''.
@item
Trois fichiers dont le nom débute par @file{tmp} sont créés; ces fichiers
sont les originaux des fichiers qui ne peuvent pas être fusionnés
ensemble.
@item
Des marqueurs de conflit sont placés dans les fichier pour repérer les
zones de recouvrement.
@end itemize
Dans cette situation, Subversion @emph{ne} vous permet @emph{pas} de
remonter le fichier tant que les trois fichiers temporaire n'on pas été
supprimés.
Si vous obtenez un conflit, vous devez soit (1) faire la fusion
manuellement des textes en conflits (en examinant et en éditant les
marqueurs de conflit dans le fichier), (2) copier un des fichiers tmp*
en haut de votre fichier de travail, ou (3) exécuter @samp{svn revert}
pour perdre tous vos modifications.
Une fois que vous avez résolu les conflits, vous devez en informer
Subversion en supprimant les trois fichiers tmp*. La commande
@samp{svn resolved} est un racourçi qui ne fait rien sinon supprimer les
trois fichiers tmp* pour vous. Lorsque les fichiers tmp* sont supprimés
Subversion ne considère plus le fichier en état de conflit.
@subsection Remonter vos modifications
Enfin! vos éditions sont finies, vous avez fusionné tous les mise à jour
du serveur et vous êtes prêt à remonter vos modifications.
La commande @samp{svn commit} envoie tous de vos modifications au
dépôt. Lorsque vous remontez une modification, vous devez fournir une
@dfn{description des modifications}. Votre description restera attachée à
la nouvelle révision que vous avez créé.
@example
$ svn commit -m "Added include lines and corrected # of cheese slices."
Sending bar.c
Transmitting file data .
Committed revision 3.
$
@end example
Une autre façon de spécifier une description des modifications est de
les mettre dans un fichier et de fournir le nom du fichier avec
l'option @option{-F}. Si la description des modifications n'a pu être
fournie avec les options @option{-m} ou @option{-F}, alors Subversion
lancera automatiquement l'éditeur spécifié par la variable d'environnement
@samp{$EDITOR} pour que vous composiez la description des modifications.
Le dêpot ne s'occupe pas de savoir si vos modifications sont cohérentes ou
non. Il vérifie uniquement que personne d'autre n'a changé aucun des
fichiers que vous remontez depuis la dernière fois que vous les avez
sortie (@samp{svn co}) ou mise à jour (@samp{svn update}). Si
quelqu'un l'a fait, toute la remontée achoue avec un message indiquant que
un ou plusieurs de vos fichiers sont dépassés. Il vous faut lancer
@samp{svn upade}, traiter tous les fusions ou conflits qu'il en résulte
et recommencer votre remontée.
Nous avons couvert les commandes les plus fondamentales pour travailler
avec Subversion. Vous pouvez exécuter @samp{svn help <nom de la
commande>} pour avoir une aide sur toute les commandes présentées dans
cette section.
@c ------------------------------------------------------------------
@node Historique
@section Historique
Le dépôt trace toutes les remontées et vous permet d'explorer cet
historique.
Il y a deux commandes qui extraient les informations relatives à
l'historique de votre depôt. @samp{svn log} vous montre des informations
globales de l'historique: les descriptions de modification attachées à
chaque révision et quels fichiers/répertoires ont changé pour chaque
révision. La commande @samp{svn diff} est elle plus ``précise''. Elle
vous montre les modifications apportées à un fichier dans le temps.
@subsection svn log
Pour avoir des imformations de l'historique d'un fichier ou d'un
répertoire, vous utilisez la commande @samp{svn log}. @samp{svn log} vous
dira qui a modifié le fichier, à quel révision, l'heure et la date de la
révision et la description des modifications qui a accompagné la remontée.
@example
$ svn log
------------------------------------------------------------------------
rev 3: fitz | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line
Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
rev 2: someguy | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line
Added main() methods.
------------------------------------------------------------------------
rev 1: fitz | Mon, 15 Jul 2002 17:40:08 -0500 | 2 lines
Initial import
------------------------------------------------------------------------
@end example
Remarquez que les descriptions des modifications sont affichées dans
l'ordre chronologique inversé. Si vous désirez voir une plage différente
de révision dans un ordre particulier, ou voir une seule révision utilisé
l'option @option{--revision} (@option{-r}).
@example
$ svn log -r 5:19
@dots{} # Montre les descriptions de modification de 5 à 19 dans l'ordre
# chronologique.
$ svn log -r 19:5
@dots{} # Montre les descriptions de modification de 5 à 19 dans l'ordre
# inversé.
$ svn log -r 8
@dots{}
@end example
Vous pouvez aussi examiner l'historique des descriptions de modification
pour un unique fichier ou répertoire en spécifiant le chemin:
@example
$ svn log foo.c
@dots{}
$ svn log http://foo.com/svn/trunk/code/foo.c
@dots{}
@end example
les commandes affichent les descriptions de modification uniquement pour
les révisions où le fichier/répertoire (ou l'URL) a changé.
La commande @samp{svn log} a l'option @option{--verbose} (@option{-v})
aussi. Avec cette option, la liste des fichiers/répertoires modifiés
est également incluse pour chaque révision:
@example
$ svn log -r 8 -v
------------------------------------------------------------------------
rev 8: jrandom | 2002-07-14 08:15:29 -0500 | 1 line
Changed paths:
U /trunk/code/foo.c
U /trunk/code/bar.h
A /trunk/code/doc/README
Frozzled the sub-space winch.
------------------------------------------------------------------------
@end example
@subsection @samp{svn diff}
Nous avons déjà vu la commande @samp{svn diff} dans la section
précédante. Elle affiche les différences d'un fichier dans le format
``unified diff''. Il y a peu, nous l'avons utilisé pour montrer les
modifications locales réalisées à notre copie de travail.
En fait, il y a @emph{trois} utilisations distinctes de la commande
@samp{svn diff}:
@subsubsection Examiner les modifications locales
Exécuter @samp{svn diff} sans option compare vos fichiers de travail
avec les versions de référence cachées dans espace @file{.svn}.
@example
$ svn diff foo
Index: ./foo
===================================================================
--- ./foo
+++ ./foo Tue Jul 16 15:19:53 2002
@@ -1 +1,2 @@
An early version of the file
+...extra edits
@end example
@subsubsection Comparaison de la copie de travail avec le dépôt
Si option @option{--revision}(@option{-r}), suivi d'un numéros de révision,
est passé, alors votre copie de travail est comparée à une révision
particuliaire du dépôt.
@example
$ svn diff -r 3 foo
Index: ./foo
===================================================================
--- ./foo
+++ ./foo Tue Jul 16 15:19:53 2002
@@ -1,2 +1,2 @@
An early version of the file
-Second version of the file
+...extra edits
@end example
@subsubsection Comparaison dépôt à dépôt
Si deux numéros de révision sont passés à @option{-r}, alors les
deux révisions (du dépôt) sont directement comparées.
@example
$ svn diff -r 2:3 foo
Index: ./foo
===================================================================
--- ./foo
+++ tmp.280.00001 Tue Jul 16 15:22:19 2002
@@ -1 +1,2 @@
An early version of the file
+Second version of the file
@end example
Si vous lisez l'aide incluse dans svn (@command{svn help diff}), vous
découvrirez que vous pouvez également fournir une URL au-lieu de votre
copie de travail. C'est particuliairement appréciable pour inspecter des
modifications alors que vous n'avez pas de copie de travail disponible:
@example
$ svn diff -r 23:24 http://foo.com/some/project
@dots{}
@end example
@c ------------------------------------------------------------------
@node Branche et Etiquetage
@section Branche et Etiquetage
@subsection Branchement avec @command{svn cp}
Les branches et les étiquettess sont des concepts généraux commnun à la
plupart des systèmes de contrôle de révision. Si vous n'êtes pas familier
avec ces concepts, vous trouverez un bonne introduction d'explication dans
le livre libre de CVS de Karl Fogel :
@uref{http://cvsbook.red-bean.com/cvsbook.html#Branching_Basics}
Ici, vous devez avoir compris comment chaques remontées crées une
nouvelle et complète arborescence dans le dépôt. Si ce n'est pas le cas,
lisez ce qui est relavitif aux @dfn{révisions}, @xref{Transactions et
numéro de révision}, ou @xref{Les numéros de révision sont différents
maintenant}.
Comme vous le suspectez, le système de fichier (du dépôt) ne grossit
pas de 652 nouveaux fichier/répertoire à chaque fois qu'une nouvelle
révision est crée. Au-lieu de çà, chaque nouvelle arborescence est faite
principalement de pointeurs sur des fichiers/répertoires déjà existant.
Un nouveaux noeud est créé uniquement lorqu'un élément est modifié, tout
le reste de la révision utilise un espace de stockage partagé avec
d'autres révisions d'arborescence. Cette technique montre que le système
de fichier du dépôt est capable de faire des copies ``bon marchées'' (en
espace disque). Ces copies bon marchées ne sont rien d'autre qu'un entrée
de répertoire pointant sur un fichier existant (un peu comme le fait la
commande @command{ln} sous Unix). Ce principe est la base de l'étiquetage
et des branchements.
@subsection Branchement avec @samp{svn cp}
Supposons que nous avons un dépôt dont la révision de tête (la plus
récente) est 82. Dans ce dépôt il y a un sous-répertoire @file{mooIRC} qui
contient un projet de logiciel prêt à être étiqueté. Comment allons nous
l'étiqueter? Très simple: nous faisons une copie bon marchée de ce
répertoire. En d'autres mots, nous créons un nouveau répertoire (quelque
part ailleur dans le système de fichier) qui pointe sur ce noeud
@emph{spécifique} qui représente le répertoire @file{mooIRC} à la
révision 82. Bien sûr, vous pouvez nommer ce nouveau répertoire comme bon
vous semble (probablement quelque chose comme @file{mooIRC-beta}).
La façon la plus simple de faire cette copie est avec la commande
@samp{svn cp} qui peut également opérer uniquement sur des URL. Ainsi
cette copie peut avoir lieu uniquement côté serveur:
@example
$ svn cp http://foo.com/repos/mooIRC \
http://foo.com/repos/mooIRC-beta
Committed revision 83.
@end example
Maintenant, aussi longtemps que vous ne modifié pas le contenu de ce
répertoire @file{mooIRC-beta}, cette entrée pointera toujours sur le noeud
qui représente @file{mooIRC} au moment de la création de
@file{mooIRC-beta} (c'est à dire la révision 82). Ceci est un étiquetage.
Mais supposons @file{mooIRC-beta} ne soit pas sacré, et qu'ainsi, vous
décidé d'y faire des modifications. Et supposons que vous continuez
également à faire des modifications dans l'original @file{mooIRC}
répertoire. Ainsi, vous avez deux répertoires au début identique -- leurs
ancêtre commun est @file{mooIRC} dans la révision 82 -- mais qui
maintenant divergent dans le temps par leur contenu. En d'autres mots, ils
representent différentes @dfn{branches} de votre projet.
Il est très important de remarquer que le système de fichier de Subversion
n'a aucune ``conscience'' des ``étiquetages'' ou ``branches''. Il ne considère
que les répertoires et tous les répertoires sont égaux. Le concept
d'étiquetage et de branche attaché à un répertoire particulier n'ont qu'un
sens @emph{humain}.
C'est pour cette raison qu'il est de la responsabilité de l'utilisateur
(et de l'administrateur du dépôt Subversion) de choisir de bonnes rêgles
de nommage pour distinguer les branches, étiquetages@dots{}
Par exemple, voici une bonne organisation possible de votre dépôt:
@example
/
/projectA
/projectA/trunk/
/projectA/branches/
/projectA/tags/
/projectB
/projectB/trunk/
/projectB/branches/
/projectB/tags/
@end example
Chaque fois que @file{/projectA/trunk} atteind un état étiquetable, faites
une copie du répertoire quelque part dans @file{/projectA/tags/} et mettez
la copie en lecture seule. Utiliser la même procédure pour créer une branche
dans @file{/projectA/branches}.
Voici une autre bonne organisation possible:
@example
/
/trunk
/trunk/projectA
/trunk/projectB
/branches
/branches/projectA
/branches/projectB
/tags
/tags/projectA
/tags/projectB
@end example
Ou, bien sûr, vous pouvez également mettre chaque projet dans un dépôt
dédié. Ceci est de votre responsabilité. D'autres informations ici:
@xref{FAQ}.
@subsection Basculer vers une branche avec @samp{svn switch}
La commande @samp{svn switch} vous permet de ``déplacer'' certaine
partie ou tout votre copie de travail vers une branche ou une étiquette.
Par exemple, supposons que j'ai une copie de travail de @file{mooIRC},
et que je veux travailler sur un sous-système tel qu'il apparait dans
un sous-répertoire de @file{mooIRC-beta}. En même temps, je veux que
le reste de ma copie de travail reste sur sa branche d'origine
@file{mooIRC}. Pour le faire, je bascule le sous-répertoire approprié
vers le point de la nouvelle branche.
@example
$ svn switch http://foo.com/repos/mooIRC-beta/subsystems/renderer \
mooIRC/subsystems/renderer
U mooIRC/subsystems/renderer/foo.c
U mooIRC/subsystems/renderer/bar.h
U mooIRC/subsystems/renderer/baz.c
@end example
Maintenant mon sous-répertoire @file{renderer} de ma copie de travail
représente un répertoire différent sur le serveur.
En fait, @samp{svn swith} est une version plus ``rigolote'' de
@samp{svn update}. Alors que @samp{svn update} a la possibilité de
déplacer votre copie de travail dans le temps (en mettant à jour à la
dernière révision, ou en allant à la révision spécifiée avec l'option
@option{-r}), @samp{svn switch} est capable de déplacer votre copie de
travail dans le temps @emph{et} l'espace.
Si votre copie de travail à plusieurs aborescences de différents lieux de
dépôt, tout continue de fonctionner comme d'habitude. Lorsque vous faites
une mise à jour, vous recevrez, comme prévu, les patches apropriés a
chaques arborescences. Lorsque vous ferez une remontée, vos modifications
locales restent appliquées avec une unique et atomique modification au
dépôt.
@subsection Déplacer des modifications avec @samp{svn merge}
Supposons qu'une équipe de programmeur travaillant sur la branche
@file{mooIRC-beta} a corrigé un bug critique, et que l'équipe travaillant
sur la branche @file{mooIRC} originale veut appliquer ces modifications
également.
La commande @samp{svn merge} répond à cette situation. Vous pouvez penser
à @samp{svn merge} comme un cas spécial de @samp{svn diff}; simplement,
au-lieu d'affiche un ``unified diff'' à l'écran, il @emph{applique} les
modifications à votre copie de travail. Ces nouvelles modifications sont
locales à votre copie de travail.
Par exemple, supposons que la correction du bug soit arrivé à la remontée
de la révision 102 de la branche @file{mooIRC-beto}.
@example
$ svn diff -r 101:102 http://foo.com/repos/mooIRC-beta
@dots{} # diffs sent to screen
$ svn merge -r 101:102 http://foo.com/repos/mooIRC-beta mooIRC
U mooIRC/glorb.c
U mooIRC/src/floo.h
@end example
Alors que l'affichage de @samp{svn merge} est similaire à @samp{svn
update} ou @samp{svn switch}, La commande n'applique que des modifications
temporaires à vos fichiers de travail. Une fois que les différences sont
appliquées comme des modifications locales, vous pouvez les examiner comme
d'habitude avec @samp{svn diff}, @samp{svn status}, ou les annuler comme
d'habitude avec @samp{svn revert}. Si les changement sont acceptable, vous
pouvez les remonter.
@subsection Revenir en arrière avec @samp{svn merge}
Une autre utilisation courante de @samp{svn merge} est pour revenir
en arrière sur une modification qui a été remontée. C'est-à-dire que vous
avez remonté des modifications dans la révision 10, et que plus tard vous
décidez qui y a une erreur. Vous pouvez facilement ramener l'arborescence
à l'état de la révision 9 avec la commande @samp{svn merge}.
@example
$ svn commit -m "change some stuff"
Sending bar.c
Sending foo.c
Transmitting file data ..
Committed revision 10.
$
@dots{} # le développeur continu et réalise qu'il y a une erreur
$ svn merge -r 10:9 .
U ./bar.c
U ./foo.c
$ svn commit -m "oops, reverting revision 10"
Sending bar.c
Sending foo.c
Transmitting file data ..
Committed revision 11.
@end example
Si vous n'êtes pas revenu en arrière sur les modifications dans votre
répertoire courant (C'est-à-dire que vous voulez revenir en arrière pour
un fichier spécifique, ou tous les fichiers d'un répertoire spécifique),
alors la syntaxe est légèrement différente, parce que vous devez dire à
@samp{svn merge} où il doit fusionner les modifications.
@example
$ svn merge -r 10:9 baz/ baz/
U ./baz/bar.c
U ./baz/foo.c
$ svn commit -m "reverting revision 10's changes in baz/"
Sending baz/bar.c
Sending baz/foo.c
Transmitting file data ..
Committed revision 12.
$
@dots{} # le développeur continu et réalise qu'il y a une erreur
$ svn merge -r 13:12 baz/foo.c baz/foo.c
U ./baz/foo.c
$ svn commit -m "reverting revision 12's change to foo.c"
Sending baz/foo.c
Transmitting file data .
Committed revision 15.
@end example
Conservez à l'esprit que revenir en arrière sur des modifications avec
cette méthode est comme toutes les autres opérations avec @samp{svn
merge}, ainsi vous devriez utiliser @samp{svn status} et @samp{svn diff}
pour confirmer que votre travail est dans l'état que vous voulez qu'il
soit, et puis utiliser @samp{svn commit} pour envoyer la version finale au
dépôt.
@subsection Branches vendeur
Parfois, vous voulez géner/modifier, dans votre dépôt, des codes source
modifiés par une tierce partie tout en suivant les modifications apporté
par la tierce partie. Dans CVS, ceci peut s'appeler une ``branche
vendeur''. Subversion n'a pas formellement de ``branche vendeur'', mais
il est suffisament flexible pour vous permettre de faire pratiquement la
même chose.
La procédure générale se déroule comme ceci. Vous créé un répertoire pour
conserver la branche vendeur. Ici nous utiliserons @file{/vendor}. Puis
vous importez le code de la tierce partie dans un sous-répertoire de
@file{/vendor}, et enfin copiez ce sous-répertoire dans @file{/trunk} où
vous faites vos modifications locales. A chaques sorties d'une nouvelle
version par la tierce partie que vous voulez tracer, vous l'importez dans
la branche vendeur puis fusionnez les modification dans @file{/trunk}, et
resolvez si nécessaire les conflits entre vos modifications les celles
de la branche vendeur.
Faisons un essai et rendons çà un peu plus claire avec un exemple.
Premièrement, l'importation initiale.
@example
$ svn mkdir http://svnhost/repos/vendor/foobar
$ svn import http://svnhost/repos/vendor/foobar ~/foobar-1.0 current
@end example
Maintenant, nous avons la version courante du projet foobar dans
@file{/vendor/foobar/current}. Nous en faisons une autre copie, ainsi nous
pourrons toujours nous référer à cette version, puis nous la copions dans
la branche trunk (la branche de développement) afin de pouvoir travailler
dessus.
@example
$ svn copy http://svnhost/repos/vendor/foobar/current \
http://svnhost/repos/vendor/foobar/foobar-1.0 \
-m `étiquetage de foobar-1.0'
$ svn copy http://svnhost/repos/vendor/foobar/foobar-1.0 \
http://svnhost/repos/trunk/foobar \
-m `copie de foobar-1.0 dans trunk'
@end example
Maintenant nous n'avons qu'à sortie une copie de @file{/trunk/foobar} pour
commencer à travailler!
Plus tard, les développeurs de l'entreprise FooBar Widgets sortent une
nouvelle version de leurs codes, et vous voulez mettre à jour la version
du code que vous utilisez. Premièrement, vous sortez le répertoire
@file{/vendor/foobar/current}, puis copiez la nouvelle version dans cette
copie de travail. Gérez les renommages, les ajouts et les suppressions
manuellement puis faite la remontée.
@example
$ svn co http://svnhost/repos/vendor/foobar/current ~/current
$ cd ~/foobar-1.1
$ tar -cf - . | (cd ~/current ; tar -xf -)
$ cd ~/current
$ mv foobar.c main.c
$ svn mv main.c foobar.c
$ svn rm dead.c
$ svn add doc
$ svn add doc/*
$ svn commit -m `importation de foobar 1.1 dans la branche vendeur'
@end example
Diantre, que c'est compliqué. N'ayez crainte, la plupart des cas
sont nettement plus simple.
Que c'est-il passé? foobar 1.0 a un fichier nommé @file{main.c}. Ce
fichier a été renommé en @file{foobar.c} dans la version 1.1. Ainsi, votre
copie de travail a le vieux @file{main.c}, que @command{svn} connait, et
le nouveau @file{foobar.c} dont @command{svn} n'a pas connaissance. Nous
renommons @file{foobar.c} en @file{main.c} et utilisant @samp{svn mv} pour
lui redonner son nouveau nom. Ainsi, @command{svn} sait que
@file{foobar.c} est un descendant de @file{main.c}. @file{dead.c} a été
supprimé dans 1.1, et finalement, ils ont écrit de la documantation que
nous ajoutons.
Puis nous copions @file{/vendor/foobar/current} vers
@file{/vendor/foobar/foobar-1.1} ainsi vous pourrez toujours vous référer
à la version 1.1 en utilisant ce nom.
@example
$ svn copy http://svnhost/repos/vendor/foobar/current \
http://svnhost/repos/vendor/foobar/foobar-1.1 \
-m `étiquetage de foobar-1.1'
@end example
Maintenant que vous avez une copie de référence de foobar 1.1 dans
@file{/vendor}, vous n'avez plus qu'à fusionner leurs changements dans
@file{/trunk} et tout est fini.
Cette opération peut-être faite comme çà :
@example
$ svn co http://svnhost/repos/trunk/foobar ~/foobar
$ cd ~/foobar
$ svn merge http://svnhost/repos/vendor/foobar/foobar-1.0 \
http://svnhost/repos/vendor/foobar/foobar-1.1
$
@dots{} # résoudre tous les conflits entre leurs modifications et vos
# modification.
$ svn commit -m `merging foobar 1.1 into trunk'
@end example
Voilà qui est fait. Vous avez maintenant une copie de foobar 1.1 avec
toutes vos modifications fusionnées dans votre arborescence.
Les branches vendeurs qui ont beaucoup d'ajouts, suppressions et
déplacements peuvent utiliser le script @command{svn_load_dirs.pl} fourni
avec Subversion. Ce script automatise les étapes d'importations
précédentes et minimise les erreurs. Vous devez néanmoins toujours
utiliser la commande @samp{svn merge} pour fusionner la nouvelle version
de foobar dans votre copie locale contenant vos modifications locales.
Ce script prend en compte les cas où Subversion requière une remontée
pour pouvoir renommer à la fois un fichier et un répertoire, comme dans le
cas ou vous avez une branche vendeur qui renomme
@file{foobar-1.1/docs/doc.ps} en @file{foobar-1.2/documents/doc-1.2.ps}.
Ici, nous devons renommer @file{docs} en @file{documents}, faire une
remontée, puis renommer @file{doc.ps} en @file{doc-1.2.ps}. Vous ne pouvez
pas faire les deux renommages sans la remontée car @file{doc.ps} a déjà
été renommé une fois de @file{docs/doc.ps} en @file{documents/doc.ps}.
Ce script compare toujours le répertoire en cours d'importation avec ce
qu'il y a actuellement dans le dépôt Subversion et réalise les ajouts,
suppressions et renommages de fichiers et répertoires nécessaires pour que
le dépôt Subversion corresponde au répertoire importé. De cette manière,
il peut être utilisé avec un répertoire Subversion vide côté dépôt lors du
premier import mais aussi pour tous les imports suivant pour mettre à jour
la branche vendeur.
Pour le premier import de foobar-1.0 situé dans @file{~/foobar-1.0}:
@example
$ svn_load_dirs.pl -t foobar-1.0 \
http://svnhost/repos/vendor/foobar \
current \
~/foobar-1.0
@end example
@command{svn_load_dirs.pl} prend trois arguments au moins. Le premier
argument, @url{http://svnhost/repos/vendor/foobar}, est l'URL servant de
base pour les opérations de @command{svn_load_dirs.pl}. Dans ce cas, nous
travaillerons dans la partie @file{vendor/foobar} du dépôt Subversion.
L'argument suivant, @file{current}, est relatif au premier et est le
répertoire où l'importation courante sera faite. Dans ce cas c'est
@url{http://svnhost/repos/vendor/foobar/current}. Le dernier argument,
@file{~/foobar-1.0}, est le répertoire à importer. Enfin, l'argument de
l'option @option{-t} est également relatif à
@url{http://svnhost/repos/vendor/foobar} et dit à
@command{svn_load_dirs.pl} de créer l'étiquette
@url{http://svnhost/repos/vendor/foobar/foobar-1.0} pour le répertoire
importé.
L'importation de foobar-1.1 peut-être réalisée de la même façon:
@example
$ svn_load_dirs.pl -t foobar-1.1 \
http://svnhost/repos/vendor/foobar \
current \
~/foobar-1.1
@end example
Le script examine le répertoire courant
@url{http://svnhost/repos/vendor/foobar/current} et détermine quelles
modifications doivent lui être appliquées pour qu'il corresponde à
@file{~/foobar-1.1}. Le script est suffisament attentif pour remarquer
qu'il y a des fichiers ou répertoires qui existent dans 1.0 et non dans
1.1, et demandera si vous voulez réaliser des changements de nom. A ce
moment, vous pouvez indiquer que @file{main.c} a été renommé en
@file{foobar.c} puis indiquer qu'il n'y a plus de renommage à réaliser.
Le script supprime alors @file{dead.c}, ajoute @file{doc} et
@file{doc/*} au dépôt Subversion, et finalement crée l'étiquette
foobar-1.1 dans @url{http://svnhost/repos/vendor/foobar/foobar-1.1}.
@subsection Suppression de branche ou d'étiquette avec @samp{svn rm}
La commande @samp{svn rm} peut opérer sur des URL. Un fichier ou un
répertoire peut-être supprimé du dépôt à ``distance'' sans la présence
d'une copie de travail:
@example
$ svn rm http://foo.com/repos/tags/mooIRC-bad-tag -m "deleting bad tag"
Committed revision 1023.
@end example
Bien sûr, c'est une forme de remontée immédiate, ainsi une description
des modifications est requise (@samp{-m}).
@c ------------------------------------------------------------------
@node Propriétés
@section Propriétés
Subversion vous permet d'attacher n'importe quelle ``Méta-donnée'' à un
fichier ou un répertoire. Nous appèlerons ces données des @dfn{propriétés}
et elles peuvent être vues comme un ensemble de paire nom/valeur attaché à
chaque élément dans votre copie de travail.
Pour mettre ou récupérer une propriété d'un fichier ou d'un répertoire,
utilisez les commandes @samp{svn propset} et @samp{svn propget}.
Pour lister tous les propriétés d'un élément, utilisez @samp{svn
proplist}. Pour supprimer une propriété, utilisez @samp{svn propdel}.
@example
$ svn propset color green foo.c
property `color' set on 'foo.c'
$ svn propget color foo.c
green
$ svn propset height "5 feet" foo.c
property `height' set on 'foo.c'
$ svn proplist foo.c
Properties on 'foo.c':
height
color
$ svn proplist foo.c --verbose
Properties on 'foo.c':
height : 5 feet
color : green
$ svn propdel color foo.c
property `color' deleted from 'foo.c'
@end example
Les propriétés sont @emph{versionnées} comme l'est le contenu des
fichiers. Ceci signifie que de nouvelles propriétés peuvent être
fusionnées dans vos fichiers de travail, et peuvent parfois être en
conflit également. La valeur des propriétés n'est pas obligatoirement du
texte cependant. Par example, vous pouvez attacher une valeur de
propriété binaire en utilisant l'option @option{-F}:
@example
$ svn propset x-face -F joeface.jpg foo.c
property `x-face' set on 'foo.c'
@end example
Subversion founit également une méthode confortable pour éditer
des propriétés existantes: @samp{svn propedit}. Lorsque vous
exécutez cette commande, Subversion ouvre la valeur de la propriété
en question dans votre éditeur favori (en fait, l'éditeur que vous
avez défini avec @samp{$EDITOR} dans votre interpréteur de commande) et vous
pouvez éditer la valeur comme n'importe quel fichier texte. Ceci est
particuliairement agréable pour des propriétés qui sont un tableau de
valeurs séparés par des retour-chariot (voir plus bas).
Les modifications de propriétés restent considérées comme des
``modifications locales'' et ne sont pas permanentes tant que vous ne les
avez pas remontées. Comme les modifications de texte, les modifications de
propriétés peuvent être vuess avec @samp{svn diff}, @samp{svn
status} et également annulées avec @samp{svn revert}:
@example
$ svn diff
Property changes on: foo.c
___________________________________________________________________
Name: color
+ green
$ svn status
_M foo.c
@end example
Remarquez qu'une seconde colonne est apparue dans l'affichage de
@samp{svn status}; le souligné initial indique que vous n'avez pas
modifié le contenu du fichier, mais le @samp{M} signifie que vous avez
modifié les propriétés. @samp{svn status} essaie de cacher la seconde
colonne des propriétés lorsqu'un élément n'a pas de propriété du tout.
C'est un choix de conception, pour faciliter les nouveaux utilisateurs à
ce concept. Lorsque des propriétés sont créées, éditées ou mise à jour sur
un élément, cette seconde colonne apparait toujours après.
Enfin, ne soyez pas inquiet de la façon non-standard dont Subversion
affiche actuellement les différences de propriété. Vous pouvez continuer
a utiliser @samp{svn diff} et rediriger sa sortie pour créer un fichier
patche utilisable. Le programme @command{patch} ignorera les patches de
propriété; il a la règle d'ignorer tout ce qu'il ne comprend pas.
Cependant, dans une future version de Subversion, nous commencerons à
utiliser un nouveau format de patche qui décrit les modifications de
propriété et les copies/renommages de fichiers.
@subsection Propriétés spéciales
Subversion n'a pas de règles particulières à l'égard des propriétés. Elles
peuvent être utilisées à n'importe quel propos. La seule restriction est
que Subversion s'est réservé les noms avec le préfixe @samp{svn:} pour son
propre usage. Un certain nombre de propriétés ``magique'' commence avec ce
préfixe. Nous traitons de leures caractéristiques ici.
@subsubsection @samp{svn:executable}
C'est une propriété pour les fichiers uniquement et qui peut être mis à
n'importe quelle valeur. Son existance modifier les permissions du fichier
pour permettre son exécution.
@subsubsection @samp{svn:mime-type}
Actuellemnt, Subversion examine la propriété @samp{svn:mime-type} pour
décider si le fichier est de type texte ou binaire. Si le fichier n'a pas
de propriété @samp{svn:mime-type} ou si la valeur de la propriété
correspond à @samp{text/*}, alors Subversion considère que c'est un
fichier texte. Si le fichier a la propriété @samp{svn:mime-type} mise à
autre chose que @samp{text/*}, alors le fichier est considéré comme
binaire.
Si Subversion considère que le fichier est binaire, il ne tentera pas de
fusionner durant une mise à jour. Au-lieu de çà, Subversion crée deux
fichiers dans votre copie de travail (un fichier correspondant au dépôt et
un autre à votre copie de travail). Celui avec vos modifications locales
est renommé avec l'extension @file{.orig}.
Subversion aide l'utilisateur en tentant de détecter la présence d'un
fichier binaire lors d'un @samp{svn import} ou @samp{svn add}. Si le
fichier est considéré comme binaire par ces commandes, elles mettent la
propriété @samp{svn:mime-type} à @samp{application/octet-stream} au
fichier qui vient être ajouté. Si Subversion s'est trompé lors de sa
détection, vous pouvez toujours supprimer ou éditer la propriété.
Enfin, si la propriété @samp{svn:mime-type} est mise, alors mod_dav_svn
l'utilisera pour remplire l'entête @samp{Content-type:} lors d'une réponse
à une requête http GET. Ceci rend l'affichage des fichiers plus agréable
lors de la consultation d'un dépôt avec un navigateur web.
@subsubsection @samp{svn:ignore}
Si vous attachez cette propriété à un répertoire, les fichiers avec un
certain motif dans leur nom seront ignorés par @samp{svn status}. Par
exemple, supposons que je ne veux pas voir les fichiers objets ou les
fichiers de sauvegarde dans le listing de @samp{svn status}:
@example
$ svn status
M ./foo.c
? ./foo.o
? ./foo.c~
@end example
En utilisant @samp{svn propedit}, je peux mettre la valeur de
@samp{svn:ignore} à une liste de motifs délimités par des retours-chariot:
@example
$ svn propget svn:ignore .
*.o
*~
@end example
@subsubsection @samp{svn:keywords}
Subversion a l'abtitude de substituer certains mots-clé par des chaines de
caractère utilent dans les fichiers textes. Par exemple, si je place ce
texte dans un fichier:
@example
Ceci est le dernier rapport de la ligne de front.
$LastChangedDate$
Les comulus sont plus nombreux à l'approche de l'été.
@end example
Subversion est capable de substituer la chaine @samp{$LastChangedDate$}
avec l'actuelle date de dernière modification du fichier. Le mot clé
n'est pas supprimé durant la substitution, Il n'y a que l'information
spécifique qui est placé après le mot clé qui est substitué.
@example
Ceci est le dernier rapport de la ligne de front.
$LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $
Les comulus sont plus nombreux à l'approche de l'été.
@end example
Il y a quatre mots-clé que Subversion sait comment substituer:
@table @b
@item LastChangedDate
La dernier date quand le fichier a été modifié. L'abbréviation @samp{Date}
peut-être utilisée. La substitution du mot clé @samp{$LastChangedRevision}
ressemble à quelque chose comme
@samp{$LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $}.
@item LastChangedRevision
La dernière révision quand le fichier a été modifié. L'abbréviation
@samp{Rev} peut-être utilisée. La substitution du mot clé
@samp{$LastChangedRev$} ressemble à quelque chose comme
@samp{$LastChangedRevision: 144 $}.
@item LastChangedBy
Le dernier utilisateur qui a changé le fichier. L'abbréviation
@samp{Author} peut-être utilisée. La substitution du mot clé
@samp{$LastChangedBy$} ressemble à quelque chose comme
@samp{$LastChangedBy: joe $}.
@item HeadURL
L'URL complète de la dernière version du fichier dans le depôt.
L'abbréviation ``URL'' peut-être utilisée. La substitution du mot clé
@samp{$HeadURL$} ressemble à quelque chose comme
@samp{$HeadURL: http://svn.collab.net/repos/trunk/README $}.
@end table
Pour activer un mot-clé ou fixer un mot-clé, vous avez simplement besoin
de mettre la propriété @samp{svn:keywords} à une liste de mot-clé que
vous voulez substituer. Les mots clé non listés dans @samp{svn:keywords}
ne seront pas substitués :
@example
$ svn propset svn:keywords "Date Author" foo.c
property `svn:keywords' set on 'foo.c'
@end example
Lorsque que vous remonterez ces changements de propriété, vous découvrirez
que toutes les occurrences de @samp{$Date$}, @samp{$LastChangedDate$},
@samp{$Author$}, et @samp{$LastChangedBy$} auront leurs valeurs de
substitutions dans @file{foo.c}.
@subsubsection @samp{svn:eol-style}
Par défaut, Subversion ne prête pas attention aux fins de ligne. Si un
fichier texte a LF, CR or CRLF pour fins de ligne, alors celles-ci sont
les fins de ligne qui existeront dans le fichier pour le dépôt et la copie
de travail.
Mais si les développeurs travaillent sur différentes plateformes, les fins
de ligne peuvent être la source de nuisances. Par exemple, si un
développeur sous win32 et un développeur sous Unix modifient l'un après
l'autre le même fichier, les fins de ligne du fichier changent entre les
révisions du dépôt. Ceci rend l'examen ou la fusion des différences très
difficile, car @emph{chaques} lignes apparaissent avoir changé pour chaque
version du fichier.
La solution ici est de mettre la propriété @samp{svn:eol-style} à
``native''. Celà permet au fichier d'apparaitre avec les fins de ligne
``native'' dans chaqu'un des systèmes d'exploitation des développeurs.
Remarquez, néanmoins, que le fichier est toujours avec des fins de
ligne LF dans le dépôt. Ceci prévient les problèmes de fin de ligne
``bidon'' de révision en révision.
Alternativement, vous pouvez forcer un fichier à toujours conserver une
convention de fin de ligne spécifique : mettez la propriété
@samp{svn:eol-style} d'un fichier à @samp{LF}, @samp{CR} ou @samp{CRLF}.
Un fichier @file{.dsp} de win32 par exemple, qui est utilisé par les outils de
développement Microsoft, doit toujours avoir des fins de ligne CRLF.
@subsubsection @samp{svn:externals}
@xref{Modules}.
@c ------------------------------------------------------------------
@node Modules
@section Modules
Parfois il est utile de construire une copie de travail qui est faite de
différentes sorties. Par exemple, vous voulez que différents
sous-répertoires correspondent à différents endroits du dépôt.
Une méthode possible est de commencer par une sortie d'une copie de
travail puis d'exécuter @samp{svn switch} dans différents
sous-répertoires. Mais c'est du boulot. Ne serait-il pas agréable de
définir -- en un seul lieu -- exactement comment vous voulez que la copie
de travail soit?
Ceci est connu en tant que @dfn{module}. vous pouvez définir un module en
attachant une autre propriété ``magique'' à un répertoire: la propriété
@samp{svn:externals}.
@example
$ svn propget svn:externals projectdir
subdir1/foo http://url.for.external.source/foo
subdir1/bar http://blah.blah.blah/repositories/theirproj
subdir1/bar/baz http://blorg.blorg.blorg/basement/code
@end example
En considérant que cette propriété est attachée au répertoire
@file{projectdir}, alors lorsque vous faite une sortie, vous obtenez aussi
ce qui est défini par la propriété.
@example
$ svn checkout http://foo.com/repos/projectdir
A projectdir/blah.c
A projectdir/gloo.c
A projectdir/trout.h
Checked out revision 128.
Fetching external item into projectdir/subdir1/foo
A projectdir/subdir1/foo/rho.txt
A projectdir/subdir1/foo/pi.txt
A projectdir/subdir1/foo/tau.doc
Checked out revision 128.
@dots{}
@end example
En modifiant la valeur de la propriété de @samp{svn:externals}, la
définition du module peut changer dans le temps et les appels suivants à
@samp{svn update} mettront à jour votre copie de travail de façon
approprié.
@c ### Karl, anything else to add here? I'm suspicious that this
@c feature doesn't work as I expect just yet; when I run svn @samp{up} at
@c the top of the wc, nothing happens in the external directory at
@c all, because (I guess) it's not linked to the parent.
@c ------------------------------------------------------------------
@node Révisions
@section Révisions
Comme vous l'avez sans doute remarqué, beaucoup de commandes Subversion
sont capable de traiter le drapeau @option{-r}. Ici nous décrirons
quelques méthodes pour spécifier des révisions.
Le client Subversion comprend plusieurs @dfn{mots clé de révision}. Ces
mots clé peuvent-être utilisé à la place d'un entier comme argument de
l'option @option{-r}, et désigne un numéro de révision spécifique.
@table @b
@item HEAD
La dernière révision dans le dépôt.
@item BASE
La révision de référence dans @file{.svn} d'un élément de la copie de
travail.
@item COMMITTED
La dernière révision dans laquelle un élément a changé.
@item PREV
La révision juste @emph{avant} la dernière révision où l'élément à changé.
(Théorique c'est équivalent à COMMITTED - 1).
@end table
Quelques exemples de mots clé de révision en action:
@example
$ svn diff -r PREV:COMMITTED foo.c
# montre la dernière modification remontée de foo.c
$ svn log -r HEAD
# montre la description de modification de la dernière remontée au dépôt
$ svn diff -r HEAD
# compare votre fichier de travail (avec ses modifications locales) à la
# dernière version dans le dépôt
$ svn diff -r BASE:HEAD foo.c
# compares la version de référence de foo.c dans @file{.svn} (sans
# modifications locales) avec la dernière version dans le dépôt
$ svn log -r BASE:HEAD
# montre toutes les descriptions de modification depuis la dernière mise à
# jour
$ svn update -r PREV foo.c
# revient en arrière sur les dernières modifications de foo.c remontées au
# dépôt. (la révision de travail de foo.c est diminuée.)
@end example
@node Autres commandes
@section Autres commandes
@subheading @samp{svn cleanup}
Lorsque Subversion modifie votre copie de travail (ou toutes informations
à l'intérieur de @file{.svn}), il essaie de la faire de la façon la plus
sûre possible. Avant toute modification, il écrit ces intentions dans un
un ``logfile'', puis exécute les commandes du ``logfile''. C'est similaire
dans la conception à un système de fichier journalisé; si l'utilisateur
fait Contrôle-C ou si la machine se plante, le ``logfile'' reste. En
réexécutant les ``logfiles'', le travail peut être terminé, et votre copie
de travail peut revenir à un état consistant.
Et c'est exactement ce que fait @samp{svn cleanup}: il recherche dans
votre copie de travail des ``logfile'' que sont restés et les réexécute,
supprimant ainsi les verrous dans le processus. Utilisez cette commande si
Subversion vous dit que certaines parties de votre copie de travail sont
``verrouillées''. Enfin, @samp{svn status} affichera un @samp{L} a côté
des éléments verrouillés.
@example
$ svn st
L ./somedir
M ./somedir/foo.c
$ svn cleanup
$ svn st
M ./somedir/foo.c
@end example
@subheading @samp{svn info}
En général nous essayons de décourager les utilisateurs de lire
directement le fichier @file{.svn/entries} utilisé pour tracer les
éléments. Au lieu de celà, les curiosités peuvent être ``calmées'' en
utilisant la command @samp{svn info} qui affiche la plupart des
informations tracées :
@example
$ svn info client.texi
Path: client.texi
Name: client.texi
URL: http://svn.collab.net/repos/svn/trunk/doc/handbook/client.texi
Revision: 2548
Node Kind: file
Schedule: normal
Last Changed Author: fitz
Last Changed Rev: 2545
Last Changed Date: 2002-07-15 23:03:54 -0500 (Mon, 15 Jul 2002)
Text Last Updated: 2002-07-16 08:48:04 -0500 (Tue, 16 Jul 2002)
Properties Last Updated: 2002-07-16 08:48:03 -0500 (Tue, 16 Jul 2002)
Checksum: 8sfaU+5dqyOgkhuSdyxGrQ==
@end example
@subheading @samp{svn import}
La commande import est un moyen rapide de remonter une arborescence de
fichiers non versionnée dans un dépôt.
Il y a deux façon d'utiliser cette commande:
@example
$ svnadmin create /usr/local/svn/newrepos
$ svn import file:///usr/local/svn/newrepos mytree
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h
Transmitting file data....
Committed revision 1.
@end example
L'exemple précédent place le contenu du répertoire @file{mytree}
directement à la racine du dépôt:
@example
/foo.c
/bar.c
/subdir
/subdir/quux.h
@end example
Si vous donnez un troisième argument à la commande @samp{svn import},
il utilisera l'argument comme le nom du nouveau sous-répertoire à créer
dans l'URL.
@example
$ svnadmin create /usr/local/svn/newrepos
$ svn import file:///usr/local/svn/newrepos mytree fooproject
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h
Transmitting file data....
Committed revision 1.
@end example
Le dépôt doit maintenant ressembler à :
@example
/fooproject/foo.c
/fooproject/bar.c
/fooproject/subdir
/fooproject/subdir/quux.h
@end example
@subheading @samp{svn export}
La commande export est un moyen rapide de créer une arborescence de
fichier non versionnée d'un répertoire d'un dépôt.
@example
$ svn export file:///usr/local/svn/newrepos/fooproject
A fooproject/foo.c
A fooproject/bar.c
A fooproject/subdir
A fooproject/subdir/quux.h
Checked out revision 3.
@end example
Le répertoire résultant ne contiendra aucun espace d'administration
@file{.svn} et toutes les méta-données de propriété sont perdues.
(N'utilisez pas cette technique pour faire des backups; elle est
probablement meilleur pour faire un paquetage des sources.)
@subheading @samp{svn ls}
La commande ls vous permet d'avoir des informations sur des fichiers d'un
répertoire du dépôt.
@example
$ svn ls http://svn.collab.net/repos/svn
http://svn.collab.net/repos/svn:
_ 2738 bmatzell 0 Jul 26 13:07 clients/
_ 2743 rooneg 0 Jul 26 18:07 trunk/
_ 2703 brane 0 Jul 24 22:07 branches/
P 2734 kfogel 2331 Jul 26 10:07 COMMITTERS
_ 2698 rooneg 0 Jul 24 18:07 tags/
@end example
Les colonnes vous disent si le fichier a des propriétés (``P'' s'il en a,
``_'' s'il n'en a pas), la révision de la dernière mise à jour,
l'utilisateur qui a fait la dernière mise à jour, sa taille, la date de
dernière mise à jour et le nom du fichier.
@subheading @samp{svn mkdir}
C'est un autre commande partique et qui a deux usages.
Premièrement, elle peut être utilisée pour simultanément créer un nouveau
répertoire dans la copie de travail et le programmé pour l'ajout:
@example
$ svn mkdir new-dir
A new-dir
@end example
Ou, elle peut être utilisée pour instantanément créer un répertoire dans
le dépôt (aucune copie de travail n'est nécessaire):
@example
$ svn mkdir file:///usr/local/svn/newrepos/branches -m "made new dir"
Committed revision 1123.
@end example
Encore une fois, c'est une forme de remontée immédiate et une description
de modification est requise.
* Configuration d exécution::
@c ------------------------------------------------------------------
@node Configuration d exécution
@section Configuration d exécution
Lorsque vous exécuter pour la première fois le client en ligne de commande
@command{svn}, il cré un @dfn{espace de configuration} par utilisateur.
Sur un système Unix-like, un répertoire @file{.subversion/} est créé dans
le répertoire personnel de l'utilisateur. Sur un système Win32, un dossier
@file{Subversion} est créé dans un endroit approprié pour le faire
(typiquement quelque part dans @file{Documents and Settings\username},
mais çà dépend du système.)
@subsection Proxy
Au moment de l'écriture de ce guide, l'espace de configuration contient
uniquement un élément: un fichier @file{proxies}. En renseignant des
valeurs dans ce fichier, votre client Subversion peut opérer via un proxy
http. (Lisez le fichier lui-même pour les détails; il contient sa propre
documentation.)
@subsection Config
Prochainement -- très prochainement -- un fichier @file{config} existera
dans cet espace pour définir des préférences générales de l'utilisateur.
Par exemple, l'éditeur à utiliser préféré (@samp{$EDITOR}), les options a
passer à @samp{svn diff}, les préférences pour le format de date et heure,
etc. Voir la question #668 pour les détails
(@uref{http://subversion.tigris.org/issues/show_bug.cgi?id=668}).
@subsection Espace de configuration multiple
Sur Unix, un administrateur peut créer des préférences Subversion
``global'' en créant et remplissant un espace @file{/etc/subversion/}. Les
fichiers de configuration par utilisateur écrasent ces valeurs par
défauts cependant.
Sur Win32, un administrateur a l'option de créer trois autres
emplacements: un dossier global @file{Subversion} dans l'espace ``All
Users'', un ensemble de registres de configuration globaux, ou un ensemble
de registres de configuration par utilisateur. Les registres de
configuration sont défini dans:
@example
HKCU\Software\Tigris.org\Subversion\Proxies
HKCU\Software\Tigris.org\Subversion\Config
etc.
@end example
Pour clarifier les chose, voici l'ordre de recherche de la configuration
à l'exécution sous Win32. Chaque configuration d'un emplacement écrase
la configuration de l'emplacement précédent:
@itemize @bullet
@item global registry
@item global @file{Subversion} folder
@item user registry
@item user @file{Subversion} folder
@end itemize