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
svn update
Effectuer des modifications
svn add
svn delete
svn copy
svn move
Examiner vos modifications
svn status
svn diff
svn revert
Fusionner les modifications des autres avec votre copie de travail
svn update
svn resolved
Propager vos modifications
svn commit
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 fooLe fichier foo a été mis à jour
(Updated
) (modifications reçues depuis
le serveur).
A fooLe fichier ou répertoire foo a été
Ajouté dans votre copie
de travail.
D fooLe fichier ou répertoire foo a été
supprimé (Deleted
) de votre copie de travail.
R fooLe 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 fooLe 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 fooLe 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.
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 :
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.
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).
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.
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
).
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]
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.
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.
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.
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 itemLe fichier, répertoire ou lien symbolique
item est destiné à être
ajouté dans le dépôt.
C itemLe 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 itemLe fichier, répertoire ou lien symbolique
item est destiné à être
supprimé du dépôt.
M itemLe contenu du fichier item
a été modifié.
R itemLe 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 itemLe 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”.
? itemLe 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”.
! itemLe 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.
~ itemLe 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 itemLe 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.)
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.
À 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
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
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.mineC'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.rANCIENNEREVC'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.rNOUVELLEREVC'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'
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.
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
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.
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.
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.