annotate en/ch00-preface.xml @ 749:7e7c47481e4f

Oops, this is the real merge for my hg's oddity
author Dongsheng Song <dongsheng.song@gmail.com>
date Fri, 20 Mar 2009 16:43:35 +0800
parents d0160b0b1a9e
children 751ee9bf2e8d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
1 <!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
2
724
cfdb601a3c8b Fix imagedata fileref in xml files, and replace ':' with '.' in id attribute
Dongsheng Song <dongsheng.song@gmail.com>
parents: 658
diff changeset
3 <preface id="chap.preface">
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
4 <?dbhtml filename="preface.html"?>
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
5 <title>Preface</title>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
6
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
7 <sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
8 <title>Why revision control? Why Mercurial?</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
9
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
10 <para id="x_6d">Revision control is the process of managing multiple
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
11 versions of a piece of information. In its simplest form, this
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
12 is something that many people do by hand: every time you modify
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
13 a file, save it under a new name that contains a number, each
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
14 one higher than the number of the preceding version.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
15
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
16 <para id="x_6e">Manually managing multiple versions of even a single file is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
17 an error-prone task, though, so software tools to help automate
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
18 this process have long been available. The earliest automated
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
19 revision control tools were intended to help a single user to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
20 manage revisions of a single file. Over the past few decades,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
21 the scope of revision control tools has expanded greatly; they
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
22 now manage multiple files, and help multiple people to work
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
23 together. The best modern revision control tools have no
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
24 problem coping with thousands of people working together on
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
25 projects that consist of hundreds of thousands of files.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
26
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
27 <para id="x_6f">The arrival of distributed revision control is relatively
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
28 recent, and so far this new field has grown due to people's
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
29 willingness to explore ill-charted territory.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
30
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
31 <para id="x_70">I am writing a book about distributed revision control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
32 because I believe that it is an important subject that deserves
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
33 a field guide. I chose to write about Mercurial because it is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
34 the easiest tool to learn the terrain with, and yet it scales to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
35 the demands of real, challenging environments where many other
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
36 revision control tools buckle.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
37
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
38 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
39 <title>Why use revision control?</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
40
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
41 <para id="x_71">There are a number of reasons why you or your team might
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
42 want to use an automated revision control tool for a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
43 project.</para>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
44
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
45 <itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
46 <listitem><para id="x_72">It will track the history and evolution of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
47 your project, so you don't have to. For every change,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
48 you'll have a log of <emphasis>who</emphasis> made it;
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
49 <emphasis>why</emphasis> they made it;
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
50 <emphasis>when</emphasis> they made it; and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
51 <emphasis>what</emphasis> the change
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
52 was.</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
53 <listitem><para id="x_73">When you're working with other people,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
54 revision control software makes it easier for you to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
55 collaborate. For example, when people more or less
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
56 simultaneously make potentially incompatible changes, the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
57 software will help you to identify and resolve those
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
58 conflicts.</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
59 <listitem><para id="x_74">It can help you to recover from mistakes. If
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
60 you make a change that later turns out to be in error, you
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
61 can revert to an earlier version of one or more files. In
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
62 fact, a <emphasis>really</emphasis> good revision control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
63 tool will even help you to efficiently figure out exactly
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
64 when a problem was introduced (see section <xref
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
65 linkend="sec.undo.bisect"/> for details).</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
66 <listitem><para id="x_75">It will help you to work simultaneously on,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
67 and manage the drift between, multiple versions of your
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
68 project.</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
69 </itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
70
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
71 <para id="x_76">Most of these reasons are equally valid---at least in
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
72 theory---whether you're working on a project by yourself, or
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
73 with a hundred other people.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
74
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
75 <para id="x_77">A key question about the practicality of revision control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
76 at these two different scales (<quote>lone hacker</quote> and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
77 <quote>huge team</quote>) is how its
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
78 <emphasis>benefits</emphasis> compare to its
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
79 <emphasis>costs</emphasis>. A revision control tool that's
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
80 difficult to understand or use is going to impose a high
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
81 cost.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
82
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
83 <para id="x_78">A five-hundred-person project is likely to collapse under
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
84 its own weight almost immediately without a revision control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
85 tool and process. In this case, the cost of using revision
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
86 control might hardly seem worth considering, since
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
87 <emphasis>without</emphasis> it, failure is almost
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
88 guaranteed.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
89
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
90 <para id="x_79">On the other hand, a one-person <quote>quick hack</quote>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
91 might seem like a poor place to use a revision control tool,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
92 because surely the cost of using one must be close to the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
93 overall cost of the project. Right?</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
94
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
95 <para id="x_7a">Mercurial uniquely supports <emphasis>both</emphasis> of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
96 these scales of development. You can learn the basics in just
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
97 a few minutes, and due to its low overhead, you can apply
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
98 revision control to the smallest of projects with ease. Its
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
99 simplicity means you won't have a lot of abstruse concepts or
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
100 command sequences competing for mental space with whatever
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
101 you're <emphasis>really</emphasis> trying to do. At the same
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
102 time, Mercurial's high performance and peer-to-peer nature let
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
103 you scale painlessly to handle large projects.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
104
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
105 <para id="x_7b">No revision control tool can rescue a poorly run project,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
106 but a good choice of tools can make a huge difference to the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
107 fluidity with which you can work on a project.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
108
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
109 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
110
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
111 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
112 <title>The many names of revision control</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
113
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
114 <para id="x_7c">Revision control is a diverse field, so much so that it is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
115 referred to by many names and acronyms. Here are a few of the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
116 more common variations you'll encounter:</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
117 <itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
118 <listitem><para id="x_7d">Revision control (RCS)</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
119 <listitem><para id="x_7e">Software configuration management (SCM), or
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
120 configuration management</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
121 <listitem><para id="x_7f">Source code management</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
122 <listitem><para id="x_80">Source code control, or source
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
123 control</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
124 <listitem><para id="x_81">Version control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
125 (VCS)</para></listitem></itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
126 <para id="x_82">Some people claim that these terms actually have different
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
127 meanings, but in practice they overlap so much that there's no
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
128 agreed or even useful way to tease them apart.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
129
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
130 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
131 </sect1>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
132
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
133 <sect1>
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
134 <title>This book is a work in progress</title>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
135
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
136 <para id="x_83">I am releasing this book while I am still writing it, in the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
137 hope that it will prove useful to others. I am writing under an
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
138 open license in the hope that you, my readers, will contribute
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
139 feedback and perhaps content of your own.</para>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
140
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
141 </sect1>
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
142 <sect1>
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
143 <title>About the examples in this book</title>
200
9bba958be4c6 Mention automatic example generation.
Bryan O'Sullivan <bos@serpentine.com>
parents: 26
diff changeset
144
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
145 <para id="x_84">This book takes an unusual approach to code samples. Every
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
146 example is <quote>live</quote>---each one is actually the result
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
147 of a shell script that executes the Mercurial commands you see.
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
148 Every time an image of the book is built from its sources, all
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
149 the example scripts are automatically run, and their current
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
150 results compared against their expected results.</para>
200
9bba958be4c6 Mention automatic example generation.
Bryan O'Sullivan <bos@serpentine.com>
parents: 26
diff changeset
151
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
152 <para id="x_85">The advantage of this approach is that the examples are
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
153 always accurate; they describe <emphasis>exactly</emphasis> the
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
154 behaviour of the version of Mercurial that's mentioned at the
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
155 front of the book. If I update the version of Mercurial that
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
156 I'm documenting, and the output of some command changes, the
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
157 build fails.</para>
200
9bba958be4c6 Mention automatic example generation.
Bryan O'Sullivan <bos@serpentine.com>
parents: 26
diff changeset
158
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
159 <para id="x_86">There is a small disadvantage to this approach, which is
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
160 that the dates and times you'll see in examples tend to be
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
161 <quote>squashed</quote> together in a way that they wouldn't be
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
162 if the same commands were being typed by a human. Where a human
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
163 can issue no more than one command every few seconds, with any
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
164 resulting timestamps correspondingly spread out, my automated
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
165 example scripts run many commands in one second.</para>
200
9bba958be4c6 Mention automatic example generation.
Bryan O'Sullivan <bos@serpentine.com>
parents: 26
diff changeset
166
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
167 <para id="x_87">As an instance of this, several consecutive commits in an
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
168 example can show up as having occurred during the same second.
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
169 You can see this occur in the <literal
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
170 role="hg-ext">bisect</literal> example in section <xref
724
cfdb601a3c8b Fix imagedata fileref in xml files, and replace ':' with '.' in id attribute
Dongsheng Song <dongsheng.song@gmail.com>
parents: 658
diff changeset
171 id="sec.undo.bisect"/>, for instance.</para>
200
9bba958be4c6 Mention automatic example generation.
Bryan O'Sullivan <bos@serpentine.com>
parents: 26
diff changeset
172
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
173 <para id="x_88">So when you're reading examples, don't place too much weight
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
174 on the dates or times you see in the output of commands. But
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
175 <emphasis>do</emphasis> be confident that the behaviour you're
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
176 seeing is consistent and reproducible.</para>
200
9bba958be4c6 Mention automatic example generation.
Bryan O'Sullivan <bos@serpentine.com>
parents: 26
diff changeset
177
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
178 </sect1>
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
179
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
180 <sect1>
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
181 <title>Trends in the field</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
182
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
183 <para id="x_89">There has been an unmistakable trend in the development and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
184 use of revision control tools over the past four decades, as
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
185 people have become familiar with the capabilities of their tools
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
186 and constrained by their limitations.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
187
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
188 <para id="x_8a">The first generation began by managing single files on
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
189 individual computers. Although these tools represented a huge
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
190 advance over ad-hoc manual revision control, their locking model
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
191 and reliance on a single computer limited them to small,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
192 tightly-knit teams.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
193
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
194 <para id="x_8b">The second generation loosened these constraints by moving
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
195 to network-centered architectures, and managing entire projects
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
196 at a time. As projects grew larger, they ran into new problems.
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
197 With clients needing to talk to servers very frequently, server
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
198 scaling became an issue for large projects. An unreliable
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
199 network connection could prevent remote users from being able to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
200 talk to the server at all. As open source projects started
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
201 making read-only access available anonymously to anyone, people
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
202 without commit privileges found that they could not use the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
203 tools to interact with a project in a natural way, as they could
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
204 not record their changes.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
205
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
206 <para id="x_8c">The current generation of revision control tools is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
207 peer-to-peer in nature. All of these systems have dropped the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
208 dependency on a single central server, and allow people to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
209 distribute their revision control data to where it's actually
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
210 needed. Collaboration over the Internet has moved from
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
211 constrained by technology to a matter of choice and consensus.
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
212 Modern tools can operate offline indefinitely and autonomously,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
213 with a network connection only needed when syncing changes with
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
214 another repository.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
215
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
216 </sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
217 <sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
218 <title>A few of the advantages of distributed revision
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
219 control</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
220
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
221 <para id="x_8d">Even though distributed revision control tools have for
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
222 several years been as robust and usable as their
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
223 previous-generation counterparts, people using older tools have
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
224 not yet necessarily woken up to their advantages. There are a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
225 number of ways in which distributed tools shine relative to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
226 centralised ones.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
227
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
228 <para id="x_8e">For an individual developer, distributed tools are almost
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
229 always much faster than centralised tools. This is for a simple
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
230 reason: a centralised tool needs to talk over the network for
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
231 many common operations, because most metadata is stored in a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
232 single copy on the central server. A distributed tool stores
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
233 all of its metadata locally. All else being equal, talking over
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
234 the network adds overhead to a centralised tool. Don't
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
235 underestimate the value of a snappy, responsive tool: you're
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
236 going to spend a lot of time interacting with your revision
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
237 control software.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
238
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
239 <para id="x_8f">Distributed tools are indifferent to the vagaries of your
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
240 server infrastructure, again because they replicate metadata to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
241 so many locations. If you use a centralised system and your
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
242 server catches fire, you'd better hope that your backup media
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
243 are reliable, and that your last backup was recent and actually
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
244 worked. With a distributed tool, you have many backups
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
245 available on every contributor's computer.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
246
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
247 <para id="x_90">The reliability of your network will affect distributed
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
248 tools far less than it will centralised tools. You can't even
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
249 use a centralised tool without a network connection, except for
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
250 a few highly constrained commands. With a distributed tool, if
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
251 your network connection goes down while you're working, you may
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
252 not even notice. The only thing you won't be able to do is talk
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
253 to repositories on other computers, something that is relatively
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
254 rare compared with local operations. If you have a far-flung
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
255 team of collaborators, this may be significant.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
256
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
257 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
258 <title>Advantages for open source projects</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
259
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
260 <para id="x_91">If you take a shine to an open source project and decide
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
261 that you would like to start hacking on it, and that project
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
262 uses a distributed revision control tool, you are at once a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
263 peer with the people who consider themselves the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
264 <quote>core</quote> of that project. If they publish their
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
265 repositories, you can immediately copy their project history,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
266 start making changes, and record your work, using the same
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
267 tools in the same ways as insiders. By contrast, with a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
268 centralised tool, you must use the software in a <quote>read
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
269 only</quote> mode unless someone grants you permission to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
270 commit changes to their central server. Until then, you won't
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
271 be able to record changes, and your local modifications will
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
272 be at risk of corruption any time you try to update your
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
273 client's view of the repository.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
274
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
275 <sect3>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
276 <title>The forking non-problem</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
277
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
278 <para id="x_92">It has been suggested that distributed revision control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
279 tools pose some sort of risk to open source projects because
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
280 they make it easy to <quote>fork</quote> the development of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
281 a project. A fork happens when there are differences in
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
282 opinion or attitude between groups of developers that cause
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
283 them to decide that they can't work together any longer.
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
284 Each side takes a more or less complete copy of the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
285 project's source code, and goes off in its own
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
286 direction.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
287
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
288 <para id="x_93">Sometimes the camps in a fork decide to reconcile their
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
289 differences. With a centralised revision control system, the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
290 <emphasis>technical</emphasis> process of reconciliation is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
291 painful, and has to be performed largely by hand. You have
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
292 to decide whose revision history is going to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
293 <quote>win</quote>, and graft the other team's changes into
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
294 the tree somehow. This usually loses some or all of one
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
295 side's revision history.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
296
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
297 <para id="x_94">What distributed tools do with respect to forking is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
298 they make forking the <emphasis>only</emphasis> way to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
299 develop a project. Every single change that you make is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
300 potentially a fork point. The great strength of this
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
301 approach is that a distributed revision control tool has to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
302 be really good at <emphasis>merging</emphasis> forks,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
303 because forks are absolutely fundamental: they happen all
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
304 the time.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
305
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
306 <para id="x_95">If every piece of work that everybody does, all the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
307 time, is framed in terms of forking and merging, then what
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
308 the open source world refers to as a <quote>fork</quote>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
309 becomes <emphasis>purely</emphasis> a social issue. If
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
310 anything, distributed tools <emphasis>lower</emphasis> the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
311 likelihood of a fork:</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
312 <itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
313 <listitem><para id="x_96">They eliminate the social distinction that
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
314 centralised tools impose: that between insiders (people
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
315 with commit access) and outsiders (people
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
316 without).</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
317 <listitem><para id="x_97">They make it easier to reconcile after a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
318 social fork, because all that's involved from the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
319 perspective of the revision control software is just
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
320 another merge.</para></listitem></itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
321
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
322 <para id="x_98">Some people resist distributed tools because they want
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
323 to retain tight control over their projects, and they
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
324 believe that centralised tools give them this control.
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
325 However, if you're of this belief, and you publish your CVS
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
326 or Subversion repositories publicly, there are plenty of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
327 tools available that can pull out your entire project's
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
328 history (albeit slowly) and recreate it somewhere that you
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
329 don't control. So while your control in this case is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
330 illusory, you are forgoing the ability to fluidly
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
331 collaborate with whatever people feel compelled to mirror
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
332 and fork your history.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
333
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
334 </sect3>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
335 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
336 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
337 <title>Advantages for commercial projects</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
338
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
339 <para id="x_99">Many commercial projects are undertaken by teams that are
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
340 scattered across the globe. Contributors who are far from a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
341 central server will see slower command execution and perhaps
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
342 less reliability. Commercial revision control systems attempt
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
343 to ameliorate these problems with remote-site replication
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
344 add-ons that are typically expensive to buy and cantankerous
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
345 to administer. A distributed system doesn't suffer from these
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
346 problems in the first place. Better yet, you can easily set
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
347 up multiple authoritative servers, say one per site, so that
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
348 there's no redundant communication between repositories over
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
349 expensive long-haul network links.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
350
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
351 <para id="x_9a">Centralised revision control systems tend to have
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
352 relatively low scalability. It's not unusual for an expensive
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
353 centralised system to fall over under the combined load of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
354 just a few dozen concurrent users. Once again, the typical
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
355 response tends to be an expensive and clunky replication
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
356 facility. Since the load on a central server---if you have
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
357 one at all---is many times lower with a distributed tool
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
358 (because all of the data is replicated everywhere), a single
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
359 cheap server can handle the needs of a much larger team, and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
360 replication to balance load becomes a simple matter of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
361 scripting.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
362
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
363 <para id="x_9b">If you have an employee in the field, troubleshooting a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
364 problem at a customer's site, they'll benefit from distributed
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
365 revision control. The tool will let them generate custom
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
366 builds, try different fixes in isolation from each other, and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
367 search efficiently through history for the sources of bugs and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
368 regressions in the customer's environment, all without needing
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
369 to connect to your company's network.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
370
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
371 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
372 </sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
373 <sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
374 <title>Why choose Mercurial?</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
375
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
376 <para id="x_9c">Mercurial has a unique set of properties that make it a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
377 particularly good choice as a revision control system.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
378 <itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
379 <listitem><para id="x_9d">It is easy to learn and use.</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
380 <listitem><para id="x_9e">It is lightweight.</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
381 <listitem><para id="x_9f">It scales excellently.</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
382 <listitem><para id="x_a0">It is easy to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
383 customise.</para></listitem></itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
384
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
385 <para id="x_a1">If you are at all familiar with revision control systems,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
386 you should be able to get up and running with Mercurial in less
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
387 than five minutes. Even if not, it will take no more than a few
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
388 minutes longer. Mercurial's command and feature sets are
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
389 generally uniform and consistent, so you can keep track of a few
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
390 general rules instead of a host of exceptions.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
391
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
392 <para id="x_a2">On a small project, you can start working with Mercurial in
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
393 moments. Creating new changes and branches; transferring changes
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
394 around (whether locally or over a network); and history and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
395 status operations are all fast. Mercurial attempts to stay
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
396 nimble and largely out of your way by combining low cognitive
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
397 overhead with blazingly fast operations.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
398
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
399 <para id="x_a3">The usefulness of Mercurial is not limited to small
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
400 projects: it is used by projects with hundreds to thousands of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
401 contributors, each containing tens of thousands of files and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
402 hundreds of megabytes of source code.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
403
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
404 <para id="x_a4">If the core functionality of Mercurial is not enough for
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
405 you, it's easy to build on. Mercurial is well suited to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
406 scripting tasks, and its clean internals and implementation in
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
407 Python make it easy to add features in the form of extensions.
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
408 There are a number of popular and useful extensions already
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
409 available, ranging from helping to identify bugs to improving
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
410 performance.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
411
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
412 </sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
413 <sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
414 <title>Mercurial compared with other tools</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
415
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
416 <para id="x_a5">Before you read on, please understand that this section
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
417 necessarily reflects my own experiences, interests, and (dare I
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
418 say it) biases. I have used every one of the revision control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
419 tools listed below, in most cases for several years at a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
420 time.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
421
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
422
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
423 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
424 <title>Subversion</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
425
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
426 <para id="x_a6">Subversion is a popular revision control tool, developed
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
427 to replace CVS. It has a centralised client/server
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
428 architecture.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
429
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
430 <para id="x_a7">Subversion and Mercurial have similarly named commands for
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
431 performing the same operations, so if you're familiar with
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
432 one, it is easy to learn to use the other. Both tools are
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
433 portable to all popular operating systems.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
434
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
435 <para id="x_a8">Prior to version 1.5, Subversion had no useful support for
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
436 merges. At the time of writing, its merge tracking capability
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
437 is new, and known to be <ulink
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
438 url="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.finalword">complicated
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
439 and buggy</ulink>.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
440
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
441 <para id="x_a9">Mercurial has a substantial performance advantage over
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
442 Subversion on every revision control operation I have
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
443 benchmarked. I have measured its advantage as ranging from a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
444 factor of two to a factor of six when compared with Subversion
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
445 1.4.3's <emphasis>ra_local</emphasis> file store, which is the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
446 fastest access method available. In more realistic
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
447 deployments involving a network-based store, Subversion will
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
448 be at a substantially larger disadvantage. Because many
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
449 Subversion commands must talk to the server and Subversion
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
450 does not have useful replication facilities, server capacity
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
451 and network bandwidth become bottlenecks for modestly large
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
452 projects.</para>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
453
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
454 <para id="x_aa">Additionally, Subversion incurs substantial storage
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
455 overhead to avoid network transactions for a few common
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
456 operations, such as finding modified files
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
457 (<literal>status</literal>) and displaying modifications
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
458 against the current revision (<literal>diff</literal>). As a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
459 result, a Subversion working copy is often the same size as,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
460 or larger than, a Mercurial repository and working directory,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
461 even though the Mercurial repository contains a complete
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
462 history of the project.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
463
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
464 <para id="x_ab">Subversion is widely supported by third party tools.
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
465 Mercurial currently lags considerably in this area. This gap
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
466 is closing, however, and indeed some of Mercurial's GUI tools
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
467 now outshine their Subversion equivalents. Like Mercurial,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
468 Subversion has an excellent user manual.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
469
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
470 <para id="x_ac">Because Subversion doesn't store revision history on the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
471 client, it is well suited to managing projects that deal with
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
472 lots of large, opaque binary files. If you check in fifty
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
473 revisions to an incompressible 10MB file, Subversion's
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
474 client-side space usage stays constant The space used by any
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
475 distributed SCM will grow rapidly in proportion to the number
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
476 of revisions, because the differences between each revision
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
477 are large.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
478
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
479 <para id="x_ad">In addition, it's often difficult or, more usually,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
480 impossible to merge different versions of a binary file.
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
481 Subversion's ability to let a user lock a file, so that they
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
482 temporarily have the exclusive right to commit changes to it,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
483 can be a significant advantage to a project where binary files
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
484 are widely used.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
485
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
486 <para id="x_ae">Mercurial can import revision history from a Subversion
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
487 repository. It can also export revision history to a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
488 Subversion repository. This makes it easy to <quote>test the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
489 waters</quote> and use Mercurial and Subversion in parallel
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
490 before deciding to switch. History conversion is incremental,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
491 so you can perform an initial conversion, then small
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
492 additional conversions afterwards to bring in new
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
493 changes.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
494
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
495
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
496 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
497 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
498 <title>Git</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
499
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
500 <para id="x_af">Git is a distributed revision control tool that was
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
501 developed for managing the Linux kernel source tree. Like
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
502 Mercurial, its early design was somewhat influenced by
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
503 Monotone.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
504
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
505 <para id="x_b0">Git has a very large command set, with version 1.5.0
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
506 providing 139 individual commands. It has something of a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
507 reputation for being difficult to learn. Compared to Git,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
508 Mercurial has a strong focus on simplicity.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
509
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
510 <para id="x_b1">In terms of performance, Git is extremely fast. In
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
511 several cases, it is faster than Mercurial, at least on Linux,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
512 while Mercurial performs better on other operations. However,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
513 on Windows, the performance and general level of support that
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
514 Git provides is, at the time of writing, far behind that of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
515 Mercurial.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
516
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
517 <para id="x_b2">While a Mercurial repository needs no maintenance, a Git
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
518 repository requires frequent manual <quote>repacks</quote> of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
519 its metadata. Without these, performance degrades, while
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
520 space usage grows rapidly. A server that contains many Git
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
521 repositories that are not rigorously and frequently repacked
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
522 will become heavily disk-bound during backups, and there have
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
523 been instances of daily backups taking far longer than 24
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
524 hours as a result. A freshly packed Git repository is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
525 slightly smaller than a Mercurial repository, but an unpacked
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
526 repository is several orders of magnitude larger.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
527
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
528 <para id="x_b3">The core of Git is written in C. Many Git commands are
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
529 implemented as shell or Perl scripts, and the quality of these
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
530 scripts varies widely. I have encountered several instances
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
531 where scripts charged along blindly in the presence of errors
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
532 that should have been fatal.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
533
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
534 <para id="x_b4">Mercurial can import revision history from a Git
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
535 repository.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
536
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
537
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
538 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
539 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
540 <title>CVS</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
541
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
542 <para id="x_b5">CVS is probably the most widely used revision control tool
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
543 in the world. Due to its age and internal untidiness, it has
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
544 been only lightly maintained for many years.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
545
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
546 <para id="x_b6">It has a centralised client/server architecture. It does
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
547 not group related file changes into atomic commits, making it
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
548 easy for people to <quote>break the build</quote>: one person
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
549 can successfully commit part of a change and then be blocked
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
550 by the need for a merge, causing other people to see only a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
551 portion of the work they intended to do. This also affects
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
552 how you work with project history. If you want to see all of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
553 the modifications someone made as part of a task, you will
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
554 need to manually inspect the descriptions and timestamps of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
555 the changes made to each file involved (if you even know what
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
556 those files were).</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
557
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
558 <para id="x_b7">CVS has a muddled notion of tags and branches that I will
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
559 not attempt to even describe. It does not support renaming of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
560 files or directories well, making it easy to corrupt a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
561 repository. It has almost no internal consistency checking
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
562 capabilities, so it is usually not even possible to tell
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
563 whether or how a repository is corrupt. I would not recommend
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
564 CVS for any project, existing or new.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
565
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
566 <para id="x_b8">Mercurial can import CVS revision history. However, there
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
567 are a few caveats that apply; these are true of every other
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
568 revision control tool's CVS importer, too. Due to CVS's lack
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
569 of atomic changes and unversioned filesystem hierarchy, it is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
570 not possible to reconstruct CVS history completely accurately;
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
571 some guesswork is involved, and renames will usually not show
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
572 up. Because a lot of advanced CVS administration has to be
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
573 done by hand and is hence error-prone, it's common for CVS
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
574 importers to run into multiple problems with corrupted
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
575 repositories (completely bogus revision timestamps and files
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
576 that have remained locked for over a decade are just two of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
577 the less interesting problems I can recall from personal
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
578 experience).</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
579
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
580 <para id="x_b9">Mercurial can import revision history from a CVS
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
581 repository.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
582
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
583
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
584 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
585 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
586 <title>Commercial tools</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
587
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
588 <para id="x_ba">Perforce has a centralised client/server architecture,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
589 with no client-side caching of any data. Unlike modern
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
590 revision control tools, Perforce requires that a user run a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
591 command to inform the server about every file they intend to
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
592 edit.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
593
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
594 <para id="x_bb">The performance of Perforce is quite good for small teams,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
595 but it falls off rapidly as the number of users grows beyond a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
596 few dozen. Modestly large Perforce installations require the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
597 deployment of proxies to cope with the load their users
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
598 generate.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
599
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
600
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
601 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
602 <sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
603 <title>Choosing a revision control tool</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
604
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
605 <para id="x_bc">With the exception of CVS, all of the tools listed above
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
606 have unique strengths that suit them to particular styles of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
607 work. There is no single revision control tool that is best
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
608 in all situations.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
609
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
610 <para id="x_bd">As an example, Subversion is a good choice for working
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
611 with frequently edited binary files, due to its centralised
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
612 nature and support for file locking.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
613
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
614 <para id="x_be">I personally find Mercurial's properties of simplicity,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
615 performance, and good merge support to be a compelling
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
616 combination that has served me well for several years.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
617
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
618
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
619 </sect2>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
620 </sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
621 <sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
622 <title>Switching from another tool to Mercurial</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
623
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
624 <para id="x_bf">Mercurial is bundled with an extension named <literal
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
625 role="hg-ext">convert</literal>, which can incrementally
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
626 import revision history from several other revision control
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
627 tools. By <quote>incremental</quote>, I mean that you can
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
628 convert all of a project's history to date in one go, then rerun
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
629 the conversion later to obtain new changes that happened after
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
630 the initial conversion.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
631
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
632 <para id="x_c0">The revision control tools supported by <literal
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
633 role="hg-ext">convert</literal> are as follows:</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
634 <itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
635 <listitem><para id="x_c1">Subversion</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
636 <listitem><para id="x_c2">CVS</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
637 <listitem><para id="x_c3">Git</para></listitem>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
638 <listitem><para id="x_c4">Darcs</para></listitem></itemizedlist>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
639
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
640 <para id="x_c5">In addition, <literal role="hg-ext">convert</literal> can
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
641 export changes from Mercurial to Subversion. This makes it
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
642 possible to try Subversion and Mercurial in parallel before
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
643 committing to a switchover, without risking the loss of any
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
644 work.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
645
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
646 <para id="x_c6">The <command role="hg-ext-convert">convert</command> command
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
647 is easy to use. Simply point it at the path or URL of the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
648 source repository, optionally give it the name of the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
649 destination repository, and it will start working. After the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
650 initial conversion, just run the same command again to import
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
651 new changes.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
652 </sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
653
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
654 <sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
655 <title>A short history of revision control</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
656
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
657 <para id="x_c7">The best known of the old-time revision control tools is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
658 SCCS (Source Code Control System), which Marc Rochkind wrote at
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
659 Bell Labs, in the early 1970s. SCCS operated on individual
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
660 files, and required every person working on a project to have
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
661 access to a shared workspace on a single system. Only one
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
662 person could modify a file at any time; arbitration for access
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
663 to files was via locks. It was common for people to lock files,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
664 and later forget to unlock them, preventing anyone else from
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
665 modifying those files without the help of an
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
666 administrator.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
667
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
668 <para id="x_c8">Walter Tichy developed a free alternative to SCCS in the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
669 early 1980s; he called his program RCS (Revision Control System).
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
670 Like SCCS, RCS required developers to work in a single shared
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
671 workspace, and to lock files to prevent multiple people from
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
672 modifying them simultaneously.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
673
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
674 <para id="x_c9">Later in the 1980s, Dick Grune used RCS as a building block
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
675 for a set of shell scripts he initially called cmt, but then
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
676 renamed to CVS (Concurrent Versions System). The big innovation
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
677 of CVS was that it let developers work simultaneously and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
678 somewhat independently in their own personal workspaces. The
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
679 personal workspaces prevented developers from stepping on each
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
680 other's toes all the time, as was common with SCCS and RCS. Each
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
681 developer had a copy of every project file, and could modify
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
682 their copies independently. They had to merge their edits prior
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
683 to committing changes to the central repository.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
684
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
685 <para id="x_ca">Brian Berliner took Grune's original scripts and rewrote
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
686 them in C, releasing in 1989 the code that has since developed
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
687 into the modern version of CVS. CVS subsequently acquired the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
688 ability to operate over a network connection, giving it a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
689 client/server architecture. CVS's architecture is centralised;
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
690 only the server has a copy of the history of the project. Client
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
691 workspaces just contain copies of recent versions of the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
692 project's files, and a little metadata to tell them where the
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
693 server is. CVS has been enormously successful; it is probably
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
694 the world's most widely used revision control system.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
695
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
696 <para id="x_cb">In the early 1990s, Sun Microsystems developed an early
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
697 distributed revision control system, called TeamWare. A
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
698 TeamWare workspace contains a complete copy of the project's
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
699 history. TeamWare has no notion of a central repository. (CVS
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
700 relied upon RCS for its history storage; TeamWare used
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
701 SCCS.)</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
702
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
703 <para id="x_cc">As the 1990s progressed, awareness grew of a number of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
704 problems with CVS. It records simultaneous changes to multiple
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
705 files individually, instead of grouping them together as a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
706 single logically atomic operation. It does not manage its file
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
707 hierarchy well; it is easy to make a mess of a repository by
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
708 renaming files and directories. Worse, its source code is
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
709 difficult to read and maintain, which made the <quote>pain
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
710 level</quote> of fixing these architectural problems
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
711 prohibitive.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
712
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
713 <para id="x_cd">In 2001, Jim Blandy and Karl Fogel, two developers who had
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
714 worked on CVS, started a project to replace it with a tool that
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
715 would have a better architecture and cleaner code. The result,
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
716 Subversion, does not stray from CVS's centralised client/server
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
717 model, but it adds multi-file atomic commits, better namespace
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
718 management, and a number of other features that make it a
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
719 generally better tool than CVS. Since its initial release, it
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
720 has rapidly grown in popularity.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
721
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
722 <para id="x_ce">More or less simultaneously, Graydon Hoare began working on
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
723 an ambitious distributed revision control system that he named
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
724 Monotone. While Monotone addresses many of CVS's design flaws
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
725 and has a peer-to-peer architecture, it goes beyond earlier (and
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
726 subsequent) revision control tools in a number of innovative
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
727 ways. It uses cryptographic hashes as identifiers, and has an
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
728 integral notion of <quote>trust</quote> for code from different
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
729 sources.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
730
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
731 <para id="x_cf">Mercurial began life in 2005. While a few aspects of its
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
732 design are influenced by Monotone, Mercurial focuses on ease of
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
733 use, high performance, and scalability to very large
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
734 projects.</para>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
735
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
736 </sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
737
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
738 <sect1>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
739 <title>Colophon&emdash;this book is Free</title>
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
740
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
741 <para id="x_d0">This book is licensed under the Open Publication License,
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
742 and is produced entirely using Free Software tools. It is
680
8366882f67f2 Fix up more formatting goop
Bryan O'Sullivan <bos@serpentine.com>
parents: 658
diff changeset
743 typeset with DocBook XML. Illustrations are drawn and rendered with
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
744 <ulink url="http://www.inkscape.org/">Inkscape</ulink>.</para>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
745
749
7e7c47481e4f Oops, this is the real merge for my hg's oddity
Dongsheng Song <dongsheng.song@gmail.com>
parents: 746
diff changeset
746 <para id="x_d1">The complete source code for this book is published as a
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
747 Mercurial repository, at <ulink
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
748 url="http://hg.serpentine.com/mercurial/book">http://hg.serpentine.com/mercurial/book</ulink>.</para>
26
1bc6c1f0192a More MQ content.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
749
658
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
750 </sect1>
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
751 </preface>
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
752 <!--
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
753 local variables:
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
754 sgml-parent-document: ("00book.xml" "book" "preface")
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
755 end:
b90b024729f1 WIP DocBook snapshot that all compiles. Mirabile dictu!
Bryan O'Sullivan <bos@serpentine.com>
parents: 649
diff changeset
756 -->