hgbook

annotate fr/intro.tex @ 943:3344e9987bf2

Quelques 'rephrasage' suite aux remarques pertinentes de Hugues
author Romain PELISSE <belaran@gmail.com>
date Mon Feb 16 18:13:41 2009 +0100 (2009-02-16)
parents d7159547e28a
children eb01681e0bb8
rev   line source
bos@16 1 \chapter{Introduction}
bos@16 2 \label{chap:intro}
bos@16 3
Wilk@933 4 \section{À propos de la gestion source}
Wilk@933 5
Wilk@933 6 La gestion de sources est un processus permettant de gérer différentes
Wilk@933 7 versions de la même information. Dans sa forme la plus simple, c'est
Wilk@933 8 ce que tout le monde fait manuellement : quand vous modifiez
romain@923 9 un fichier, vous le sauvegarder sous un nouveau nom contenant un numéro,
Wilk@933 10 à chaque fois plus grand que celui de la version précédente.
Wilk@933 11
Wilk@933 12 Ce genre de gestion de version manuelle est cependant facilement sujette
romain@923 13 à des erreurs, ainsi, depuis longtemps, des logiciels existent pour
Wilk@933 14 résoudre cette problématique. Les premiers outils de gestion de sources
romain@923 15 étaient destinés à aider un seul utilisateur, à automatiser la gestion
Wilk@933 16 des versions d'un seul fichier. Dans les dernières décades, cette cible
Wilk@933 17 s'est largement agrandie, ils gèrent désormais de multiples fichiers, et
Wilk@933 18 aident un grand nombre de personnes à travailler ensemble. Les outils les
romain@923 19 plus modernes n'ont aucune difficultés à gérer plusieurs milliers de
romain@923 20 personnes travaillant ensemble sur des projets regroupant plusieurs
romain@923 21 centaines de milliers de fichiers.
romain@923 22
romain@923 23 \subsection{Pourquoi utiliser un gestionnaire de source ?}
romain@923 24
Wilk@933 25 Il y a de nombreuses raisons pour que vous ou votre équipe souhaitiez
romain@923 26 utiliser un outil automatisant la gestion de version pour votre projet.
bos@217 27 \begin{itemize}
romain@923 28 \item L'outil se chargera de suivre l'évolution de votre projet, sans
Wilk@933 29 que vous n'ayez à le faire. Pour chaque modification, vous aurez à votre
Wilk@933 30 disposition un journal indiquant \emph{qui} a fait quoi, \emph{pourquoi}
romain@923 31 ils l'ont fait, \emph{quand} ils l'ont fait, et \emph{ce} qu'ils ont
romain@923 32 modifiés.
romain@923 33 \item Quand vous travaillez avec d'autres personnes, les logiciels de
Wilk@933 34 gestion de source facilitent le travail collaboratif. Par exemple, quand
Wilk@933 35 plusieurs personnes font, plus ou moins simultanément, des modifications
romain@923 36 incompatibles, le logiciel vous aidera à identifier et résoudre les conflits.
romain@924 37 \item L'outil vous aidera à réparer vos erreurs. Si vous effectuez un changement
Wilk@933 38 qui se révèlera être une erreur, vous pourrez revenir à une version
Wilk@933 39 antérieure d'un fichier ou même d'un ensemble de fichiers. En fait, un outil de
romain@924 40 gestion de source \emph{vraiment} efficace vous permettra d'identifier à quel
romain@924 41 moment le problème est apparu (voir la section~\ref{sec:undo:bisect} pour plus
romain@924 42 de détails).
romain@924 43 \item L'outil vous permettra aussi de travailler sur plusieurs versions différentes
Wilk@933 44 de votre projet et à gérer l'écart entre chacune.
bos@217 45 \end{itemize}
Wilk@933 46 La plupart de ces raisons ont autant d'importances ---du moins en théorie--- que
romain@924 47 vous travailliez sur un projet pour vous, ou avec une centaine d'autres
romain@924 48 personnes.
romain@924 49
Wilk@933 50 Une question fondamentale à propos des outils de gestion de source, qu'il s'agisse
romain@924 51 du projet d'une personne ou d'une grande équipe, est quelles sont ses
romain@924 52 \emph{avantages} par rapport à ses \emph{coût}. Un outil qui est difficile à
belaran@936 53 utiliser ou à comprendre exigera un lourd effort d'adaptation.
Wilk@933 54
Wilk@933 55 Un projet de cinq milles personnes s'effondrera très certainement de lui même
romain@924 56 sans aucun processus et outil de gestion de source. Dans ce cas, le coût
romain@924 57 d'utilisation d'un logiciel de gestion de source est dérisoire, puisque
romain@924 58 \emph{sans}, l'échec est presque garanti.
romain@924 59
Wilk@933 60 D'un autre coté, un ``rapide hack'' d'une personne peut sembler un contexte
romain@924 61 bien pauvre pour utiliser un outil de gestion de source, car, bien évidement
romain@924 62 le coût d'utilisation dépasse le coût total du projet. N'est ce pas ?
romain@924 63
romain@924 64 Mercurial supporte ces \emph{deux} échelles de travail. Vous pouvez apprendre
Wilk@933 65 les bases en quelques minutes seulement, et, grâce à sa performance, vous pouvez
romain@924 66 l'utiliser avec facilité sur le plus petit des projets. Cette simplicité
Wilk@933 67 signifie que vous n'avez pas de concepts obscurs ou de séquence de commandes
Wilk@933 68 défiant l'imagination, sans aucune corrélation avec \emph{ce que vous êtes
romain@924 69 vraiment entrain de faire}. En même temps, ces mêmes performances et sa
romain@924 70 nature ``peer-to-peer'' vous permet d'augmenter, sans difficulté, son
romain@924 71 utilisation à de très grand projet.
romain@924 72
romain@924 73 Aucun outil de gestion de source ne peut sauver un projet mal mené, mais un
belaran@943 74 bon outil peut rendre beaucoup plus fluide votre travail.
romain@924 75
romain@924 76 \subsection{Les multiples noms de la gestion de source}
romain@924 77
Wilk@933 78 La gestion de source\footnote{NdT: J'ai utilisé systématiquement le terme
Wilk@933 79 ``gestion de source'' à travers tout l'ouvrage. Ce n'est pas forcement la
Wilk@933 80 meilleur traduction, et ceci peut rendre la lecture un peu lourde, mais je
Wilk@933 81 pense que le document y gagne en clarté et en précision.} est un domaine
Wilk@933 82 divers, tellement qu'il n'existe pas une seul nom ou acronyme pour le désigner.
Wilk@933 83 Voilà quelqu'uns des noms ou
Wilk@933 84 acronymes que vous rencontrerez le plus souvent\footnote{NdT: J'ai conservé la
Wilk@933 85 liste des noms en anglais pour des raisons de commodité (ils sont plus
Wilk@933 86 ``googelable''). En outre, j'ai opté conserver l'ensemble des opérations de
Wilk@933 87 Mercurial (\textit{commit},\textit{push}, \textit{pull},...) en anglais, là
Wilk@933 88 aussi pour faciliter la lecture d'autres documents en anglais, et aussi
Wilk@933 89 l'utilisation de Mercurial}.
romain@928 90
romain@928 91 :
bos@217 92 \begin{itemize}
romain@924 93 \item \textit{Revision control (RCS)} ;
romain@924 94 \item Software configuration management (SCM), ou \textit{configuration management} ;
romain@924 95 \item \textit{Source code management} ;
romain@924 96 \item \textit{Source code control}, ou \textit{source control} ;
romain@924 97 \item \textit{Version control (VCS)}.
bos@217 98 \end{itemize}
romain@924 99
romain@924 100 Certains personnes prétendent que ces termes ont en fait des sens
romain@924 101 différents mais en pratique ils se recouvrent tellement qu'il n'y a pas
romain@924 102 réellement de manière pertinente de les distinguer.
romain@924 103
romain@924 104 \section{Une courte histoire de la gestion de source}
romain@924 105
Wilk@934 106 Le plus célèbre des anciens outils de gestion de source est \textit{SCCS
Wilk@934 107 (Source Code Control System)}, que Marc Rochkind conçu dans les laboratoire de
Wilk@934 108 recherche de Bell (\textit{Bell Labs}), dans le début des années 70.
Wilk@934 109 \textit{SCCS} ne fonctionnait que sur des fichiers individuels, et obligeait à
Wilk@934 110 chaque personne travaillant sur le projet d'avoir un accès à un répertoire de
Wilk@934 111 travail commun, sur le même système. Seulement une seule personne pouvait
Wilk@934 112 modifier un fichier au même moment, ce fonctionnement était assuré par
Wilk@934 113 l'utilisation de verrou (``lock''). Il était courant que des personnes
Wilk@934 114 verrouillent des fichiers, et plus tard, oublient de le déverrouiller;
Wilk@934 115 empêchant n'importe qui d'autre de travailler sur ces fichiers sans l'aide de
Wilk@934 116 l'administrateur...
Wilk@934 117
Wilk@934 118 Walter Tichy a développé une alternative libre à \textit{SCCS} au début des
Wilk@934 119 années 80, qu'il nomma \textit{RSC (Revison Control System)}. Comme
Wilk@934 120 \textit{SCCS}, \textit{RCS} demander aux développeurs de travailler sur le même
Wilk@934 121 répertoire partagé, et de verrouiller les
romain@924 122 fichiers pour se prémunir de tout conflit issue de modifications concurrentes.
romain@924 123
Wilk@934 124 Un peu plus tard dans les années 1980, Dick Grune utilisa \textit{RCS} comme
Wilk@934 125 une brique de base pour un ensemble de scripts \textit{shell} qu'il intitula
Wilk@934 126 cmt, avant de la renommer en \textit{CVS (Concurrent Versions System)}. La
Wilk@934 127 grande innovation de CVS était que les développeurs pouvaient travailler
Wilk@934 128 simultanément et indépendamment dans leur propre espace de travail. Ces espaces
Wilk@934 129 de travail privés assuraient que les développeurs ne se marchent pas
Wilk@934 130 mutuellement sur les pieds, comme c'était souvent le cas avec RCS et SCCS.
Wilk@934 131 Chaque développeur disposait donc de sa copie de tous les fichiers du projet,
Wilk@934 132 et ils pouvaient donc librement les modifier. Ils devaient néanmoins effectuer
Wilk@934 133 la ``fusion'' (\textit{``merge''}) de leurs fichiers, avant d'effectuer le
Wilk@934 134 ``commit'' de leur modifications sur le dépôt central.
Wilk@934 135
Wilk@934 136 Brian Berliner repris les scripts de Grune's et les réécris en~C, qu'il publia
Wilk@934 137 en 1989. Depuis, ce code a été modifié jusqu'à devenir la version moderne de
Wilk@934 138 CVS. CVS a acquis ainsi la capacité de fonctionner en réseau, transformant son
Wilk@934 139 architecture en client/serveur. L'architecture de CVS est centralisée, seul le
Wilk@934 140 serveur a une copie de l'historique du projet. L'espace de travail client ne
Wilk@934 141 contient qu'une copie de la dernière version du projet, et quelques métadonnées
Wilk@934 142 pour indiquer où le serveur se trouve. CVS a été un grand succès, aujourd'hui
Wilk@934 143 c'est probablement l'outil de gestion de contrôle le plus utilisé au monde.
Wilk@934 144
Wilk@934 145 Au début des années 1990, Sun Microsystmes développa un premier outil de
Wilk@934 146 gestion de source distribué, nommé TeamWare. Un espace de travail TeamWare
Wilk@934 147 contient une copie complète de l'historique du projet. TeamWare n'a pas de
Wilk@934 148 notion de dépôt central. (CVS utilisait RCS pour le stockage de l'historique,
Wilk@934 149 TeamWare utilisait SCCS).
Wilk@934 150
Wilk@934 151 Alors que les années 1990 avançaient, les utilisateurs ont pris conscience d'un
Wilk@934 152 certain nombre de problèmes avec CVS. Il enregistrait simultanément des
Wilk@934 153 modifications sur différents fichiers individuellement, au lieu de les
Wilk@934 154 regrouper dans une seule opération cohérente et atomique. Il ne gère pas bien
Wilk@934 155 sa hiérarchie de fichier, il est donc assez aisé de créer le chaos en renommant
Wilk@934 156 les fichiers et les répertoires. Pire encore, son code source est difficile à
Wilk@934 157 lire et à maintenir, ce qui agrandit largement le ``niveau de souffrance''
Wilk@934 158 associé à la réparation de ces problèmes d'architecture de manière prohibitive.
Wilk@934 159
Wilk@934 160 En 2001, Jim Blandy et Karl Fogel, deux développeurs qui avaient travaillés sur
Wilk@934 161 CVS, initièrent un projet pour le remplacer par un outil qui aurait une
Wilk@934 162 meilleur architecture et un code plus propre. Le résultat, Subversion, ne
Wilk@934 163 quitte pas le modèle centralisé et client/server de CVS, mais ajoute les
Wilk@934 164 opérations de ``commit'' atomique sur de multiples fichiers, une meilleure
Wilk@934 165 gestion des espaces de noms, et d'autres fonctionnalités qui en font un
Wilk@934 166 meilleur outil que CVS. Depuis sa première publication, il est rapidement
Wilk@934 167 devenu très populaire.
Wilk@934 168
Wilk@934 169 Plus ou moins de simultanément, Graydon Hoare a commencé sur l'ambitieux
Wilk@934 170 système de gestion distribué Monotone. Bien que Monotone corrige plusieurs
Wilk@934 171 défaut de CVS's tout en offrant une architecture ``peer-to-peer'', il va aussi
Wilk@934 172 plus loin que la plupart des outils de révision de manière assez innovante. Il
Wilk@934 173 utilise des ``hash'' cryptographique comme identifiant, et il a une notion
Wilk@934 174 complète de ``confiance'' du code issue de différentes sources.
Wilk@934 175
Wilk@934 176 Mercurial est né en 2005. Bien que très influencé par Monotone, Mercurial se
Wilk@934 177 concentre sur la facilité d'utilisation, les performances et la capacité à
Wilk@934 178 monter en charge pour de très gros projets.
romain@926 179
romain@926 180 \section{Tendances de la gestion de source}
romain@926 181
Wilk@934 182 Il y a eu une tendance évidente dans le développement et l'utilisation d'outil
Wilk@934 183 de gestion de source depuis les quatre dernières décades, au fur et à mesure
Wilk@934 184 que les utilisateurs se sont habitués à leur outils et se sont sentis contraint
Wilk@934 185 par leur limitations.
Wilk@934 186
Wilk@934 187 La première génération commença simplement par gérer un fichier unique sur un
Wilk@934 188 ordinateur individuel. Cependant, même si ces outils présentaient une grande
Wilk@934 189 avancée par rapport à la gestion manuelle des versions, leur modèle de
Wilk@934 190 verrouillage et leur utilisation limitée à un seul ordinateur rendait leur
Wilk@934 191 utilisation possible uniquement dans une très petite équipe.
Wilk@934 192
Wilk@934 193 La seconde génération a assoupli ces contraintes en adoptant une architecture
Wilk@934 194 réseau et centralisé, permettant de gérer plusieurs projets entiers en même
Wilk@934 195 temps. Alors que les projets grandirent en taille, ils rencontrèrent de nouveau
Wilk@934 196 problèmes. Avec les clients discutant régulièrement avec le serveurs, la montée
Wilk@934 197 en charge devint un réel problème sur les gros projets. Une connexion réseau
Wilk@934 198 peu fiable pouvant complètement empêcher les utilisateurs distant de dialoguer
Wilk@934 199 avec le serveur. Alors que les projets \textit{Open Source} commencèrent à
Wilk@934 200 mettre en place des accès en lecture seule disponible anonymement, les
Wilk@934 201 utilisateurs sans les privilèges de ``commit'' réalisèrent qu'ils ne pouvaient
Wilk@934 202 pas utiliser les outils pour collaborer naturellement avec le projet, comme ils
Wilk@934 203 ne pouvaient pas non plus enregistrer leurs modifications.
Wilk@934 204
Wilk@934 205 La génération actuelle des outils de gestion de source est ``peer-to-peer'' par
Wilk@934 206 nature. Tout ces systèmes ont abandonné la dépendance à un serveur central, et
Wilk@934 207 ont permis à leur utilisateur de distribuer les données de leur gestion de
Wilk@934 208 source à qui en a besoin. La collaboration à travers Internet a transformée la
Wilk@934 209 contrainte technologique à une simple question de choix et de consencus. Les
Wilk@934 210 outils moderne peuvent maintenant fonctionner en mode déconnecté sans limite et
Wilk@934 211 de manière autonome, la connexion au réseau n'étant nécessaire que pour
Wilk@934 212 synchroniser les modifications avec les autres dépôts.
romain@926 213
romain@926 214 \section{Quelques avantages des gestionnaire de source distribué}
romain@926 215
Wilk@933 216 Même si les gestionnaire de source distribués sont depuis plusieurs années
Wilk@933 217 assez robustes et aussi utilisables que leur prédécesseurs, les utilisateurs
Wilk@933 218 d'autres outils n'y ont pas encore été sensibilisés. Les gestionnaires
Wilk@933 219 de sources distribués se distinguent particulièrement de leurs équivalents
Wilk@933 220 centralisés de nombreuses manières.
Wilk@933 221
Wilk@933 222 Pour un développeur individuel, ils restent beaucoup plus rapides que les
Wilk@933 223 outils centralisés. Cela pour une raison simple : un outil centralisé doit
Wilk@933 224 toujours dialoguer à travers le réseau pour la plupart des opérations, car
romain@926 225 presque toutes les métadonnées sont stockées sur la seule copie du serveur
romain@926 226 central. Un outil distribué stocke toute ses métadonnées localement. À tâche
romain@926 227 égale, effectuer un échange avec le réseau ajoute un délai aux outils
Wilk@933 228 centralisés. Ne sous-estimez pas la valeur d'un outil rapide : vous allez
romain@926 229 passer beaucoup de temps à interagir avec un logiciel de gestion de sources.
romain@926 230
Wilk@933 231 Les outils distribués sont complètement indépendants des aléas de votre serveur,
Wilk@933 232 d'autant plus qu'ils répliquent les métadonnées à beaucoup d'endroits. Si
Wilk@933 233 votre serveur central prend feu, vous avez intérêt à ce que les médias de
Wilk@933 234 sauvegardes soient fiables, et que votre dernier ``backup'' soit récent et
romain@926 235 fonctionne sans problème. Avec un outil distribué, vous avez autant de
romain@926 236 ``backup'' que de contributeurs.
romain@926 237
romain@926 238 En outre, la fiabilité de votre réseau affectera beaucoup moins les
Wilk@933 239 outils distribués. Vous ne pouvez même pas utiliser un outil centralisé
Wilk@933 240 sans connexion réseau, à l'exception de quelques commandes, très limitées.
Wilk@933 241 Avec un outil distribué, si votre connexion réseau tombe pendant que vous
romain@926 242 travaillez, vous pouvez ne même pas vous en rendre compte. La seule chose
romain@926 243 que vous ne serez pas capable de faire sera de communiquer avec des dépôts
romain@926 244 distants, opération somme toute assez rare par comparaison aux opérations
Wilk@933 245 locales. Si vous avez une équipe de collaborateurs très dispersés ceci peut
Wilk@933 246 être significatif.
romain@926 247
romain@926 248 \subsection{Avantages pour les projets \textit{Open Source}}
romain@926 249
romain@926 250 Si vous prenez goût à un projet \textit{Open Source} et que vous
romain@926 251 décidez de commencer à toucher à son code, et que le projet utilise
romain@926 252 un gestionnaire de source distribué, vous êtes immédiatement un "pair"
Wilk@933 253 avec les personnes formant le ``cœur'' du projet. Si ils publient
romain@926 254 leurs dépôts, vous pouvez immédiatement copier leurs historiques de
romain@926 255 projet, faire des modifications, enregistrer votre travail en utilisant
romain@926 256 les même outils qu'eux. Par comparaison, avec un outil centralisé, vous
romain@926 257 devez utiliser un logiciel en mode ``lecture seule'' à moins que
romain@926 258 quelqu'un ne vous donne les privilèges de ``commit'' sur le serveur
romain@926 259 central. Avant ça, vous ne serez pas capable d'enregistrer vos
romain@926 260 modifications, et vos propres modifications risqueront de se
romain@926 261 corrompre chaque fois que vous essayerez de mettre à jour à votre
romain@926 262 espace de travail avec le serveur central.
romain@926 263
romain@926 264 \subsubsection{Le non-problème du \textit{fork}}
romain@926 265
Wilk@933 266 Il a été souvent suggéré que les gestionnaires de source distribués
romain@926 267 posent un risque pour les projets \textit{Open Source} car ils
romain@926 268 facilitent grandement la création de ``fork''\footnote{NdT:Création
belaran@936 269 d'une
belaran@937 270 \url{version alternative du logiciel}{http://fr.wikipedia.org/wiki/Fork\#Embranchement\_d.27un\_projet\_informatique}.}
romain@926 271 Un ``fork'' apparait quand il y des divergences d'opinion ou d'attitude
romain@926 272 au sein d'un groupe de développeurs qui aboutit à la décision de ne
belaran@936 273 plus travailler ensemble. Chaque parti s'empare d'une copie plus ou moins
romain@926 274 complète du code source du projet et continue dans sa propre direction.
romain@926 275
Wilk@933 276 Parfois ces différents partis décident de se réconcilier. Avec un
romain@926 277 serveur central, l'aspect \emph{technique} de cette réconciliation
romain@926 278 est un processus douloureux, et essentiellement manuel. Vous devez
romain@926 279 décider quelle modification est ``la gagnante'', et replacer, par un
Wilk@933 280 moyen ou un autre, les modifications de l'autre équipe dans l'arborescence
Wilk@933 281 du projet. Ceci implique généralement la perte d'une partie de l'historique
romain@926 282 d'un des partie, ou même des deux.
romain@926 283
romain@926 284 Ce que les outils distribués permettent à ce sujet est probablement
romain@926 285 la \emph{meilleur} façon de développer un projet. Chaque modification
Wilk@933 286 que vous effectuez est potentiellement un ``fork''. La grande force de
Wilk@933 287 cette approche est que les gestionnaires de source distribués doivent être
Wilk@933 288 vraiment très efficasses pour \emph{fusionner}\footnote{NdT:j'ai choisi de
romain@926 289 traduire ici \textit{merging} par ``fusionner'' pour des raisons de clarté}
romain@926 290 des ``forks'', car les ``forks'', dans ce contexte, arrivent tout le
romain@926 291 temps.
romain@926 292
Wilk@933 293 Si chaque altération que n'importe qui effectue, à tout moment, est vue
romain@926 294 comme un ``fork'' à fusionner, alors ce que le monde de l'\textit{Open
romain@926 295 Source} voit comme un ``fork'' devient \emph{uniquement} une problématique
Wilk@933 296 sociale. En fait, les outils de gestions de source distribués \emph{réduisent}
romain@926 297 les chances de ``fork'':
bos@220 298 \begin{itemize}
Wilk@933 299 \item Ils éliminent la distinction sociale qu'imposent les outils centralisés
Wilk@933 300 entre les membres du projets (ceux qui ont accès au ``commit'') et ceux de l'
romain@926 301 extérieur (ce qui ne l'ont pas).
romain@926 302 \item Ils rendent plus facile la réconciliation après un ``fork'' social, car
romain@926 303 tout ce qu'elle implique est juste une simple fusion.
bos@220 304 \end{itemize}
bos@220 305
romain@926 306 Certaines personnes font de la résistance envers les gestionnaires de source
romain@926 307 distribués parce qu'ils veulent garder un contrôle ferme de leur projet, et
romain@926 308 ils pensent que les outils centralisés leur fournissent ce contrôle. Néanmoins,
romain@926 309 si c'est votre cas, sachez que si vous publier votre dépôt CVS ou Subversion
romain@926 310 de manière publique, il existe une quantité d'outils disponibles pour récupérer
romain@926 311 entièrement votre projet et son historique (quoique lentement) et le récréer
romain@926 312 ailleurs, sans votre contrôle. En fait, votre contrôle sur votre projet est
romain@926 313 illusoire, vous ne faites qu'interdire à vos collaborateurs de travailler
romain@926 314 de manière fluide, en disposant d'un miroir ou d'un ``fork'' de votre
romain@926 315 historique.
romain@926 316 %%%TODO: Fussy, those last sentences are not really well translated:
Wilk@933 317 %%%no problem for me (wilk)
romain@926 318 %However, if you're of this belief, and you publish your CVS or Subversion
romain@926 319 %repositories publically, there are plenty of tools available that can pull
romain@926 320 %out your entire project's history (albeit slowly) and recreate it somewhere
romain@926 321 %that you don't control. So while your control in this case is illusory, you are
romain@926 322 %forgoing the ability to fluidly collaborate with whatever people feel
romain@926 323 %compelled to mirror and fork your history.
romain@926 324
romain@926 325 \subsection{Avantages pour les projets commerciaux}
romain@926 326
Wilk@933 327 Beaucoup de projets commerciaux sont réalisés par des équipes éparpillées
romain@926 328 à travers le globe. Les contributeurs qui sont loin du serveur central
Wilk@933 329 devront subir des commandes lentes et même parfois peu fiables. Les
Wilk@933 330 solutions propriétaires de gestion de source, tentent de palier ce problème
romain@926 331 avec des réplications de site distant qui sont à la fois coûteuses à mettre
Wilk@933 332 en place et lourdes à administrer. Un système distribué ne souffre pas
romain@926 333 de ce genre de problèmes. En outre, il est très aisé de mettre en place
Wilk@933 334 plusieurs serveurs de références, disons un par site, de manière à ce qu'il
romain@926 335 n'y est pas de communication redondante entre les dépôts, sur une connexion
romain@926 336 longue distance souvent onéreuse.
romain@926 337
romain@926 338 Les systèmes de gestion de source supportent généralement assez mal la
Wilk@933 339 montée en charge. Ce n'est pas rare pour un gestionnaire de source centralisé
Wilk@933 340 pourtant onéreux de s'effondrer sous la charge combinée d'une douzaine
Wilk@933 341 d'utilisateurs concurrents seulement. Une fois encore, la réponse à cette problématique
romain@926 342 est généralement encore la mise en place d'un ensemble complexe de serveurs
Wilk@933 343 synchronisés par un mécanisme de réplication. Dans le cas d'un gestionnaire
Wilk@933 344 de source distribué, la charge du serveur central --- si vous avez un--- est
Wilk@933 345 plusieurs fois inférieure (car toutes les données sont déjà répliquées ailleurs),
Wilk@933 346 un simple serveur, pas très cher, peut gérer les besoins d'une plus grande
Wilk@933 347 équipe, et la réplication pour balancer la charge devient le
romain@926 348 travail d'un simple script.
romain@926 349
Wilk@933 350 Si vous avez des employés sur le terrain, entrain de chercher à résoudre un soucis sur
romain@926 351 le site d'un client, ils bénéficieront aussi d'un gestionnaire de source
romain@926 352 distribués. Cet outil leur permettra de générer des versions personnalisées,
romain@926 353 d'essayer différentes solutions, en les isolant aisément les une des autres,
Wilk@933 354 et de rechercher efficacement à travers l'historique des sources, la cause
Wilk@933 355 des bugs ou des régressions, tout ceci sans avoir besoin de la moindre
romain@926 356 connexion au réseau de votre compagnie.
romain@926 357
romain@926 358 \section{Pourquoi choisir Mercurial?}
romain@926 359
romain@926 360 Mercurial a plusieurs caractéristiques qui en font un choix particulièrement
romain@926 361 pertinent pour la gestion de source:
bos@221 362 \begin{itemize}
Wilk@933 363 \item Il est facile à apprendre et à utiliser ;
romain@926 364 \item il est léger et performant ;
romain@926 365 \item il monte facilement en charge ;
romain@926 366 \item il est facile à personnaliser ;
bos@221 367 \end{itemize}
bos@221 368
romain@926 369 Si vous êtes déjà familier d'un outil de gestion de source, vous serez
romain@926 370 capable de l'utiliser en moins de 5 minutes. Sinon, ça ne sera pas beaucoup
romain@926 371 plus long\footnote{NdT: Pour appuyer le propos de l'auteur, je signale que
romain@926 372 j'utilise Mercurial comme outil d'initiation à la gestion de contrôle dans
romain@926 373 des travaux pratique à l'ESME Sudria (\url{http://www.esme.fr}) et que les
romain@926 374 élèves le prennent en main sans difficulté majeur malgré l'approche distribuée.}.
romain@926 375 Les commandes utilisées par Mercurial, comme ses fonctionnalités, sont
romain@926 376 généralement uniformes et cohérentes, et vous pouvez donc ainsi garder en tête
romain@926 377 simplement quelques règles générales, plutôt qu'un lot complexe d'exceptions.
romain@926 378
romain@926 379 Sur un petit projet, vous pouvez commencer à travailler avec Mercurial en
romain@926 380 quelques instants. Ajouter des modifications ou des branches, transférer
romain@926 381 ces modifications (localement ou via le réseau), et les opérations
romain@926 382 d'historique ou de statut sont aussi très rapide. Mercurial reste hors de
romain@926 383 votre chemin grâce à sa simplicité d'utilisation et sa rapidité d'exécution.
romain@926 384
romain@926 385 L'utilité de Mercurial ne se limite pas à des petits projets: il est
romain@926 386 aussi utilisé par des projets ayant des centaines ou même des milliers
romain@926 387 de contributeurs, avec plusieurs dizaines de milliers de fichiers, et des
romain@926 388 centaines de méga de code source.
romain@926 389
Wilk@933 390 Voici une liste non exhaustive des projets complexes ou critiques utilisant
Wilk@933 391 Mercurial :
romain@926 392 %TODO
romain@926 393 % For both spanish and english version, add the following examples:
romain@926 394 \begin{itemize}
belaran@937 395 \item \url{Firefox}{https://developer.mozilla.org/en/Mozilla\_Source\_Code\_(Mercurial)} ;
belaran@937 396 \item \url{OpenSolaris}{http://opensolaris.org/os/community/tools/scm/hg\_help/} ;
belaran@936 397 \item \url{OpenJDK}{http://hg.openjdk.java.net/} (utilisant en outre l'extension
belaran@936 398 ``forest'' pour gérer ses sous modules);
romain@926 399 \end{itemize}
romain@926 400
Wilk@933 401 Si les fonctionnalités cœur de Mercurial ne sont pas suffisantes pour vous,
belaran@936 402 il est très aisé d'en construire d'autres. Mercurial est adapté à l'utilisation
Wilk@933 403 de scripts, et son implémentation interne en Python, propre et claire,
Wilk@933 404 rend encore plus facile l'ajout de fonctionnalité sous forme d'extensions. Il
Wilk@933 405 en existe déjà un certain nombre de très populaires et très utiles,
romain@926 406 dont le périmètre va de la recherche de bugs à l'amélioration des performances.
bos@221 407
romain@928 408 \section{Mercurial comparé aux autres outils}
romain@928 409
romain@928 410 Avant que vous n'alliez plus loin, comprenez bien que cette section
romain@928 411 reflète mes propres expériences, et elle est donc (j'ose le dire)
Wilk@933 412 peu objective. Néanmoins, j'ai utilisé les outils de gestion de source
romain@928 413 listé ci dessous, dans la plupart des cas, pendant plusieurs années.
romain@928 414 %% TODO: Fussy translation.
bos@280 415
bos@221 416 \subsection{Subversion}
bos@221 417
romain@928 418 Subversion est un outil de gestion de source les plus populaire, il fût
romain@928 419 développé pour remplacer CVS. Il a une architecture client/server centralisée.
romain@928 420
romain@928 421 Subversion et Mercurial ont des noms de commandes très similaires pour
romain@928 422 les mêmes opérations, ainsi si vous êtes familier avec l'un, c'est facile
romain@928 423 d'apprendre l'autre. Ces deux outils sont portable sur les systèmes
romain@928 424 d'exploitation les plus populaires\footnote{NdT:Mercurial fonctionne sans problèmes
romain@928 425 sur OpenVMS à l'ESME Sudria \url{http://www.esme.fr}, compte tenu que Subversion a été
romain@928 426 développé en C, je ne suis pas sûr que son portage aurait été aussi aisé.}.
romain@928 427 %TODO: Backport this statement in english and spanish
romain@928 428
Wilk@933 429 Avant la version 1.5, Subversion n'offrait aucune forme de support pour les fusions. Lors
Wilk@933 430 de l'écriture de ce livre, ces capacités de fusion étaient nouvelles, et réputés pour être
romain@928 431 \href{http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.finalword}{complexes
romain@928 432 et buggués}.
romain@928 433
Wilk@933 434 Mercurial dispose d'un avantage substantiel en terme de performance par rapport à
Wilk@933 435 Subversion sur la plupart des opérations que j'ai pu tester. J'ai mesuré
romain@928 436 une différence de performance allant de deux à six fois plus rapide avec
romain@928 437 le système de stockage de fichier local de Subversion~1.4.3
Wilk@933 438 (\emph{ra\_local}), qui est la méthode d'accès la plus rapide disponible. Dans
romain@928 439 un déploiement plus réaliste, impliquant un stockage réseau, Subversion
romain@928 440 serait encore plus désavantagé. Parce que la plupart des commandes Subversion
romain@928 441 doivent communiquer avec le serveur et que Subversion n'a pas de mécanisme
romain@928 442 de réplication, la capacité du serveur et la bande passante sont devenu des
Wilk@933 443 goulots d'étranglement pour les projets de tailles moyennes ou grandes.
Wilk@933 444
Wilk@933 445 En outre, Subversion implique une surcharge substantielle dans le stockage local
romain@928 446 de certaines données, pour éviter des transactions avec le serveur, pour
romain@928 447 certaines opérations communes, tel que la recherche des fichier modifiées
romain@928 448 (\texttt{status}) et l'affichage des modifications par rapport la révision
romain@928 449 courante (\texttt{diff}). En conséquence, un répertoire de travail Subversion
Wilk@933 450 a souvent la même taille, ou est plus grand, qu'un dépôt Mercurial et son
belaran@943 451 espace de travail, et ceci bien que le dépôt Mercurial contienne l'intégralité
belaran@943 452 de l'historique.
romain@928 453
Wilk@933 454 Subversion est largement supporté par les outils tierces. Mercurial est
romain@928 455 actuellement encore en retrait de ce point de vue. L'écart se réduit, néanmoins,
Wilk@933 456 et en effet certains des outils graphiques sont maintenant supérieurs à leurs
romain@928 457 équivalents Subversion. Comme Mercurial, Subversion dispose d'un excellent
romain@928 458 manuel utilisateur.
romain@928 459
Wilk@933 460 Parce que Subversion ne stocke pas l'historique chez ses clients, il est
Wilk@933 461 parfaitement adapté à la gestion de projets qui doivent suivre un ensemble
Wilk@933 462 de larges fichiers binaires et opaques. Si vous suivez une cinquantaine de
romain@928 463 versions d'un fichier incompressible de 10MB, l'occupation disque coté client
romain@928 464 d'un projet sous Subversion restera à peu près constante. A l'inverse,
romain@928 465 l'occupation disque du même projet sous n'importe lequel des gestionnaire
romain@928 466 de source distribués grandira rapidement, proportionnellement aux nombres
Wilk@933 467 de versions, car les différences entre chaque révisions sera très grande.
Wilk@933 468
Wilk@933 469 En outre, c'est souvent difficile ou, généralement, impossible de fusionner
romain@928 470 des différences dans un fichier binaire. La capacité de Subversion de
Wilk@933 471 verrouiller des fichiers, pour permettre à l'utilisateur d'être le seul
Wilk@933 472 à le mettre à jour (``commit'') temporairement, est un avantage significatif
Wilk@933 473 dans un projet doté de beaucoup de fichiers binaires.
romain@928 474
romain@928 475 Mercurial peut importer l'historique depuis un dépôt Subversion. Il peut
romain@928 476 aussi exporter l'ensemble des révisions d'un projet vers un dépôt Subversion.
Wilk@933 477 Ceci rend très facile de ``prendre la température'' et d'utiliser Mercurial et Subversion
romain@928 478 en parallèle, avant de décider de migrer vers Mercurial. La conversion de
Wilk@933 479 l'historique est incrémentale, donc vous pouvez effectuer une conversion
Wilk@933 480 initiale, puis de petites additions par la suite pour ajouter les nouvelles
romain@928 481 modifications.
bos@221 482
bos@221 483 \subsection{Git}
bos@221 484
romain@928 485 Git est un outil de gestion de source distribué qui fût développé pour gérer
Wilk@933 486 le code source de noyau de Linux. Comme Mercurial, sa conception initiale à
Wilk@933 487 était inspirée par Monotone.
Wilk@933 488
Wilk@933 489 Git dispose d'un ensemble conséquent de commandes, avec plus de~139 commandes
Wilk@933 490 individuelles pour la version~1.5.0. Il a aussi la réputation d'être difficile
romain@928 491 à apprendre. Comparé à Git, le point fort de Mercurial est clairement sa
romain@928 492 simplicité.
romain@928 493
romain@928 494 En terme de performance, Git est extrêmement rapide. Dans la plupart des
romain@928 495 cas, il est plus rapide que Mercurial, tout du moins sur Linux, alors que
romain@928 496 Mercurial peut être plus performant sur d'autres opérations. Néanmoins, sur
romain@928 497 Windows, les performances et le niveau de support général fourni par Git,
Wilk@933 498 au moment de l'écriture de cet ouvrage, est bien derrière celui de Mercurial.
romain@928 499
romain@928 500 Alors que le dépôt Mercurial ne demande aucune maintenance, un dépôt Git
romain@928 501 exige d'exécuter manuellement et régulièrement la commande ``repacks'' sur
romain@928 502 ces métadonnées. Sans ceci, les performances de git se dégrade, et la
romain@928 503 consommation de l'espace disque augmente rapidement. Un serveur qui contient
Wilk@933 504 plusieurs dépôts Git qui ne sont pas régulièrement et fréquemment ``repacked''
romain@928 505 deviendra un vrai problème lors des ``backups'' du disque, et il y eu des
romain@928 506 cas, où un ``backup'' journalier pouvait durer plus de~24 heures. Un dépôt
Wilk@933 507 fraichement ``repacked'' sera légèrement plus petit qu'un dépôt Mercurial,
romain@928 508 mais un dépôt non ``repacked'' est beaucoup plus grand.
romain@928 509
Wilk@933 510 Le cœur de Git est écrit en C. La plupart des commandes Git sont implémentées
Wilk@933 511 sous forme de scripts Shell ou Perl, et la qualité de ces scripts varie
romain@928 512 grandement. J'ai plusieurs fois constaté que certains de ces scripts étaient
Wilk@933 513 chargés en mémoire aveuglément et que la présence d'erreurs pouvait s'avérer
Wilk@933 514 fatale.
romain@928 515
romain@928 516 Mercurial peut importer l'historique d'un dépôt Git.
bos@280 517
bos@221 518 \subsection{CVS}
bos@221 519
romain@928 520 CVS est probablement l'outil de gestion de source le plus utilisé aujourd'hui
Wilk@933 521 dans le monde. À cause de son manque de clarté interne, il n'est plus
romain@928 522 maintenu depuis plusieurs années.
romain@928 523
Wilk@933 524 Il a une architecture client/serveur centralisée. Il ne regroupe pas les
romain@928 525 modifications de fichiers dans une opération de ``commit'' atomique, ce
romain@928 526 qui permet à ses utilisateurs de ``casser le \textit{build}'' assez
romain@928 527 facilement : une personne peut effectuer une opération de ``commit''
romain@928 528 sans problème puis être bloqué par besoin de fusion, avec comme conséquence
romain@928 529 néfaste, que les autres utilisateurs ne récupèreront qu'une partie de ses
romain@928 530 modifications. Ce problème affecte aussi la manière de travailler avec
romain@928 531 l'historique du projet. Si vous voulez voir toutes les modifications d'une
romain@928 532 personne du projet, vous devrez injecter manuellement les descriptions et les
romain@928 533 \textit{timestamps} des modifications de chacun des fichiers impliqués (si
romain@928 534 vous savez au moins quels sont ces fichiers).
romain@928 535
romain@928 536 CVS a une notion étrange des \textit{tags} et des branches que je n'essayerais
Wilk@933 537 même pas de décrire ici. Il ne supporte pas bien les opérations de renommage d'un
Wilk@933 538 fichier ou d'un répertoire, ce qui facilite la corruption de son dépôt. Il n'a
romain@928 539 presque pas pour ainsi dire de contrôle de cohérence interne, il est donc
romain@928 540 pratiquement impossible de dire si un dépôt est corrompu ni à quel point. Je
romain@928 541 ne recommanderais pas CVS pour un projet existant ou nouveau.
romain@928 542
romain@928 543 Mercurial peut importer l'historique d'un projet CVS. Néanmoins, il y a
Wilk@933 544 quelques principes à respecter; ce qui est vrai aussi pour les autres
romain@928 545 outils d'import de projet CVS. À cause de l'absence de ``commit'' atomique
Wilk@933 546 et gestion de version de l'arborescence, il n'est pas possible de reconstruire
romain@928 547 de manière précise l'ensemble de l'historique. Un travail de ``devinette''
romain@928 548 est donc nécessaire, et les fichiers renommées ne sont pas détectés. Parce
Wilk@933 549 qu'une bonne part de l'administration d'un dépôt CVS est effectuée manuellement,
Wilk@933 550 et est donc, sujette à erreur, il est courant que les imports CVS rencontrent
romain@928 551 de nombreux problèmes avec les dépôt corrompues (des \textit{timestamps}
Wilk@933 552 de révision complètement buggé et des fichiers verrouillés depuis des années
romain@928 553 sont deux des problèmes les moins intéressants dont je me souvienne).
romain@928 554
romain@928 555 Mercurial peut importer l'historique depuis un dépôt CVS.
bos@280 556
bos@221 557 \subsection{Commercial tools}
bos@221 558
Wilk@933 559 Perforce a une architecture client/serveur centralisée, sans aucun
Wilk@933 560 mécanisme de mise en cache de données coté client. Contrairement à la plupart
romain@929 561 des outils modernes de gestion de source, Perforce exige de ses
romain@929 562 utilisateurs d'exécuter une commande pour informer le serveur
romain@929 563 central de tout fichier qu'il souhaite modifier.
romain@929 564
romain@929 565 Les performances de Perforce sont plutôt bonnes pour des petites
romain@929 566 équipes, mais elles s'effondrent rapidement lorsque le nombre
romain@929 567 d'utilisateurs augmente au delà de la douzaine. Des installations
Wilk@933 568 de Perforce assez larges nécessitent le déploiement de proxies pour
romain@929 569 supporter la montée en charge associée.
bos@280 570
Wilk@933 571 \subsection{Choisir un outil de gestion de source}
Wilk@933 572
Wilk@933 573 A l'exception de CVS, tous les outils listés ci-dessus ont des
romain@929 574 forces qui leur sont propres et qui correspondent à certaines
romain@929 575 formes de projet. Il n'y a pas un seul meilleur outil de gestion
romain@929 576 de source qui correspondent le mieux à toutes les situations.
romain@929 577
Wilk@933 578 Par exemple, Subversion est un très bon choix lorsqu'on travaille
Wilk@933 579 avec beaucoup de fichiers binaires, qui évoluent régulièrement, grâce
Wilk@933 580 à sa nature centralisée et sa capacité à verrouiller des fichiers.
romain@929 581
romain@929 582 Personnellement, je préfère Mercurial pour sa simplicité, ses
Wilk@933 583 performances et sa bonne capacité de fusion, et il m'a très bien rendu service
belaran@943 584 depuis plusieurs années maintenant.
romain@929 585
romain@929 586 \section{Migrer depuis un outil à Mercurial}
romain@929 587
romain@929 588 Mercurial est livré avec une extension nommée \hgext{convert}, qui
Wilk@933 589 peut de manière incrémentale importer des révisions depuis différents
Wilk@933 590 autres outils de gestion de source. Par ``incrémental'', j'entends que
romain@929 591 vous pouvez convertir l'historique entier du projet en une seule fois,
romain@929 592 puis relancer l'outil d'import plus tard pour obtenir les modifications
Wilk@933 593 effectués depuis votre import initial.
romain@929 594
romain@929 595 Les outils de gestion de source supportés par \hgext{convert} sont :
bos@280 596 \begin{itemize}
romain@929 597 \item Subversion
romain@929 598 \item CVS
romain@929 599 \item Git
romain@929 600 \item Darcs
bos@280 601 \end{itemize}
bos@280 602
romain@929 603 En outre, \hgext{convert} peut exporter les modifications depuis Mercurial
Wilk@933 604 vers Subversion. Ceci rend possible d'essayer Subversion en parallèle
romain@929 605 avant de choisir une solution définitive, sans aucun risque de perte de
romain@929 606 données.
romain@929 607
romain@929 608 La commande \hgxcmd{conver}{convert} est très simple à utiliser. Simplement,
Wilk@933 609 indiquez le chemin ou l'URL du dépôt de source, en lui indiquant éventuellement
Wilk@933 610 le nom du chemin de destination, et la conversion se met en route. Après cet
romain@929 611 import initial, il suffit de relancer la commande encore une fois pour
romain@929 612 importer les modifications effectuées depuis.
bos@280 613
bos@16 614 %%% Local Variables:
bos@16 615 %%% mode: latex
bos@16 616 %%% TeX-master: "00book"
bos@16 617 %%% End: