hgbook

annotate fr/ch03-tour-merge.xml @ 979:64475a75365b

Merged from rpelisse
author Jean-Marie Clément <JeanMarieClement@web.de>
date Fri Sep 04 18:24:06 2009 +0200 (2009-09-04)
parents
children 713f0f69029a
rev   line source
belaran@964 1 <!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
belaran@964 2
belaran@964 3 <chapter>
belaran@964 4 <title>Un rapide tour de Mercurial: fusionner les travaux</title>
belaran@964 5 <para>\label{chap:tour-merge}</para>
belaran@964 6
belaran@964 7 <para>Nous avons maintenant étudié comment cloner un dépôt, effectuer
belaran@964 8 des changements dedans, et récupérer ou transférer depuis un
belaran@964 9 autre dépôt. La prochaine étape est donc de <emphasis>fusionner</emphasis> les
belaran@964 10 modifications de différents dépôts.</para>
belaran@964 11
belaran@964 12 <sect1>
belaran@964 13 <title>Fusionner différents travaux</title>
belaran@964 14 <para> %%% for 'Merging streams of work' ?
belaran@964 15 La fusion\footnote{NdT: Je garde fusion mais le jargon professionnel
belaran@964 16 emploiera généralement le terme \textit{merge}.} est un aspect
belaran@964 17 fondamental lorsqu'on travaille avec un gestionnaire de source
belaran@964 18 distribué.</para>
belaran@964 19 <itemizedlist>
belaran@964 20 <listitem><para>Alice et Bob ont chacun une copie personnelle du dépôt d'un
belaran@964 21 projet sur lequel ils collaborent. Alice corrige un \textit{bug}
belaran@964 22 dans son dépôt, et Bob ajoute une nouvelle fonctionnalité dans le
belaran@964 23 sien. Ils veulent un dépôt partagé avec à la fois le correctif du
belaran@964 24 \textit{bug} et la nouvelle fonctionnalité.</para>
belaran@964 25 </listitem>
belaran@964 26 <listitem><para>Je travaille régulièrement sur plusieurs tâches différentes sur
belaran@964 27 un seul projet en même temps, chacun isolé dans son propre dépôt.
belaran@964 28 Travailler ainsi signifie que je dois régulièrement fusionner une
belaran@964 29 partie de mon code avec celui des autres.</para>
belaran@964 30 </listitem></itemizedlist>
belaran@964 31
belaran@964 32 <para>Parce que la fusion est une opération si commune à réaliser,
belaran@964 33 Mercurial la rend facile. Étudions ensemble le déroulement des opérations.
belaran@964 34 Nous commencerons encore par faire un clone d'un autre dépôt (vous voyez
belaran@964 35 que l'on fait ça tout le temps ?) puis nous ferons quelques modifications
belaran@964 36 dessus.
belaran@964 37 <!-- &interaction.tour.merge.clone; -->
belaran@964 38 Nous devrions avoir maintenant deux copies de <filename>hello.c</filename> avec
belaran@964 39 des contenus différents. Les historiques de ces deux dépôts ont aussi
belaran@964 40 divergés, comme illustré dans la figure <xref linkend="fig:tour-merge:sep-repos"/>.</para>
belaran@964 41
belaran@964 42 <para><!-- &interaction.tour.merge.cat; --></para>
belaran@964 43
belaran@964 44 <informalfigure>
belaran@964 45
belaran@964 46 <para> <mediaobject><imageobject><imagedata fileref="tour-merge-sep-repos"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
belaran@964 47 <caption><para>Historiques récent divergents des dépôts \dirname{my-hello</para></caption>
belaran@964 48 et <filename class="directory">my-new-hello</filename>}
belaran@964 49 \label{fig:tour-merge:sep-repos}</para>
belaran@964 50 </informalfigure>
belaran@964 51
belaran@964 52 <para>Nous savons déjà que récupérer les modifications depuis notre dépôt
belaran@964 53 <filename class="directory">my-hello</filename> n'aura aucun effet sur l'espace de travail.
belaran@964 54 </para>
belaran@964 55
belaran@964 56 <para><!-- &interaction.tour.merge.pull; -->
belaran@964 57 </para>
belaran@964 58
belaran@964 59 <para>Néanmoins, la commande <command role="hg-cmd">hg pull</command> nous indique quelque chose au
belaran@964 60 sujet des <quote>heads</quote>.
belaran@964 61 </para>
belaran@964 62
belaran@964 63 <sect2>
belaran@964 64 <title>\textit{Head changesets}</title>
belaran@964 65
belaran@964 66 <para>Une \textit{head}\footnote{NdT: Je garde \textit{head} que j'accorde
belaran@964 67 au féminin comme la coutume orale l'a imposé.} est un \textit{changeset}
belaran@964 68 sans descendants, ou enfants, comme on les désigne parfois. La révision
belaran@964 69 \textit{tip} est une \textit{head}, car la dernière révision dans un dépôt
belaran@964 70 n'a aucun enfant, mais il est important de noter qu'un dépôt peut contenir
belaran@964 71 plus d'une \textit{head}.
belaran@964 72 </para>
belaran@964 73
belaran@964 74 <informalfigure>
belaran@964 75
belaran@964 76 <para> <mediaobject><imageobject><imagedata fileref="tour-merge-pull"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
belaran@964 77 \caption{Contenu d'un dépôt après avoir transféré le contenu du dépôt
belaran@964 78 <filename class="directory">my-hello</filename> dans le dépôt <filename class="directory">my-new-hello</filename>}
belaran@964 79 \label{fig:tour-merge:pull}
belaran@964 80 </para>
belaran@964 81 </informalfigure>
belaran@964 82
belaran@964 83 <para>Dans la figure <xref linkend="fig:tour-merge:pull"/>, vous pouvez constater l'effet
belaran@964 84 d'un \textit{pull} depuis le dépôt <filename class="directory">my-hello</filename> dans le dépôt
belaran@964 85 <filename class="directory">my-new-hello</filename>. L'historique qui était déjà présent dans le dépôt
belaran@964 86 <filename class="directory">my-new-hello</filename> reste intact, mais une nouvelle révision a été
belaran@964 87 ajoutée. En vous reportant à la figure <xref linkend="fig:tour-merge:sep-repos"/>,
belaran@964 88 vous pouvez voir que le \textit{<emphasis>changeset ID</emphasis>} reste le même dans
belaran@964 89 le nouveau dépôt, mais que le <emphasis>numéro de révision</emphasis> reste le même.
belaran@964 90 (Ceci est un parfait exemple de pourquoi il n'est fiable d'utiliser les
belaran@964 91 numéros de révision lorsque l'on discute d'un \textit{changeset}.) Vous
belaran@964 92 pouvez voir les \texit{heads} présentes dans le dépôt en utilisant la
belaran@964 93 commande <command role="hg-cmd">hg heads</command>.
belaran@964 94 <!-- &interaction.tour.merge.heads; -->
belaran@964 95 </para>
belaran@964 96
belaran@964 97 </sect2>
belaran@964 98 <sect2>
belaran@964 99 <title>Effectuer la fusion</title>
belaran@964 100
belaran@964 101 <para>Que se passe-t-il quand vous essayez d'utiliser la commande <command role="hg-cmd">hg update</command>
belaran@964 102 pour mettre à jour votre espace de travail au nouveau \textit{tip}.
belaran@964 103 <!-- &interaction.tour.merge.update; -->
belaran@964 104 Mercurial nous prévient que la commande <command role="hg-cmd">hg update</command> n'effectuera pas
belaran@964 105 la fusion, il ne veut pas mettre à jour l'espace de travail quand il
belaran@964 106 estime que nous pourrions avoir besoin d'une fusion, à moins de lui
belaran@964 107 forcer la main. À la place, il faut utiliser la commande <command role="hg-cmd">hg merge</command>
belaran@964 108 pour fusionner les deux \textit{heads}.
belaran@964 109 <!-- &interaction.tour.merge.merge; -->
belaran@964 110 </para>
belaran@964 111
belaran@964 112 <informalfigure>
belaran@964 113
belaran@964 114 <para> <mediaobject><imageobject><imagedata fileref="tour-merge-merge"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
belaran@964 115 \caption{Espace de travail et dépôt lors d'une fusion, et dans le
belaran@964 116 \textit{commit} qui suit.}
belaran@964 117 \label{fig:tour-merge:merge}
belaran@964 118 </para>
belaran@964 119 </informalfigure>
belaran@964 120
belaran@964 121 <para>Ceci met à jour l'espace de travail de manière à ce qu'il contienne
belaran@964 122 les modifications des <emphasis>deux</emphasis> \textit{heads}, ce qui apparaît dans
belaran@964 123 les sorties de la commande <command role="hg-cmd">hg parents</command> et le contenu de
belaran@964 124 <filename>hello.c</filename>.
belaran@964 125 <!-- &interaction.tour.merge.parents; -->
belaran@964 126 </para>
belaran@964 127
belaran@964 128 </sect2>
belaran@964 129 <sect2>
belaran@964 130 <title>Effectuer le \textit{commit} du résultat de la fusion</title>
belaran@964 131
belaran@964 132 <para>Dès l'instant où vous avez effectué une fusion, <command role="hg-cmd">hg parents</command> vous
belaran@964 133 affichera deux parents, avant que vous n'exécutiez la commande
belaran@964 134 <command role="hg-cmd">hg commit</command> sur le résultat de la fusion.
belaran@964 135 <!-- &interaction.tour.merge.commit; -->
belaran@964 136 Nous avons maintenant un nouveau \textit{tip}, remarquer qu'il contient
belaran@964 137 <emphasis>à la fois</emphasis> nos anciennes \textit{heads} et leurs parents. Ce sont
belaran@964 138 les mêmes révisions que nous avions affichées avec la commande
belaran@964 139 <command role="hg-cmd">hg parents</command>.
belaran@964 140 </para>
belaran@964 141
belaran@964 142 <para><!-- &interaction.tour.merge.tip; -->
belaran@964 143 Dans la figure <xref linkend="fig:tour-merge:merge"/>, vous pouvez voir une représentation
belaran@964 144 de ce qui se passe dans l'espace de travail pendant la fusion, et comment ceci
belaran@964 145 affecte le dépôt lors du \textit{commit}. Pendant la fusion, l'espace de travail,
belaran@964 146 qui a deux \texit{changesets} comme parents, voit ces derniers devenir le parent
belaran@964 147 %%% TODO: le parent ou "les parents" : plus logique mais si il reste seulement
belaran@964 148 %%% un changeset, alors c'est effectivement un parent (le changeset est hermaphrodite)
belaran@964 149 d'un nouveau \textit{changeset}.
belaran@964 150 </para>
belaran@964 151
belaran@964 152 </sect2>
belaran@964 153 </sect1>
belaran@964 154 <sect1>
belaran@964 155 <title>Fusionner les modifications en conflit</title>
belaran@964 156
belaran@964 157 <para>La plupart des fusions sont assez simple à réaliser, mais parfois
belaran@964 158 vous vous retrouverez à fusionner des fichiers où la modification touche
belaran@964 159 la même portion de code, au sein d'un même fichier. À moins que ces
belaran@964 160 modification ne soient identiques, ceci aboutira à un <emphasis>conflit</emphasis>,
belaran@964 161 et vous devrez décider comment réconcilier les différentes modifications
belaran@964 162 dans un tout cohérent.
belaran@964 163 </para>
belaran@964 164
belaran@964 165 <informalfigure>
belaran@964 166
belaran@964 167 <para> <mediaobject><imageobject><imagedata fileref="tour-merge-conflict"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
belaran@964 168 <caption><para>Modifications conflictuelles dans un document</para></caption>
belaran@964 169 \label{fig:tour-merge:conflict}
belaran@964 170 </para>
belaran@964 171 </informalfigure>
belaran@964 172
belaran@964 173 <para>La figure <xref linkend="fig:tour-merge:conflict"/> illustre un cas de modifications
belaran@964 174 conflictuelles dans un document. Nous avons commencé avec une version simple
belaran@964 175 de ce fichier, puis nous avons ajouté des modifications, pendant que
belaran@964 176 quelqu'un d'autre modifiait le même texte. Notre tâche dans la résolution
belaran@964 177 du conflit est de décider à quoi le fichier devrait ressembler.
belaran@964 178 </para>
belaran@964 179
belaran@964 180 <para>Mercurial n'a pas de mécanisme interne pour gérer les conflits.
belaran@964 181 À la place, il exécute un programme externe appelé <command>hgmerge</command>.
belaran@964 182 Il s'agit d'un script shell qui est embarqué par Mercurial, vous
belaran@964 183 pouvez le modifier si vous le voulez. Ce qu'il fait par défaut est
belaran@964 184 d'essayer de trouver un des différents outils de fusion qui seront
belaran@964 185 probablement installés sur le système. Il commence par les outils
belaran@964 186 totalement automatiques, et si ils échouent (parce que la résolution
belaran@964 187 du conflit nécessite une intervention humaine) ou si ils sont absents,
belaran@964 188 le script tente d'exécuter certains outils graphiques de fusion.
belaran@964 189 </para>
belaran@964 190
belaran@964 191 <para>Il est aussi possible de demander à Mercurial d'exécuter un autre
belaran@964 192 programme ou un autre script au lieu de la commande <command>hgmerge</command>,
belaran@964 193 en définissant la variable d'environnement <envar>HGMERGE</envar> avec le nom
belaran@964 194 du programme de votre choix.
belaran@964 195 </para>
belaran@964 196
belaran@964 197 <sect2>
belaran@964 198 <title>Utiliser un outil graphique de fusion</title>
belaran@964 199
belaran@964 200 <para>Mon outil de fusion préféré est <command>kdiff3</command>, que j'utilise ici
belaran@964 201 pour illustrer les fonctionnalités classiques des outils graphiques
belaran@964 202 de fusion. Vous pouvez voir une capture d'écran de l'utilisation de
belaran@964 203 <command>kdiff3</command> dans la figure <xref linkend="fig:tour-merge:kdiff3"/>. Cet outil
belaran@964 204 effectue une <emphasis>fusion \textit{three-way</emphasis>}, car il y a trois différentes
belaran@964 205 versions du fichier qui nous intéresse. Le fichier découpe la partie
belaran@964 206 supérieure de la fenêtre en trois panneaux:
belaran@964 207 </para>
belaran@964 208
belaran@964 209 <itemizedlist>
belaran@964 210 <listitem><para>A gauche on la version de <emphasis>base</emphasis> du fichier, soit la plus
belaran@964 211 récente version des deux versions qu'on souhaite fusionner.
belaran@964 212 </para>
belaran@964 213 </listitem>
belaran@964 214 <listitem><para>Au centre, il y a <quote>notre</quote> version du fichier, avec le contenu
belaran@964 215 que nous avons modifié.
belaran@964 216 </para>
belaran@964 217 </listitem>
belaran@964 218 <listitem><para>Sur la droite, on trouve <quote>leur</quote> version du fichier, celui qui
belaran@964 219 contient le \textit{changeset} que nous souhaitons intégré.
belaran@964 220 </para>
belaran@964 221 </listitem></itemizedlist>
belaran@964 222
belaran@964 223 <para>Dans le panneau en dessous, on trouve le <emphasis>résultat</emphasis> actuel de notre
belaran@964 224 fusion. Notre tâche consiste donc à remplacement tous les textes en rouges,
belaran@964 225 qui indiquent des conflits non résolus, avec une fusion manuelle et pertinente
belaran@964 226 de <quote>notre</quote> version et de la <quote>leur</quote>.
belaran@964 227 </para>
belaran@964 228
belaran@964 229 <para>Tous les quatre panneaux sont <emphasis>accrochés ensemble</emphasis>, si nous déroulons
belaran@964 230 les ascenseurs verticalement ou horizontalement dans chacun d'entre eux, les
belaran@964 231 autres sont mis à jour avec la section correspondante dans leurs fichiers
belaran@964 232 respectifs.
belaran@964 233 </para>
belaran@964 234
belaran@964 235 <informalfigure>
belaran@964 236
belaran@964 237 <para> <mediaobject><imageobject><imagedata fileref="kdiff3"/></imageobject><textobject><phrase>XXX add text</phrase></textobject></mediaobject>
belaran@964 238 <caption><para>Utilisation de \command{kdiff3</para></caption> pour fusionner différentes versions
belaran@964 239 d'un fichier.}
belaran@964 240 \label{fig:tour-merge:kdiff3}
belaran@964 241 </para>
belaran@964 242 </informalfigure>
belaran@964 243
belaran@964 244 <para>Pour chaque portion de fichier posant problème, nous pouvons choisir
belaran@964 245 de résoudre le conflit en utilisant une combinaison
belaran@964 246 de texte depuis la version de base, la notre, ou la leur. Nous pouvons
belaran@964 247 aussi éditer manuellement les fichiers à tout moment, si c'est
belaran@964 248 nécessaire.
belaran@964 249 </para>
belaran@964 250
belaran@964 251 <para>Il y a <emphasis>beaucoup</emphasis> d'outils de fusion disponibles, bien trop pour
belaran@964 252 en parler de tous ici. Leurs disponibilités varient selon les plate formes
belaran@964 253 ainsi que leurs avantages et inconvénients. La plupart sont optimisé pour
belaran@964 254 la fusion de fichier contenant un texte plat, certains sont spécialisé
belaran@964 255 dans un format de fichier précis (généralement XML).
belaran@964 256 </para>
belaran@964 257
belaran@964 258 </sect2>
belaran@964 259 <sect2>
belaran@964 260 <title>Un exemple concret</title>
belaran@964 261
belaran@964 262 <para>Dans cet exemple, nous allons reproduire la modification de l'historique
belaran@964 263 du fichier de la figure <xref linkend="fig:tour-merge:conflict"/> ci dessus. Commençons
belaran@964 264 par créer un dépôt avec une version de base de notre document.
belaran@964 265 </para>
belaran@964 266
belaran@964 267 <para><!-- &interaction.tour-merge-conflict.wife; -->
belaran@964 268 Créons un clone de ce dépôt et faisons une modification dans le fichier.
belaran@964 269 <!-- &interaction.tour-merge-conflict.cousin; -->
belaran@964 270 Et un autre clone, pour simuler que quelqu'un d'autre effectue une
belaran@964 271 modification sur le fichier. (Ceci pour suggérer qu'il n'est pas rare
belaran@964 272 de devoir effectuer des \textit{merge} avec vos propres travaux quand
belaran@964 273 vous isolez les tâches dans des dépôts distincts. En effet, vous
belaran@964 274 aurez alors à trouver et résoudre certains conflits).
belaran@964 275 <!-- &interaction.tour-merge-conflict.son; -->
belaran@964 276 Maintenant que ces deux versions différentes du même fichier sont
belaran@964 277 créées, nous allons configurer l'environnement de manière appropriée pour
belaran@964 278 exécuter notre \textit{merge}.
belaran@964 279 <!-- &interaction.tour-merge-conflict.pull; -->
belaran@964 280 </para>
belaran@964 281
belaran@964 282 <para>Dans cette exemple, je n'utiliserais pas la commande Mercurial
belaran@964 283 habituelle <command>hgmerge</command> pour effectuer le \textit{merge},
belaran@964 284 car il me faudrait abandonner ce joli petit exemple automatisé
belaran@964 285 pour utiliser un outil graphique. À la place, je vais définir
belaran@964 286 la variable d'environnement <envar>HGMERGE</envar> pour indiquer à
belaran@964 287 Mercurial d'utiliser la commande non-interactive <command>merge</command>.
belaran@964 288 Cette dernière est embarquée par de nombreux systèmes <quote>à la Unix</quote>.
belaran@964 289 Si vous exécutez cet exemple depuis votre ordinateur, ne vous
belaran@964 290 occupez pas de définir <envar>HGMERGE</envar>.
belaran@964 291 <!-- &interaction.tour-merge-conflict.merge; -->
belaran@964 292 Parce que <command>merge</command> ne peut pas résoudre les modifications
belaran@964 293 conflictuelles, il laisse des <emphasis>marqueurs de différences</emphasis>
belaran@964 294 \footnote{NdT: Oui, je traduis \textit{merge markers} par un sens
belaran@964 295 inverse en Français, mais je pense vraiment que c'est plus clair
belaran@964 296 comme ça...} à l'intérieur du fichier qui a des conflits, indiquant
belaran@964 297 clairement quelles lignes sont en conflits, et si elles viennent de
belaran@964 298 notre fichier ou du fichier externe.
belaran@964 299 </para>
belaran@964 300
belaran@964 301 <para>Mercurial peut distinguer, à la manière dont la commande <command>merge</command>
belaran@964 302 se termine, qu'elle n'a pas été capable d'effectuer le \textit{merge},
belaran@964 303 alors il nous indique que nous devons effectuer de nouveau cette
belaran@964 304 opération. Ceci peut être très utile si, par exemple, nous exécutons un
belaran@964 305 outil graphique de fusion et que nous le quittons sans nous rendre compte
belaran@964 306 qu'il reste des conflits ou simplement par erreur.
belaran@964 307 </para>
belaran@964 308
belaran@964 309 <para>Si le \textit{merge} automatique ou manuel échoue, il n'y a rien pour
belaran@964 310 nous empêcher de <quote>corriger le tir</quote> en modifiant nous même les fichiers,
belaran@964 311 et enfin effectuer le \textit{commit} du fichier:
belaran@964 312 <!-- &interaction.tour-merge-conflict.commit; -->
belaran@964 313 </para>
belaran@964 314
belaran@964 315 </sect2>
belaran@964 316 </sect1>
belaran@964 317 <sect1>
belaran@964 318 <title>Simplification de la séquence pull-merge-commit</title>
belaran@964 319 <para>\label{sec:tour-merge:fetch}
belaran@964 320 </para>
belaran@964 321
belaran@964 322 <para>La procédure pour effectuer la fusion indiquée ci-dessus est simple,
belaran@964 323 mais requiert le lancement de trois commandes à la suite.
belaran@964 324 </para>
belaran@964 325 <programlisting>
belaran@964 326 <para> hg pull
belaran@964 327 hg merge
belaran@964 328 hg commit -m 'Merged remote changes'
belaran@964 329 </para>
belaran@964 330 </programlisting>
belaran@964 331
belaran@964 332 <para>Lors du \textit{commit} final, vous devez également saisir un message,
belaran@964 333 qui aura vraisemblablement assez peu d'intérêt.
belaran@964 334 </para>
belaran@964 335
belaran@964 336 <para>Il serait assez sympathique de pouvoir réduire le nombre d'opérations
belaran@964 337 nécessaire, si possible. De fait Mercurial est fourni avec une
belaran@964 338 extension appelé <literal role="hg-ext">fetch</literal> qui fait justement cela.
belaran@964 339 </para>
belaran@964 340
belaran@964 341 <para>Mercurial fourni un mécanisme d'extension flexible qui permet à chacun
belaran@964 342 d'étendre ces fonctionnalités, tout en conservant le cœur de Mercurial
belaran@964 343 léger et facile à utiliser. Certains extensions ajoutent de nouvelles
belaran@964 344 commandes que vous pouvez utiliser en ligne de commande, alors que
belaran@964 345 d'autres travaillent <quote>en coulisse,</quote> par exemple en ajoutant des
belaran@964 346 possibilités au serveur.
belaran@964 347 </para>
belaran@964 348
belaran@964 349 <para>L'extension <literal role="hg-ext">fetch</literal> ajoute une nouvelle commande nommée, sans
belaran@964 350 surprise, <command role="hg-cmd">hg fetch</command>. Cette extension résulte en une combinaison
belaran@964 351 de <command role="hg-cmd">hg pull</command>, <command role="hg-cmd">hg update</command> and <command role="hg-cmd">hg merge</command>. Elle commence par
belaran@964 352 récupérer les modifications d'un autre dépôt dans le dépôt courant.
belaran@964 353 Si elle trouve que les modifications ajoutent une nouvelle \textit{head},
belaran@964 354 elle effectue un \textit{merge}, et ensuite \texit{commit} le résultat
belaran@964 355 du \textit{merge} avec un message généré automatiquement. Si aucune
belaran@964 356 \textit{head} n'ont été ajouté, elle met à jour le répertoire de travail
belaran@964 357 au niveau du nouveau \textit{changeset} \textit{tip}.
belaran@964 358 </para>
belaran@964 359
belaran@964 360
belaran@964 361 <para>Activer l'extension <literal role="hg-ext">fetch</literal> est facile. Modifiez votre <filename role="special">.hgrc</filename>,
belaran@964 362 et soit allez à la section <literal role="rc-extensions">extensions</literal> soit créer une
belaran@964 363 section <literal role="rc-extensions">extensions</literal>. Ensuite ajoutez une ligne qui consiste
belaran@964 364 simplement en <quote>\Verb+fetch =</quote>.
belaran@964 365 </para>
belaran@964 366
belaran@964 367 <programlisting>
belaran@964 368 <para> [extensions]
belaran@964 369 fetch =
belaran@964 370 </para>
belaran@964 371 </programlisting>
belaran@964 372 <para>(Normalement, sur la partie droite de <quote><literal>=</literal></quote> devrait apparaître
belaran@964 373 le chemin de l'extension, mais étant donné que l'extension <literal role="hg-ext">fetch</literal>
belaran@964 374 fait partie de la distribution standard, Mercurial sait où la trouver.)
belaran@964 375 </para>
belaran@964 376
belaran@964 377 </sect1>
belaran@964 378 </chapter>
belaran@964 379
belaran@964 380 <!--
belaran@964 381 local variables:
belaran@964 382 sgml-parent-document: ("00book.xml" "book" "chapter")
belaran@964 383 end:
belaran@964 384 -->