Processus basique de travail

Subversion est pourvu de nombreuses fonctionnalités, options et gadgets, mais au quotidien, il est plus probable que vous n'en utiliserez qu'un nombre relativement restreint. Dans cette section, nous énumèrerons les tâches les plus communes que vous serez amené à effectuer avec Subversion lors d'une journée de travail.

Le processus de travail typique ressemble à ceci :

Mettre à Jour Votre Copie de Travail

En travaillant en équipe sur un projet, vous souhaiterez mettre à jour votre copie de travail pour recevoir toute modification effectuée depuis votre dernière mise à jour pour recevoir ce qu'ont fait les autres développeurs du projet. Utilisez svn update pour synchroniser votre copie de travail avec la dernière révision du dépôt.

$ svn update
U  foo.c
U  bar.c
Updated to revision 2.

Dans le cas précédent, quelqu'un d'autre a propagé ses modifications sur foo.c et bar.c depuis votre dernière mise à jour, et Subversion a mis à jour votre copie de travail pour y répercuter ces changements.

Attardons nous un instant sur les messages de sortie de svn update. Lorsque le serveur envoie des changements vers votre copie de travail, un caractère est affiché devant chaque élément mis à jour pour vous signaler le type d'action que Subversion a faite sur votre copie de travail :

U foo

Le fichier foo a été mis à jour (Updated ) (modifications reçues depuis le serveur).

A foo

Le fichier ou répertoire foo a été Ajouté dans votre copie de travail.

D foo

Le fichier ou répertoire foo a été supprimé (Deleted ) de votre copie de travail.

R foo

Le fichier ou répertoire foo a été Remplacé dans votre copie de travail ; en d'autres termes, foo a été supprimé, et un nouvel élément avec un même nom a été ajouté. Même s'ils ont le même nom, le dépôt les considère comme deux objets distincts avec des historiques séparés.

G foo

Le fichier foo a reçu des changements depuis le dépôt, mais votre copie locale du fichier a été modifiée par vous. Les modifications du dépôt ne sont pas en conflit avec les votres ou elles sont strictement identiques à celles subies par votre copie locale, aussi Subversion a fusionné (merGed ) les changements du dépôt avec les votres sans difficulté.

C foo

Le fichier foo a reçu des modifications depuis le serveur en Conflit avec vos modifications locales. Les changements reçus depuis le serveur concernent directement des segments du fichier que vous avez vous-même modifiés localement. Cependant, inutile de paniquer. Ce conflit doit être résolu par un humain (vous) ; nous traiterons de cette situation plus tard dans ce chapitre.

Modifiez Votre Copie de Travail

Maintenant, vous pouvez commencer à travailler et à modifier votre copie de travail. Il est en général plus pratique de décider à l'avance du changement (ou de l'ensemble de changements) particulier que l'on souhaite faire, comme l'implémentation d'une nouvelle fonctionnalité, la correction d'un bogue etc. Les commandes Subversion que vous utiliserez ici sont svn add, svn delete, svn copy, et svn move. De toute façon, si vous ne faites qu'éditer des fichiers qui sont déjà dans Subversion, il se peut que vous n'ayez besoin d'aucune de ces commandes tant que vous ne voudrez pas propager vos modifications. Les différentes types de changement que vous pouvez faire dans votre copie de travail sont :

Modifications de fichiers

Il s'agit du plus simple type de changement. Il est inutile d'informer Subversion que vous avez l'intention de modifier un fichier ; vous n'avez qu'à simplement le faire. Subversion saura détecter automatiquement les fichiers modifiés.

Modifications de l'arborescence

Vous pouvez signaler à Subversion les fichiers et répertoires que vous avez l'intention de supprimer, ajouter, copier ou déplacer. Ces modifications peuvent être prises en compte immédiatement dans votre copie de travail sans qu'elles ne soient répercutées dans le dépôt jusqu'à ce que vous les propagiez.

Pour modifier des fichiers, utilisez votre éditeur de texte, traitement de texte, programme de dessin ou n'importe quel autre outil que vous utiliseriez normalement. Subversion gère les fichiers binaires aussi facilement qu'il gère les fichiers texte — avec la même efficacité.

Voici un aperçu des quatres sous-commandes de Subversion que vous utiliserez le plus souvent pour modifier l'arborescence (nous parlerons des commandes svn import et svn mkdir plus tard).

Warning

Même si vous pouvez éditer vos fichiers avec les outils de votre choix, vous ne devez pas changer la structure de votre copie de travail sans en avertir Subversion. Utilisez les commandes svn copy, svn delete et svn move pour changer la structure de votre copie de travail et utilisez la commande svn add pour soumettre de nouveaux fichiers et répertoires au contrôle de version.

svn add foo

Planifie l'ajout du fichier, répertoire ou lien symbolique foo dans le dépôt. A votre prochaine propagation, foo deviendra un élément fils de son répertoire père. Notez que si foo est un répertoire, tout les éléments fils de foo seront aussi préparés à être ajoutés. Si vous ne voulez ajouter que le répertoire foo lui-même, utilisez l'option --non-recursive (-N ).

svn delete foo

Planifie la suppression du fichier, répertoire ou lien symbolique foo dans le dépôt. Si foo est un fichier ou un lien, il est immédiatement supprimé de votre copie de travail. Si foo est un répertoire, il n'est pas supprimé, mais Subversion planifie sa suppression. Lorsque vous propagez vos modifications, foo sera supprimé de votre copie de travail ainsi que du dépôt. [10]

svn copy foo bar

Crée un nouvel élément bar qui est une copie, un double de foo. bar est automatiquement marqué comme devant être ajouté. Lorsque bar est ajouté au dépôt à la prochaine propagation, l'historique de l'original (foo) est enregistré (car un certain lien avec foo est conservé). svn copy ne crée pas d'éventuels répertoires intermédiaires.

svn move foo bar

Cette commande revient à exécuter svn copy foo bar; svn delete foo. En d'autres termes, bar est marqué comme devant être ajouté en tant que copie de foo et foo est en attente d'être supprimé. svn move ne crée pas d'éventuels répertoires intermédiaires.

Consultez vos modifications

Une fois vos modifications terminées, vous voudrez les propager vers le dépôt, mais avant de faire cela, il est en général préférable de jeter un oeil aux modifications exactes que vous avez effectuées. En consultant vos modifications avant de les propager, vous serez en mesure de fournir un commentaire d'historique plus pertinent. Vous pouvez aussi découvrir que vous avez modifié un fichier par inadvertance et cela vous donne donc une chance d'annuler ces changements avant de propager votre travail. De plus, c'est l'occasion parfaite pour examiner en détail vos changements avant de les publier. Vous pouvez voir tout ce que vous avez changé en utilisant svn status, svn diff et svn revert. Typiquement, vous utiliserez les deux premières commandes pour chercher les fichiers qui ont changé dans votre copie de travail, et éventuellement la troisième pour annuler tout ou partie de ces changements.

Subversion a été optimisé pour vous assiter dans cette tâche et est capable de faire un grand nombre d'opérations sans communiquer avec le dépôt. En particulier, votre copie de travail contient une “copie originale” secrêtement mise en cache de chaque fichier soumis au contrôle de version dans le répertoire .svn. Grâce à cela, Subversion peut rapidement vous montrer de quelle manière vos fichiers de travail ont été modifiés, voire même vous permettre d'annuler vos changements sans avoir à contacter le dépôt.

svn status

Il est probable que vous utiliserez la commande svn status plus que n'importe quelle autre commande Subversion.

Si vous exécutez svn status à la racine de votre copie de travail sans aucun argument, cela détectera tous les changements que vous avez réalisés sur les fichiers et sur l'arborescence. Ci-dessous quelques exemples des différents codes de status que svn status peut renvoyer. (Notez que le texte situé après # n'est pas réellement affiché par la commande svn status.)

  L     some_dir            # svn a laissé un verrou dans le répertoire .svn de some_dir
M       bar.c               # le contenu de bar.c a été modifié localement
 M      baz.c               # baz.c a été modifié au niveau des propriétés mais pas de son contenu
X       3rd_party           # dir fait partie d'une définition externe
?       foo.o               # svn ne gère pas foo.o
!       some_dir            # svn gère cet élément, mais ce dernier est manquant ou incomplet
~       qux                 # versionné en tant que fichier/répertoire/lien, mais le type a changé
I       .screenrc           # svn ne gère pas cet élément, et il lui a été demandé de l'ignorer
A  +    moved_dir           # ajouté avec l'historique hérité de l'original
M  +    moved_dir/README    # ajouté avec un historique hérité et contient des modifications locales
D       stuff/fish.c        # le fichier est marqué pour une suppression
A       stuff/loot/bloo.h   # le fichier est marqué pour être ajouté
C       stuff/loot/lump.c   # fichier sujet à conflit de contenu suite à une mise à jour
 C      stuff/loot/glub.c   # fichier sujet à conflit de propriété suite à une mise à jour
R       xyz.c               # le fichier est destiné à être remplacé
    S   stuff/squawk        # le fichier ou répertoire a été échangé avec une autre branche
     K  dog.jpg             # le fichier est verrouillé localement ; jeton de verrou présent
     O  cat.jpg             # le fichier est verrouilé dans le dépôt par un autre utilisateur
     B  bird.jpg            # le fichier est verrouillé localement, mais le verrou est brisé
     T  fish.jpg            # le fichier est verrouillé localement, mais le verrou a été volé

Dans ce format de sortie svn status affiche cinq colonnes de caractères, suivis de plusieurs caractères d'espacement, suivis par le nom d'un fichier ou d'un répertoire. La première colonne indique le statut d'un fichier ou répertoire et/ou son contenu. Les codes affichés ici sont :

A item

Le fichier, répertoire ou lien symbolique item est destiné à être ajouté dans le dépôt.

C item

Le fichier item est en situation de conflit. Autrement dit, les changements reçus depuis le serveur durant une mise à jour sont incompatibles avec les changements locaux effectués dans votre copie de travail. Vous devez résoudre ce conflit avant de propager vos modifications vers le dépôt.

D item

Le fichier, répertoire ou lien symbolique item est destiné à être supprimé du dépôt.

M item

Le contenu du fichier item a été modifié.

R item

Le fichier, répertoire ou lien symbolique item est destiné à remplacer item dans le dépôt. Cela signifie que l'objet est d'abord supprimé, puis qu'un autre objet portant le même nom est ajouté, tout cela en une seule révision.

X item

Le répertoire item n'est pas versionné, mais il est attaché à une définition externe Subversion. Pour en savoir plus sur les définitions externes, voir the section called “Externals Definitions”.

? item

Le fichier, répertoire ou lien symbolique item n'est pas soumis au contrôle de version. Vous pouvez éviter l'affichage de ces lignes en passant l'option --quiet (-q) à la commande svn status ou en positionnant la propriété svn:ignore sur le répertoire parent. Pour plus d'informations sur les fichiers ignorés, voir the section called “svn:ignore.

! item

Le fichier, répertoire ou lien symbolique item est soumis au contrôle de version mais est manquant ou “incomplet”. Cet élément peut être manquant s'il a été supprimé sans utiliser une commande Subversion. Dans le cas d'un répertoire, il peut être incomplet si vous avez interrompu une extraction ou une mise à jour. Un rapide svn update récupèrera le fichier ou répertoire depuis le dépôt ou svn revert file restaurera tout fichier manquant.

~ item

Le fichier, répertoire ou lien symbolique item est présent dans le dépôt en tant qu'objet d'un certain type, mais il est d'un type différent dans votre copie de travail. Par exemple, Subversion peut contenir un fichier dans le dépôt, mais vous avez supprimé le fichier et créé un répertoire à la place sans avoir utilisé la commande svn delete ou svn add.

I item

Le fichier, répertoire ou lien symbolique item n'est pas soumis au contrôle de version et Subversion est configuré pour l'ignorer durant les opérations svn add, svn import et svn status. Pour plus d' informations sur les fichiers ignorés, voir the section called “svn:ignore. Notez que ce symbôle ne s'affiche que si vous passez l'option --no-ignore à svn status — dans le cas contraire le fichier serait ignoré et donc pas du tout listé !

La seconde colonne indique le statut des propriétés d'un fichier ou d'un répertoire (voir the section called “Properties” pour plus d'informations sur les propriétés). Si un M apparaît dans la seconde colonne, alors les propriétés ont été modifiées, sinon un espace sera affiché.

La troisième colonne affichera soit un espace soit un L qui signifie que Subversion a verrouillé la zone de travail .svn du répertoire. Vous verrez L si vous exécutez svn status dans un répertoire où svn commit est en cours — peut-être pendant que vous éditer le commentaire de journal. Si Subversion n'est pas en cours d'exécution, alors vraisemblablement Subversion a été interrompu et le verrou a besoin d'être nettoyé en exécutant svn cleanup (plus de détails plus tard dans ce chapitre).

La quatrième colonne affichera soit un espace soit + qui signifie que le fichier ou répertoire est destiné à être ajouté ou modifié avec un historique hérité en plus du reste. Typiquement, cela arrive lorsque vous utilisez svn move ou svn copy sur un fichier ou un répertoire. Si vous voyez A  +, cela signifie que l'élément est destiné à être ajouté avec un historique hérité. L'élément pourrait être un fichier ou la racine d'un répertoire copié. + signifie q'un élément fait partie d'une sous arborescence destinée à être ajoutée avec un historique hérité, i.e. un parent a été copié and it's just coming along for the ride. M  + signifie que l'élément fait partie d'une sous arborescence destinée à être ajoutée avec un historique hérité et il contient des modifications locales. Lorsque vous lancez une propagation, le parent sera d'abord ajouté avec un historique hérité (copié), ce qui signifie que ce fichier existera automatiquement dans la copie. Puis les modifications locales seront chargées dans la copie.

La cinquième colonne affichera soit un espace soit un S. Cela signifie que le fichier ou répertoire has been switched from the path of the rest of the working copy (using svn switch) to a branch.

La sixième colonne affiche des informations à propos des verrous, sujet dont on parlera plus longuement dans the section called “Locking”.

Si vous passez en paramètre un chemin spécifique à svn status, vous obtiendrez des informations sur ce chemin seulement :

$ svn status stuff/fish.c
D      stuff/fish.c

svn status offre aussi la possibilité d'utiliser l'option --verbose (-v), qui affichera le statut de tous les éléments dans votre copie de travail, même ceux n'ayant pas été modifiés :

$ svn status --verbose
M               44        23    sally     README
                44        30    sally     INSTALL
M               44        20    harry     bar.c
                44        18    ira       stuff
                44        35    harry     stuff/trout.c
D               44        19    ira       stuff/fish.c
                44        21    sally     stuff/things
A                0         ?     ?        stuff/things/bloo.h
                44        36    harry     stuff/things/gloo.c

Ceci est la “version longue” de l'affichage de svn status. La première colonne reste inchangée, mais la seconde colonne affiche la révision de travail de l'élément. Les troisième et quatrième colonnes affichent la révision durant laquelle l'élément a été modifié pour la dernière fois et qui l'a modifié.

Aucune de ces invocations de svn status ne contacte le dépôt, elles fonctionnent localement en comparant les métadonnées du répertoire .svn avec la copie de travail. Enfin, il reste l'option --show-updates (-u), qui contacte le dépôt et ajoute des informations à propos des éléments qui ne sont pas à jour :

$ svn status --show-updates --verbose
M      *        44        23    sally     README
M               44        20    harry     bar.c
       *        44        35    harry     stuff/trout.c
D               44        19    ira       stuff/fish.c
A                0         ?     ?        stuff/things/bloo.h
Status against revision:   46

Remarquez les deux astérisques : si vous exécutiez svn update à cet instant, vous recevriez des modifications pour README et trout.c. Vous avez ainsi obtenu une information très utile — vous devrez mettre à jour votre copie de README avant de pouvoir propager vos modifications sur cet élément, sinon le dépôt rejettera votre propagation du fait que votre copie n'est pas à jour. (ce sujet sera approfondi ultérieurement.)

svn diff

La commande svn diff est un autre moyen d'examiner vos modifications. Vous pouvez retrouver en détails comment vous avez modifié vos éléments en exécutant svn diff sans aucun argument, ce qui affichera les modifications de vos fichiers au format “unified diff” :[11]

$ svn diff
Index: bar.c
===================================================================
--- bar.c	(revision 3)
+++ bar.c	(working copy)
@@ -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	(revision 3)
+++ README	(working copy)
@@ -193,3 +193,4 @@ 
+Note to self:  pick up laundry.

Index: stuff/fish.c
===================================================================
--- stuff/fish.c	(revision 1)
+++ stuff/fish.c	(working copy)
-Welcome to the file known as 'fish'.
-Information on fish will be here soon.

Index: stuff/things/bloo.h
===================================================================
--- stuff/things/bloo.h	(revision 8)
+++ stuff/things/bloo.h	(working copy)
+Here is a new file to describe
+things about bloo.

La commande svn diff produit ces informations en comparant les fichiers de votre copie de travail avec les “copies originales” mises en cache dans les répertoires .svn. Les fichiers destinés à être ajoutés sont affichés dans leur intégralité et les fichiers destinés à être effacés sont affichés comme si leur contenu avait complètement été supprimé.

Les différences sont affichées dans le format “ unified diff. Avec ce format, les lignes effacées sont précédées d'un - et les lignes ajoutées sont précédées avec un +. svn diff affiche aussi le nom du fichier and offset information utiles à la commande patch, ainsi vous pouvez créer des “patches” en redirigeant les données de différence vers un fichier :

$ svn diff > patchfile

Vous pourriez, par exemple, envoyer par courrier électronique le fichier de patch à un autre développeur pour que celui-ci soit vérifié ou testé avant que vos modifications ne soient propagées.

svn revert

À présent, supposez qu'en examinant les différences ci-dessus, vous réalisiez que vos modifications dans README sont une erreur ; vous avez peut-être accidentellement saisi ce texte dans le mauvais fichier avec votre éditeur.

C'est exactement pour cette situation qu'existe svn revert.

$ svn revert README
Reverted 'README'

Subversion ramène le fichier à son état avant modification en l'écrasant avec la “copie originale” mise en cache dans le répertoire .svn. Mais sachez aussi que svn revert peut annuler toute opération planifiée — par exemple, vous pouvez décider que, finalement, vous ne voulez pas ajouter un nouveau fichier :

$ svn status foo
?      foo

$ svn add foo
A         foo

$ svn revert foo
Reverted 'foo'

$ svn status foo
?      foo

Note

svn revert ITEM produit exactement le même effet que la suppression de ITEM de votre copie de travail suivi de la commande svn update -r BASE ITEM. Cependant, si vous restaurez un fichier, l'utilisation de la commande svn revert apporte une différence non négligeable — elle n'a pas besoin de communiquer avec le dépôt pour restaurer votre fichier.

Ou peut-être avez-vous supprimé par erreur un fichier soumis au contrôle de version :

$ svn status README 
       README

$ svn delete README 
D         README

$ svn revert README
Reverted 'README'

$ svn status README
       README

Résolution des conflits (fusionner les modifications des autres)

Nous avons déjà vu comment svn status -u peut prédire les conflits. Supposez que vous lancez svn update et quelques choses intéressantes se produisent :

$ svn update
U  INSTALL
G  README
C  bar.c
Updated to revision 46.

Les codes U et G ne posent pas de problèmes ; ces fichiers intègrent proprement les changements du dépôt. Les fichiers marqués U ne contenaient pas de changements locaux mais ont été mis à jour (Updated) avec les changements contenus dans le dépôt. Le G est pour une fusion (merGed), ce qui signifie que le fichier avait des changement locaux, mais qui n'interféraient pas avec ceux du dépôt.

Mais le C est pour conflit (conflict). Ceci signifie que les changement effectués sur le serveur se superposent avec les votres, et vous devez maintenant choisir entre eux manuellement.

À chaque fois qu'un conflit survient, trois choses se produisent pour vous aider à remarquer et à résoudre ce conflit :

  • Subversion affiche un C pendant la mise à jour, et se souvient que le fichier est dans un état de conflit.

  • Si Subversion considère le fichier comme étant d'un type que l'on peut fusionner, il place des marqueurs de conflit — chaines de caractères spéciales qui délimitent les “cotés” du conflit — dans le fichier pour mettre en évidence visuellement les zones se superposant. (Subversion utilise la propriété svn:mime-type pour décider si un fichier supporte une fusion contextuelle basée sur les lignes. Voir the section called “svn:mime-type pour en savoir plus.)

  • Pour chaque fichier en conflit, Subversion ajoute jusqu'à trois fichiers non versionnés supplémentaires dans votre copie de travail :

    nomdefichier.mine

    C'est votre fichier tel qu'il était dans la copie de travail avant que vous ne le mettiez à jour —  c'est-à-dire sans les marqueurs de conflit. Ce fichier contient vos dernières modifications et rien d'autre. (Si Subversion considère que le fichier ne peut pas être fusionné, alors le fichier .mine n'est pas créé, puiqu'il serait identique au fichier de travail.)

    nomdefichier.rANCIENNEREV

    C'est le fichier qui était la révision de BASE avant que vous modifiiez votre copie de travail. C'est-à-dire le fichier que vous avez récupéré (checked out) avant de faire vos dernières modifications.

    filename.rNOUVELLEREV

    C'est le fichier que votre client Subversion a reçu du serveur quand vous avez mis à jour votre copie de travail. Ce fichier correspond à la dernière révision (HEAD) du dépôt.

    Ici, ANCIENNEREV est le numéro de révision du fichier dans votre répertoire .svn et NOUVELLEREV est le numéro de révision courant de le dépôt (HEAD).

Par exemple, Sally fait des changements sur le fichier sandwich.txt dans le dépôt. Harry vient juste d'effectuer des modifications sur le fichier de sa copie de travail et les a propagées. Sally met à jour sa copie de travail avant de propager ses changements et a donc un conflit :

$ svn update
C  sandwich.txt
Updated to revision 2.
$ ls -1
sandwich.txt
sandwich.txt.mine
sandwich.txt.r1
sandwich.txt.r2

À ce niveau, Subversion ne vous permettra pas de soumettre le fichier sandwich.txt avant que les trois fichiers temporaires ne soient supprimés.

$ svn commit --message "Ajoute de quelques trucs"
svn: Commit failed (details follow):
svn: Aborting commit: '/home/sally/svn-work/sandwich.txt' remains in conflict

Si vous avez un conflit, vous devez faire une de ces trois choses :

  • Fusionner les textes en conflit “à la main” (en examinant et modifiant les marqueurs de conflit dans le fichier).

  • Remplacer votre copie de travail par un des fichiers temporaires.

  • Lancer svn revert <nomdefichier> pour annuler tous vos changement locaux.

Une fois que vous avez résolu les conflits, vous devez en informer Subversion en lançant svn resolved. Ceci supprime les trois fichiers temporaires et Subversion ne considère plus désormais le fichier comme étant dans un état conflictuel.[12]

$ svn resolved sandwich.txt
Resolved conflicted state of 'sandwich.txt'

Fusion des conflits à la main

Fusionner les conflits à la main peut être assez intimidant la première fois que vous essaierez, mais avec un peu de pratique, cela peut devenir aussi facile que tomber de vélo.

Voici un exemple. À cause d'un manque de communication, vous et Sally, votre collaboratrice, modifiez tous les deux le fichier sandwich.txt en même temps. Sally applique ses changements, et quand vous voulez mettre à jour votre copie de travail, vous obtenez un conflit et nous allons devoir éditer sandwich.txt pour résoudre les conflits. Tout d'abord, regardons le fichier :

$ cat sandwich.txt
Morceau de pain
Mayonnaise
Laitue
Tomate
Provolone
<<<<<<< .mine
Salami
Mortadelle
Jambon de Prosciutto
=======
Choucroute
Poulet grillé
>>>>>>> .r2
Moutarde Creole
Morceau de paim

La suite de signes inférieurs, égals et supérieurs sont les marqueurs de conflit, et ne font pas partie des données en conflits. Vous voulez généralement vous assurer que ceux-ci sont supprimés du fichier avant votre prochaine soumission. Le texte entre les deux premier ensembles de marqueurs contient les changements que vous avez fait dans la zone de conflit :

<<<<<<< .mine
Salami
Mortadelle
Jambon de Prosciutto
=======

Le texte entre le deuxième et le troisième ensemble de marqueurs vient des modifications de Sally :

=======
Choucroute
Poulet grillé
>>>>>>> .r2

Habituellement, vous ne voudrez pas juste effacer les marqueurs de conflit et les changements de Sally — elle va être affreusement surprise quand le sandwich arrivera et ne sera pas ce qu'elle voulait. Donc c'est le moment où vous décrochez le téléphone ou traversez le bureau et expliquez à Sally que vous ne pouvez pas avoir de choucroute dans un sandwich italien.[13] Une fois que vous vous êtes mis d'accord sur les changements à apporter, modifiez votre fichier et effacez les marqueurs de conflit.

Morceau de pain
Mayonnaise
Laitue
Tomate
Provolone
Salami
Mortadelle
Jambon Prosciutto
Moutarde Creole
Morceau de pain

Maintenant, lancez svn resolved, et vous êtes prêt à propager vos changements :

$ svn resolved sandwich.txt
$ svn commit -m "Allez-y et utilisez mon sandwich, en annulant les modifications de Sally."

Souvenez-vous, si vous êtes perdu pendant l'édition du fichier conflictuel, vous pouvez toujours consulter les trois fichiers créés par Subversion dans votre copie de travail — y compris votre fichier tel qu'il était avant la mise à jour. Vous pouvez même utiliser un outil tiers de fusion interactive pour examiner ces fichiers.

Remplacer votre copie de travail

Si vous avez un conflit et que vous décidez d'annuler vos modifications, vous pouvez seulement remplacer votre copie de travail par un des fichiers temporaires créés par Subversion :

$ svn update
C  sandwich.txt
Updated to revision 2.
$ ls sandwich.*
sandwich.txt  sandwich.txt.mine  sandwich.txt.r2  sandwich.txt.r1
$ cp sandwich.txt.r2 sandwich.txt
$ svn resolved sandwich.txt

Annuler : utiliser svn revert

Si vous avez un conflit, et après examen decidez que vous voulez oublier vos changements et recommencer votre édition, annulez simplement vos modifications :

$ svn revert sandwich.txt
Reverted 'sandwich.txt'
$ ls sandwich.*
sandwich.txt

Notez que lorsque vous annulez (revert) un fichier conflictuel, vous n'avez pas besoin de lancer svn resolved.

Vous êtes maintenant prêt à appliquer vos changements. Notez que svn resolved, à la différence de la plupart des autre commandes que nous avons déjà traitées dans ce chapitre, nécessite un argument. Dans tous les cas, vous devez être prudent et ne lancer svn resolved que lorsque vous ête certain que vous avez résolu le conflit dans votre fichier — une fois que les fichiers temporaires sont supprimés, Subversion vous laissera soumettre le fichier même s'il contient encore des marqueurs de conflit.

Propagez Vos Modifications

Enfin ! Vos modifications sont terminées, vous avez fusionné votre copie de travail avec tous les changements reçus depuis le serveur et vous êtes prêt à propager vos modifications vers le dépôt.

La commande svn commit envoie toutes vos modifications au dépôt. Lorsque vous propagez un changement, vous devez fournir un commentaire de journal (log message) qui décrit vos modifications. Votre commentaire de journal sera lié à la nouvelle révision que vous venez de créer. Si votre commentaire est bref, il est possible que vous préfériez le fournir sur la ligne de commande en utilisant l'option --message (ou -m) :

$ svn commit --message "Nombre de tranches de fromage corrigé."
Sending        sandwich.txt
Transmitting file data .
Committed revision 3.

Cependant, si vous avez rédigé votre commentaire durant votre travail, vous pouvez indiquer à Subversion le fichier depuis lequel il pourra récupérer votre commentaire en passant le nom du fichier à l'aide de l'option --file :

$ svn commit --file logmsg 
Sending        sandwich.txt
Transmitting file data .
Committed revision 4.

Si les deux options --message ou --file manquent, alors Subversion lancera automatiquement votre éditeur favori (voir la section editor-cmd dans the section called “Config”) pour vous permettre de rédiger votre commentaire.

Tip

Si vous êtes en train de rédiger un commentaire dans votre éditeur et que vous décidez d'annuler la propagation, vous pouvez simplement quitter votre éditeur sans sauvegarder. Si vous avez déjà sauvegardé votre commentaire sans avoir quitté l'éditeur, effacez le texte et sauvegardez le à nouveau.

$ svn commit
Waiting for Emacs...Done

Log message unchanged or not specified
a)bort, c)ontinue, e)dit
a
$

Le dépôt ne sait pas ni ne se soucie de savoir si vos modifications ont un sens dans leur ensemble ; il se contente de s'assurer que personne d'autre n'a changé un des fichiers que vous avez modifié sans que vous le sachiez. Si quelqu'un a fait cela, toute la propagation échouera et un message vous informera qu' un (ou plusieurs) de vos fichiers n'est pas à jour:

$ svn commit --message "Add another rule"
Sending        rules.txt
svn: Commit failed (details follow):
svn: Out of date: 'rules.txt' in transaction 'g'

À cet instant, vous devez exécuter svn update, gérer toute opération de fusion ou conflits qui en résulte puis tenter une nouvelle propagation.

Nous avons ainsi décrit le processus basique de travail lors de l'utilisation de Subversion. Il existe de nombreuses autres fonctionnalités dans Subversion que vous pouvez utiliser pour gérer votre dépôt et votre copie de travail mais vous pouvez facilement vous en sortir en utilisant uniquement les commandes que nous avons abordées jusqu'à ce chapitre.



[10] Bien sur, rien n'est vraiment définitivement supprimé du dépôt — seulement supprimé dans la révision HEAD du dépôt. Vous pouvez restaurer tout ce que vous supprimez en l'extrayant (ou en mettant à jour votre copie de travail) avec une révision plus récente que celle où vous avez effacé l'élément.

[11] Subversion utilise ses propres algorithmes de recherche de différences qui produisent, par défaut, des données au format “unified diff”. Si vous souhaitez afficher les différences dans un format différent, indiquez un programme de comparaison de fichiers en utilisant --diff-cmd et en passant à ce programme tous les arguments que vous souhaitez via l'option --extensions. Par exemple, pour voir les différences locales du fichier foo.c avec le format utilisé par la commande Unix <commande>diff</commande> en ignorant les changements effectués sur les espaces, vous pouvez exécuter svn diff --diff-cmd /usr/bin/diff --extensions '-bc' foo.c.

[12] Vous pouvez toujours supprimer les fichiers temporaires vous-mêmes, mais voulez-vous vraiment faire cela quand Subversion peut le faire pour vous ? Nous ne pensons pas.

[13] Et si vous le leur demandez, ils vont sûrement vous sortir de la ville sur un rail.