This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.
Subversion dispose de nombreuses fonctionnalités, d'options, d'avertissements et de garde-fous. Mais dans une utilisation au jour le jour, vous n'utilisez qu'un petit nombre d'entre eux. Dans cette section, nous passons en revue l'utilisation quotidienne de Subversion.
Le cycle de travail typique ressemble à ceci :
Mettre à jour votre copie de travail, par l'utilisation de la commande svn update.
Faire des changements. Les changements les plus courants seront des modifications du contenu des fichiers existants. Parfois, vous aurez besoin d'ajouter, supprimer, copier ou déplacer des fichiers et des dossiers ; les commandes svn add, svn delete, svn copy et svn move prennent en charge ces modifications structurelles de la copie de travail.
Examiner les changements effectués. Les commandes svn status et svn diff sont là pour passer en revue les modifications que vous avez apportées à votre copie de travail.
Annuler des changements. Personne n'est parfait, aussi lorsque vous passez en revue vos modifications, vous pouvez constater des erreurs. Parfois, le plus simple est de repartir de zéro. La commande svn revert rétablit un fichier ou un dossier dans son état initial.
Résoudre les conflits (fusionner les modifications). Dans le temps qu'il vous faut pour réaliser et passer en revue vos modifications, d'autres utilisateurs effectuent et publient peut-être des modifications également. Vous voulez sûrement intégrer leurs changements dans votre copie de travail pour éviter qu'ils ne deviennent « périmés » quand vous voudrez les publier. Une fois encore, la commande svn update prend cette opération en charge. Si des conflits apparaissent sur votre copie locale, vous devrez les résoudre à l'aide de la commande svn resolve.
Propager les changements. La commande svn commit transmet vos modifications au dépôt et, si elles sont acceptées, créeront une nouvelle version de toutes les choses que vous avez modifiées. Maintenant, les autres aussi peuvent voir votre travail !
Si vous travaillez sur un projet donné qui est modifié par des copies de travail multiples, vous voudrez mettre à jour votre copie locale pour recevoir toutes les modifications qui ont pu être faites par les autres copies de travail depuis votre dernière mise à jour. Ce peut être des modifications que les autres membres de l'équipe de projet ont faites, ou simplement des modifications que vous avez faites vous-même sur un autre ordinateur. Afin de protéger vos données, Subversion ne vous autorise pas à publier des changements sur des fichiers ou des dossiers qui ne sont pas à jour. Il est donc toujours mieux d'avoir les dernières versions de tous les fichiers et dossiers des projets sur lesquels vous travaillez avant d'apporter vous-même des modifications.
Utilisez svn update pour synchroniser votre copie de travail avec la dernière version présente dans le dépôt :
$ svn update Mise à jour de '.' : U truc.c U machin.c Actualisé à la révision 2. $
Dans cet exemple, il se trouve que quelqu'un a propagé
des modifications à truc.c
ainsi qu'à
machin.c
depuis votre dernière mise à jour
et Subversion vient de répercuter ces modifications dans votre
copie de travail.
Lorsque le serveur envoie des modifications vers votre
copie de travail via svn
update, un code, sous forme de lettre, est affiché à
côté de chaque élément pour vous permettre de savoir quelles
actions Subversion a effectuées pour mettre votre copie de
travail à jour. Pour en savoir plus sur le sens de ces lettres,
exécutez svn help update
ou
reportez-vous à svn update (up) dans
Guide de référence de svn : le client texte interactif.
Vous pouvez à présent vous mettre au travail et apporter des modifications à votre copie de travail. Vous pouvez effectuer deux types de modifications : les modifications de fichiers et les modifications de dossiers. Vous n'avez pas à prévenir Subversion que vous voulez modifier un fichier ; faites vos modifications avec un éditeur de texte, un traitement de texte, un logiciel de dessin ou n'importe quel autre outil que vous utilisez d'habitude. Subversion détecte automatiquement quels fichiers ont été modifiés et, en plus, il traite les fichiers binaires tout aussi facilement et aussi efficacement que les fichiers textes. Les modifications dans l'arborescence sont différentes ; cela comprend l'ajout et la suppression de fichiers, le renommage de fichiers ou de dossier ainsi que la copie ou le déplacement de fichiers ou dossiers vers un nouvel emplacement. Pour les modifications d'arborescence, les opérations de Subversion consistent à « marquer » la suppression, l'ajout, la copie ou le déplacement des fichiers et dossiers. Ces modifications prennent effet immédiatement sur votre copie de travail mais aucun ajout ou suppression n'interviendra sur le dépôt avant que vous ne les propagiez.
Voici un aperçu des cinq sous-commandes Subversion les plus utilisées pour faire des modifications sur l'arborescence :
svn add TRUC
Marque le fichier, le dossier ou le lien
symbolique TRUC
pour ajout. Lors
de la prochaine propagation, TRUC
devient un fils de son dossier parent. Notez que
si TRUC
est un dossier, tout ce
qui se trouve à l'intérieur de TRUC
est marqué pour ajout. Si vous ne désirez ajouter que
TRUC
lui-même, passez l'option
--depth empty
.
svn delete TRUC
Marque le fichier, le dossier ou le lien
symbolique TRUC
pour suppression.
TRUC
est immédiatement supprimé de
votre copie de travail. Bien sûr, rien n'est jamais
totalement supprimé du dépôt — seulement de la révision
HEAD
du dépôt. Vous avez accès à
l'élément supprimé dans les révisions précédentes.
[6]
svn copy TRUC MACHIN
Crée un nouvel élément
MACHIN
par duplication de
TRUC
et marque automatiquement
MACHIN
pour ajout. Lorsque
MACHIN
est ajouté au dépôt, lors
de la prochaine propagation, son historique est
enregistré (comme ayant été créé à partir de
TRUC
). svn copy
ne crée pas de dossiers intermédiaires, à moins que
vous ne lui passiez l'option
--parents
.
svn move TRUC MACHIN
Cette commande équivaut exactement à
svn copy TRUC MACHIN; svn delete
MACHIN
. C'est-à-dire que
MACHIN
est marqué pour ajout en tant
que copie de TRUC
et que
TRUC
est marqué pour suppression.
svn move ne crée pas de dossiers
intermédiaires, à moins que vous ne lui passiez
l'option --parents
.
svn mkdir TRUC
Cette commande équivaut exactement à
mkdir TRUC; svn add TRUC
.
C'est-à-dire qu'un nouveau dossier nommé
TRUC
est créé et marqué pour
ajout.
Une fois vos modifications apportées, vous devez les intégrer au dépôt. Avant de le faire, il est souvent utile de jeter un coup d'œil sur ces modifications pour savoir exactement ce que vous avez changé. En examinant les modifications avant de les intégrer au dépôt, vous pouvez rédiger un commentaire de propagation, c'est-à-dire une description à l'attention des utilisateurs des changements propagés, ce commentaire étant conservé avec les données dans le dépôt. Éventuellement, vous verrez que vous avez modifié un fichier par inadvertance et cela vous donne une chance de revenir sur ces modifications avant de les propager au dépôt. En outre, c'est une bonne occasion de passer en revue et d'examiner les modifications avant de les publier. Vous pouvez obtenir une vue d'ensemble des modifications que vous avez faites en utilisant la commande svn status et voir le détail de ces changements en utilisant svn diff.
Pour avoir une vue d'ensemble des changements que vous avez effectués, utilisez la commande svn status. C'est certainement la commande Subversion que vous utiliserez le plus.
Astuce | |
---|---|
Parce que l'affichage produit par la commande cvs status était tellement verbeux et parce que la commande cvs update ne faisait pas qu'une mise à jour mais affichait également l'état des changements effectués localement, la plupart des utilisateurs de CVS ont appris à utiliser cvs update pour propager leurs modifications. Dans Subversion, les opérations de mise-à-jour et d'examen des changements sont complètement séparées. Reportez-vous à la section intitulée « Distinction entre les commandes status et update » pour plus de détails. |
Si vous lancez svn status sans argument à la racine de votre copie de travail, Subversion détecte toutes les modifications effectuées sur les fichiers et sur l'arborescence.
$ svn status ? gribouillage.c A bazar/pognon A bazar/pognon/nouveau.h D bazar/vieux.c M machin.c
Dans le format d'affichage par défaut, svn status affiche sept colonnes de caractères, suivis par plusieurs espaces, suivis par un nom de fichier ou de dossier. La première colonne indique le statut du fichier ou du dossier et/ou son contenu. Les codes les plus utilisés sont :
? élément
Le fichier, dossier ou lien symbolique
élément
n'est pas suivi en
versions.
A élément
Le fichier, dossier ou lien symbolique
élément
est marqué pour ajout
au dépôt.
C élément
Le fichier élément
est dans
un état de conflit. C'est-à-dire que des modifications
ont eu lieu dans le dépôt depuis votre dernière mise à
jour et ces modifications interfèrent avec les
modifications que vous avez effectuées sur votre copie
de travail (et la mise à jour n'a pas résolu ce conflit).
Vous devez résoudre ce conflit avant de propager vos
changements vers le dépôt.
D élément
Le fichier, dossier ou lien symbolique
élément
est marqué pour
suppression (Deletion en
anglais).
M élément
Le contenu du fichier élément
a été modifié.
Si vous spécifiez un chemin à svn status, vous obtenez uniquement les informations relatives à ce chemin :
$ svn status bazar/poisson.c D bazar/poisson.c
svn status possède aussi une option
--verbose
(-v
) pour la
rendre plus verbeuse : elle affiche alors le statut de
tous les éléments de votre copie de
travail, même ceux qui n'ont pas subi de
modification :
$ svn status -v M 44 23 sally LISEZMOI 44 30 sally INSTALL M 44 20 harry machin.c 44 18 ira bazar 44 35 harry bazar/truite.c D 44 19 ira bazar/poisson.c 44 21 sally bazar/divers A 0 ? ? bazar/divers/bitoniau.h 44 36 harry bazar/divers/tartempion.c
C'est la « version longue » de l'affichage de svn status. Les lettres de la première colonne ont la même signification que précédemment, mais la deuxième colonne indique le numéro de révision de travail de l'élément. Les troisième et quatrième colonnes indiquent le numéro de la révision dans laquelle a eu lieu le changement le plus récent et qui l'a effectué.
Aucune des commandes citées ci-dessus n'induit de
connexion vers le dépôt : elles comparent les métadonnées
de la zone administrative et les horodatages avec la copie de
travail. Parfois, il peut être utile de voir quels
éléments de la copie de travail ont été modifiés dans le
dépôt depuis la dernière mise à jour de la copie de
travail. À cette fin, svn status propose
l'option --show-updates
(-u
)
qui effectue une connexion au dépôt et ajoute les informations
sur les éléments périmés :
$ svn status -u -v M * 44 23 sally LISEZMOI M 44 20 harry machin.c * 44 35 harry bazar/truite.c D 44 19 ira bazar/poisson.c A 0 ? ? bazar/divers/bitoniau.h État par rapport à la révision 46
Notez les deux astérisques : si vous lanciez la
commande svn update, vous recevriez les
changements relatifs à LISEZMOI
et
truite.c
. Cela vous procure des
informations particulièrement intéressantes, puisque l'un
des éléments a fait l'objet de modifications de votre part (le
fichier LISEZMOI
) ; vous devez
faire une mise à jour et récupérer les changements effectués
sur LISEZMOI
avant de propager les
vôtres, sinon le dépôt rejettera votre propagation en la
considérant comme périmée (le sujet est approfondi plus
tard).
svn status peut afficher beaucoup
plus d'informations sur les fichiers et dossiers de votre
copie de travail que ce que nous venons de voir ici. Pour
obtenir une description exhaustive de svn
status et de ses modes d'affichage, lancez
svn help status
ou reportez-vous à
svn status (stat, st) dans
Guide de référence de svn : le client texte interactif.
La commande svn diff offre une
autre façon d'examiner vos changements. En lançant la commande
svn diff
dans le dossier racine de
votre copie de travail et sans argument, Subversion affiche
les changements que vous avez apportés dans les fichiers
lisibles par les humains de votre copie de travail. Il
affiche ces changements au format diff
unifié, un format qui décrit les changements
par des « morceaux »
(hunks ou
snippets en anglais) du
contenu des fichiers, où chaque ligne de texte est
préfixée par un code sur un caractère : une espace
signifie que la ligne n'a pas été modifiée ; un signe
moins (-
) signifie que la ligne a été
supprimée du fichier ; et un signe plus
(+
) signifie que la ligne a été ajoutée
au fichier. Dans le contexte de svn diff,
les préfixes respectivement +
et
-
montrent le contenu des lignes
respectivement avant et après vos modifications.
Voici un exemple :
$ svn diff Index: truc.c =================================================================== --- machin.c (révision 3) +++ machin.c (copie de travail) @@ -1,7 +1,12 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include <stdio.h> int main(void) { - printf("Soixante-quatre tranches de fromage...\n"); + printf("Soixante-cinq tranches de fromage...\n"); return 0; } Index: LISEZMOI =================================================================== --- LISEZMOI (révision 3) +++ LISEZMOI (copie de travail) @@ -193,3 +193,4 @@ +Pense-bête : passer au pressing. Index: bazar/poisson.c =================================================================== --- bazar/poisson.c (révision 1) +++ bazar/poisson.c (copie de travail) -Bienvenue dans le fichier 'poisson'. -Plus d'informations seront disponibles prochainement. Index: bazar/divers/machin.h ================================================================== --- bazar/divers/bitoniau.h (révision 8) +++ bazar/divers/bitoniau.h (copie de travail) +Voici un nouveau fichier pour +écrire sur les petites choses.
La commande svn diff produit ces lignes en comparant vos fichiers de travail aux copies « originales » en cache dans la zone administrative. Les fichiers marqués pour ajout sont affichés comme toute section de texte ajoutée, et les fichiers marqués pour suppression sont affichés comme toute section de texte supprimée. L'affichage de svn diff est compatible avec le programme patch — et encore davantage avec l'introduction de la commande svn patch dans Subversion 1.7. Les commandes patch lisent et appliquent des correctifs (patches en anglais), c'est-à-dire des fichiers qui décrivent les modifications appliquées à un ou plusieurs fichiers. Ainsi, vous pouvez partager les modifications que vous avez faites sur votre copie de travail avec quelqu'un d'autre sans propager ces modifications, mais seulement en créant un fichier correctif obtenu par la redirection de l'affichage de svn diff.
$ svn diff > fichier-correctif $
Subversion utilise son propre moteur de calcul de
différences, qui produit par défaut des résultats au format
diff unifié. Si vous désirez obtenir les différences dans un
autre format, spécifiez un programme de comparaison externe
en utilisant l'option --diff-cmd
et en
fournissant les paramètres que vous voulez à l'aide de
l'option --extensions
(-x
).
Par exemple, pour obtenir les différences entre votre
version locale du fichier et l'original de
truc.c
au format
« contexte » et en ignorant la casse des
caractères, vous pouvez lancer la commande
suivante :
$ svn diff --diff-cmd /usr/bin/diff -x "-i" truc.c … $
Supposons qu'en examinant la sortie de
svn diff, vous vous rendiez compte que
tous les changements effectués sur un fichier donné sont
erronés. Peut-être auriez-vous dû laisser le fichier tel
quel, ou bien peut-être qu'il serait plus facile de reprendre
les changements depuis le début. Vous pourriez éditer à
nouveau le fichier et défaire tous les changements. Vous
pourriez essayer de trouver une copie du fichier tel qu'il
était avant les changements et copier son contenu à la place
de votre fichier modifié. Vous pourriez essayer d'appliquer
les changements à l'envers en utilisant svn patch
--reverse-diff
ou depuis le système d'exploitation
avec patch -R
. Et il existe probablement
encore d'autres méthodes.
Heureusement, avec Subversion annuler son travail et repartir de zéro ne nécessite pas autant d'acrobaties. Vous avez juste à utiliser la commande svn revert:
$ svn status LISEZMOI M LISEZMOI $ svn revert LISEZMOI 'LISEZMOI' réinitialisé $
Dans cet exemple, Subversion ramène le fichier dans son état d'avant les modifications en le remplaçant par la copie de l'original stockée dans la zone d'administration. Mais notez aussi que svn revert peut annuler n'importe quelle opération. Par exemple, vous pouvez décider que, après tout, vous ne voulez pas ajouter tel fichier :
$ svn status truc ? truc $ svn add truc A truc $ svn revert truc 'truc' réinitialisé $ svn status truc ? truc $
Ou, si vous avez enlevé un fichier du suivi de versions par erreur :
$ svn status LISEZMOI $ svn delete LISEZMOI D LISEZMOI $ svn revert LISEZMOI 'LISEZMOI' réinitialisé $ svn status LISEZMOI $
La commande svn revert est le parachute des gens imparfaits. Elle peut vous faire gagner un temps et une énergie considérables que vous auriez dépensé autrement à faire des corrections manuelles, voire à récupérer une copie de travail vierge juste pour retrouver un environnement de travail propre.
Nous avons déjà vu que svn status
-u
est capable de prévoir les conflits, mais
il reste à savoir gérer ces conflits. Des conflits peuvent
survenir à chaque fois que vous voulez fusionner ou intégrer
(dans le sens le plus général) des modifications en
provenance du dépôt dans votre copie de travail. Vous savez
désormais que la commande svn update
génère ce type de situation ; la fonction essentielle de
cette commande est de mettre à jour votre copie de travail en
y intégrant toutes les modifications effectuées depuis votre
dernière mise à jour. Comment Subversion vous rend-il compte
de ces conflits et comment pouvez-vous les gérer ?
Supposons que vous lanciez svn update
et que le résultat suivant apparaisse :
$ svn update Mise à jour de '.' : U INSTALL G LISEZMOI Conflit découvert dans 'machin.c'. Sélectionner : (p) report, (df) diff complet, (e) édite, (m) fusion, (mc) my side of conflict, (tc) their side of conflict, (s) voir toutes les options:
Les codes U
(qui veut dire
« mis à jour », updated
en anglais) et G
(qui veut
dire fusionné, merGed en
anglais) ne doivent pas vous inquiéter, les fichiers
correspondants ayant absorbé sans problème les modifications
venant du dépôt. Les fichiers notés
U
ne contenaient aucun
changement local mais ont été mis à jour à partir de
changements présents dans le dépôt. Le fichier marqué
G
avait subi des changements
localement, mais les changements en provenance du dépôt ont pu
être appliqués sans affecter les changements locaux.
Ce sont les quelques lignes suivantes qui sont
intéressantes. D'abord, Subversion vous avertit que sa
tentative pour fusionner les modifications en provenance du
serveur dans le fichier local machin.c
, il
a détecté que certains changements interfèrent avec
les vôtres quelqu'un a peut-être modifié la même ligne
que vous. Quelle qu'en soit la raison, Subversion marque
immédiatement le fichier comme étant dans un état de
conflit. Ensuite, il vous demande ce que vous voulez faire pour
résoudre ce conflit, vous proposant de choisir une action de
manière interactive. Les options les plus utilisées sont
affichées, mais vous pouvez voir toutes les options possibles en
tapant s
:
… Sélectionner : (p) report, (df) diff complet, (e) édite, (m) fusion, (mc) my side of conflict, (tc) their side of conflict, (s) voir toutes les options: (e) - change merged file in an editor [edit] (df) - show all changes made to merged file (r) - accept merged version of file (dc) - show all conflicts (ignoring merged version) (mc) - accept my version for all conflicts (same) [mine-conflict] (tc) - accept their version for all conflicts (same) [theirs-conflict] (mf) - accept my version of entire file (even non-conflicts) [mine-full] (tf) - accept their version of entire file (same) [theirs-full] (m) - use internal merge tool to resolve conflict (l) - launch external tool to resolve conflict [launch] (p) - mark the conflict to be resolved later [postpone] (q) - postpone all remaining conflicts (s) - show this list (also 'h', '?') Words in square brackets are the corresponding --accept option arguments. Select: (p) postpone, (df) show diff, (e) edit file, (m) fusion, (mc) my side of conflict, (tc) their side of conflict, (s) show all options:
Regardons brièvement ce que recèle chaque option avant de les détailler :
(e) edit [edit]
Ouvrir le fichier en conflit avec votre éditeur de
texte favori, qui est spécifié dans la variable
d'environnement EDITOR
.
(df) diff-full
afficher les différences entre la révision de base et le fichier en conflit au format diff unifié.
(r) resolved
Après édition du fichier, indiquer à Subversion que vous avez résolu les conflits à l'intérieur du fichier et qu'il doit accepter son contenu actuel ; en bref, vous avez « résolu » le conflit.
(dc) display-conflict
Afficher toutes les parties du fichier en conflit, en ignorant les modifications qui ont réussi à être fusionnées.
(mc) mine-conflict [mine-conflict]
ignorer les changements envoyés par le serveur qui entrent en conflit avec vos modifications locales pour le fichier concerné. Cependant, accepter et fusionner toutes les parties qui n'engendrent pas de conflit.
(tc) theirs-conflict [theirs-conflict]
Ignorer les modifications locales qui engendrent des conflits avec la version envoyée par le serveur pour le fichier concerné. Cependant, conserver toutes les parties qui n'engendrent pas de conflit pour ce fichier.
(mf) mine-full [mine-full]
Ignorer les changements envoyés par le serveur et utiliser uniquement votre version locale pour le fichier concerné.
(tf) theirs-full [theirs-full]
Ignorer vos changements sur le fichier concerné et utiliser la version envoyée par le serveur.
(m) fusion
Lancer un outil interne de fusion pour traiter le conflit. Cette option est disponible à partir de Subversion 1.8.
(l) launch
Lancer un programme externe pour résoudre le conflit. Ceci nécessite un peu de préparation en amont.
(p) postpone [postpone]
Laisser le fichier en état de conflit, conflit que vous devrez résoudre après la fin de la mise à jour.
(s) show all
Afficher la liste de toutes les commandes que vous pouvez utiliser dans la résolution interactive des conflits.
Nous allons maintenant passer en revue chaque commande, en les classant par fonctionnalité.
Avant de décider comment résoudre un conflit de
manière interactive, il est probable que vous vouliez examiner
le détail des lignes en conflit. Deux des commandes
accessibles via l'invite interactive de gestion des conflits
répondent à ce besoin. La première est la commande
df
(pour
diff-full en anglais), qui
affiche toutes les modifications locales du fichier ainsi que
les zones en conflit :
… Sélectionner : (p) report, (df) diff complet, (e) édite, (m) fusion, (mc) my side of conflict, (tc) their side of conflict, (s) voir toutes les options:df --- .svn/text-base/sandwich.txt.svn-base mar. 11 déc. 2007, 21:33:57 +++ .svn/tmp/tempfile.32.tmp mar. 11 déc. 2007, 21:34:33 @@ -1 +1,5 @@ -Achète-moi un sandwich. +<<<<<<< .mien +Va chercher un hamburger. +======= +Apporte-moi un taco ! +>>>>>>> .r32 …
La première ligne du diff correspond à ce que contenait
la copie de travail dans l'ancienne version (la révision
BASE
), la ligne suivante correspond
à vos modifications et la dernière ligne contient les
modifications reçues du serveur (la révision
HEAD
la plupart du temps).
La deuxième commande est similaire à la première mais
dc
(display
conflict en anglais) affiche uniquement les
zones en conflits, pas toutes les modifications apportées au
fichier. En plus, cette commande utilise un format d'affichage
légèrement différent qui permet de comparer facilement le
contenu du fichier tel qu'il serait dans les trois
états : original et non édité ; avec les
modifications locales et les changements provenant du serveur
qui génèrent des conflits ignorés ; uniquement les
changements provenant du serveur et vos modifications locales
qui génèrent des conflits ignorés.
Après avoir pris connaissance des informations fournies par ces commandes, vous être prêt à l'action suivante.
La manière la plus directe de résoudre interactivement un conflit utilise un outil interne de fusion. Cet outil vous demande quoi faire pour chaque modification qui pose problème et permet de fusionner et d'adapter les modifications de manière interactive. Cependant, il existe d'autres manières de faire interactivement— deux outils peuvent fusionner et adapter les modifications à l'aide d'éditeurs externes, les autres vous permettent simplement de choisir une version du fichier parmi celles proposées et de passer à la suite.
Vous avez déjà passé en revue les modifications qui posent
problème, il est donc temps de résoudre ces conflits. La
première commande qui peut vous aider est « merge »
(m
), disponible à partir de la version
1.8 de Subversion. Cette commande affiche les zones en conflit
et vous permet de choisir parmi différentes options pour chaque
zone en conflit :
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge, (mc) my side of conflict, (tc) their side of conflict, (s) show all options: m Merging 'Makefile'. Conflicting section found during merge: (1) their version (at line 24) |(2) your version (at line 24) ------------------------------------------------+------------------------------------------------ top_builddir = /truc |top_builddir = /machin ------------------------------------------------+------------------------------------------------ Select: (1) use their version, (2) use your version, (12) their version first, then yours, (21) your version first, then theirs, (e1) edit their version and use the result, (e2) edit your version and use the result, (eb) edit both versions and use the result, (p) postpone this conflicting section leaving conflict markers, (a) abort file merge and return to main menu:
Comme vous le constatez, en utilisant l'outil de fusion interne, vous pouvez naviguer entre les différentes zones en conflit dans le fichier et choisir différentes stratégies de résolution, voire remettre à plus tard la résolution du conflit pour certaines zones.
Cependant, si vous souhaitez utiliser un éditeur externe pour
choisir une combinaison de vos
modifications locales, vous pouvez utiliser la commande
« édite » (e
) pour
modifier manuellement dans un éditeur de texte (configuré
en suivant les instructions données dans
la section intitulée « Utilisation d'éditeurs externes ») le fichier
avec des marqueurs indiquant les conflits. Après avoir édité
le fichier et si vous êtes satisfait de vos changements, vous
pouvez indiquer à Subversion que le fichier n'est plus en
conflit en utilisant la commande « résolu »
(r
).
En dehors de quelques puristes d'Unix, l'édition manuelle
de ce fichier avec votre éditeur préféré peut sembler quelque
peu « bas de gamme » (voir la section intitulée « Résolution des conflits à la main » pour une description
détaillée), c'est pourquoi Subversion propose d'utiliser des
outils graphiques plus évolués et spécialisés dans la fusion
de documents (voir la section intitulée « Outils de fusion externes ») avec la
commande « launch »
(lancer en français), raccourci
l
).
Il existe deux autres options qui offrent des
compromis. Les commandes respectivement
« mien-conflits » (mc
) et
« leur-conflits » (tc
)
demandent à Subversion de conserver respectivement vos
modifications locales et les modifications en provenance du
serveur pour tous les conflits rencontrés. Mais, au
contraire de « mien complet » et « autre
complet », ces commandes conservent à la fois vos
modifications et les modifications en provenance du serveur
dans les zones du fichier où il n'est pas détecté de
conflit.
Enfin, si vous décidez que vous ne voulez pas fusionner
les modifications mais simplement conserver une version du
fichier ou une autre, vous pouvez choisir votre version
(étiquetée « mine ») en sélectionnant
la commande « mine-full » (mf
)
ou choisir la version du dépôt en sélectionnant la commande
« theirs-full » (tf
).
Le titre peut laisser penser à un paragraphe sur
l'amélioration des relations conjugales, mais il s'agit bien
toujours de Subversion, voyez plutôt. Si, lorsque vous
effectuez une mise à jour, Subversion soulève un conflit
que vous n'êtes pas prêt à résoudre, vous pouvez, fichier
par fichier, taper p
, pour remettre
à plus tard la résolution du conflit. Si, lors de votre
mise à jour, vous ne voulez résoudre aucun conflit, vous
pouvez passer l'option --non-interactive
à svn update et les fichiers en conflit
sont automatiquement marqués
C
.
À partir de Subversion 1.8, un outil interne de fusion vous permet de différer la résolution de conflits pour certains conflits et de résoudre les autres. Ainsi, vous pouvez différer la résolution des conflits zone par zone et non plus uniquement fichier par fichier.
Le C
indique un
conflit, c'est-à-dire que les changements sur le serveur
interfèrent avec les vôtres et vous devez donc choisir
manuellement entre les différentes modifications après la
fin de la procédure de mise à jour. Quand vous repoussez à
plus tard la résolution d'un conflit, Subversion
accomplit trois actions qui vous aideront à repérer et à
résoudre ce conflit :
Subversion affiche un
C
pendant la mise à
jour et enregistre que le fichier est dans un état de
conflit.
Si Subversion considère que le fichier peut être
fusionné, il place dans le fichier des
marqueurs de conflit (des
chaînes de caractères spéciales qui dénotent les
« contours » des conflits) pour mettre en
exergue les zones de conflit (Subversion utilise la
propriété svn:mime-type
pour
déterminer si un fichier peut subir une fusion
contextuelle ligne par ligne ; voir
la section intitulée « Type de contenu des fichiers »
pour en apprendre davantage).
Pour chaque fichier en conflit, Subversion place trois fichiers supplémentaires non-suivis en versions dans votre copie de travail :
nom_du_fichier.mine
C'est votre fichier tel qu'il était dans votre
copie de travail avant la mise à jour,
c'est-à-dire sans les marqueurs de conflits. Ce
fichier ne comporte que vos derniers changements
(si Subversion considère que le fichier ne peut
pas être fusionné, le fichier
.mine
n'est pas créé, car il
serait identique à la version de travail).
nom_du_fichier.rANCIENNE_REV
C'est le fichier tel qu'il était à la révision
BASE
, avant la mise à jour de
votre copie de travail. C'est donc le fichier que
vous avez extrait avant de
faire vos dernières modifications,
ANCIENNE_REV
désignant le
numéro de révision de cette version de base.
nom_du_fichier.rNOUVELLE_REV
C'est le fichier que le client Subversion vient
de recevoir du serveur via l'opération de mise à
jour, où NOUVELLE_REV
désigne le numéro de révision de la mise à jour
demandée (HEAD
, à moins d'avoir
spécifié une autre révision).
Par exemple, Sally effectue un changement sur le
fichier sandwich.txt
mais elle ne
propage pas immédiatement ses modifications. Pendant ce
temps, Harry propage des changements sur ce même fichier.
Sally met à jour sa copie de travail avant d'effectuer la
propagation et un conflit apparaît, dont elle remet la
résolution à plus tard :
$ svn update Mise à jour de '.' : Conflit découvert dans 'sandwich.txt'. Select: (p) postpone, (df) show diff, (e) edit file, (m) merge, (mc) my side of conflict, (tc) their side of conflict, (s) show all options: p C sandwich.txt Actualisé à la révision 2. Résumé des conflits : Text conflicts: 1 $ ls -1 sandwich.txt sandwich.txt.mine sandwich.txt.r1 sandwich.txt.r2
À partir de là, Subversion n'autorise
pas Sally à propager le fichier
sandwich.txt
avant que les trois
fichiers temporaires ne soient effacés :
$ svn commit -m "Quelques petits ajouts" svn: Échec de la propagation (commit), détails : svn: Arrêt de la propagation : '/home/sally/travail-svn/sandwich.txt' demeure en conflit
Si vous avez remis à plus tard la résolution d'un
conflit, vous devez le résoudre pour que Subversion vous
autorise à propager vos changements. Vous pouvez le faire
avec la commande svn resolve. Cette
commande possède l'option --accept
afin de
spécifier votre manière de résoudre le conflit. Avant
Subversion 1.8, la commande svn resolve
exigeait de spécifier l'option.
Dorénavant, Subversion vous autorise à ne pas la
spécifier. Dans ce cas, Subversion passe en mode de
résolution interactif tel que présenté dans la section
précédente (voir la section intitulée « Résolution des conflits en mode interactif »). Dans cette
section, nous allons présenter l'utilisation de l'option
--accept
pour la résolution de
conflits.
L'option --accept
de la commande
svn resolve demande à Subversion d'utiliser
une des approches prédéfinies pour résoudre un conflit. Si
vous choisissez la version du fichier que vous avez extraite
avant de faire vos changements, utilisez l'argument
--accept=base
. Si vous préférez garder la
version qui contient uniquement vos changements, utilisez
l'argument --accept=mine-full
. Vous pouvez
aussi choisir la version la plus récente venant du
serveur (et donc abandonner tous vos changements) en utilisant
l'argument --accept=theirs-full
.
Il existe d'autres méthodes de résolution
« pré-emballées ». Lisez --accept
ACTION
dans
Guide de référence de svn : le client texte interactif pour en obtenir les détails.
Vous n'êtes pas limité à ces choix tout ou rien. Si vous
comptez effectuer un mélange de vos modifications et des
modifications rapatriées du serveur, fusionnez le fichier en
conflit « à la main » (examinez et éditez les
marqueurs de conflit dans le fichier) puis indiquez à
Subversion de résoudre le conflit en gardant la version de
travail dans son état actuel par la commande svn
resolve avec l'argument
--accept=working
.
La commande svn resolve supprime les
trois fichiers temporaires et retient la version du fichier
que vous avez spécifié avec l'option
--accept
. À la fin d'exécution de la
commande (en considérant bien évidemment que vous n'avez
décidé de reporter la résolution du conflit), Subversion
considère que le fichier n'est plus dans un état de
conflit :
$ svn resolve --accept working sandwich.txt Conflit sur 'sandwich.txt' résolu
Résoudre les conflits à la main peut paraître quelque peu intimidant la première fois. Mais avec un peu de pratique, un enfant de cinq ans y arriverait.
Prenons un exemple. Par manque de communication entre
Sally (votre collaboratrice) et vous-même, vous éditez en
même temps le fichier sandwich.txt
.
Sally propage ses changements et, quand vous mettez à jour
votre copie de travail, un conflit apparaît, que vous devez
résoudre en éditant sandwich.txt
.
Jetons un œil à ce fichier :
$ cat sandwich.txt Tranche de pain supérieure Mayonnaise Laitue Tomate Comté <<<<<<< .mine Saucisson Mortadelle Jambon ======= Choucroute Poulet rôti >>>>>>> .r2 Moutarde Tranche de pain inférieure
Les suites de caractères inférieur-à
(<
), égal(=
) ou
supérieur-à (>
) sont des marqueurs de
conflit, ils ne font pas partie des données elles-mêmes.
Vous devrez en général vous assurer qu'elles ont disparu du
fichier avant de propager vos modifications. Le texte entre
les deux premiers marqueurs est constitué des modifications
que vous avez apportées dans la zone de
conflit :
<<<<<<< .mine Saucisson Mortadelle Jambon =======
Le texte entre le deuxième et le troisième marqueur est celui du fichier propagé par Sally :
======= Choucroute Poulet rôti >>>>>>> .r2
Normalement, vous n'allez pas juste supprimer les marqueurs et les changements effectués par Sally (elle sera affreusement déçue quand on lui apportera un sandwich différent de ce qu'elle a commandé). Vous décrochez donc le téléphone, ou vous traversez le bureau, pour expliquer à Sally qu'on ne met pas de choucroute dans un sandwich. [7] Après vous être mis d'accord sur les changements à enregistrer, éditez votre fichier et enlevez les marqueurs de conflit.
Tranche de pain supérieure Mayonnaise Laitue Tomate Comté Saucisson Mortadelle Jambon Moutarde Tranche de pain inférieure
Maintenant utilisez svn resolve et vous êtes paré pour propager vos changements :
$ svn resolve --accept working sandwich.txt Conflit sur 'sandwich.txt' résolu $ svn commit -m "Va pour mon sandwich et au diable celui de Sally !"
Soyez prudent et ne lancez svn resolve qu'une fois certain que vous avez résolu le conflit dans votre fichier : une fois les fichiers temporaires effacés, Subversion vous laisse propager le fichier même s'il contient toujours des marqueurs de conflit.
Si jamais vous êtes perdu lors de l'édition du fichier en conflit, vous pouvez toujours consulter les trois fichiers que Subversion a créé pour vous dans votre copie de travail, y compris le fichier tel qu'il était avant que vous ne lanciez la mise à jour. Vous pouvez même utiliser un outil externe interactif spécialisé dans les fusions pour examiner ces trois fichiers.
Si vous faites face à un conflit et que vous
décidez d'abandonner vos changements, vous pouvez lancer
svn resolve --accept theirs-full
,
Subversion abandonne alors vos modifications et supprime les
fichiers temporaires :CHEMIN-DU-CONFLIT
$ svn update Conflit découvert dans 'machin.c'. Sélectionner : (p) report, (df) diff complet, (e) édite, (h) aide pour plus d'options : C sandwich.txt Actualisé à la révision 2. $ ls sandwich.* sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1 $ svn resolve --accept theirs-full sandwich.txt Conflit sur 'sandwich.txt' résolu $
Si vous faites face à un conflit et qu'après examen de la situation, vous décidez d'abandonner vos changements et de repartir de zéro (peu importe en fait que ce soit après un conflit ou à n'importe quel autre moment), contentez-vous de revenir en arrière sur vos changements :
$ svn revert sandwich.txt 'sandwich.txt' réinitialisé $ ls sandwich.* sandwich.txt
Notez que quand vous revenez en arrière sur un fichier en conflit, vous n'avez pas besoin de lancer svn resolve.
Enfin ! Vos modifications sont terminées, vous les avez fusionnées avec celles du serveur et vous êtes prêt à les propager vers le dépôt.
La commande svn commit envoie vos
changements au dépôt. Quand vous propagez un changement,
vous devez l'accompagner d'un commentaire de propagation qui décrit
ce changement. Votre commentaire est associé à la nouvelle révision
que vous créez. Si votre commentaire est bref, vous pouvez le passer
en ligne de commande en utilisant l'option
--message
(ou -m
) :
$ svn commit -m "Nombre de tranches de fromage corrigé." Envoi sandwich.txt Transmission des données . Révision 3 propagée.
Cependant, si vous avez rédigé votre commentaire au fur et à
mesure, vous souhaitez sûrement indiquer à Subversion de le
récupérer dans un fichier en lui donnant le nom
du fichier avec l'option --file
(-F
) :
$ svn commit -F commentaire_de_propagation Envoi sandwich.txt Transmission des données . Révision 4 propagée.
Si vous ne spécifiez ni l'option --message
ni l'option --file
, Subversion lance
automatiquement votre éditeur de texte favori (voir les
détails de editor-cmd
dans
la section intitulée « Configuration générale ») pour
que vous rédigiez le commentaire de propagation.
Astuce | |
---|---|
Si, au moment où vous rédigez votre commentaire de propagation, vous décidez d'annuler la propagation, vous n'avez qu'à quitter l'éditeur de texte sans sauvegarder les changements. Si vous avez déjà sauvegardé le commentaire, effacez le texte, sauvegardez à nouveau puis choisissez d'annuler : $ svn commit Attente de Emacs...Fait Entrée du journal non modifié ou non précisé a)nnule, c)ontinue, e)dite a $ |
Le dépôt ne sait pas si vos changements ont un sens ou pas ; il vérifie seulement que personne n'a modifié, pendant que vous aviez le dos tourné, un des fichiers que vous-même avez modifié. Si c'est le cas, la propagation toute entière échoue, affichant un message vous informant qu'un ou plusieurs de vos fichiers ne sont plus à jour :
$ svn commit -m "Ajout d'une autre règle" Envoi règles.txt Transmission des données . svn: E155011: Echec de la propagation (commit), détails : svn: E155011: Fichier '/règles.txt' obsolète …
Notez que le phrasé exact de ce message d'erreur dépend du protocole réseau et du serveur que vous utilisez, mais l'idée reste la même.
À ce moment là, vous devez lancer svn
update
, traiter les fusions ou conflits qui
apparaissent et retenter une propagation.
Nous en avons terminé avec le cycle d'utilisation de base de Subversion. Subversion offre beaucoup d'autres fonctionnalités pour gérer votre dépôt et votre copie de travail, mais l'utilisation quotidienne de Subversion ne requiert pratiquement que les commandes que nous venons de voir dans ce chapitre. Intéressons-nous quand même à quelques commandes supplémentaires utilisées relativement souvent.
[6] Si vous avez l'intention de recouvrer cet élément
afin qu'il soit de nouveau présent dans
HEAD
, lisez la section intitulée « Résurrection des éléments effacés ».
[7] Et si vous commandez ça, on vous chassera de la ville à coup de baguette rassie.