rev |
line source |
dongsheng@627
|
1 #
|
dongsheng@627
|
2 # Simplified Chinese translation for hgbook
|
dongsheng@627
|
3 # This file is distributed under the same license as the hgbook.
|
dongsheng@627
|
4 #
|
dongsheng@627
|
5 # Authors:
|
dongsheng@627
|
6 # Dongsheng Song <dongsheng.song@gmail.com>, 2009
|
dongsheng@627
|
7 #
|
dongsheng@627
|
8 # Update to new pot:
|
dongsheng@636
|
9 # msgmerge --update zh.po hgbook.pot
|
dongsheng@627
|
10 #
|
dongsheng@627
|
11 # Check translation:
|
dongsheng@627
|
12 # msgfmt --statistics -c -o zh.mo zh.po
|
dongsheng@627
|
13 #
|
dongsheng@627
|
14 # Please format your translation before commit:
|
dongsheng@627
|
15 # msgcat --sort-by-file --width=80 -o zh_new.po zh.po
|
dongsheng@627
|
16 # mv -f zh_new.po zh.po
|
dongsheng@627
|
17 #
|
dongsheng@627
|
18 # Dictionary:
|
dongsheng@627
|
19 # blame 追溯
|
dongsheng@627
|
20 # branch 分支
|
dongsheng@627
|
21 # changes 修改
|
dongsheng@627
|
22 # changeset 修改集
|
dongsheng@627
|
23 # checkout 检出
|
dongsheng@627
|
24 # remove 移除(从版本库删除)
|
dongsheng@627
|
25 # delete 删除(只从文件系统删除)
|
dongsheng@627
|
26 # patchset 补丁集
|
dongsheng@627
|
27 # pushing to 推到
|
dongsheng@635
|
28 # pulling from 拉自,抓取
|
dongsheng@627
|
29 # rename 改名
|
dongsheng@627
|
30 # repository 版本库
|
dongsheng@627
|
31 # revert 恢复
|
dongsheng@627
|
32 # revision 版本
|
dongsheng@627
|
33 # tag 标签
|
dongsheng@627
|
34 # tip 顶点
|
dongsheng@627
|
35 # undo 撤销
|
dongsheng@627
|
36 # unversioned 未版本控制
|
dongsheng@627
|
37 # versioned 受版本控制
|
dongsheng@627
|
38 # working copy 工作副本
|
dongsheng@627
|
39 # ...
|
dongsheng@627
|
40 #
|
dongsheng@627
|
41 msgid ""
|
dongsheng@627
|
42 msgstr ""
|
dongsheng@627
|
43 "Project-Id-Version: hgbook 1.2\n"
|
dongsheng@653
|
44 "POT-Creation-Date: 2009-03-20 17:12+0800\n"
|
dongsheng@653
|
45 "PO-Revision-Date: 2009-03-20 17:12+0800\n"
|
dongsheng@627
|
46 "Last-Translator: \n"
|
dongsheng@627
|
47 "Language-Team: Simplified Chinese <i18n-zh@googlegroups.com >\n"
|
dongsheng@627
|
48 "MIME-Version: 1.0\n"
|
dongsheng@627
|
49 "Content-Type: text/plain; charset=UTF-8\n"
|
dongsheng@627
|
50 "Content-Transfer-Encoding: 8bit\n"
|
dongsheng@627
|
51 "X-Poedit-Language: Chinese\n"
|
dongsheng@627
|
52 "X-Poedit-Country: CHINA\n"
|
dongsheng@627
|
53 "X-Poedit-SourceCharset: utf-8\n"
|
dongsheng@627
|
54
|
dongsheng@627
|
55 #. type: Content of: <book><title>
|
dongsheng@627
|
56 #: ../en/00book.xml:41
|
dongsheng@627
|
57 msgid "Mercurial: The Definitive Guide"
|
dongsheng@627
|
58 msgstr "Mercurial 权威指南"
|
dongsheng@627
|
59
|
dongsheng@627
|
60 #. type: Content of: <book><subtitle>
|
dongsheng@627
|
61 #: ../en/00book.xml:46
|
dongsheng@627
|
62 msgid "Compiled from $rev_id$"
|
dongsheng@627
|
63 msgstr "编译自 $rev_id$"
|
dongsheng@627
|
64
|
dongsheng@627
|
65 #. type: Content of: <book><bookinfo><authorgroup><author><firstname>
|
dongsheng@627
|
66 #: ../en/00book.xml:50
|
dongsheng@627
|
67 msgid "Bryan"
|
dongsheng@643
|
68 msgstr "Bryan"
|
dongsheng@627
|
69
|
dongsheng@627
|
70 #. type: Content of: <book><bookinfo><authorgroup><author><surname>
|
dongsheng@627
|
71 #: ../en/00book.xml:51
|
dongsheng@627
|
72 msgid "O'Sullivan"
|
dongsheng@643
|
73 msgstr "O'Sullivan"
|
dongsheng@627
|
74
|
dongsheng@627
|
75 #. type: Content of: <book><bookinfo>
|
dongsheng@627
|
76 #: ../en/00book.xml:55
|
dongsheng@627
|
77 msgid ""
|
dongsheng@627
|
78 "<editor> <firstname>Mike</firstname> <surname>Loukides</surname> </editor> "
|
dongsheng@627
|
79 "<copyright> <year>2006</year> <year>2007</year> <year>2008</year> <year>2009</"
|
dongsheng@627
|
80 "year> <holder>Bryan O'Sullivan</holder> </copyright>"
|
dongsheng@627
|
81 msgstr ""
|
dongsheng@643
|
82 "<editor> <firstname>Mike</firstname> <surname>Loukides</surname> </editor> "
|
dongsheng@643
|
83 "<copyright> <year>2006</year> <year>2007</year> <year>2008</year> <year>2009</"
|
dongsheng@643
|
84 "year> <holder>Bryan O'Sullivan</holder> </copyright>"
|
dongsheng@627
|
85
|
dongsheng@627
|
86 #. type: Content of: <book><appendix><title>
|
dongsheng@627
|
87 #: ../en/appA-cmdref.xml:4
|
dongsheng@627
|
88 msgid "Command reference"
|
dongsheng@627
|
89 msgstr "命令参考"
|
dongsheng@627
|
90
|
dongsheng@627
|
91 #. type: Content of: <book><appendix><para>
|
dongsheng@627
|
92 #: ../en/appA-cmdref.xml:6
|
dongsheng@627
|
93 msgid ""
|
dongsheng@627
|
94 "\\cmdref{add}{add files at the next commit} \\optref{add}{I}{include} \\optref"
|
dongsheng@627
|
95 "{add}{X}{exclude} \\optref{add}{n}{dry-run}"
|
dongsheng@627
|
96 msgstr ""
|
dongsheng@627
|
97
|
dongsheng@627
|
98 #. type: Content of: <book><appendix><para>
|
dongsheng@627
|
99 #: ../en/appA-cmdref.xml:11
|
dongsheng@627
|
100 msgid "\\cmdref{diff}{print changes in history or working directory}"
|
dongsheng@627
|
101 msgstr ""
|
dongsheng@627
|
102
|
dongsheng@627
|
103 #. type: Content of: <book><appendix><para>
|
dongsheng@627
|
104 #: ../en/appA-cmdref.xml:13
|
dongsheng@627
|
105 msgid ""
|
dongsheng@627
|
106 "Show differences between revisions for the specified files or directories, "
|
dongsheng@627
|
107 "using the unified diff format. For a description of the unified diff format, "
|
dongsheng@627
|
108 "see section <xref linkend=\"sec.mq.patch\"/>."
|
dongsheng@627
|
109 msgstr ""
|
dongsheng@627
|
110
|
dongsheng@627
|
111 #. type: Content of: <book><appendix><para>
|
dongsheng@627
|
112 #: ../en/appA-cmdref.xml:17
|
dongsheng@627
|
113 msgid ""
|
dongsheng@627
|
114 "By default, this command does not print diffs for files that Mercurial "
|
dongsheng@627
|
115 "considers to contain binary data. To control this behaviour, see the <option "
|
dongsheng@627
|
116 "role=\"hg-opt-diff\">-a</option> and <option role=\"hg-opt-diff\">--git</"
|
dongsheng@627
|
117 "option> options."
|
dongsheng@627
|
118 msgstr ""
|
dongsheng@627
|
119
|
dongsheng@627
|
120 #. type: Content of: <book><appendix><sect2><title>
|
dongsheng@627
|
121 #: ../en/appA-cmdref.xml:22
|
dongsheng@627
|
122 msgid "Options"
|
dongsheng@627
|
123 msgstr "选项"
|
dongsheng@627
|
124
|
dongsheng@627
|
125 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
126 #: ../en/appA-cmdref.xml:24
|
dongsheng@627
|
127 msgid "\\loptref{diff}{nodates}"
|
dongsheng@627
|
128 msgstr ""
|
dongsheng@627
|
129
|
dongsheng@627
|
130 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
131 #: ../en/appA-cmdref.xml:26
|
dongsheng@627
|
132 msgid "Omit date and time information when printing diff headers."
|
dongsheng@627
|
133 msgstr ""
|
dongsheng@627
|
134
|
dongsheng@627
|
135 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
136 #: ../en/appA-cmdref.xml:28
|
dongsheng@627
|
137 msgid "\\optref{diff}{B}{ignore-blank-lines}"
|
dongsheng@627
|
138 msgstr ""
|
dongsheng@627
|
139
|
dongsheng@627
|
140 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
141 #: ../en/appA-cmdref.xml:30
|
dongsheng@627
|
142 msgid ""
|
dongsheng@627
|
143 "Do not print changes that only insert or delete blank lines. A line that "
|
dongsheng@627
|
144 "contains only whitespace is not considered blank."
|
dongsheng@627
|
145 msgstr ""
|
dongsheng@627
|
146
|
dongsheng@627
|
147 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
148 #: ../en/appA-cmdref.xml:34
|
dongsheng@627
|
149 msgid "\\optref{diff}{I}{include}"
|
dongsheng@627
|
150 msgstr ""
|
dongsheng@627
|
151
|
dongsheng@627
|
152 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
153 #: ../en/appA-cmdref.xml:37
|
dongsheng@627
|
154 msgid "Include files and directories whose names match the given patterns."
|
dongsheng@627
|
155 msgstr ""
|
dongsheng@627
|
156
|
dongsheng@627
|
157 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
158 #: ../en/appA-cmdref.xml:40
|
dongsheng@627
|
159 msgid "\\optref{diff}{X}{exclude}"
|
dongsheng@627
|
160 msgstr ""
|
dongsheng@627
|
161
|
dongsheng@627
|
162 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
163 #: ../en/appA-cmdref.xml:43
|
dongsheng@627
|
164 msgid "Exclude files and directories whose names match the given patterns."
|
dongsheng@627
|
165 msgstr ""
|
dongsheng@627
|
166
|
dongsheng@627
|
167 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
168 #: ../en/appA-cmdref.xml:46
|
dongsheng@627
|
169 msgid "\\optref{diff}{a}{text}"
|
dongsheng@627
|
170 msgstr ""
|
dongsheng@627
|
171
|
dongsheng@627
|
172 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
173 #: ../en/appA-cmdref.xml:49
|
dongsheng@627
|
174 msgid ""
|
dongsheng@627
|
175 "If this option is not specified, <command role=\"hg-cmd\">hg diff</command> "
|
dongsheng@627
|
176 "will refuse to print diffs for files that it detects as binary. Specifying "
|
dongsheng@627
|
177 "<option role=\"hg-opt-diff\">-a</option> forces <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
178 "diff</command> to treat all files as text, and generate diffs for all of them."
|
dongsheng@627
|
179 msgstr ""
|
dongsheng@627
|
180
|
dongsheng@627
|
181 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
182 #: ../en/appA-cmdref.xml:55
|
dongsheng@627
|
183 msgid ""
|
dongsheng@627
|
184 "This option is useful for files that are <quote>mostly text</quote> but have "
|
dongsheng@627
|
185 "a few embedded NUL characters. If you use it on files that contain a lot of "
|
dongsheng@627
|
186 "binary data, its output will be incomprehensible."
|
dongsheng@627
|
187 msgstr ""
|
dongsheng@627
|
188
|
dongsheng@627
|
189 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
190 #: ../en/appA-cmdref.xml:60
|
dongsheng@627
|
191 msgid "\\optref{diff}{b}{ignore-space-change}"
|
dongsheng@627
|
192 msgstr ""
|
dongsheng@627
|
193
|
dongsheng@627
|
194 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
195 #: ../en/appA-cmdref.xml:63
|
dongsheng@627
|
196 msgid ""
|
dongsheng@627
|
197 "Do not print a line if the only change to that line is in the amount of white "
|
dongsheng@627
|
198 "space it contains."
|
dongsheng@627
|
199 msgstr ""
|
dongsheng@627
|
200
|
dongsheng@627
|
201 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
202 #: ../en/appA-cmdref.xml:67
|
dongsheng@627
|
203 msgid "\\optref{diff}{g}{git}"
|
dongsheng@627
|
204 msgstr ""
|
dongsheng@627
|
205
|
dongsheng@627
|
206 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
207 #: ../en/appA-cmdref.xml:70
|
dongsheng@627
|
208 msgid ""
|
dongsheng@627
|
209 "Print <command>git</command>-compatible diffs. XXX reference a format "
|
dongsheng@627
|
210 "description."
|
dongsheng@627
|
211 msgstr ""
|
dongsheng@627
|
212
|
dongsheng@627
|
213 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
214 #: ../en/appA-cmdref.xml:74
|
dongsheng@627
|
215 msgid "\\optref{diff}{p}{show-function}"
|
dongsheng@627
|
216 msgstr ""
|
dongsheng@627
|
217
|
dongsheng@627
|
218 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
219 #: ../en/appA-cmdref.xml:77
|
dongsheng@627
|
220 msgid ""
|
dongsheng@627
|
221 "Display the name of the enclosing function in a hunk header, using a simple "
|
dongsheng@627
|
222 "heuristic. This functionality is enabled by default, so the <option role="
|
dongsheng@627
|
223 "\"hg-opt-diff\">-p</option> option has no effect unless you change the value "
|
dongsheng@627
|
224 "of the <envar role=\"rc-item-diff\">showfunc</envar> config item, as in the "
|
dongsheng@627
|
225 "following example."
|
dongsheng@627
|
226 msgstr ""
|
dongsheng@627
|
227
|
dongsheng@627
|
228 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
229 #: ../en/appA-cmdref.xml:84
|
dongsheng@627
|
230 msgid "\\optref{diff}{r}{rev}"
|
dongsheng@627
|
231 msgstr ""
|
dongsheng@627
|
232
|
dongsheng@627
|
233 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
234 #: ../en/appA-cmdref.xml:87
|
dongsheng@627
|
235 msgid ""
|
dongsheng@627
|
236 "Specify one or more revisions to compare. The <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
237 "diff</command> command accepts up to two <option role=\"hg-opt-diff\">-r</"
|
dongsheng@627
|
238 "option> options to specify the revisions to compare."
|
dongsheng@627
|
239 msgstr ""
|
dongsheng@627
|
240
|
dongsheng@627
|
241 #. type: Content of: <book><appendix><sect2><orderedlist><listitem><para>
|
dongsheng@627
|
242 #: ../en/appA-cmdref.xml:93
|
dongsheng@627
|
243 msgid ""
|
dongsheng@627
|
244 "Display the differences between the parent revision of the working directory "
|
dongsheng@627
|
245 "and the working directory."
|
dongsheng@627
|
246 msgstr ""
|
dongsheng@627
|
247
|
dongsheng@627
|
248 #. type: Content of: <book><appendix><sect2><orderedlist><listitem><para>
|
dongsheng@627
|
249 #: ../en/appA-cmdref.xml:97
|
dongsheng@627
|
250 msgid ""
|
dongsheng@627
|
251 "Display the differences between the specified changeset and the working "
|
dongsheng@627
|
252 "directory."
|
dongsheng@627
|
253 msgstr ""
|
dongsheng@627
|
254
|
dongsheng@627
|
255 #. type: Content of: <book><appendix><sect2><orderedlist><listitem><para>
|
dongsheng@627
|
256 #: ../en/appA-cmdref.xml:101
|
dongsheng@627
|
257 msgid "Display the differences between the two specified changesets."
|
dongsheng@627
|
258 msgstr ""
|
dongsheng@627
|
259
|
dongsheng@627
|
260 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
261 #: ../en/appA-cmdref.xml:105
|
dongsheng@627
|
262 msgid ""
|
dongsheng@627
|
263 "You can specify two revisions using either two <option role=\"hg-opt-diff\">-"
|
dongsheng@627
|
264 "r</option> options or revision range notation. For example, the two revision "
|
dongsheng@627
|
265 "specifications below are equivalent."
|
dongsheng@627
|
266 msgstr ""
|
dongsheng@627
|
267
|
dongsheng@627
|
268 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
269 #: ../en/appA-cmdref.xml:112
|
dongsheng@627
|
270 msgid ""
|
dongsheng@627
|
271 "When you provide two revisions, Mercurial treats the order of those revisions "
|
dongsheng@627
|
272 "as significant. Thus, <command role=\"hg-cmd\">hg diff -r10:20</command> "
|
dongsheng@627
|
273 "will produce a diff that will transform files from their contents as of "
|
dongsheng@627
|
274 "revision 10 to their contents as of revision 20, while <command role=\"hg-cmd"
|
dongsheng@627
|
275 "\">hg diff -r20:10</command> means the opposite: the diff that will transform "
|
dongsheng@627
|
276 "files from their revision 20 contents to their revision 10 contents. You "
|
dongsheng@627
|
277 "cannot reverse the ordering in this way if you are diffing against the "
|
dongsheng@627
|
278 "working directory."
|
dongsheng@627
|
279 msgstr ""
|
dongsheng@627
|
280
|
dongsheng@627
|
281 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
282 #: ../en/appA-cmdref.xml:122
|
dongsheng@627
|
283 msgid "\\optref{diff}{w}{ignore-all-space}"
|
dongsheng@627
|
284 msgstr ""
|
dongsheng@627
|
285
|
dongsheng@627
|
286 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
287 #: ../en/appA-cmdref.xml:125
|
dongsheng@627
|
288 msgid "\\cmdref{version}{print version and copyright information}"
|
dongsheng@627
|
289 msgstr ""
|
dongsheng@627
|
290
|
dongsheng@627
|
291 #. type: Content of: <book><appendix><sect2><para>
|
dongsheng@627
|
292 #: ../en/appA-cmdref.xml:128
|
dongsheng@627
|
293 msgid ""
|
dongsheng@627
|
294 "This command displays the version of Mercurial you are running, and its "
|
dongsheng@627
|
295 "copyright license. There are four kinds of version string that you may see."
|
dongsheng@627
|
296 msgstr ""
|
dongsheng@627
|
297
|
dongsheng@627
|
298 #. type: Content of: <book><appendix><sect2><itemizedlist><listitem><para>
|
dongsheng@627
|
299 #: ../en/appA-cmdref.xml:133
|
dongsheng@627
|
300 msgid ""
|
dongsheng@627
|
301 "The string <quote><literal>unknown</literal></quote>. This version of "
|
dongsheng@627
|
302 "Mercurial was not built in a Mercurial repository, and cannot determine its "
|
dongsheng@627
|
303 "own version."
|
dongsheng@627
|
304 msgstr ""
|
dongsheng@627
|
305
|
dongsheng@627
|
306 #. type: Content of: <book><appendix><sect2><itemizedlist><listitem><para>
|
dongsheng@627
|
307 #: ../en/appA-cmdref.xml:138
|
dongsheng@627
|
308 msgid ""
|
dongsheng@627
|
309 "A short numeric string, such as <quote><literal>1.1</literal></quote>. This "
|
dongsheng@627
|
310 "is a build of a revision of Mercurial that was identified by a specific tag "
|
dongsheng@627
|
311 "in the repository where it was built. (This doesn't necessarily mean that "
|
dongsheng@627
|
312 "you're running an official release; someone else could have added that tag to "
|
dongsheng@627
|
313 "any revision in the repository where they built Mercurial.)"
|
dongsheng@627
|
314 msgstr ""
|
dongsheng@627
|
315
|
dongsheng@627
|
316 #. type: Content of: <book><appendix><sect2><itemizedlist><listitem><para>
|
dongsheng@627
|
317 #: ../en/appA-cmdref.xml:146
|
dongsheng@627
|
318 msgid ""
|
dongsheng@627
|
319 "A hexadecimal string, such as <quote><literal>875489e31abe</literal></"
|
dongsheng@627
|
320 "quote>. This is a build of the given revision of Mercurial."
|
dongsheng@627
|
321 msgstr ""
|
dongsheng@627
|
322
|
dongsheng@627
|
323 #. type: Content of: <book><appendix><sect2><itemizedlist><listitem><para>
|
dongsheng@627
|
324 #: ../en/appA-cmdref.xml:150
|
dongsheng@627
|
325 msgid ""
|
dongsheng@627
|
326 "A hexadecimal string followed by a date, such as <quote><literal>875489e31abe"
|
dongsheng@627
|
327 "+20070205</literal></quote>. This is a build of the given revision of "
|
dongsheng@627
|
328 "Mercurial, where the build repository contained some local changes that had "
|
dongsheng@627
|
329 "not been committed."
|
dongsheng@627
|
330 msgstr ""
|
dongsheng@627
|
331
|
dongsheng@627
|
332 #. type: Content of: <book><appendix><sect2><title>
|
dongsheng@627
|
333 #: ../en/appA-cmdref.xml:159
|
dongsheng@627
|
334 msgid "Tips and tricks"
|
dongsheng@627
|
335 msgstr ""
|
dongsheng@627
|
336
|
dongsheng@627
|
337 #. type: Content of: <book><appendix><sect2><sect3><title>
|
dongsheng@627
|
338 #: ../en/appA-cmdref.xml:162
|
dongsheng@627
|
339 msgid ""
|
dongsheng@627
|
340 "Why do the results of <command role=\"hg-cmd\">hg diff</command> and <command "
|
dongsheng@627
|
341 "role=\"hg-cmd\">hg status</command> differ?"
|
dongsheng@627
|
342 msgstr ""
|
dongsheng@627
|
343 "为什么 <command role=\"hg-cmd\">hg diff</command> 与 <command role=\"hg-cmd"
|
dongsheng@627
|
344 "\">hg status</command> 的结果不同 ?"
|
dongsheng@627
|
345
|
dongsheng@627
|
346 #. type: Content of: <book><appendix><sect2><sect3><para>
|
dongsheng@627
|
347 #: ../en/appA-cmdref.xml:164
|
dongsheng@627
|
348 msgid ""
|
dongsheng@627
|
349 "When you run the <command role=\"hg-cmd\">hg status</command> command, you'll "
|
dongsheng@627
|
350 "see a list of files that Mercurial will record changes for the next time you "
|
dongsheng@627
|
351 "perform a commit. If you run the <command role=\"hg-cmd\">hg diff</command> "
|
dongsheng@627
|
352 "command, you may notice that it prints diffs for only a <emphasis>subset</"
|
dongsheng@627
|
353 "emphasis> of the files that <command role=\"hg-cmd\">hg status</command> "
|
dongsheng@627
|
354 "listed. There are two possible reasons for this."
|
dongsheng@627
|
355 msgstr ""
|
dongsheng@627
|
356
|
dongsheng@627
|
357 #. type: Content of: <book><appendix><sect2><sect3><para>
|
dongsheng@627
|
358 #: ../en/appA-cmdref.xml:171
|
dongsheng@627
|
359 msgid ""
|
dongsheng@627
|
360 "The first is that <command role=\"hg-cmd\">hg status</command> prints some "
|
dongsheng@627
|
361 "kinds of modifications that <command role=\"hg-cmd\">hg diff</command> "
|
dongsheng@627
|
362 "doesn't normally display. The <command role=\"hg-cmd\">hg diff</command> "
|
dongsheng@627
|
363 "command normally outputs unified diffs, which don't have the ability to "
|
dongsheng@627
|
364 "represent some changes that Mercurial can track. Most notably, traditional "
|
dongsheng@627
|
365 "diffs can't represent a change in whether or not a file is executable, but "
|
dongsheng@627
|
366 "Mercurial records this information."
|
dongsheng@627
|
367 msgstr ""
|
dongsheng@627
|
368
|
dongsheng@627
|
369 #. type: Content of: <book><appendix><sect2><sect3><para>
|
dongsheng@627
|
370 #: ../en/appA-cmdref.xml:179
|
dongsheng@627
|
371 msgid ""
|
dongsheng@627
|
372 "If you use the <option role=\"hg-opt-diff\">--git</option> option to <command "
|
dongsheng@627
|
373 "role=\"hg-cmd\">hg diff</command>, it will display <command>git</command>-"
|
dongsheng@627
|
374 "compatible diffs that <emphasis>can</emphasis> display this extra information."
|
dongsheng@627
|
375 msgstr ""
|
dongsheng@627
|
376
|
dongsheng@627
|
377 #. type: Content of: <book><appendix><sect2><sect3><para>
|
dongsheng@627
|
378 #: ../en/appA-cmdref.xml:184
|
dongsheng@627
|
379 msgid ""
|
dongsheng@627
|
380 "The second possible reason that <command role=\"hg-cmd\">hg diff</command> "
|
dongsheng@627
|
381 "might be printing diffs for a subset of the files displayed by <command role="
|
dongsheng@627
|
382 "\"hg-cmd\">hg status</command> is that if you invoke it without any "
|
dongsheng@627
|
383 "arguments, <command role=\"hg-cmd\">hg diff</command> prints diffs against "
|
dongsheng@627
|
384 "the first parent of the working directory. If you have run <command role="
|
dongsheng@627
|
385 "\"hg-cmd\">hg merge</command> to merge two changesets, but you haven't yet "
|
dongsheng@627
|
386 "committed the results of the merge, your working directory has two parents "
|
dongsheng@627
|
387 "(use <command role=\"hg-cmd\">hg parents</command> to see them). While "
|
dongsheng@627
|
388 "<command role=\"hg-cmd\">hg status</command> prints modifications relative to "
|
dongsheng@627
|
389 "<emphasis>both</emphasis> parents after an uncommitted merge, <command role="
|
dongsheng@627
|
390 "\"hg-cmd\">hg diff</command> still operates relative only to the first "
|
dongsheng@627
|
391 "parent. You can get it to print diffs relative to the second parent by "
|
dongsheng@627
|
392 "specifying that parent with the <option role=\"hg-opt-diff\">-r</option> "
|
dongsheng@627
|
393 "option. There is no way to print diffs relative to both parents."
|
dongsheng@627
|
394 msgstr ""
|
dongsheng@627
|
395
|
dongsheng@627
|
396 #. type: Content of: <book><appendix><sect2><sect3><title>
|
dongsheng@627
|
397 #: ../en/appA-cmdref.xml:200
|
dongsheng@627
|
398 msgid "Generating safe binary diffs"
|
dongsheng@627
|
399 msgstr "生成安全的二进制差异"
|
dongsheng@627
|
400
|
dongsheng@627
|
401 #. type: Content of: <book><appendix><sect2><sect3><para>
|
dongsheng@627
|
402 #: ../en/appA-cmdref.xml:202
|
dongsheng@627
|
403 msgid ""
|
dongsheng@627
|
404 "If you use the <option role=\"hg-opt-diff\">-a</option> option to force "
|
dongsheng@627
|
405 "Mercurial to print diffs of files that are either <quote>mostly text</quote> "
|
dongsheng@627
|
406 "or contain lots of binary data, those diffs cannot subsequently be applied by "
|
dongsheng@627
|
407 "either Mercurial's <command role=\"hg-cmd\">hg import</command> command or "
|
dongsheng@627
|
408 "the system's <command>patch</command> command."
|
dongsheng@627
|
409 msgstr ""
|
dongsheng@627
|
410
|
dongsheng@627
|
411 #. type: Content of: <book><appendix><sect2><sect3><para>
|
dongsheng@627
|
412 #: ../en/appA-cmdref.xml:209
|
dongsheng@627
|
413 msgid ""
|
dongsheng@627
|
414 "If you want to generate a diff of a binary file that is safe to use as input "
|
dongsheng@627
|
415 "for <command role=\"hg-cmd\">hg import</command>, use the <command role=\"hg-"
|
dongsheng@627
|
416 "cmd\">hg diff</command>{--git} option when you generate the patch. The "
|
dongsheng@627
|
417 "system <command>patch</command> command cannot handle binary patches at all."
|
dongsheng@627
|
418 msgstr ""
|
dongsheng@627
|
419
|
dongsheng@627
|
420 #. type: Content of: <book><appendix><title>
|
dongsheng@627
|
421 #: ../en/appB-mq-ref.xml:5
|
dongsheng@627
|
422 msgid "Mercurial Queues reference"
|
dongsheng@627
|
423 msgstr "Mercurial 队列参考"
|
dongsheng@627
|
424
|
dongsheng@627
|
425 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
426 #: ../en/appB-mq-ref.xml:8
|
dongsheng@627
|
427 msgid "MQ command reference"
|
dongsheng@627
|
428 msgstr "MQ 命令参考"
|
dongsheng@627
|
429
|
dongsheng@627
|
430 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
431 #: ../en/appB-mq-ref.xml:10
|
dongsheng@627
|
432 msgid ""
|
dongsheng@627
|
433 "For an overview of the commands provided by MQ, use the command <command role="
|
dongsheng@627
|
434 "\"hg-cmd\">hg help mq</command>."
|
dongsheng@627
|
435 msgstr ""
|
dongsheng@627
|
436
|
dongsheng@627
|
437 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@627
|
438 #: ../en/appB-mq-ref.xml:14
|
dongsheng@627
|
439 msgid ""
|
dongsheng@627
|
440 "<command role=\"hg-ext-mq\">qapplied</command>&emdash;print applied patches"
|
dongsheng@627
|
441 msgstr "<command role=\"hg-ext-mq\">qapplied</command>&emdash;显示已应用的补丁"
|
dongsheng@627
|
442
|
dongsheng@627
|
443 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@627
|
444 #: ../en/appB-mq-ref.xml:17
|
dongsheng@627
|
445 msgid ""
|
dongsheng@627
|
446 "The <command role=\"hg-ext-mq\">qapplied</command> command prints the current "
|
dongsheng@627
|
447 "stack of applied patches. Patches are printed in oldest-to-newest order, so "
|
dongsheng@627
|
448 "the last patch in the list is the <quote>top</quote> patch."
|
dongsheng@627
|
449 msgstr ""
|
dongsheng@627
|
450
|
dongsheng@627
|
451 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@627
|
452 #: ../en/appB-mq-ref.xml:24
|
dongsheng@627
|
453 msgid ""
|
dongsheng@627
|
454 "<command role=\"hg-ext-mq\">qcommit</command>&emdash;commit changes in the "
|
dongsheng@627
|
455 "queue repository"
|
dongsheng@627
|
456 msgstr "<command role=\"hg-ext-mq\">qcommit</command>&emdash;提交队列中的修改"
|
dongsheng@627
|
457
|
dongsheng@627
|
458 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@627
|
459 #: ../en/appB-mq-ref.xml:27
|
dongsheng@627
|
460 msgid ""
|
dongsheng@627
|
461 "The <command role=\"hg-ext-mq\">qcommit</command> command commits any "
|
dongsheng@627
|
462 "outstanding changes in the <filename role=\"special\" class=\"directory\">.hg/"
|
dongsheng@627
|
463 "patches</filename> repository. This command only works if the <filename role="
|
dongsheng@627
|
464 "\"special\" class=\"directory\">.hg/patches</filename> directory is a "
|
dongsheng@627
|
465 "repository, i.e. you created the directory using <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
466 "qinit <option role=\"hg-ext-mq-cmd-qinit-opt\">-c</option></command> or ran "
|
dongsheng@627
|
467 "<command role=\"hg-cmd\">hg init</command> in the directory after running "
|
dongsheng@627
|
468 "<command role=\"hg-ext-mq\">qinit</command>."
|
dongsheng@627
|
469 msgstr ""
|
dongsheng@627
|
470
|
dongsheng@627
|
471 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@627
|
472 #: ../en/appB-mq-ref.xml:39
|
dongsheng@627
|
473 msgid ""
|
dongsheng@627
|
474 "This command is shorthand for <command role=\"hg-cmd\">hg commit --cwd .hg/"
|
dongsheng@627
|
475 "patches</command>."
|
dongsheng@627
|
476 msgstr ""
|
dongsheng@627
|
477
|
dongsheng@650
|
478 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
479 #: ../en/appB-mq-ref.xml:43
|
dongsheng@650
|
480 msgid ""
|
dongsheng@650
|
481 "<command role=\"hg-ext-mq\">qdelete</command>&emdash;delete a patch from the "
|
dongsheng@653
|
482 "<filename role=\"special\">series</filename> file"
|
dongsheng@653
|
483 msgstr ""
|
dongsheng@653
|
484 "<command role=\"hg-ext-mq\">qdelete</command>&emdash;从文件 <filename role="
|
dongsheng@653
|
485 "\"special\">series</filename> 中删除补丁"
|
dongsheng@650
|
486
|
dongsheng@627
|
487 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
488 #: ../en/appB-mq-ref.xml:48
|
dongsheng@627
|
489 msgid ""
|
dongsheng@627
|
490 "The <command role=\"hg-ext-mq\">qdelete</command> command removes the entry "
|
dongsheng@627
|
491 "for a patch from the <filename role=\"special\">series</filename> file in the "
|
dongsheng@627
|
492 "<filename role=\"special\" class=\"directory\">.hg/patches</filename> "
|
dongsheng@627
|
493 "directory. It does not pop the patch if the patch is already applied. By "
|
dongsheng@627
|
494 "default, it does not delete the patch file; use the <option role=\"hg-ext-mq-"
|
dongsheng@627
|
495 "cmd-qdel-opt\">-f</option> option to do that."
|
dongsheng@627
|
496 msgstr ""
|
dongsheng@627
|
497
|
dongsheng@627
|
498 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
499 #: ../en/appB-mq-ref.xml:57 ../en/appB-mq-ref.xml:99 ../en/appB-mq-ref.xml:157
|
dongsheng@650
|
500 #: ../en/appB-mq-ref.xml:197 ../en/appB-mq-ref.xml:264
|
dongsheng@650
|
501 #: ../en/appB-mq-ref.xml:335 ../en/appB-mq-ref.xml:404
|
dongsheng@650
|
502 #: ../en/appB-mq-ref.xml:497
|
dongsheng@627
|
503 msgid "Options:"
|
dongsheng@627
|
504 msgstr ""
|
dongsheng@627
|
505
|
dongsheng@627
|
506 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
507 #: ../en/appB-mq-ref.xml:59
|
dongsheng@627
|
508 msgid ""
|
dongsheng@627
|
509 "<option role=\"hg-ext-mq-cmd-qdel-opt\">-f</option>: Delete the patch file."
|
dongsheng@627
|
510 msgstr ""
|
dongsheng@627
|
511
|
dongsheng@627
|
512 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
513 #: ../en/appB-mq-ref.xml:66
|
dongsheng@627
|
514 msgid ""
|
dongsheng@627
|
515 "<command role=\"hg-ext-mq\">qdiff</command>&emdash;print a diff of the "
|
dongsheng@627
|
516 "topmost applied patch"
|
dongsheng@627
|
517 msgstr ""
|
dongsheng@627
|
518 "<command role=\"hg-ext-mq\">qdiff</command>&emdash;显示最新应用补丁的差异"
|
dongsheng@627
|
519
|
dongsheng@627
|
520 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
521 #: ../en/appB-mq-ref.xml:69
|
dongsheng@627
|
522 msgid ""
|
dongsheng@627
|
523 "The <command role=\"hg-ext-mq\">qdiff</command> command prints a diff of the "
|
dongsheng@627
|
524 "topmost applied patch. It is equivalent to <command role=\"hg-cmd\">hg diff -"
|
dongsheng@627
|
525 "r-2:-1</command>."
|
dongsheng@627
|
526 msgstr ""
|
dongsheng@627
|
527
|
dongsheng@627
|
528 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
529 #: ../en/appB-mq-ref.xml:75
|
dongsheng@627
|
530 msgid ""
|
dongsheng@627
|
531 "<command role=\"hg-ext-mq\">qfold</command>&emdash;merge (<quote>fold</"
|
dongsheng@627
|
532 "quote>) several patches into one"
|
dongsheng@627
|
533 msgstr ""
|
dongsheng@627
|
534 "<command role=\"hg-ext-mq\">qfold</command>&emdash;将多个补丁合并(<quote>折叠"
|
dongsheng@627
|
535 "</quote>)成一个"
|
dongsheng@627
|
536
|
dongsheng@627
|
537 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
538 #: ../en/appB-mq-ref.xml:78
|
dongsheng@627
|
539 msgid ""
|
dongsheng@627
|
540 "The <command role=\"hg-ext-mq\">qfold</command> command merges multiple "
|
dongsheng@627
|
541 "patches into the topmost applied patch, so that the topmost applied patch "
|
dongsheng@627
|
542 "makes the union of all of the changes in the patches in question."
|
dongsheng@627
|
543 msgstr ""
|
dongsheng@627
|
544
|
dongsheng@627
|
545 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
546 #: ../en/appB-mq-ref.xml:83
|
dongsheng@627
|
547 msgid ""
|
dongsheng@627
|
548 "The patches to fold must not be applied; <command role=\"hg-ext-mq\">qfold</"
|
dongsheng@627
|
549 "command> will exit with an error if any is. The order in which patches are "
|
dongsheng@627
|
550 "folded is significant; <command role=\"hg-cmd\">hg qfold a b</command> means "
|
dongsheng@627
|
551 "<quote>apply the current topmost patch, followed by <literal>a</literal>, "
|
dongsheng@627
|
552 "followed by <literal>b</literal></quote>."
|
dongsheng@627
|
553 msgstr ""
|
dongsheng@627
|
554
|
dongsheng@627
|
555 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
556 #: ../en/appB-mq-ref.xml:91
|
dongsheng@627
|
557 msgid ""
|
dongsheng@627
|
558 "The comments from the folded patches are appended to the comments of the "
|
dongsheng@627
|
559 "destination patch, with each block of comments separated by three asterisk "
|
dongsheng@627
|
560 "(<quote><literal>*</literal></quote>) characters. Use the <option role=\"hg-"
|
dongsheng@627
|
561 "ext-mq-cmd-qfold-opt\">-e</option> option to edit the commit message for the "
|
dongsheng@627
|
562 "combined patch/changeset after the folding has completed."
|
dongsheng@627
|
563 msgstr ""
|
dongsheng@627
|
564
|
dongsheng@627
|
565 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
566 #: ../en/appB-mq-ref.xml:101
|
dongsheng@627
|
567 msgid ""
|
dongsheng@627
|
568 "<option role=\"hg-ext-mq-cmd-qfold-opt\">-e</option>: Edit the commit message "
|
dongsheng@627
|
569 "and patch description for the newly folded patch."
|
dongsheng@627
|
570 msgstr ""
|
dongsheng@627
|
571
|
dongsheng@627
|
572 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
573 #: ../en/appB-mq-ref.xml:106
|
dongsheng@627
|
574 msgid ""
|
dongsheng@627
|
575 "<option role=\"hg-ext-mq-cmd-qfold-opt\">-l</option>: Use the contents of the "
|
dongsheng@627
|
576 "given file as the new commit message and patch description for the folded "
|
dongsheng@627
|
577 "patch."
|
dongsheng@627
|
578 msgstr ""
|
dongsheng@627
|
579
|
dongsheng@627
|
580 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
581 #: ../en/appB-mq-ref.xml:111
|
dongsheng@627
|
582 msgid ""
|
dongsheng@627
|
583 "<option role=\"hg-ext-mq-cmd-qfold-opt\">-m</option>: Use the given text as "
|
dongsheng@627
|
584 "the new commit message and patch description for the folded patch."
|
dongsheng@627
|
585 msgstr ""
|
dongsheng@627
|
586
|
dongsheng@627
|
587 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
588 #: ../en/appB-mq-ref.xml:119
|
dongsheng@627
|
589 msgid ""
|
dongsheng@627
|
590 "<command role=\"hg-ext-mq\">qheader</command>&emdash;display the header/"
|
dongsheng@627
|
591 "description of a patch"
|
dongsheng@627
|
592 msgstr "<command role=\"hg-ext-mq\">qheader</command>&emdash;显示补丁头部描述"
|
dongsheng@627
|
593
|
dongsheng@627
|
594 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
595 #: ../en/appB-mq-ref.xml:123
|
dongsheng@627
|
596 msgid ""
|
dongsheng@627
|
597 "The <command role=\"hg-ext-mq\">qheader</command> command prints the header, "
|
dongsheng@627
|
598 "or description, of a patch. By default, it prints the header of the topmost "
|
dongsheng@627
|
599 "applied patch. Given an argument, it prints the header of the named patch."
|
dongsheng@627
|
600 msgstr ""
|
dongsheng@627
|
601
|
dongsheng@627
|
602 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
603 #: ../en/appB-mq-ref.xml:130
|
dongsheng@627
|
604 msgid ""
|
dongsheng@627
|
605 "<command role=\"hg-ext-mq\">qimport</command>&emdash;import a third-party "
|
dongsheng@627
|
606 "patch into the queue"
|
dongsheng@627
|
607 msgstr ""
|
dongsheng@627
|
608 "<command role=\"hg-ext-mq\">qimport</command>&emdash;将第三方补丁导入队列"
|
dongsheng@627
|
609
|
dongsheng@627
|
610 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
611 #: ../en/appB-mq-ref.xml:133
|
dongsheng@627
|
612 msgid ""
|
dongsheng@627
|
613 "The <command role=\"hg-ext-mq\">qimport</command> command adds an entry for "
|
dongsheng@627
|
614 "an external patch to the <filename role=\"special\">series</filename> file, "
|
dongsheng@627
|
615 "and copies the patch into the <filename role=\"special\" class=\"directory\">."
|
dongsheng@627
|
616 "hg/patches</filename> directory. It adds the entry immediately after the "
|
dongsheng@627
|
617 "topmost applied patch, but does not push the patch."
|
dongsheng@627
|
618 msgstr ""
|
dongsheng@627
|
619
|
dongsheng@627
|
620 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
621 #: ../en/appB-mq-ref.xml:141
|
dongsheng@627
|
622 msgid ""
|
dongsheng@627
|
623 "If the <filename role=\"special\" class=\"directory\">.hg/patches</filename> "
|
dongsheng@627
|
624 "directory is a repository, <command role=\"hg-ext-mq\">qimport</command> "
|
dongsheng@627
|
625 "automatically does an <command role=\"hg-cmd\">hg add</command> of the "
|
dongsheng@627
|
626 "imported patch."
|
dongsheng@627
|
627 msgstr ""
|
dongsheng@627
|
628
|
dongsheng@627
|
629 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
630 #: ../en/appB-mq-ref.xml:149
|
dongsheng@627
|
631 msgid ""
|
dongsheng@627
|
632 "<command role=\"hg-ext-mq\">qinit</command>&emdash;prepare a repository to "
|
dongsheng@627
|
633 "work with MQ"
|
dongsheng@627
|
634 msgstr "<command role=\"hg-ext-mq\">qinit</command>&emdash;为使用 MQ 配置版本库"
|
dongsheng@627
|
635
|
dongsheng@627
|
636 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
637 #: ../en/appB-mq-ref.xml:152
|
dongsheng@627
|
638 msgid ""
|
dongsheng@627
|
639 "The <command role=\"hg-ext-mq\">qinit</command> command prepares a repository "
|
dongsheng@627
|
640 "to work with MQ. It creates a directory called <filename role=\"special\" "
|
dongsheng@627
|
641 "class=\"directory\">.hg/patches</filename>."
|
dongsheng@627
|
642 msgstr ""
|
dongsheng@627
|
643
|
dongsheng@627
|
644 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
645 #: ../en/appB-mq-ref.xml:159
|
dongsheng@627
|
646 msgid ""
|
dongsheng@627
|
647 "<option role=\"hg-ext-mq-cmd-qinit-opt\">-c</option>: Create <filename role="
|
dongsheng@627
|
648 "\"special\" class=\"directory\">.hg/patches</filename> as a repository in its "
|
dongsheng@627
|
649 "own right. Also creates a <filename role=\"special\">.hgignore</filename> "
|
dongsheng@627
|
650 "file that will ignore the <filename role=\"special\">status</filename> file."
|
dongsheng@627
|
651 msgstr ""
|
dongsheng@627
|
652
|
dongsheng@627
|
653 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
654 #: ../en/appB-mq-ref.xml:169
|
dongsheng@627
|
655 msgid ""
|
dongsheng@627
|
656 "When the <filename role=\"special\" class=\"directory\">.hg/patches</"
|
dongsheng@627
|
657 "filename> directory is a repository, the <command role=\"hg-ext-mq\">qimport</"
|
dongsheng@627
|
658 "command> and <command role=\"hg-ext-mq\">qnew</command> commands "
|
dongsheng@627
|
659 "automatically <command role=\"hg-cmd\">hg add</command> new patches."
|
dongsheng@627
|
660 msgstr ""
|
dongsheng@627
|
661
|
dongsheng@627
|
662 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
663 #: ../en/appB-mq-ref.xml:178
|
dongsheng@627
|
664 msgid "<command role=\"hg-ext-mq\">qnew</command>&emdash;create a new patch"
|
dongsheng@627
|
665 msgstr "<command role=\"hg-ext-mq\">qnew</command>&emdash;创建新补丁"
|
dongsheng@627
|
666
|
dongsheng@627
|
667 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
668 #: ../en/appB-mq-ref.xml:181
|
dongsheng@627
|
669 msgid ""
|
dongsheng@627
|
670 "The <command role=\"hg-ext-mq\">qnew</command> command creates a new patch. "
|
dongsheng@627
|
671 "It takes one mandatory argument, the name to use for the patch file. The "
|
dongsheng@627
|
672 "newly created patch is created empty by default. It is added to the "
|
dongsheng@627
|
673 "<filename role=\"special\">series</filename> file after the current topmost "
|
dongsheng@627
|
674 "applied patch, and is immediately pushed on top of that patch."
|
dongsheng@627
|
675 msgstr ""
|
dongsheng@627
|
676
|
dongsheng@627
|
677 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
678 #: ../en/appB-mq-ref.xml:189
|
dongsheng@627
|
679 msgid ""
|
dongsheng@627
|
680 "If <command role=\"hg-ext-mq\">qnew</command> finds modified files in the "
|
dongsheng@627
|
681 "working directory, it will refuse to create a new patch unless the <option "
|
dongsheng@627
|
682 "role=\"hg-ext-mq-cmd-qnew-opt\">-f</option> option is used (see below). This "
|
dongsheng@627
|
683 "behaviour allows you to <command role=\"hg-ext-mq\">qrefresh</command> your "
|
dongsheng@627
|
684 "topmost applied patch before you apply a new patch on top of it."
|
dongsheng@627
|
685 msgstr ""
|
dongsheng@627
|
686
|
dongsheng@627
|
687 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
688 #: ../en/appB-mq-ref.xml:199
|
dongsheng@627
|
689 msgid ""
|
dongsheng@627
|
690 "<option role=\"hg-ext-mq-cmd-qnew-opt\">-f</option>: Create a new patch if "
|
dongsheng@627
|
691 "the contents of the working directory are modified. Any outstanding "
|
dongsheng@627
|
692 "modifications are added to the newly created patch, so after this command "
|
dongsheng@627
|
693 "completes, the working directory will no longer be modified."
|
dongsheng@627
|
694 msgstr ""
|
dongsheng@627
|
695
|
dongsheng@627
|
696 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
697 #: ../en/appB-mq-ref.xml:206
|
dongsheng@627
|
698 msgid ""
|
dongsheng@627
|
699 "<option role=\"hg-ext-mq-cmd-qnew-opt\">-m</option>: Use the given text as "
|
dongsheng@627
|
700 "the commit message. This text will be stored at the beginning of the patch "
|
dongsheng@627
|
701 "file, before the patch data."
|
dongsheng@627
|
702 msgstr ""
|
dongsheng@627
|
703
|
dongsheng@627
|
704 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
705 #: ../en/appB-mq-ref.xml:215
|
dongsheng@627
|
706 msgid ""
|
dongsheng@627
|
707 "<command role=\"hg-ext-mq\">qnext</command>&emdash;print the name of the next "
|
dongsheng@627
|
708 "patch"
|
dongsheng@627
|
709 msgstr "<command role=\"hg-ext-mq\">qnext</command>&emdash;显示下个补丁的名称"
|
dongsheng@627
|
710
|
dongsheng@627
|
711 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
712 #: ../en/appB-mq-ref.xml:218
|
dongsheng@627
|
713 msgid ""
|
dongsheng@627
|
714 "The <command role=\"hg-ext-mq\">qnext</command> command prints the name name "
|
dongsheng@627
|
715 "of the next patch in the <filename role=\"special\">series</filename> file "
|
dongsheng@627
|
716 "after the topmost applied patch. This patch will become the topmost applied "
|
dongsheng@627
|
717 "patch if you run <command role=\"hg-ext-mq\">qpush</command>."
|
dongsheng@627
|
718 msgstr ""
|
dongsheng@627
|
719
|
dongsheng@627
|
720 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
721 #: ../en/appB-mq-ref.xml:227
|
dongsheng@627
|
722 msgid ""
|
dongsheng@627
|
723 "<command role=\"hg-ext-mq\">qpop</command>&emdash;pop patches off the stack"
|
dongsheng@627
|
724 msgstr "<command role=\"hg-ext-mq\">qpop</command>&emdash;删除堆栈顶部的补丁"
|
dongsheng@627
|
725
|
dongsheng@627
|
726 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
727 #: ../en/appB-mq-ref.xml:230
|
dongsheng@627
|
728 msgid ""
|
dongsheng@627
|
729 "The <command role=\"hg-ext-mq\">qpop</command> command removes applied "
|
dongsheng@627
|
730 "patches from the top of the stack of applied patches. By default, it removes "
|
dongsheng@627
|
731 "only one patch."
|
dongsheng@627
|
732 msgstr ""
|
dongsheng@627
|
733
|
dongsheng@627
|
734 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
735 #: ../en/appB-mq-ref.xml:234
|
dongsheng@627
|
736 msgid ""
|
dongsheng@627
|
737 "This command removes the changesets that represent the popped patches from "
|
dongsheng@627
|
738 "the repository, and updates the working directory to undo the effects of the "
|
dongsheng@627
|
739 "patches."
|
dongsheng@627
|
740 msgstr ""
|
dongsheng@627
|
741
|
dongsheng@627
|
742 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
743 #: ../en/appB-mq-ref.xml:238
|
dongsheng@627
|
744 msgid ""
|
dongsheng@627
|
745 "This command takes an optional argument, which it uses as the name or index "
|
dongsheng@627
|
746 "of the patch to pop to. If given a name, it will pop patches until the named "
|
dongsheng@627
|
747 "patch is the topmost applied patch. If given a number, <command role=\"hg-"
|
dongsheng@627
|
748 "ext-mq\">qpop</command> treats the number as an index into the entries in the "
|
dongsheng@627
|
749 "series file, counting from zero (empty lines and lines containing only "
|
dongsheng@627
|
750 "comments do not count). It pops patches until the patch identified by the "
|
dongsheng@627
|
751 "given index is the topmost applied patch."
|
dongsheng@627
|
752 msgstr ""
|
dongsheng@627
|
753
|
dongsheng@627
|
754 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
755 #: ../en/appB-mq-ref.xml:248
|
dongsheng@627
|
756 msgid ""
|
dongsheng@627
|
757 "The <command role=\"hg-ext-mq\">qpop</command> command does not read or write "
|
dongsheng@627
|
758 "patches or the <filename role=\"special\">series</filename> file. It is thus "
|
dongsheng@627
|
759 "safe to <command role=\"hg-ext-mq\">qpop</command> a patch that you have "
|
dongsheng@627
|
760 "removed from the <filename role=\"special\">series</filename> file, or a "
|
dongsheng@627
|
761 "patch that you have renamed or deleted entirely. In the latter two cases, "
|
dongsheng@627
|
762 "use the name of the patch as it was when you applied it."
|
dongsheng@627
|
763 msgstr ""
|
dongsheng@627
|
764
|
dongsheng@627
|
765 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
766 #: ../en/appB-mq-ref.xml:257
|
dongsheng@627
|
767 msgid ""
|
dongsheng@627
|
768 "By default, the <command role=\"hg-ext-mq\">qpop</command> command will not "
|
dongsheng@627
|
769 "pop any patches if the working directory has been modified. You can override "
|
dongsheng@627
|
770 "this behaviour using the <option role=\"hg-ext-mq-cmd-qpop-opt\">-f</option> "
|
dongsheng@627
|
771 "option, which reverts all modifications in the working directory."
|
dongsheng@627
|
772 msgstr ""
|
dongsheng@627
|
773
|
dongsheng@627
|
774 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
775 #: ../en/appB-mq-ref.xml:266
|
dongsheng@627
|
776 msgid ""
|
dongsheng@627
|
777 "<option role=\"hg-ext-mq-cmd-qpop-opt\">-a</option>: Pop all applied "
|
dongsheng@627
|
778 "patches. This returns the repository to its state before you applied any "
|
dongsheng@627
|
779 "patches."
|
dongsheng@627
|
780 msgstr ""
|
dongsheng@627
|
781
|
dongsheng@627
|
782 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
783 #: ../en/appB-mq-ref.xml:271
|
dongsheng@627
|
784 msgid ""
|
dongsheng@627
|
785 "<option role=\"hg-ext-mq-cmd-qpop-opt\">-f</option>: Forcibly revert any "
|
dongsheng@627
|
786 "modifications to the working directory when popping."
|
dongsheng@627
|
787 msgstr ""
|
dongsheng@627
|
788
|
dongsheng@627
|
789 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
790 #: ../en/appB-mq-ref.xml:276
|
dongsheng@627
|
791 msgid ""
|
dongsheng@627
|
792 "<option role=\"hg-ext-mq-cmd-qpop-opt\">-n</option>: Pop a patch from the "
|
dongsheng@627
|
793 "named queue."
|
dongsheng@627
|
794 msgstr ""
|
dongsheng@627
|
795
|
dongsheng@627
|
796 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
797 #: ../en/appB-mq-ref.xml:281
|
dongsheng@627
|
798 msgid ""
|
dongsheng@627
|
799 "The <command role=\"hg-ext-mq\">qpop</command> command removes one line from "
|
dongsheng@627
|
800 "the end of the <filename role=\"special\">status</filename> file for each "
|
dongsheng@627
|
801 "patch that it pops."
|
dongsheng@627
|
802 msgstr ""
|
dongsheng@627
|
803
|
dongsheng@627
|
804 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
805 #: ../en/appB-mq-ref.xml:288
|
dongsheng@627
|
806 msgid ""
|
dongsheng@627
|
807 "<command role=\"hg-ext-mq\">qprev</command>&emdash;print the name of the "
|
dongsheng@627
|
808 "previous patch"
|
dongsheng@627
|
809 msgstr "<command role=\"hg-ext-mq\">qprev</command>&emdash;显示上个补丁的名称"
|
dongsheng@627
|
810
|
dongsheng@627
|
811 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
812 #: ../en/appB-mq-ref.xml:291
|
dongsheng@627
|
813 msgid ""
|
dongsheng@627
|
814 "The <command role=\"hg-ext-mq\">qprev</command> command prints the name of "
|
dongsheng@627
|
815 "the patch in the <filename role=\"special\">series</filename> file that comes "
|
dongsheng@627
|
816 "before the topmost applied patch. This will become the topmost applied patch "
|
dongsheng@627
|
817 "if you run <command role=\"hg-ext-mq\">qpop</command>."
|
dongsheng@627
|
818 msgstr ""
|
dongsheng@627
|
819
|
dongsheng@627
|
820 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
821 #: ../en/appB-mq-ref.xml:300
|
dongsheng@627
|
822 msgid ""
|
dongsheng@627
|
823 "<command role=\"hg-ext-mq\">qpush</command>&emdash;push patches onto the stack"
|
dongsheng@627
|
824 msgstr "<command role=\"hg-ext-mq\">qpush</command>&emdash;增加补丁到堆栈"
|
dongsheng@627
|
825
|
dongsheng@627
|
826 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
827 #: ../en/appB-mq-ref.xml:303
|
dongsheng@627
|
828 msgid ""
|
dongsheng@627
|
829 "The <command role=\"hg-ext-mq\">qpush</command> command adds patches onto the "
|
dongsheng@627
|
830 "applied stack. By default, it adds only one patch."
|
dongsheng@627
|
831 msgstr ""
|
dongsheng@627
|
832
|
dongsheng@627
|
833 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
834 #: ../en/appB-mq-ref.xml:307
|
dongsheng@627
|
835 msgid ""
|
dongsheng@627
|
836 "This command creates a new changeset to represent each applied patch, and "
|
dongsheng@627
|
837 "updates the working directory to apply the effects of the patches."
|
dongsheng@627
|
838 msgstr ""
|
dongsheng@627
|
839
|
dongsheng@627
|
840 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
841 #: ../en/appB-mq-ref.xml:311
|
dongsheng@627
|
842 msgid "The default data used when creating a changeset are as follows:"
|
dongsheng@627
|
843 msgstr ""
|
dongsheng@627
|
844
|
dongsheng@627
|
845 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
846 #: ../en/appB-mq-ref.xml:314
|
dongsheng@627
|
847 msgid ""
|
dongsheng@627
|
848 "The commit date and time zone are the current date and time zone. Because "
|
dongsheng@627
|
849 "these data are used to compute the identity of a changeset, this means that "
|
dongsheng@627
|
850 "if you <command role=\"hg-ext-mq\">qpop</command> a patch and <command role="
|
dongsheng@627
|
851 "\"hg-ext-mq\">qpush</command> it again, the changeset that you push will have "
|
dongsheng@627
|
852 "a different identity than the changeset you popped."
|
dongsheng@627
|
853 msgstr ""
|
dongsheng@627
|
854
|
dongsheng@627
|
855 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
856 #: ../en/appB-mq-ref.xml:322
|
dongsheng@627
|
857 msgid ""
|
dongsheng@627
|
858 "The author is the same as the default used by the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
859 "commit</command> command."
|
dongsheng@627
|
860 msgstr ""
|
dongsheng@627
|
861
|
dongsheng@627
|
862 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
863 #: ../en/appB-mq-ref.xml:326
|
dongsheng@627
|
864 msgid ""
|
dongsheng@627
|
865 "The commit message is any text from the patch file that comes before the "
|
dongsheng@627
|
866 "first diff header. If there is no such text, a default commit message is "
|
dongsheng@627
|
867 "used that identifies the name of the patch."
|
dongsheng@627
|
868 msgstr ""
|
dongsheng@627
|
869
|
dongsheng@627
|
870 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
871 #: ../en/appB-mq-ref.xml:331
|
dongsheng@627
|
872 msgid ""
|
dongsheng@627
|
873 "If a patch contains a Mercurial patch header (XXX add link), the information "
|
dongsheng@627
|
874 "in the patch header overrides these defaults."
|
dongsheng@627
|
875 msgstr ""
|
dongsheng@627
|
876
|
dongsheng@627
|
877 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
878 #: ../en/appB-mq-ref.xml:337
|
dongsheng@627
|
879 msgid ""
|
dongsheng@627
|
880 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-a</option>: Push all unapplied "
|
dongsheng@627
|
881 "patches from the <filename role=\"special\">series</filename> file until "
|
dongsheng@627
|
882 "there are none left to push."
|
dongsheng@627
|
883 msgstr ""
|
dongsheng@627
|
884
|
dongsheng@627
|
885 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
886 #: ../en/appB-mq-ref.xml:343
|
dongsheng@627
|
887 msgid ""
|
dongsheng@627
|
888 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-l</option>: Add the name of the "
|
dongsheng@627
|
889 "patch to the end of the commit message."
|
dongsheng@627
|
890 msgstr ""
|
dongsheng@627
|
891
|
dongsheng@627
|
892 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
893 #: ../en/appB-mq-ref.xml:347
|
dongsheng@627
|
894 msgid ""
|
dongsheng@627
|
895 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-m</option>: If a patch fails to "
|
dongsheng@627
|
896 "apply cleanly, use the entry for the patch in another saved queue to compute "
|
dongsheng@627
|
897 "the parameters for a three-way merge, and perform a three-way merge using the "
|
dongsheng@627
|
898 "normal Mercurial merge machinery. Use the resolution of the merge as the new "
|
dongsheng@627
|
899 "patch content."
|
dongsheng@627
|
900 msgstr ""
|
dongsheng@627
|
901
|
dongsheng@627
|
902 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
903 #: ../en/appB-mq-ref.xml:355
|
dongsheng@627
|
904 msgid ""
|
dongsheng@627
|
905 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-n</option>: Use the named queue if "
|
dongsheng@627
|
906 "merging while pushing."
|
dongsheng@627
|
907 msgstr ""
|
dongsheng@627
|
908
|
dongsheng@627
|
909 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
910 #: ../en/appB-mq-ref.xml:360
|
dongsheng@627
|
911 msgid ""
|
dongsheng@627
|
912 "The <command role=\"hg-ext-mq\">qpush</command> command reads, but does not "
|
dongsheng@627
|
913 "modify, the <filename role=\"special\">series</filename> file. It appends "
|
dongsheng@627
|
914 "one line to the <command role=\"hg-cmd\">hg status</command> file for each "
|
dongsheng@627
|
915 "patch that it pushes."
|
dongsheng@627
|
916 msgstr ""
|
dongsheng@627
|
917
|
dongsheng@627
|
918 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
919 #: ../en/appB-mq-ref.xml:368
|
dongsheng@627
|
920 msgid ""
|
dongsheng@627
|
921 "<command role=\"hg-ext-mq\">qrefresh</command>&emdash;update the topmost "
|
dongsheng@627
|
922 "applied patch"
|
dongsheng@627
|
923 msgstr "<command role=\"hg-ext-mq\">qrefresh</command>&emdash;更新最新的补丁"
|
dongsheng@627
|
924
|
dongsheng@627
|
925 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
926 #: ../en/appB-mq-ref.xml:372
|
dongsheng@627
|
927 msgid ""
|
dongsheng@627
|
928 "The <command role=\"hg-ext-mq\">qrefresh</command> command updates the "
|
dongsheng@627
|
929 "topmost applied patch. It modifies the patch, removes the old changeset that "
|
dongsheng@627
|
930 "represented the patch, and creates a new changeset to represent the modified "
|
dongsheng@627
|
931 "patch."
|
dongsheng@627
|
932 msgstr ""
|
dongsheng@627
|
933
|
dongsheng@627
|
934 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
935 #: ../en/appB-mq-ref.xml:378
|
dongsheng@627
|
936 msgid ""
|
dongsheng@627
|
937 "The <command role=\"hg-ext-mq\">qrefresh</command> command looks for the "
|
dongsheng@627
|
938 "following modifications:"
|
dongsheng@627
|
939 msgstr ""
|
dongsheng@627
|
940
|
dongsheng@627
|
941 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
942 #: ../en/appB-mq-ref.xml:381
|
dongsheng@627
|
943 msgid ""
|
dongsheng@627
|
944 "Changes to the commit message, i.e. the text before the first diff header in "
|
dongsheng@627
|
945 "the patch file, are reflected in the new changeset that represents the patch."
|
dongsheng@627
|
946 msgstr ""
|
dongsheng@627
|
947
|
dongsheng@627
|
948 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
949 #: ../en/appB-mq-ref.xml:386
|
dongsheng@627
|
950 msgid ""
|
dongsheng@627
|
951 "Modifications to tracked files in the working directory are added to the "
|
dongsheng@627
|
952 "patch."
|
dongsheng@627
|
953 msgstr ""
|
dongsheng@627
|
954
|
dongsheng@627
|
955 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
956 #: ../en/appB-mq-ref.xml:389
|
dongsheng@627
|
957 msgid ""
|
dongsheng@627
|
958 "Changes to the files tracked using <command role=\"hg-cmd\">hg add</command>, "
|
dongsheng@627
|
959 "<command role=\"hg-cmd\">hg copy</command>, <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
960 "remove</command>, or <command role=\"hg-cmd\">hg rename</command>. Added "
|
dongsheng@627
|
961 "files and copy and rename destinations are added to the patch, while removed "
|
dongsheng@627
|
962 "files and rename sources are removed."
|
dongsheng@627
|
963 msgstr ""
|
dongsheng@627
|
964
|
dongsheng@627
|
965 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
966 #: ../en/appB-mq-ref.xml:398
|
dongsheng@627
|
967 msgid ""
|
dongsheng@627
|
968 "Even if <command role=\"hg-ext-mq\">qrefresh</command> detects no changes, it "
|
dongsheng@627
|
969 "still recreates the changeset that represents the patch. This causes the "
|
dongsheng@627
|
970 "identity of the changeset to differ from the previous changeset that "
|
dongsheng@627
|
971 "identified the patch."
|
dongsheng@627
|
972 msgstr ""
|
dongsheng@627
|
973
|
dongsheng@627
|
974 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
975 #: ../en/appB-mq-ref.xml:406
|
dongsheng@627
|
976 msgid ""
|
dongsheng@627
|
977 "<option role=\"hg-ext-mq-cmd-qrefresh-opt\">-e</option>: Modify the commit "
|
dongsheng@627
|
978 "and patch description, using the preferred text editor."
|
dongsheng@627
|
979 msgstr ""
|
dongsheng@627
|
980
|
dongsheng@627
|
981 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
982 #: ../en/appB-mq-ref.xml:411
|
dongsheng@627
|
983 msgid ""
|
dongsheng@627
|
984 "<option role=\"hg-ext-mq-cmd-qrefresh-opt\">-m</option>: Modify the commit "
|
dongsheng@627
|
985 "message and patch description, using the given text."
|
dongsheng@627
|
986 msgstr ""
|
dongsheng@627
|
987
|
dongsheng@627
|
988 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
989 #: ../en/appB-mq-ref.xml:416
|
dongsheng@627
|
990 msgid ""
|
dongsheng@627
|
991 "<option role=\"hg-ext-mq-cmd-qrefresh-opt\">-l</option>: Modify the commit "
|
dongsheng@627
|
992 "message and patch description, using text from the given file."
|
dongsheng@627
|
993 msgstr ""
|
dongsheng@627
|
994
|
dongsheng@627
|
995 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
996 #: ../en/appB-mq-ref.xml:424
|
dongsheng@627
|
997 msgid "<command role=\"hg-ext-mq\">qrename</command>&emdash;rename a patch"
|
dongsheng@627
|
998 msgstr "<command role=\"hg-ext-mq\">qrename</command>&emdash;改名补丁"
|
dongsheng@627
|
999
|
dongsheng@627
|
1000 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1001 #: ../en/appB-mq-ref.xml:427
|
dongsheng@627
|
1002 msgid ""
|
dongsheng@627
|
1003 "The <command role=\"hg-ext-mq\">qrename</command> command renames a patch, "
|
dongsheng@627
|
1004 "and changes the entry for the patch in the <filename role=\"special\">series</"
|
dongsheng@627
|
1005 "filename> file."
|
dongsheng@627
|
1006 msgstr ""
|
dongsheng@627
|
1007
|
dongsheng@627
|
1008 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1009 #: ../en/appB-mq-ref.xml:431
|
dongsheng@627
|
1010 msgid ""
|
dongsheng@627
|
1011 "With a single argument, <command role=\"hg-ext-mq\">qrename</command> renames "
|
dongsheng@627
|
1012 "the topmost applied patch. With two arguments, it renames its first argument "
|
dongsheng@627
|
1013 "to its second."
|
dongsheng@627
|
1014 msgstr ""
|
dongsheng@627
|
1015
|
dongsheng@627
|
1016 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1017 #: ../en/appB-mq-ref.xml:438
|
dongsheng@627
|
1018 msgid ""
|
dongsheng@627
|
1019 "<command role=\"hg-ext-mq\">qrestore</command>&emdash;restore saved queue "
|
dongsheng@627
|
1020 "state"
|
dongsheng@627
|
1021 msgstr "<command role=\"hg-ext-mq\">qrestore</command>&emdash;恢复保存的队列"
|
dongsheng@627
|
1022
|
dongsheng@627
|
1023 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1024 #: ../en/appB-mq-ref.xml:442
|
dongsheng@627
|
1025 msgid "XXX No idea what this does."
|
dongsheng@627
|
1026 msgstr ""
|
dongsheng@627
|
1027
|
dongsheng@627
|
1028 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1029 #: ../en/appB-mq-ref.xml:446
|
dongsheng@627
|
1030 msgid ""
|
dongsheng@627
|
1031 "<command role=\"hg-ext-mq\">qsave</command>&emdash;save current queue state"
|
dongsheng@627
|
1032 msgstr "<command role=\"hg-ext-mq\">qsave</command>&emdash;保存当前的队列状态"
|
dongsheng@627
|
1033
|
dongsheng@627
|
1034 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1035 #: ../en/appB-mq-ref.xml:449
|
dongsheng@627
|
1036 msgid "XXX Likewise."
|
dongsheng@627
|
1037 msgstr ""
|
dongsheng@627
|
1038
|
dongsheng@627
|
1039 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1040 #: ../en/appB-mq-ref.xml:453
|
dongsheng@627
|
1041 msgid ""
|
dongsheng@627
|
1042 "<command role=\"hg-ext-mq\">qseries</command>&emdash;print the entire patch "
|
dongsheng@627
|
1043 "series"
|
dongsheng@627
|
1044 msgstr "<command role=\"hg-ext-mq\">qseries</command>&emdash;显示补丁序列"
|
dongsheng@627
|
1045
|
dongsheng@627
|
1046 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1047 #: ../en/appB-mq-ref.xml:456
|
dongsheng@627
|
1048 msgid ""
|
dongsheng@627
|
1049 "The <command role=\"hg-ext-mq\">qseries</command> command prints the entire "
|
dongsheng@627
|
1050 "patch series from the <filename role=\"special\">series</filename> file. It "
|
dongsheng@627
|
1051 "prints only patch names, not empty lines or comments. It prints in order "
|
dongsheng@627
|
1052 "from first to be applied to last."
|
dongsheng@627
|
1053 msgstr ""
|
dongsheng@627
|
1054
|
dongsheng@627
|
1055 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1056 #: ../en/appB-mq-ref.xml:464
|
dongsheng@627
|
1057 msgid ""
|
dongsheng@627
|
1058 "<command role=\"hg-ext-mq\">qtop</command>&emdash;print the name of the "
|
dongsheng@627
|
1059 "current patch"
|
dongsheng@627
|
1060 msgstr "<command role=\"hg-ext-mq\">qtop</command>&emdash;显示当前补丁的名称"
|
dongsheng@627
|
1061
|
dongsheng@627
|
1062 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1063 #: ../en/appB-mq-ref.xml:467
|
dongsheng@627
|
1064 msgid ""
|
dongsheng@627
|
1065 "The <command role=\"hg-ext-mq\">qtop</command> prints the name of the topmost "
|
dongsheng@627
|
1066 "currently applied patch."
|
dongsheng@627
|
1067 msgstr ""
|
dongsheng@627
|
1068
|
dongsheng@627
|
1069 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1070 #: ../en/appB-mq-ref.xml:472
|
dongsheng@627
|
1071 msgid ""
|
dongsheng@627
|
1072 "<command role=\"hg-ext-mq\">qunapplied</command>&emdash;print patches not yet "
|
dongsheng@627
|
1073 "applied"
|
dongsheng@627
|
1074 msgstr ""
|
dongsheng@627
|
1075 "<command role=\"hg-ext-mq\">qunapplied</command>&emdash;显示尚未应用的补丁"
|
dongsheng@627
|
1076
|
dongsheng@627
|
1077 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1078 #: ../en/appB-mq-ref.xml:476
|
dongsheng@627
|
1079 msgid ""
|
dongsheng@627
|
1080 "The <command role=\"hg-ext-mq\">qunapplied</command> command prints the names "
|
dongsheng@627
|
1081 "of patches from the <filename role=\"special\">series</filename> file that "
|
dongsheng@627
|
1082 "are not yet applied. It prints them in order from the next patch that will "
|
dongsheng@627
|
1083 "be pushed to the last."
|
dongsheng@627
|
1084 msgstr ""
|
dongsheng@627
|
1085
|
dongsheng@627
|
1086 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1087 #: ../en/appB-mq-ref.xml:484
|
dongsheng@627
|
1088 msgid ""
|
dongsheng@627
|
1089 "<command role=\"hg-cmd\">hg strip</command>&emdash;remove a revision and "
|
dongsheng@627
|
1090 "descendants"
|
dongsheng@627
|
1091 msgstr "<command role=\"hg-cmd\">hg strip</command>&emdash;删除一个版本及其后继"
|
dongsheng@627
|
1092
|
dongsheng@627
|
1093 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1094 #: ../en/appB-mq-ref.xml:487
|
dongsheng@627
|
1095 msgid ""
|
dongsheng@627
|
1096 "The <command role=\"hg-cmd\">hg strip</command> command removes a revision, "
|
dongsheng@627
|
1097 "and all of its descendants, from the repository. It undoes the effects of "
|
dongsheng@627
|
1098 "the removed revisions from the repository, and updates the working directory "
|
dongsheng@627
|
1099 "to the first parent of the removed revision."
|
dongsheng@627
|
1100 msgstr ""
|
dongsheng@627
|
1101
|
dongsheng@627
|
1102 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1103 #: ../en/appB-mq-ref.xml:493
|
dongsheng@627
|
1104 msgid ""
|
dongsheng@627
|
1105 "The <command role=\"hg-cmd\">hg strip</command> command saves a backup of the "
|
dongsheng@627
|
1106 "removed changesets in a bundle, so that they can be reapplied if removed in "
|
dongsheng@627
|
1107 "error."
|
dongsheng@627
|
1108 msgstr ""
|
dongsheng@627
|
1109
|
dongsheng@627
|
1110 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
1111 #: ../en/appB-mq-ref.xml:499
|
dongsheng@627
|
1112 msgid ""
|
dongsheng@627
|
1113 "<option role=\"hg-opt-strip\">-b</option>: Save unrelated changesets that are "
|
dongsheng@627
|
1114 "intermixed with the stripped changesets in the backup bundle."
|
dongsheng@627
|
1115 msgstr ""
|
dongsheng@627
|
1116
|
dongsheng@627
|
1117 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
1118 #: ../en/appB-mq-ref.xml:503
|
dongsheng@627
|
1119 msgid ""
|
dongsheng@627
|
1120 "<option role=\"hg-opt-strip\">-f</option>: If a branch has multiple heads, "
|
dongsheng@627
|
1121 "remove all heads. XXX This should be renamed, and use <literal>-f</literal> "
|
dongsheng@627
|
1122 "to strip revs when there are pending changes."
|
dongsheng@627
|
1123 msgstr ""
|
dongsheng@627
|
1124
|
dongsheng@627
|
1125 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
1126 #: ../en/appB-mq-ref.xml:508
|
dongsheng@627
|
1127 msgid "<option role=\"hg-opt-strip\">-n</option>: Do not save a backup bundle."
|
dongsheng@627
|
1128 msgstr ""
|
dongsheng@627
|
1129
|
dongsheng@627
|
1130 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@650
|
1131 #: ../en/appB-mq-ref.xml:515
|
dongsheng@627
|
1132 msgid "MQ file reference"
|
dongsheng@627
|
1133 msgstr "MQ 文件参考"
|
dongsheng@627
|
1134
|
dongsheng@627
|
1135 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1136 #: ../en/appB-mq-ref.xml:518
|
dongsheng@627
|
1137 msgid "The <filename role=\"special\">series</filename> file"
|
dongsheng@627
|
1138 msgstr "<filename role=\"special\">序列</filename>文件"
|
dongsheng@627
|
1139
|
dongsheng@627
|
1140 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1141 #: ../en/appB-mq-ref.xml:521
|
dongsheng@627
|
1142 msgid ""
|
dongsheng@627
|
1143 "The <filename role=\"special\">series</filename> file contains a list of the "
|
dongsheng@627
|
1144 "names of all patches that MQ can apply. It is represented as a list of "
|
dongsheng@627
|
1145 "names, with one name saved per line. Leading and trailing white space in "
|
dongsheng@627
|
1146 "each line are ignored."
|
dongsheng@627
|
1147 msgstr ""
|
dongsheng@627
|
1148
|
dongsheng@627
|
1149 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1150 #: ../en/appB-mq-ref.xml:527
|
dongsheng@627
|
1151 msgid ""
|
dongsheng@627
|
1152 "Lines may contain comments. A comment begins with the <quote><literal>#</"
|
dongsheng@627
|
1153 "literal></quote> character, and extends to the end of the line. Empty lines, "
|
dongsheng@627
|
1154 "and lines that contain only comments, are ignored."
|
dongsheng@627
|
1155 msgstr ""
|
dongsheng@627
|
1156
|
dongsheng@627
|
1157 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1158 #: ../en/appB-mq-ref.xml:532
|
dongsheng@627
|
1159 msgid ""
|
dongsheng@627
|
1160 "You will often need to edit the <filename role=\"special\">series</filename> "
|
dongsheng@627
|
1161 "file by hand, hence the support for comments and empty lines noted above. "
|
dongsheng@627
|
1162 "For example, you can comment out a patch temporarily, and <command role=\"hg-"
|
dongsheng@627
|
1163 "ext-mq\">qpush</command> will skip over that patch when applying patches. "
|
dongsheng@627
|
1164 "You can also change the order in which patches are applied by reordering "
|
dongsheng@627
|
1165 "their entries in the <filename role=\"special\">series</filename> file."
|
dongsheng@627
|
1166 msgstr ""
|
dongsheng@627
|
1167
|
dongsheng@627
|
1168 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1169 #: ../en/appB-mq-ref.xml:541
|
dongsheng@627
|
1170 msgid ""
|
dongsheng@627
|
1171 "Placing the <filename role=\"special\">series</filename> file under revision "
|
dongsheng@627
|
1172 "control is also supported; it is a good idea to place all of the patches that "
|
dongsheng@627
|
1173 "it refers to under revision control, as well. If you create a patch "
|
dongsheng@627
|
1174 "directory using the <option role=\"hg-ext-mq-cmd-qinit-opt\">-c</option> "
|
dongsheng@627
|
1175 "option to <command role=\"hg-ext-mq\">qinit</command>, this will be done for "
|
dongsheng@627
|
1176 "you automatically."
|
dongsheng@627
|
1177 msgstr ""
|
dongsheng@627
|
1178
|
dongsheng@627
|
1179 #. type: Content of: <book><appendix><sect1><sect2><title>
|
dongsheng@650
|
1180 #: ../en/appB-mq-ref.xml:551
|
dongsheng@627
|
1181 msgid "The <filename role=\"special\">status</filename> file"
|
dongsheng@627
|
1182 msgstr "<filename role=\"special\">状态</filename>文件"
|
dongsheng@627
|
1183
|
dongsheng@627
|
1184 #. type: Content of: <book><appendix><sect1><sect2><para>
|
dongsheng@650
|
1185 #: ../en/appB-mq-ref.xml:554
|
dongsheng@627
|
1186 msgid ""
|
dongsheng@627
|
1187 "The <filename role=\"special\">status</filename> file contains the names and "
|
dongsheng@627
|
1188 "changeset hashes of all patches that MQ currently has applied. Unlike the "
|
dongsheng@627
|
1189 "<filename role=\"special\">series</filename> file, this file is not intended "
|
dongsheng@627
|
1190 "for editing. You should not place this file under revision control, or "
|
dongsheng@627
|
1191 "modify it in any way. It is used by MQ strictly for internal book-keeping."
|
dongsheng@627
|
1192 msgstr ""
|
dongsheng@627
|
1193
|
dongsheng@627
|
1194 #. type: Content of: <book><appendix><title>
|
dongsheng@627
|
1195 #: ../en/appC-srcinstall.xml:5
|
dongsheng@627
|
1196 msgid "Installing Mercurial from source"
|
dongsheng@627
|
1197 msgstr "从源代码安装 Mercurial"
|
dongsheng@627
|
1198
|
dongsheng@627
|
1199 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1200 #: ../en/appC-srcinstall.xml:8
|
dongsheng@627
|
1201 msgid "On a Unix-like system"
|
dongsheng@627
|
1202 msgstr "类 Unix 系统"
|
dongsheng@627
|
1203
|
dongsheng@627
|
1204 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1205 #: ../en/appC-srcinstall.xml:10
|
dongsheng@627
|
1206 msgid ""
|
dongsheng@627
|
1207 "If you are using a Unix-like system that has a sufficiently recent version of "
|
dongsheng@627
|
1208 "Python (2.3 or newer) available, it is easy to install Mercurial from source."
|
dongsheng@627
|
1209 msgstr ""
|
dongsheng@627
|
1210
|
dongsheng@627
|
1211 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1212 #: ../en/appC-srcinstall.xml:14
|
dongsheng@627
|
1213 msgid ""
|
dongsheng@627
|
1214 "Download a recent source tarball from <ulink url=\"http://www.selenic.com/"
|
dongsheng@627
|
1215 "mercurial/download\">http://www.selenic.com/mercurial/download</ulink>."
|
dongsheng@627
|
1216 msgstr ""
|
dongsheng@627
|
1217
|
dongsheng@627
|
1218 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1219 #: ../en/appC-srcinstall.xml:17
|
dongsheng@627
|
1220 msgid "Unpack the tarball:"
|
dongsheng@627
|
1221 msgstr ""
|
dongsheng@627
|
1222
|
dongsheng@627
|
1223 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1224 #: ../en/appC-srcinstall.xml:20
|
dongsheng@627
|
1225 msgid ""
|
dongsheng@627
|
1226 "Go into the source directory and run the installer script. This will build "
|
dongsheng@627
|
1227 "Mercurial and install it in your home directory."
|
dongsheng@627
|
1228 msgstr ""
|
dongsheng@627
|
1229
|
dongsheng@627
|
1230 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1231 #: ../en/appC-srcinstall.xml:27
|
dongsheng@627
|
1232 msgid ""
|
dongsheng@627
|
1233 "Once the install finishes, Mercurial will be in the <literal>bin</literal> "
|
dongsheng@627
|
1234 "subdirectory of your home directory. Don't forget to make sure that this "
|
dongsheng@627
|
1235 "directory is present in your shell's search path."
|
dongsheng@627
|
1236 msgstr ""
|
dongsheng@627
|
1237
|
dongsheng@627
|
1238 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1239 #: ../en/appC-srcinstall.xml:32
|
dongsheng@627
|
1240 msgid ""
|
dongsheng@627
|
1241 "You will probably need to set the <envar>PYTHONPATH</envar> environment "
|
dongsheng@627
|
1242 "variable so that the Mercurial executable can find the rest of the Mercurial "
|
dongsheng@627
|
1243 "packages. For example, on my laptop, I have set it to <literal>/home/bos/lib/"
|
dongsheng@627
|
1244 "python</literal>. The exact path that you will need to use depends on how "
|
dongsheng@627
|
1245 "Python was built for your system, but should be easy to figure out. If "
|
dongsheng@627
|
1246 "you're uncertain, look through the output of the installer script above, and "
|
dongsheng@627
|
1247 "see where the contents of the <literal>mercurial</literal> directory were "
|
dongsheng@627
|
1248 "installed to."
|
dongsheng@627
|
1249 msgstr ""
|
dongsheng@627
|
1250
|
dongsheng@627
|
1251 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1252 #: ../en/appC-srcinstall.xml:44
|
dongsheng@627
|
1253 msgid "On Windows"
|
dongsheng@627
|
1254 msgstr "Windows 系统"
|
dongsheng@627
|
1255
|
dongsheng@627
|
1256 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1257 #: ../en/appC-srcinstall.xml:46
|
dongsheng@627
|
1258 msgid ""
|
dongsheng@627
|
1259 "Building and installing Mercurial on Windows requires a variety of tools, a "
|
dongsheng@627
|
1260 "fair amount of technical knowledge, and considerable patience. I very much "
|
dongsheng@627
|
1261 "<emphasis>do not recommend</emphasis> this route if you are a <quote>casual "
|
dongsheng@627
|
1262 "user</quote>. Unless you intend to hack on Mercurial, I strongly suggest "
|
dongsheng@627
|
1263 "that you use a binary package instead."
|
dongsheng@627
|
1264 msgstr ""
|
dongsheng@627
|
1265
|
dongsheng@627
|
1266 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1267 #: ../en/appC-srcinstall.xml:53
|
dongsheng@627
|
1268 msgid ""
|
dongsheng@627
|
1269 "If you are intent on building Mercurial from source on Windows, follow the "
|
dongsheng@627
|
1270 "<quote>hard way</quote> directions on the Mercurial wiki at <ulink url="
|
dongsheng@627
|
1271 "\"http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall\">http://www."
|
dongsheng@627
|
1272 "selenic.com/mercurial/wiki/index.cgi/WindowsInstall</ulink>, and expect the "
|
dongsheng@627
|
1273 "process to involve a lot of fiddly work."
|
dongsheng@627
|
1274 msgstr ""
|
dongsheng@627
|
1275
|
dongsheng@627
|
1276 #. type: Content of: <book><appendix><title>
|
dongsheng@627
|
1277 #: ../en/appD-license.xml:5
|
dongsheng@627
|
1278 msgid "Open Publication License"
|
dongsheng@627
|
1279 msgstr ""
|
dongsheng@627
|
1280
|
dongsheng@627
|
1281 #. type: Content of: <book><appendix><para>
|
dongsheng@627
|
1282 #: ../en/appD-license.xml:7
|
dongsheng@627
|
1283 msgid "Version 1.0, 8 June 1999"
|
dongsheng@627
|
1284 msgstr ""
|
dongsheng@627
|
1285
|
dongsheng@627
|
1286 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1287 #: ../en/appD-license.xml:10
|
dongsheng@627
|
1288 msgid "Requirements on both unmodified and modified versions"
|
dongsheng@627
|
1289 msgstr ""
|
dongsheng@627
|
1290
|
dongsheng@627
|
1291 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1292 #: ../en/appD-license.xml:13
|
dongsheng@627
|
1293 msgid ""
|
dongsheng@627
|
1294 "The Open Publication works may be reproduced and distributed in whole or in "
|
dongsheng@627
|
1295 "part, in any medium physical or electronic, provided that the terms of this "
|
dongsheng@627
|
1296 "license are adhered to, and that this license or an incorporation of it by "
|
dongsheng@627
|
1297 "reference (with any options elected by the author(s) and/or publisher) is "
|
dongsheng@627
|
1298 "displayed in the reproduction."
|
dongsheng@627
|
1299 msgstr ""
|
dongsheng@627
|
1300
|
dongsheng@627
|
1301 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1302 #: ../en/appD-license.xml:20
|
dongsheng@627
|
1303 msgid "Proper form for an incorporation by reference is as follows:"
|
dongsheng@627
|
1304 msgstr ""
|
dongsheng@627
|
1305
|
dongsheng@627
|
1306 #. type: Content of: <book><appendix><sect1><blockquote><para>
|
dongsheng@627
|
1307 #: ../en/appD-license.xml:24
|
dongsheng@627
|
1308 msgid ""
|
dongsheng@627
|
1309 "Copyright (c) <emphasis>year</emphasis> by <emphasis>author's name or "
|
dongsheng@627
|
1310 "designee</emphasis>. This material may be distributed only subject to the "
|
dongsheng@627
|
1311 "terms and conditions set forth in the Open Publication License, v<emphasis>x."
|
dongsheng@627
|
1312 "y</emphasis> or later (the latest version is presently available at <ulink "
|
dongsheng@627
|
1313 "url=\"http://www.opencontent.org/openpub/\">http://www.opencontent.org/"
|
dongsheng@627
|
1314 "openpub/</ulink>)."
|
dongsheng@627
|
1315 msgstr ""
|
dongsheng@627
|
1316
|
dongsheng@627
|
1317 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1318 #: ../en/appD-license.xml:33
|
dongsheng@627
|
1319 msgid ""
|
dongsheng@627
|
1320 "The reference must be immediately followed with any options elected by the "
|
dongsheng@627
|
1321 "author(s) and/or publisher of the document (see section <xref linkend=\"sec."
|
dongsheng@627
|
1322 "opl.options\"/>)."
|
dongsheng@627
|
1323 msgstr ""
|
dongsheng@627
|
1324
|
dongsheng@627
|
1325 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1326 #: ../en/appD-license.xml:37
|
dongsheng@627
|
1327 msgid ""
|
dongsheng@627
|
1328 "Commercial redistribution of Open Publication-licensed material is permitted."
|
dongsheng@627
|
1329 msgstr ""
|
dongsheng@627
|
1330
|
dongsheng@627
|
1331 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1332 #: ../en/appD-license.xml:40
|
dongsheng@627
|
1333 msgid ""
|
dongsheng@627
|
1334 "Any publication in standard (paper) book form shall require the citation of "
|
dongsheng@627
|
1335 "the original publisher and author. The publisher and author's names shall "
|
dongsheng@627
|
1336 "appear on all outer surfaces of the book. On all outer surfaces of the book "
|
dongsheng@627
|
1337 "the original publisher's name shall be as large as the title of the work and "
|
dongsheng@627
|
1338 "cited as possessive with respect to the title."
|
dongsheng@627
|
1339 msgstr ""
|
dongsheng@627
|
1340
|
dongsheng@627
|
1341 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1342 #: ../en/appD-license.xml:49
|
dongsheng@627
|
1343 msgid "Copyright"
|
dongsheng@627
|
1344 msgstr ""
|
dongsheng@627
|
1345
|
dongsheng@627
|
1346 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1347 #: ../en/appD-license.xml:51
|
dongsheng@627
|
1348 msgid ""
|
dongsheng@627
|
1349 "The copyright to each Open Publication is owned by its author(s) or designee."
|
dongsheng@627
|
1350 msgstr ""
|
dongsheng@627
|
1351
|
dongsheng@627
|
1352 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1353 #: ../en/appD-license.xml:56
|
dongsheng@627
|
1354 msgid "Scope of license"
|
dongsheng@627
|
1355 msgstr ""
|
dongsheng@627
|
1356
|
dongsheng@627
|
1357 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1358 #: ../en/appD-license.xml:58
|
dongsheng@627
|
1359 msgid ""
|
dongsheng@627
|
1360 "The following license terms apply to all Open Publication works, unless "
|
dongsheng@627
|
1361 "otherwise explicitly stated in the document."
|
dongsheng@627
|
1362 msgstr ""
|
dongsheng@627
|
1363
|
dongsheng@627
|
1364 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1365 #: ../en/appD-license.xml:62
|
dongsheng@627
|
1366 msgid ""
|
dongsheng@627
|
1367 "Mere aggregation of Open Publication works or a portion of an Open "
|
dongsheng@627
|
1368 "Publication work with other works or programs on the same media shall not "
|
dongsheng@627
|
1369 "cause this license to apply to those other works. The aggregate work shall "
|
dongsheng@627
|
1370 "contain a notice specifying the inclusion of the Open Publication material "
|
dongsheng@627
|
1371 "and appropriate copyright notice."
|
dongsheng@627
|
1372 msgstr ""
|
dongsheng@627
|
1373
|
dongsheng@627
|
1374 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1375 #: ../en/appD-license.xml:69
|
dongsheng@627
|
1376 msgid ""
|
dongsheng@627
|
1377 "<emphasis role=\"bold\">Severability</emphasis>. If any part of this license "
|
dongsheng@627
|
1378 "is found to be unenforceable in any jurisdiction, the remaining portions of "
|
dongsheng@627
|
1379 "the license remain in force."
|
dongsheng@627
|
1380 msgstr ""
|
dongsheng@627
|
1381
|
dongsheng@627
|
1382 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1383 #: ../en/appD-license.xml:74
|
dongsheng@627
|
1384 msgid ""
|
dongsheng@627
|
1385 "<emphasis role=\"bold\">No warranty</emphasis>. Open Publication works are "
|
dongsheng@627
|
1386 "licensed and provided <quote>as is</quote> without warranty of any kind, "
|
dongsheng@627
|
1387 "express or implied, including, but not limited to, the implied warranties of "
|
dongsheng@627
|
1388 "merchantability and fitness for a particular purpose or a warranty of non-"
|
dongsheng@627
|
1389 "infringement."
|
dongsheng@627
|
1390 msgstr ""
|
dongsheng@627
|
1391
|
dongsheng@627
|
1392 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1393 #: ../en/appD-license.xml:83
|
dongsheng@627
|
1394 msgid "Requirements on modified works"
|
dongsheng@627
|
1395 msgstr ""
|
dongsheng@627
|
1396
|
dongsheng@627
|
1397 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1398 #: ../en/appD-license.xml:85
|
dongsheng@627
|
1399 msgid ""
|
dongsheng@627
|
1400 "All modified versions of documents covered by this license, including "
|
dongsheng@627
|
1401 "translations, anthologies, compilations and partial documents, must meet the "
|
dongsheng@627
|
1402 "following requirements:"
|
dongsheng@627
|
1403 msgstr ""
|
dongsheng@627
|
1404
|
dongsheng@627
|
1405 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1406 #: ../en/appD-license.xml:90
|
dongsheng@627
|
1407 msgid "The modified version must be labeled as such."
|
dongsheng@627
|
1408 msgstr ""
|
dongsheng@627
|
1409
|
dongsheng@627
|
1410 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1411 #: ../en/appD-license.xml:93
|
dongsheng@627
|
1412 msgid ""
|
dongsheng@627
|
1413 "The person making the modifications must be identified and the modifications "
|
dongsheng@627
|
1414 "dated."
|
dongsheng@627
|
1415 msgstr ""
|
dongsheng@627
|
1416
|
dongsheng@627
|
1417 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1418 #: ../en/appD-license.xml:96
|
dongsheng@627
|
1419 msgid ""
|
dongsheng@627
|
1420 "Acknowledgement of the original author and publisher if applicable must be "
|
dongsheng@627
|
1421 "retained according to normal academic citation practices."
|
dongsheng@627
|
1422 msgstr ""
|
dongsheng@627
|
1423
|
dongsheng@627
|
1424 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1425 #: ../en/appD-license.xml:100
|
dongsheng@627
|
1426 msgid "The location of the original unmodified document must be identified."
|
dongsheng@627
|
1427 msgstr ""
|
dongsheng@627
|
1428
|
dongsheng@627
|
1429 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1430 #: ../en/appD-license.xml:103
|
dongsheng@627
|
1431 msgid ""
|
dongsheng@627
|
1432 "The original author's (or authors') name(s) may not be used to assert or "
|
dongsheng@627
|
1433 "imply endorsement of the resulting document without the original author's (or "
|
dongsheng@627
|
1434 "authors') permission."
|
dongsheng@627
|
1435 msgstr ""
|
dongsheng@627
|
1436
|
dongsheng@627
|
1437 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1438 #: ../en/appD-license.xml:111
|
dongsheng@627
|
1439 msgid "Good-practice recommendations"
|
dongsheng@627
|
1440 msgstr ""
|
dongsheng@627
|
1441
|
dongsheng@627
|
1442 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1443 #: ../en/appD-license.xml:113
|
dongsheng@627
|
1444 msgid ""
|
dongsheng@627
|
1445 "In addition to the requirements of this license, it is requested from and "
|
dongsheng@627
|
1446 "strongly recommended of redistributors that:"
|
dongsheng@627
|
1447 msgstr ""
|
dongsheng@627
|
1448
|
dongsheng@627
|
1449 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1450 #: ../en/appD-license.xml:118
|
dongsheng@627
|
1451 msgid ""
|
dongsheng@627
|
1452 "If you are distributing Open Publication works on hardcopy or CD-ROM, you "
|
dongsheng@627
|
1453 "provide email notification to the authors of your intent to redistribute at "
|
dongsheng@627
|
1454 "least thirty days before your manuscript or media freeze, to give the authors "
|
dongsheng@627
|
1455 "time to provide updated documents. This notification should describe "
|
dongsheng@627
|
1456 "modifications, if any, made to the document."
|
dongsheng@627
|
1457 msgstr ""
|
dongsheng@627
|
1458
|
dongsheng@627
|
1459 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1460 #: ../en/appD-license.xml:125
|
dongsheng@627
|
1461 msgid ""
|
dongsheng@627
|
1462 "All substantive modifications (including deletions) be either clearly marked "
|
dongsheng@627
|
1463 "up in the document or else described in an attachment to the document."
|
dongsheng@627
|
1464 msgstr ""
|
dongsheng@627
|
1465
|
dongsheng@627
|
1466 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1467 #: ../en/appD-license.xml:129
|
dongsheng@627
|
1468 msgid ""
|
dongsheng@627
|
1469 "Finally, while it is not mandatory under this license, it is considered good "
|
dongsheng@627
|
1470 "form to offer a free copy of any hardcopy and CD-ROM expression of an Open "
|
dongsheng@627
|
1471 "Publication-licensed work to its author(s)."
|
dongsheng@627
|
1472 msgstr ""
|
dongsheng@627
|
1473
|
dongsheng@627
|
1474 #. type: Content of: <book><appendix><sect1><title>
|
dongsheng@627
|
1475 #: ../en/appD-license.xml:137
|
dongsheng@627
|
1476 msgid "License options"
|
dongsheng@627
|
1477 msgstr ""
|
dongsheng@627
|
1478
|
dongsheng@627
|
1479 #. type: Content of: <book><appendix><sect1><para>
|
dongsheng@627
|
1480 #: ../en/appD-license.xml:139
|
dongsheng@627
|
1481 msgid ""
|
dongsheng@627
|
1482 "The author(s) and/or publisher of an Open Publication-licensed document may "
|
dongsheng@627
|
1483 "elect certain options by appending language to the reference to or copy of "
|
dongsheng@627
|
1484 "the license. These options are considered part of the license instance and "
|
dongsheng@627
|
1485 "must be included with the license (or its incorporation by reference) in "
|
dongsheng@627
|
1486 "derived works."
|
dongsheng@627
|
1487 msgstr ""
|
dongsheng@627
|
1488
|
dongsheng@627
|
1489 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1490 #: ../en/appD-license.xml:147
|
dongsheng@627
|
1491 msgid ""
|
dongsheng@627
|
1492 "To prohibit distribution of substantively modified versions without the "
|
dongsheng@627
|
1493 "explicit permission of the author(s). <quote>Substantive modification</quote> "
|
dongsheng@627
|
1494 "is defined as a change to the semantic content of the document, and excludes "
|
dongsheng@627
|
1495 "mere changes in format or typographical corrections."
|
dongsheng@627
|
1496 msgstr ""
|
dongsheng@627
|
1497
|
dongsheng@627
|
1498 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1499 #: ../en/appD-license.xml:154
|
dongsheng@627
|
1500 msgid ""
|
dongsheng@627
|
1501 "To accomplish this, add the phrase <quote>Distribution of substantively "
|
dongsheng@627
|
1502 "modified versions of this document is prohibited without the explicit "
|
dongsheng@627
|
1503 "permission of the copyright holder.</quote> to the license reference or copy."
|
dongsheng@627
|
1504 msgstr ""
|
dongsheng@627
|
1505
|
dongsheng@627
|
1506 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1507 #: ../en/appD-license.xml:160
|
dongsheng@627
|
1508 msgid ""
|
dongsheng@627
|
1509 "To prohibit any publication of this work or derivative works in whole or in "
|
dongsheng@627
|
1510 "part in standard (paper) book form for commercial purposes is prohibited "
|
dongsheng@627
|
1511 "unless prior permission is obtained from the copyright holder."
|
dongsheng@627
|
1512 msgstr ""
|
dongsheng@627
|
1513
|
dongsheng@627
|
1514 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
|
dongsheng@627
|
1515 #: ../en/appD-license.xml:165
|
dongsheng@627
|
1516 msgid ""
|
dongsheng@627
|
1517 "To accomplish this, add the phrase <quote>Distribution of the work or "
|
dongsheng@627
|
1518 "derivative of the work in any standard (paper) book form is prohibited unless "
|
dongsheng@627
|
1519 "prior permission is obtained from the copyright holder.</quote> to the "
|
dongsheng@627
|
1520 "license reference or copy."
|
dongsheng@627
|
1521 msgstr ""
|
dongsheng@627
|
1522
|
dongsheng@653
|
1523 #. type: Content of: <book><preface><title>
|
dongsheng@653
|
1524 #: ../en/ch00-preface.xml:5
|
dongsheng@653
|
1525 msgid "Preface"
|
dongsheng@653
|
1526 msgstr "序言"
|
dongsheng@653
|
1527
|
dongsheng@653
|
1528 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
1529 #: ../en/ch00-preface.xml:8
|
dongsheng@653
|
1530 msgid "Why revision control? Why Mercurial?"
|
dongsheng@653
|
1531 msgstr "为什么使用版本控制? 为什么使用 Mercurial?"
|
dongsheng@653
|
1532
|
dongsheng@653
|
1533 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1534 #: ../en/ch00-preface.xml:10
|
dongsheng@653
|
1535 msgid ""
|
dongsheng@653
|
1536 "Revision control is the process of managing multiple versions of a piece of "
|
dongsheng@653
|
1537 "information. In its simplest form, this is something that many people do by "
|
dongsheng@653
|
1538 "hand: every time you modify a file, save it under a new name that contains a "
|
dongsheng@653
|
1539 "number, each one higher than the number of the preceding version."
|
dongsheng@653
|
1540 msgstr ""
|
dongsheng@653
|
1541
|
dongsheng@653
|
1542 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1543 #: ../en/ch00-preface.xml:16
|
dongsheng@653
|
1544 msgid ""
|
dongsheng@653
|
1545 "Manually managing multiple versions of even a single file is an error-prone "
|
dongsheng@653
|
1546 "task, though, so software tools to help automate this process have long been "
|
dongsheng@653
|
1547 "available. The earliest automated revision control tools were intended to "
|
dongsheng@653
|
1548 "help a single user to manage revisions of a single file. Over the past few "
|
dongsheng@653
|
1549 "decades, the scope of revision control tools has expanded greatly; they now "
|
dongsheng@653
|
1550 "manage multiple files, and help multiple people to work together. The best "
|
dongsheng@653
|
1551 "modern revision control tools have no problem coping with thousands of people "
|
dongsheng@653
|
1552 "working together on projects that consist of hundreds of thousands of files."
|
dongsheng@653
|
1553 msgstr ""
|
dongsheng@653
|
1554
|
dongsheng@653
|
1555 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1556 #: ../en/ch00-preface.xml:27
|
dongsheng@653
|
1557 msgid ""
|
dongsheng@653
|
1558 "The arrival of distributed revision control is relatively recent, and so far "
|
dongsheng@653
|
1559 "this new field has grown due to people's willingness to explore ill-charted "
|
dongsheng@653
|
1560 "territory."
|
dongsheng@653
|
1561 msgstr ""
|
dongsheng@653
|
1562
|
dongsheng@653
|
1563 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1564 #: ../en/ch00-preface.xml:31
|
dongsheng@653
|
1565 msgid ""
|
dongsheng@653
|
1566 "I am writing a book about distributed revision control because I believe that "
|
dongsheng@653
|
1567 "it is an important subject that deserves a field guide. I chose to write "
|
dongsheng@653
|
1568 "about Mercurial because it is the easiest tool to learn the terrain with, and "
|
dongsheng@653
|
1569 "yet it scales to the demands of real, challenging environments where many "
|
dongsheng@653
|
1570 "other revision control tools buckle."
|
dongsheng@653
|
1571 msgstr ""
|
dongsheng@653
|
1572
|
dongsheng@653
|
1573 #. type: Content of: <book><preface><sect1><sect2><title>
|
dongsheng@653
|
1574 #: ../en/ch00-preface.xml:39
|
dongsheng@653
|
1575 msgid "Why use revision control?"
|
dongsheng@653
|
1576 msgstr "为什么使用版本控制?"
|
dongsheng@653
|
1577
|
dongsheng@653
|
1578 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1579 #: ../en/ch00-preface.xml:41
|
dongsheng@653
|
1580 msgid ""
|
dongsheng@653
|
1581 "There are a number of reasons why you or your team might want to use an "
|
dongsheng@653
|
1582 "automated revision control tool for a project."
|
dongsheng@653
|
1583 msgstr ""
|
dongsheng@653
|
1584
|
dongsheng@653
|
1585 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1586 #: ../en/ch00-preface.xml:46
|
dongsheng@653
|
1587 msgid ""
|
dongsheng@653
|
1588 "It will track the history and evolution of your project, so you don't have "
|
dongsheng@653
|
1589 "to. For every change, you'll have a log of <emphasis>who</emphasis> made it; "
|
dongsheng@653
|
1590 "<emphasis>why</emphasis> they made it; <emphasis>when</emphasis> they made "
|
dongsheng@653
|
1591 "it; and <emphasis>what</emphasis> the change was."
|
dongsheng@653
|
1592 msgstr ""
|
dongsheng@653
|
1593
|
dongsheng@653
|
1594 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1595 #: ../en/ch00-preface.xml:53
|
dongsheng@653
|
1596 msgid ""
|
dongsheng@653
|
1597 "When you're working with other people, revision control software makes it "
|
dongsheng@653
|
1598 "easier for you to collaborate. For example, when people more or less "
|
dongsheng@653
|
1599 "simultaneously make potentially incompatible changes, the software will help "
|
dongsheng@653
|
1600 "you to identify and resolve those conflicts."
|
dongsheng@653
|
1601 msgstr ""
|
dongsheng@653
|
1602
|
dongsheng@653
|
1603 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1604 #: ../en/ch00-preface.xml:59
|
dongsheng@653
|
1605 msgid ""
|
dongsheng@653
|
1606 "It can help you to recover from mistakes. If you make a change that later "
|
dongsheng@653
|
1607 "turns out to be in error, you can revert to an earlier version of one or more "
|
dongsheng@653
|
1608 "files. In fact, a <emphasis>really</emphasis> good revision control tool "
|
dongsheng@653
|
1609 "will even help you to efficiently figure out exactly when a problem was "
|
dongsheng@653
|
1610 "introduced (see section <xref linkend=\"sec.undo.bisect\"/> for details)."
|
dongsheng@653
|
1611 msgstr ""
|
dongsheng@653
|
1612
|
dongsheng@653
|
1613 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1614 #: ../en/ch00-preface.xml:66
|
dongsheng@653
|
1615 msgid ""
|
dongsheng@653
|
1616 "It will help you to work simultaneously on, and manage the drift between, "
|
dongsheng@653
|
1617 "multiple versions of your project."
|
dongsheng@653
|
1618 msgstr ""
|
dongsheng@653
|
1619
|
dongsheng@653
|
1620 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1621 #: ../en/ch00-preface.xml:71
|
dongsheng@653
|
1622 msgid ""
|
dongsheng@653
|
1623 "Most of these reasons are equally valid---at least in theory---whether you're "
|
dongsheng@653
|
1624 "working on a project by yourself, or with a hundred other people."
|
dongsheng@653
|
1625 msgstr ""
|
dongsheng@653
|
1626
|
dongsheng@653
|
1627 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1628 #: ../en/ch00-preface.xml:75
|
dongsheng@653
|
1629 msgid ""
|
dongsheng@653
|
1630 "A key question about the practicality of revision control at these two "
|
dongsheng@653
|
1631 "different scales (<quote>lone hacker</quote> and <quote>huge team</quote>) is "
|
dongsheng@653
|
1632 "how its <emphasis>benefits</emphasis> compare to its <emphasis>costs</"
|
dongsheng@653
|
1633 "emphasis>. A revision control tool that's difficult to understand or use is "
|
dongsheng@653
|
1634 "going to impose a high cost."
|
dongsheng@653
|
1635 msgstr ""
|
dongsheng@653
|
1636
|
dongsheng@653
|
1637 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1638 #: ../en/ch00-preface.xml:83
|
dongsheng@653
|
1639 msgid ""
|
dongsheng@653
|
1640 "A five-hundred-person project is likely to collapse under its own weight "
|
dongsheng@653
|
1641 "almost immediately without a revision control tool and process. In this case, "
|
dongsheng@653
|
1642 "the cost of using revision control might hardly seem worth considering, since "
|
dongsheng@653
|
1643 "<emphasis>without</emphasis> it, failure is almost guaranteed."
|
dongsheng@653
|
1644 msgstr ""
|
dongsheng@653
|
1645
|
dongsheng@653
|
1646 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1647 #: ../en/ch00-preface.xml:90
|
dongsheng@653
|
1648 msgid ""
|
dongsheng@653
|
1649 "On the other hand, a one-person <quote>quick hack</quote> might seem like a "
|
dongsheng@653
|
1650 "poor place to use a revision control tool, because surely the cost of using "
|
dongsheng@653
|
1651 "one must be close to the overall cost of the project. Right?"
|
dongsheng@653
|
1652 msgstr ""
|
dongsheng@653
|
1653
|
dongsheng@653
|
1654 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1655 #: ../en/ch00-preface.xml:95
|
dongsheng@653
|
1656 msgid ""
|
dongsheng@653
|
1657 "Mercurial uniquely supports <emphasis>both</emphasis> of these scales of "
|
dongsheng@653
|
1658 "development. You can learn the basics in just a few minutes, and due to its "
|
dongsheng@653
|
1659 "low overhead, you can apply revision control to the smallest of projects with "
|
dongsheng@653
|
1660 "ease. Its simplicity means you won't have a lot of abstruse concepts or "
|
dongsheng@653
|
1661 "command sequences competing for mental space with whatever you're "
|
dongsheng@653
|
1662 "<emphasis>really</emphasis> trying to do. At the same time, Mercurial's high "
|
dongsheng@653
|
1663 "performance and peer-to-peer nature let you scale painlessly to handle large "
|
dongsheng@653
|
1664 "projects."
|
dongsheng@653
|
1665 msgstr ""
|
dongsheng@653
|
1666
|
dongsheng@653
|
1667 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1668 #: ../en/ch00-preface.xml:105
|
dongsheng@653
|
1669 msgid ""
|
dongsheng@653
|
1670 "No revision control tool can rescue a poorly run project, but a good choice "
|
dongsheng@653
|
1671 "of tools can make a huge difference to the fluidity with which you can work "
|
dongsheng@653
|
1672 "on a project."
|
dongsheng@653
|
1673 msgstr ""
|
dongsheng@653
|
1674
|
dongsheng@653
|
1675 #. type: Content of: <book><preface><sect1><sect2><title>
|
dongsheng@653
|
1676 #: ../en/ch00-preface.xml:112
|
dongsheng@653
|
1677 msgid "The many names of revision control"
|
dongsheng@653
|
1678 msgstr "版本控制的别名"
|
dongsheng@653
|
1679
|
dongsheng@653
|
1680 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1681 #: ../en/ch00-preface.xml:114
|
dongsheng@653
|
1682 msgid ""
|
dongsheng@653
|
1683 "Revision control is a diverse field, so much so that it is referred to by "
|
dongsheng@653
|
1684 "many names and acronyms. Here are a few of the more common variations you'll "
|
dongsheng@653
|
1685 "encounter:"
|
dongsheng@653
|
1686 msgstr ""
|
dongsheng@653
|
1687
|
dongsheng@653
|
1688 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1689 #: ../en/ch00-preface.xml:118
|
dongsheng@653
|
1690 msgid "Revision control (RCS)"
|
dongsheng@653
|
1691 msgstr "版本控制(RCS)"
|
dongsheng@653
|
1692
|
dongsheng@653
|
1693 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1694 #: ../en/ch00-preface.xml:119
|
dongsheng@653
|
1695 msgid "Software configuration management (SCM), or configuration management"
|
dongsheng@653
|
1696 msgstr "软件配置管理(SCM),或配置管理"
|
dongsheng@653
|
1697
|
dongsheng@653
|
1698 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1699 #: ../en/ch00-preface.xml:121
|
dongsheng@653
|
1700 msgid "Source code management"
|
dongsheng@653
|
1701 msgstr "源代码管理"
|
dongsheng@653
|
1702
|
dongsheng@653
|
1703 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1704 #: ../en/ch00-preface.xml:122
|
dongsheng@653
|
1705 msgid "Source code control, or source control"
|
dongsheng@653
|
1706 msgstr "源代码控制,或源控制"
|
dongsheng@653
|
1707
|
dongsheng@653
|
1708 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@653
|
1709 #: ../en/ch00-preface.xml:124
|
dongsheng@653
|
1710 msgid "Version control (VCS)"
|
dongsheng@653
|
1711 msgstr "版本控制(VCS)"
|
dongsheng@653
|
1712
|
dongsheng@653
|
1713 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1714 #: ../en/ch00-preface.xml:126
|
dongsheng@653
|
1715 msgid ""
|
dongsheng@653
|
1716 "Some people claim that these terms actually have different meanings, but in "
|
dongsheng@653
|
1717 "practice they overlap so much that there's no agreed or even useful way to "
|
dongsheng@653
|
1718 "tease them apart."
|
dongsheng@653
|
1719 msgstr ""
|
dongsheng@653
|
1720
|
dongsheng@653
|
1721 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
1722 #: ../en/ch00-preface.xml:134
|
dongsheng@653
|
1723 msgid "This book is a work in progress"
|
dongsheng@653
|
1724 msgstr "本书正在编写中"
|
dongsheng@653
|
1725
|
dongsheng@653
|
1726 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1727 #: ../en/ch00-preface.xml:136
|
dongsheng@653
|
1728 msgid ""
|
dongsheng@653
|
1729 "I am releasing this book while I am still writing it, in the hope that it "
|
dongsheng@653
|
1730 "will prove useful to others. I am writing under an open license in the hope "
|
dongsheng@653
|
1731 "that you, my readers, will contribute feedback and perhaps content of your "
|
dongsheng@653
|
1732 "own."
|
dongsheng@653
|
1733 msgstr ""
|
dongsheng@653
|
1734
|
dongsheng@653
|
1735 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
1736 #: ../en/ch00-preface.xml:143
|
dongsheng@653
|
1737 msgid "About the examples in this book"
|
dongsheng@653
|
1738 msgstr "本书的例子"
|
dongsheng@653
|
1739
|
dongsheng@653
|
1740 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1741 #: ../en/ch00-preface.xml:145
|
dongsheng@653
|
1742 msgid ""
|
dongsheng@653
|
1743 "This book takes an unusual approach to code samples. Every example is "
|
dongsheng@653
|
1744 "<quote>live</quote>---each one is actually the result of a shell script that "
|
dongsheng@653
|
1745 "executes the Mercurial commands you see. Every time an image of the book is "
|
dongsheng@653
|
1746 "built from its sources, all the example scripts are automatically run, and "
|
dongsheng@653
|
1747 "their current results compared against their expected results."
|
dongsheng@653
|
1748 msgstr ""
|
dongsheng@653
|
1749
|
dongsheng@653
|
1750 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1751 #: ../en/ch00-preface.xml:152
|
dongsheng@653
|
1752 msgid ""
|
dongsheng@653
|
1753 "The advantage of this approach is that the examples are always accurate; they "
|
dongsheng@653
|
1754 "describe <emphasis>exactly</emphasis> the behaviour of the version of "
|
dongsheng@653
|
1755 "Mercurial that's mentioned at the front of the book. If I update the version "
|
dongsheng@653
|
1756 "of Mercurial that I'm documenting, and the output of some command changes, "
|
dongsheng@653
|
1757 "the build fails."
|
dongsheng@653
|
1758 msgstr ""
|
dongsheng@653
|
1759
|
dongsheng@653
|
1760 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1761 #: ../en/ch00-preface.xml:159
|
dongsheng@653
|
1762 msgid ""
|
dongsheng@653
|
1763 "There is a small disadvantage to this approach, which is that the dates and "
|
dongsheng@653
|
1764 "times you'll see in examples tend to be <quote>squashed</quote> together in a "
|
dongsheng@653
|
1765 "way that they wouldn't be if the same commands were being typed by a human. "
|
dongsheng@653
|
1766 "Where a human can issue no more than one command every few seconds, with any "
|
dongsheng@653
|
1767 "resulting timestamps correspondingly spread out, my automated example scripts "
|
dongsheng@653
|
1768 "run many commands in one second."
|
dongsheng@653
|
1769 msgstr ""
|
dongsheng@653
|
1770
|
dongsheng@653
|
1771 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1772 #: ../en/ch00-preface.xml:167
|
dongsheng@653
|
1773 msgid ""
|
dongsheng@653
|
1774 "As an instance of this, several consecutive commits in an example can show up "
|
dongsheng@653
|
1775 "as having occurred during the same second. You can see this occur in the "
|
dongsheng@653
|
1776 "<literal role=\"hg-ext\">bisect</literal> example in section <xref linkend="
|
dongsheng@653
|
1777 "\"sec.undo.bisect\"/>, for instance."
|
dongsheng@653
|
1778 msgstr ""
|
dongsheng@653
|
1779
|
dongsheng@653
|
1780 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1781 #: ../en/ch00-preface.xml:173
|
dongsheng@653
|
1782 msgid ""
|
dongsheng@653
|
1783 "So when you're reading examples, don't place too much weight on the dates or "
|
dongsheng@653
|
1784 "times you see in the output of commands. But <emphasis>do</emphasis> be "
|
dongsheng@653
|
1785 "confident that the behaviour you're seeing is consistent and reproducible."
|
dongsheng@653
|
1786 msgstr ""
|
dongsheng@653
|
1787
|
dongsheng@653
|
1788 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
1789 #: ../en/ch00-preface.xml:181
|
dongsheng@653
|
1790 msgid "Trends in the field"
|
dongsheng@653
|
1791 msgstr "版本控制的发展趋势"
|
dongsheng@653
|
1792
|
dongsheng@653
|
1793 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1794 #: ../en/ch00-preface.xml:183
|
dongsheng@653
|
1795 msgid ""
|
dongsheng@653
|
1796 "There has been an unmistakable trend in the development and use of revision "
|
dongsheng@653
|
1797 "control tools over the past four decades, as people have become familiar with "
|
dongsheng@653
|
1798 "the capabilities of their tools and constrained by their limitations."
|
dongsheng@653
|
1799 msgstr ""
|
dongsheng@653
|
1800
|
dongsheng@653
|
1801 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1802 #: ../en/ch00-preface.xml:188
|
dongsheng@653
|
1803 msgid ""
|
dongsheng@653
|
1804 "The first generation began by managing single files on individual computers. "
|
dongsheng@653
|
1805 "Although these tools represented a huge advance over ad-hoc manual revision "
|
dongsheng@653
|
1806 "control, their locking model and reliance on a single computer limited them "
|
dongsheng@653
|
1807 "to small, tightly-knit teams."
|
dongsheng@653
|
1808 msgstr ""
|
dongsheng@653
|
1809
|
dongsheng@653
|
1810 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1811 #: ../en/ch00-preface.xml:194
|
dongsheng@653
|
1812 msgid ""
|
dongsheng@653
|
1813 "The second generation loosened these constraints by moving to network-"
|
dongsheng@653
|
1814 "centered architectures, and managing entire projects at a time. As projects "
|
dongsheng@653
|
1815 "grew larger, they ran into new problems. With clients needing to talk to "
|
dongsheng@653
|
1816 "servers very frequently, server scaling became an issue for large projects. "
|
dongsheng@653
|
1817 "An unreliable network connection could prevent remote users from being able "
|
dongsheng@653
|
1818 "to talk to the server at all. As open source projects started making read-"
|
dongsheng@653
|
1819 "only access available anonymously to anyone, people without commit privileges "
|
dongsheng@653
|
1820 "found that they could not use the tools to interact with a project in a "
|
dongsheng@653
|
1821 "natural way, as they could not record their changes."
|
dongsheng@653
|
1822 msgstr ""
|
dongsheng@653
|
1823
|
dongsheng@653
|
1824 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1825 #: ../en/ch00-preface.xml:206
|
dongsheng@653
|
1826 msgid ""
|
dongsheng@653
|
1827 "The current generation of revision control tools is peer-to-peer in nature. "
|
dongsheng@653
|
1828 "All of these systems have dropped the dependency on a single central server, "
|
dongsheng@653
|
1829 "and allow people to distribute their revision control data to where it's "
|
dongsheng@653
|
1830 "actually needed. Collaboration over the Internet has moved from constrained "
|
dongsheng@653
|
1831 "by technology to a matter of choice and consensus. Modern tools can operate "
|
dongsheng@653
|
1832 "offline indefinitely and autonomously, with a network connection only needed "
|
dongsheng@653
|
1833 "when syncing changes with another repository."
|
dongsheng@653
|
1834 msgstr ""
|
dongsheng@653
|
1835
|
dongsheng@653
|
1836 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
1837 #: ../en/ch00-preface.xml:218
|
dongsheng@653
|
1838 msgid "A few of the advantages of distributed revision control"
|
dongsheng@653
|
1839 msgstr "分布版本控制的优点"
|
dongsheng@653
|
1840
|
dongsheng@653
|
1841 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1842 #: ../en/ch00-preface.xml:221
|
dongsheng@653
|
1843 msgid ""
|
dongsheng@653
|
1844 "Even though distributed revision control tools have for several years been as "
|
dongsheng@653
|
1845 "robust and usable as their previous-generation counterparts, people using "
|
dongsheng@653
|
1846 "older tools have not yet necessarily woken up to their advantages. There are "
|
dongsheng@653
|
1847 "a number of ways in which distributed tools shine relative to centralised "
|
dongsheng@653
|
1848 "ones."
|
dongsheng@653
|
1849 msgstr ""
|
dongsheng@653
|
1850
|
dongsheng@653
|
1851 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1852 #: ../en/ch00-preface.xml:228
|
dongsheng@653
|
1853 msgid ""
|
dongsheng@653
|
1854 "For an individual developer, distributed tools are almost always much faster "
|
dongsheng@653
|
1855 "than centralised tools. This is for a simple reason: a centralised tool "
|
dongsheng@653
|
1856 "needs to talk over the network for many common operations, because most "
|
dongsheng@653
|
1857 "metadata is stored in a single copy on the central server. A distributed "
|
dongsheng@653
|
1858 "tool stores all of its metadata locally. All else being equal, talking over "
|
dongsheng@653
|
1859 "the network adds overhead to a centralised tool. Don't underestimate the "
|
dongsheng@653
|
1860 "value of a snappy, responsive tool: you're going to spend a lot of time "
|
dongsheng@653
|
1861 "interacting with your revision control software."
|
dongsheng@653
|
1862 msgstr ""
|
dongsheng@653
|
1863
|
dongsheng@653
|
1864 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1865 #: ../en/ch00-preface.xml:239
|
dongsheng@653
|
1866 msgid ""
|
dongsheng@653
|
1867 "Distributed tools are indifferent to the vagaries of your server "
|
dongsheng@653
|
1868 "infrastructure, again because they replicate metadata to so many locations. "
|
dongsheng@653
|
1869 "If you use a centralised system and your server catches fire, you'd better "
|
dongsheng@653
|
1870 "hope that your backup media are reliable, and that your last backup was "
|
dongsheng@653
|
1871 "recent and actually worked. With a distributed tool, you have many backups "
|
dongsheng@653
|
1872 "available on every contributor's computer."
|
dongsheng@653
|
1873 msgstr ""
|
dongsheng@653
|
1874
|
dongsheng@653
|
1875 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
1876 #: ../en/ch00-preface.xml:247
|
dongsheng@653
|
1877 msgid ""
|
dongsheng@653
|
1878 "The reliability of your network will affect distributed tools far less than "
|
dongsheng@653
|
1879 "it will centralised tools. You can't even use a centralised tool without a "
|
dongsheng@653
|
1880 "network connection, except for a few highly constrained commands. With a "
|
dongsheng@653
|
1881 "distributed tool, if your network connection goes down while you're working, "
|
dongsheng@653
|
1882 "you may not even notice. The only thing you won't be able to do is talk to "
|
dongsheng@653
|
1883 "repositories on other computers, something that is relatively rare compared "
|
dongsheng@653
|
1884 "with local operations. If you have a far-flung team of collaborators, this "
|
dongsheng@653
|
1885 "may be significant."
|
dongsheng@653
|
1886 msgstr ""
|
dongsheng@653
|
1887
|
dongsheng@653
|
1888 #. type: Content of: <book><preface><sect1><sect2><title>
|
dongsheng@653
|
1889 #: ../en/ch00-preface.xml:258
|
dongsheng@653
|
1890 msgid "Advantages for open source projects"
|
dongsheng@653
|
1891 msgstr "开源项目的优点"
|
dongsheng@653
|
1892
|
dongsheng@653
|
1893 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1894 #: ../en/ch00-preface.xml:260
|
dongsheng@653
|
1895 msgid ""
|
dongsheng@653
|
1896 "If you take a shine to an open source project and decide that you would like "
|
dongsheng@653
|
1897 "to start hacking on it, and that project uses a distributed revision control "
|
dongsheng@653
|
1898 "tool, you are at once a peer with the people who consider themselves the "
|
dongsheng@653
|
1899 "<quote>core</quote> of that project. If they publish their repositories, you "
|
dongsheng@653
|
1900 "can immediately copy their project history, start making changes, and record "
|
dongsheng@653
|
1901 "your work, using the same tools in the same ways as insiders. By contrast, "
|
dongsheng@653
|
1902 "with a centralised tool, you must use the software in a <quote>read only</"
|
dongsheng@653
|
1903 "quote> mode unless someone grants you permission to commit changes to their "
|
dongsheng@653
|
1904 "central server. Until then, you won't be able to record changes, and your "
|
dongsheng@653
|
1905 "local modifications will be at risk of corruption any time you try to update "
|
dongsheng@653
|
1906 "your client's view of the repository."
|
dongsheng@653
|
1907 msgstr ""
|
dongsheng@653
|
1908
|
dongsheng@653
|
1909 #. type: Content of: <book><preface><sect1><sect2><sect3><title>
|
dongsheng@653
|
1910 #: ../en/ch00-preface.xml:276
|
dongsheng@653
|
1911 msgid "The forking non-problem"
|
dongsheng@653
|
1912 msgstr ""
|
dongsheng@653
|
1913
|
dongsheng@653
|
1914 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
|
dongsheng@653
|
1915 #: ../en/ch00-preface.xml:278
|
dongsheng@653
|
1916 msgid ""
|
dongsheng@653
|
1917 "It has been suggested that distributed revision control tools pose some sort "
|
dongsheng@653
|
1918 "of risk to open source projects because they make it easy to <quote>fork</"
|
dongsheng@653
|
1919 "quote> the development of a project. A fork happens when there are "
|
dongsheng@653
|
1920 "differences in opinion or attitude between groups of developers that cause "
|
dongsheng@653
|
1921 "them to decide that they can't work together any longer. Each side takes a "
|
dongsheng@653
|
1922 "more or less complete copy of the project's source code, and goes off in its "
|
dongsheng@653
|
1923 "own direction."
|
dongsheng@653
|
1924 msgstr ""
|
dongsheng@653
|
1925
|
dongsheng@653
|
1926 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
|
dongsheng@653
|
1927 #: ../en/ch00-preface.xml:288
|
dongsheng@653
|
1928 msgid ""
|
dongsheng@653
|
1929 "Sometimes the camps in a fork decide to reconcile their differences. With a "
|
dongsheng@653
|
1930 "centralised revision control system, the <emphasis>technical</emphasis> "
|
dongsheng@653
|
1931 "process of reconciliation is painful, and has to be performed largely by "
|
dongsheng@653
|
1932 "hand. You have to decide whose revision history is going to <quote>win</"
|
dongsheng@653
|
1933 "quote>, and graft the other team's changes into the tree somehow. This "
|
dongsheng@653
|
1934 "usually loses some or all of one side's revision history."
|
dongsheng@653
|
1935 msgstr ""
|
dongsheng@653
|
1936
|
dongsheng@653
|
1937 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
|
dongsheng@653
|
1938 #: ../en/ch00-preface.xml:297
|
dongsheng@653
|
1939 msgid ""
|
dongsheng@653
|
1940 "What distributed tools do with respect to forking is they make forking the "
|
dongsheng@653
|
1941 "<emphasis>only</emphasis> way to develop a project. Every single change that "
|
dongsheng@653
|
1942 "you make is potentially a fork point. The great strength of this approach is "
|
dongsheng@653
|
1943 "that a distributed revision control tool has to be really good at "
|
dongsheng@653
|
1944 "<emphasis>merging</emphasis> forks, because forks are absolutely fundamental: "
|
dongsheng@653
|
1945 "they happen all the time."
|
dongsheng@653
|
1946 msgstr ""
|
dongsheng@653
|
1947
|
dongsheng@653
|
1948 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
|
dongsheng@653
|
1949 #: ../en/ch00-preface.xml:306
|
dongsheng@653
|
1950 msgid ""
|
dongsheng@653
|
1951 "If every piece of work that everybody does, all the time, is framed in terms "
|
dongsheng@653
|
1952 "of forking and merging, then what the open source world refers to as a "
|
dongsheng@653
|
1953 "<quote>fork</quote> becomes <emphasis>purely</emphasis> a social issue. If "
|
dongsheng@653
|
1954 "anything, distributed tools <emphasis>lower</emphasis> the likelihood of a "
|
dongsheng@653
|
1955 "fork:"
|
dongsheng@653
|
1956 msgstr ""
|
dongsheng@653
|
1957
|
dongsheng@653
|
1958 #. type: Content of: <book><preface><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@653
|
1959 #: ../en/ch00-preface.xml:313
|
dongsheng@653
|
1960 msgid ""
|
dongsheng@653
|
1961 "They eliminate the social distinction that centralised tools impose: that "
|
dongsheng@653
|
1962 "between insiders (people with commit access) and outsiders (people without)."
|
dongsheng@653
|
1963 msgstr ""
|
dongsheng@653
|
1964
|
dongsheng@653
|
1965 #. type: Content of: <book><preface><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@653
|
1966 #: ../en/ch00-preface.xml:317
|
dongsheng@653
|
1967 msgid ""
|
dongsheng@653
|
1968 "They make it easier to reconcile after a social fork, because all that's "
|
dongsheng@653
|
1969 "involved from the perspective of the revision control software is just "
|
dongsheng@653
|
1970 "another merge."
|
dongsheng@653
|
1971 msgstr ""
|
dongsheng@653
|
1972
|
dongsheng@653
|
1973 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
|
dongsheng@653
|
1974 #: ../en/ch00-preface.xml:322
|
dongsheng@653
|
1975 msgid ""
|
dongsheng@653
|
1976 "Some people resist distributed tools because they want to retain tight "
|
dongsheng@653
|
1977 "control over their projects, and they believe that centralised tools give "
|
dongsheng@653
|
1978 "them this control. However, if you're of this belief, and you publish your "
|
dongsheng@653
|
1979 "CVS or Subversion repositories publicly, there are plenty of tools available "
|
dongsheng@653
|
1980 "that can pull out your entire project's history (albeit slowly) and recreate "
|
dongsheng@653
|
1981 "it somewhere that you don't control. So while your control in this case is "
|
dongsheng@653
|
1982 "illusory, you are forgoing the ability to fluidly collaborate with whatever "
|
dongsheng@653
|
1983 "people feel compelled to mirror and fork your history."
|
dongsheng@653
|
1984 msgstr ""
|
dongsheng@653
|
1985
|
dongsheng@653
|
1986 #. type: Content of: <book><preface><sect1><sect2><title>
|
dongsheng@653
|
1987 #: ../en/ch00-preface.xml:337
|
dongsheng@653
|
1988 msgid "Advantages for commercial projects"
|
dongsheng@653
|
1989 msgstr "商业项目的优点"
|
dongsheng@653
|
1990
|
dongsheng@653
|
1991 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
1992 #: ../en/ch00-preface.xml:339
|
dongsheng@653
|
1993 msgid ""
|
dongsheng@653
|
1994 "Many commercial projects are undertaken by teams that are scattered across "
|
dongsheng@653
|
1995 "the globe. Contributors who are far from a central server will see slower "
|
dongsheng@653
|
1996 "command execution and perhaps less reliability. Commercial revision control "
|
dongsheng@653
|
1997 "systems attempt to ameliorate these problems with remote-site replication add-"
|
dongsheng@653
|
1998 "ons that are typically expensive to buy and cantankerous to administer. A "
|
dongsheng@653
|
1999 "distributed system doesn't suffer from these problems in the first place. "
|
dongsheng@653
|
2000 "Better yet, you can easily set up multiple authoritative servers, say one per "
|
dongsheng@653
|
2001 "site, so that there's no redundant communication between repositories over "
|
dongsheng@653
|
2002 "expensive long-haul network links."
|
dongsheng@653
|
2003 msgstr ""
|
dongsheng@653
|
2004
|
dongsheng@653
|
2005 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2006 #: ../en/ch00-preface.xml:351
|
dongsheng@653
|
2007 msgid ""
|
dongsheng@653
|
2008 "Centralised revision control systems tend to have relatively low "
|
dongsheng@653
|
2009 "scalability. It's not unusual for an expensive centralised system to fall "
|
dongsheng@653
|
2010 "over under the combined load of just a few dozen concurrent users. Once "
|
dongsheng@653
|
2011 "again, the typical response tends to be an expensive and clunky replication "
|
dongsheng@653
|
2012 "facility. Since the load on a central server---if you have one at all---is "
|
dongsheng@653
|
2013 "many times lower with a distributed tool (because all of the data is "
|
dongsheng@653
|
2014 "replicated everywhere), a single cheap server can handle the needs of a much "
|
dongsheng@653
|
2015 "larger team, and replication to balance load becomes a simple matter of "
|
dongsheng@653
|
2016 "scripting."
|
dongsheng@653
|
2017 msgstr ""
|
dongsheng@653
|
2018
|
dongsheng@653
|
2019 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2020 #: ../en/ch00-preface.xml:363
|
dongsheng@653
|
2021 msgid ""
|
dongsheng@653
|
2022 "If you have an employee in the field, troubleshooting a problem at a "
|
dongsheng@653
|
2023 "customer's site, they'll benefit from distributed revision control. The tool "
|
dongsheng@653
|
2024 "will let them generate custom builds, try different fixes in isolation from "
|
dongsheng@653
|
2025 "each other, and search efficiently through history for the sources of bugs "
|
dongsheng@653
|
2026 "and regressions in the customer's environment, all without needing to connect "
|
dongsheng@653
|
2027 "to your company's network."
|
dongsheng@653
|
2028 msgstr ""
|
dongsheng@653
|
2029
|
dongsheng@653
|
2030 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
2031 #: ../en/ch00-preface.xml:374
|
dongsheng@653
|
2032 msgid "Why choose Mercurial?"
|
dongsheng@653
|
2033 msgstr "为什么选择 Mercurial?"
|
dongsheng@653
|
2034
|
dongsheng@653
|
2035 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2036 #: ../en/ch00-preface.xml:376
|
dongsheng@653
|
2037 msgid ""
|
dongsheng@653
|
2038 "Mercurial has a unique set of properties that make it a particularly good "
|
dongsheng@653
|
2039 "choice as a revision control system."
|
dongsheng@653
|
2040 msgstr ""
|
dongsheng@653
|
2041
|
dongsheng@653
|
2042 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2043 #: ../en/ch00-preface.xml:379
|
dongsheng@653
|
2044 msgid "It is easy to learn and use."
|
dongsheng@653
|
2045 msgstr ""
|
dongsheng@653
|
2046
|
dongsheng@653
|
2047 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2048 #: ../en/ch00-preface.xml:380
|
dongsheng@653
|
2049 msgid "It is lightweight."
|
dongsheng@653
|
2050 msgstr ""
|
dongsheng@653
|
2051
|
dongsheng@653
|
2052 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2053 #: ../en/ch00-preface.xml:381
|
dongsheng@653
|
2054 msgid "It scales excellently."
|
dongsheng@653
|
2055 msgstr ""
|
dongsheng@653
|
2056
|
dongsheng@653
|
2057 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2058 #: ../en/ch00-preface.xml:382
|
dongsheng@653
|
2059 msgid "It is easy to customise."
|
dongsheng@653
|
2060 msgstr ""
|
dongsheng@653
|
2061
|
dongsheng@653
|
2062 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2063 #: ../en/ch00-preface.xml:385
|
dongsheng@653
|
2064 msgid ""
|
dongsheng@653
|
2065 "If you are at all familiar with revision control systems, you should be able "
|
dongsheng@653
|
2066 "to get up and running with Mercurial in less than five minutes. Even if not, "
|
dongsheng@653
|
2067 "it will take no more than a few minutes longer. Mercurial's command and "
|
dongsheng@653
|
2068 "feature sets are generally uniform and consistent, so you can keep track of a "
|
dongsheng@653
|
2069 "few general rules instead of a host of exceptions."
|
dongsheng@653
|
2070 msgstr ""
|
dongsheng@653
|
2071
|
dongsheng@653
|
2072 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2073 #: ../en/ch00-preface.xml:392
|
dongsheng@653
|
2074 msgid ""
|
dongsheng@653
|
2075 "On a small project, you can start working with Mercurial in moments. Creating "
|
dongsheng@653
|
2076 "new changes and branches; transferring changes around (whether locally or "
|
dongsheng@653
|
2077 "over a network); and history and status operations are all fast. Mercurial "
|
dongsheng@653
|
2078 "attempts to stay nimble and largely out of your way by combining low "
|
dongsheng@653
|
2079 "cognitive overhead with blazingly fast operations."
|
dongsheng@653
|
2080 msgstr ""
|
dongsheng@653
|
2081
|
dongsheng@653
|
2082 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2083 #: ../en/ch00-preface.xml:399
|
dongsheng@653
|
2084 msgid ""
|
dongsheng@653
|
2085 "The usefulness of Mercurial is not limited to small projects: it is used by "
|
dongsheng@653
|
2086 "projects with hundreds to thousands of contributors, each containing tens of "
|
dongsheng@653
|
2087 "thousands of files and hundreds of megabytes of source code."
|
dongsheng@653
|
2088 msgstr ""
|
dongsheng@653
|
2089
|
dongsheng@653
|
2090 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2091 #: ../en/ch00-preface.xml:404
|
dongsheng@653
|
2092 msgid ""
|
dongsheng@653
|
2093 "If the core functionality of Mercurial is not enough for you, it's easy to "
|
dongsheng@653
|
2094 "build on. Mercurial is well suited to scripting tasks, and its clean "
|
dongsheng@653
|
2095 "internals and implementation in Python make it easy to add features in the "
|
dongsheng@653
|
2096 "form of extensions. There are a number of popular and useful extensions "
|
dongsheng@653
|
2097 "already available, ranging from helping to identify bugs to improving "
|
dongsheng@653
|
2098 "performance."
|
dongsheng@653
|
2099 msgstr ""
|
dongsheng@653
|
2100
|
dongsheng@653
|
2101 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
2102 #: ../en/ch00-preface.xml:414
|
dongsheng@653
|
2103 msgid "Mercurial compared with other tools"
|
dongsheng@653
|
2104 msgstr "Mercurial 与其它工具的比较"
|
dongsheng@653
|
2105
|
dongsheng@653
|
2106 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2107 #: ../en/ch00-preface.xml:416
|
dongsheng@653
|
2108 msgid ""
|
dongsheng@653
|
2109 "Before you read on, please understand that this section necessarily reflects "
|
dongsheng@653
|
2110 "my own experiences, interests, and (dare I say it) biases. I have used every "
|
dongsheng@653
|
2111 "one of the revision control tools listed below, in most cases for several "
|
dongsheng@653
|
2112 "years at a time."
|
dongsheng@653
|
2113 msgstr ""
|
dongsheng@653
|
2114
|
dongsheng@653
|
2115 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2116 #: ../en/ch00-preface.xml:424 ../en/ch00-preface.xml:635
|
dongsheng@653
|
2117 msgid "Subversion"
|
dongsheng@653
|
2118 msgstr ""
|
dongsheng@653
|
2119
|
dongsheng@653
|
2120 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2121 #: ../en/ch00-preface.xml:426
|
dongsheng@653
|
2122 msgid ""
|
dongsheng@653
|
2123 "Subversion is a popular revision control tool, developed to replace CVS. It "
|
dongsheng@653
|
2124 "has a centralised client/server architecture."
|
dongsheng@653
|
2125 msgstr ""
|
dongsheng@653
|
2126
|
dongsheng@653
|
2127 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2128 #: ../en/ch00-preface.xml:430
|
dongsheng@653
|
2129 msgid ""
|
dongsheng@653
|
2130 "Subversion and Mercurial have similarly named commands for performing the "
|
dongsheng@653
|
2131 "same operations, so if you're familiar with one, it is easy to learn to use "
|
dongsheng@653
|
2132 "the other. Both tools are portable to all popular operating systems."
|
dongsheng@653
|
2133 msgstr ""
|
dongsheng@653
|
2134
|
dongsheng@653
|
2135 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2136 #: ../en/ch00-preface.xml:435
|
dongsheng@653
|
2137 msgid ""
|
dongsheng@653
|
2138 "Prior to version 1.5, Subversion had no useful support for merges. At the "
|
dongsheng@653
|
2139 "time of writing, its merge tracking capability is new, and known to be <ulink "
|
dongsheng@653
|
2140 "url=\"http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced."
|
dongsheng@653
|
2141 "html#svn.branchmerge.advanced.finalword\">complicated and buggy</ulink>."
|
dongsheng@653
|
2142 msgstr ""
|
dongsheng@653
|
2143
|
dongsheng@653
|
2144 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2145 #: ../en/ch00-preface.xml:441
|
dongsheng@653
|
2146 msgid ""
|
dongsheng@653
|
2147 "Mercurial has a substantial performance advantage over Subversion on every "
|
dongsheng@653
|
2148 "revision control operation I have benchmarked. I have measured its advantage "
|
dongsheng@653
|
2149 "as ranging from a factor of two to a factor of six when compared with "
|
dongsheng@653
|
2150 "Subversion 1.4.3's <emphasis>ra_local</emphasis> file store, which is the "
|
dongsheng@653
|
2151 "fastest access method available. In more realistic deployments involving a "
|
dongsheng@653
|
2152 "network-based store, Subversion will be at a substantially larger "
|
dongsheng@653
|
2153 "disadvantage. Because many Subversion commands must talk to the server and "
|
dongsheng@653
|
2154 "Subversion does not have useful replication facilities, server capacity and "
|
dongsheng@653
|
2155 "network bandwidth become bottlenecks for modestly large projects."
|
dongsheng@653
|
2156 msgstr ""
|
dongsheng@653
|
2157
|
dongsheng@653
|
2158 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2159 #: ../en/ch00-preface.xml:454
|
dongsheng@653
|
2160 msgid ""
|
dongsheng@653
|
2161 "Additionally, Subversion incurs substantial storage overhead to avoid network "
|
dongsheng@653
|
2162 "transactions for a few common operations, such as finding modified files "
|
dongsheng@653
|
2163 "(<literal>status</literal>) and displaying modifications against the current "
|
dongsheng@653
|
2164 "revision (<literal>diff</literal>). As a result, a Subversion working copy "
|
dongsheng@653
|
2165 "is often the same size as, or larger than, a Mercurial repository and working "
|
dongsheng@653
|
2166 "directory, even though the Mercurial repository contains a complete history "
|
dongsheng@653
|
2167 "of the project."
|
dongsheng@653
|
2168 msgstr ""
|
dongsheng@653
|
2169
|
dongsheng@653
|
2170 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2171 #: ../en/ch00-preface.xml:464
|
dongsheng@653
|
2172 msgid ""
|
dongsheng@653
|
2173 "Subversion is widely supported by third party tools. Mercurial currently "
|
dongsheng@653
|
2174 "lags considerably in this area. This gap is closing, however, and indeed "
|
dongsheng@653
|
2175 "some of Mercurial's GUI tools now outshine their Subversion equivalents. "
|
dongsheng@653
|
2176 "Like Mercurial, Subversion has an excellent user manual."
|
dongsheng@653
|
2177 msgstr ""
|
dongsheng@653
|
2178
|
dongsheng@653
|
2179 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2180 #: ../en/ch00-preface.xml:470
|
dongsheng@653
|
2181 msgid ""
|
dongsheng@653
|
2182 "Because Subversion doesn't store revision history on the client, it is well "
|
dongsheng@653
|
2183 "suited to managing projects that deal with lots of large, opaque binary "
|
dongsheng@653
|
2184 "files. If you check in fifty revisions to an incompressible 10MB file, "
|
dongsheng@653
|
2185 "Subversion's client-side space usage stays constant The space used by any "
|
dongsheng@653
|
2186 "distributed SCM will grow rapidly in proportion to the number of revisions, "
|
dongsheng@653
|
2187 "because the differences between each revision are large."
|
dongsheng@653
|
2188 msgstr ""
|
dongsheng@653
|
2189
|
dongsheng@653
|
2190 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2191 #: ../en/ch00-preface.xml:479
|
dongsheng@653
|
2192 msgid ""
|
dongsheng@653
|
2193 "In addition, it's often difficult or, more usually, impossible to merge "
|
dongsheng@653
|
2194 "different versions of a binary file. Subversion's ability to let a user lock "
|
dongsheng@653
|
2195 "a file, so that they temporarily have the exclusive right to commit changes "
|
dongsheng@653
|
2196 "to it, can be a significant advantage to a project where binary files are "
|
dongsheng@653
|
2197 "widely used."
|
dongsheng@653
|
2198 msgstr ""
|
dongsheng@653
|
2199
|
dongsheng@653
|
2200 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2201 #: ../en/ch00-preface.xml:486
|
dongsheng@653
|
2202 msgid ""
|
dongsheng@653
|
2203 "Mercurial can import revision history from a Subversion repository. It can "
|
dongsheng@653
|
2204 "also export revision history to a Subversion repository. This makes it easy "
|
dongsheng@653
|
2205 "to <quote>test the waters</quote> and use Mercurial and Subversion in "
|
dongsheng@653
|
2206 "parallel before deciding to switch. History conversion is incremental, so "
|
dongsheng@653
|
2207 "you can perform an initial conversion, then small additional conversions "
|
dongsheng@653
|
2208 "afterwards to bring in new changes."
|
dongsheng@653
|
2209 msgstr ""
|
dongsheng@653
|
2210
|
dongsheng@653
|
2211 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2212 #: ../en/ch00-preface.xml:498 ../en/ch00-preface.xml:637
|
dongsheng@653
|
2213 msgid "Git"
|
dongsheng@653
|
2214 msgstr ""
|
dongsheng@653
|
2215
|
dongsheng@653
|
2216 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2217 #: ../en/ch00-preface.xml:500
|
dongsheng@653
|
2218 msgid ""
|
dongsheng@653
|
2219 "Git is a distributed revision control tool that was developed for managing "
|
dongsheng@653
|
2220 "the Linux kernel source tree. Like Mercurial, its early design was somewhat "
|
dongsheng@653
|
2221 "influenced by Monotone."
|
dongsheng@653
|
2222 msgstr ""
|
dongsheng@653
|
2223
|
dongsheng@653
|
2224 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2225 #: ../en/ch00-preface.xml:505
|
dongsheng@653
|
2226 msgid ""
|
dongsheng@653
|
2227 "Git has a very large command set, with version 1.5.0 providing 139 individual "
|
dongsheng@653
|
2228 "commands. It has something of a reputation for being difficult to learn. "
|
dongsheng@653
|
2229 "Compared to Git, Mercurial has a strong focus on simplicity."
|
dongsheng@653
|
2230 msgstr ""
|
dongsheng@653
|
2231
|
dongsheng@653
|
2232 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2233 #: ../en/ch00-preface.xml:510
|
dongsheng@653
|
2234 msgid ""
|
dongsheng@653
|
2235 "In terms of performance, Git is extremely fast. In several cases, it is "
|
dongsheng@653
|
2236 "faster than Mercurial, at least on Linux, while Mercurial performs better on "
|
dongsheng@653
|
2237 "other operations. However, on Windows, the performance and general level of "
|
dongsheng@653
|
2238 "support that Git provides is, at the time of writing, far behind that of "
|
dongsheng@653
|
2239 "Mercurial."
|
dongsheng@653
|
2240 msgstr ""
|
dongsheng@653
|
2241
|
dongsheng@653
|
2242 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2243 #: ../en/ch00-preface.xml:517
|
dongsheng@653
|
2244 msgid ""
|
dongsheng@653
|
2245 "While a Mercurial repository needs no maintenance, a Git repository requires "
|
dongsheng@653
|
2246 "frequent manual <quote>repacks</quote> of its metadata. Without these, "
|
dongsheng@653
|
2247 "performance degrades, while space usage grows rapidly. A server that "
|
dongsheng@653
|
2248 "contains many Git repositories that are not rigorously and frequently "
|
dongsheng@653
|
2249 "repacked will become heavily disk-bound during backups, and there have been "
|
dongsheng@653
|
2250 "instances of daily backups taking far longer than 24 hours as a result. A "
|
dongsheng@653
|
2251 "freshly packed Git repository is slightly smaller than a Mercurial "
|
dongsheng@653
|
2252 "repository, but an unpacked repository is several orders of magnitude larger."
|
dongsheng@653
|
2253 msgstr ""
|
dongsheng@653
|
2254
|
dongsheng@653
|
2255 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2256 #: ../en/ch00-preface.xml:528
|
dongsheng@653
|
2257 msgid ""
|
dongsheng@653
|
2258 "The core of Git is written in C. Many Git commands are implemented as shell "
|
dongsheng@653
|
2259 "or Perl scripts, and the quality of these scripts varies widely. I have "
|
dongsheng@653
|
2260 "encountered several instances where scripts charged along blindly in the "
|
dongsheng@653
|
2261 "presence of errors that should have been fatal."
|
dongsheng@653
|
2262 msgstr ""
|
dongsheng@653
|
2263
|
dongsheng@653
|
2264 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2265 #: ../en/ch00-preface.xml:534
|
dongsheng@653
|
2266 msgid "Mercurial can import revision history from a Git repository."
|
dongsheng@653
|
2267 msgstr ""
|
dongsheng@653
|
2268
|
dongsheng@653
|
2269 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2270 #: ../en/ch00-preface.xml:540 ../en/ch00-preface.xml:636
|
dongsheng@653
|
2271 msgid "CVS"
|
dongsheng@653
|
2272 msgstr ""
|
dongsheng@653
|
2273
|
dongsheng@653
|
2274 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2275 #: ../en/ch00-preface.xml:542
|
dongsheng@653
|
2276 msgid ""
|
dongsheng@653
|
2277 "CVS is probably the most widely used revision control tool in the world. Due "
|
dongsheng@653
|
2278 "to its age and internal untidiness, it has been only lightly maintained for "
|
dongsheng@653
|
2279 "many years."
|
dongsheng@653
|
2280 msgstr ""
|
dongsheng@653
|
2281
|
dongsheng@653
|
2282 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2283 #: ../en/ch00-preface.xml:546
|
dongsheng@653
|
2284 msgid ""
|
dongsheng@653
|
2285 "It has a centralised client/server architecture. It does not group related "
|
dongsheng@653
|
2286 "file changes into atomic commits, making it easy for people to <quote>break "
|
dongsheng@653
|
2287 "the build</quote>: one person can successfully commit part of a change and "
|
dongsheng@653
|
2288 "then be blocked by the need for a merge, causing other people to see only a "
|
dongsheng@653
|
2289 "portion of the work they intended to do. This also affects how you work with "
|
dongsheng@653
|
2290 "project history. If you want to see all of the modifications someone made as "
|
dongsheng@653
|
2291 "part of a task, you will need to manually inspect the descriptions and "
|
dongsheng@653
|
2292 "timestamps of the changes made to each file involved (if you even know what "
|
dongsheng@653
|
2293 "those files were)."
|
dongsheng@653
|
2294 msgstr ""
|
dongsheng@653
|
2295
|
dongsheng@653
|
2296 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2297 #: ../en/ch00-preface.xml:558
|
dongsheng@653
|
2298 msgid ""
|
dongsheng@653
|
2299 "CVS has a muddled notion of tags and branches that I will not attempt to even "
|
dongsheng@653
|
2300 "describe. It does not support renaming of files or directories well, making "
|
dongsheng@653
|
2301 "it easy to corrupt a repository. It has almost no internal consistency "
|
dongsheng@653
|
2302 "checking capabilities, so it is usually not even possible to tell whether or "
|
dongsheng@653
|
2303 "how a repository is corrupt. I would not recommend CVS for any project, "
|
dongsheng@653
|
2304 "existing or new."
|
dongsheng@653
|
2305 msgstr ""
|
dongsheng@653
|
2306
|
dongsheng@653
|
2307 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2308 #: ../en/ch00-preface.xml:566
|
dongsheng@653
|
2309 msgid ""
|
dongsheng@653
|
2310 "Mercurial can import CVS revision history. However, there are a few caveats "
|
dongsheng@653
|
2311 "that apply; these are true of every other revision control tool's CVS "
|
dongsheng@653
|
2312 "importer, too. Due to CVS's lack of atomic changes and unversioned "
|
dongsheng@653
|
2313 "filesystem hierarchy, it is not possible to reconstruct CVS history "
|
dongsheng@653
|
2314 "completely accurately; some guesswork is involved, and renames will usually "
|
dongsheng@653
|
2315 "not show up. Because a lot of advanced CVS administration has to be done by "
|
dongsheng@653
|
2316 "hand and is hence error-prone, it's common for CVS importers to run into "
|
dongsheng@653
|
2317 "multiple problems with corrupted repositories (completely bogus revision "
|
dongsheng@653
|
2318 "timestamps and files that have remained locked for over a decade are just two "
|
dongsheng@653
|
2319 "of the less interesting problems I can recall from personal experience)."
|
dongsheng@653
|
2320 msgstr ""
|
dongsheng@653
|
2321
|
dongsheng@653
|
2322 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2323 #: ../en/ch00-preface.xml:580
|
dongsheng@653
|
2324 msgid "Mercurial can import revision history from a CVS repository."
|
dongsheng@653
|
2325 msgstr ""
|
dongsheng@653
|
2326
|
dongsheng@653
|
2327 #. type: Content of: <book><preface><sect1><sect2><title>
|
dongsheng@653
|
2328 #: ../en/ch00-preface.xml:586
|
dongsheng@653
|
2329 msgid "Commercial tools"
|
dongsheng@653
|
2330 msgstr "商业工具"
|
dongsheng@653
|
2331
|
dongsheng@653
|
2332 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2333 #: ../en/ch00-preface.xml:588
|
dongsheng@653
|
2334 msgid ""
|
dongsheng@653
|
2335 "Perforce has a centralised client/server architecture, with no client-side "
|
dongsheng@653
|
2336 "caching of any data. Unlike modern revision control tools, Perforce requires "
|
dongsheng@653
|
2337 "that a user run a command to inform the server about every file they intend "
|
dongsheng@653
|
2338 "to edit."
|
dongsheng@653
|
2339 msgstr ""
|
dongsheng@653
|
2340
|
dongsheng@653
|
2341 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2342 #: ../en/ch00-preface.xml:594
|
dongsheng@653
|
2343 msgid ""
|
dongsheng@653
|
2344 "The performance of Perforce is quite good for small teams, but it falls off "
|
dongsheng@653
|
2345 "rapidly as the number of users grows beyond a few dozen. Modestly large "
|
dongsheng@653
|
2346 "Perforce installations require the deployment of proxies to cope with the "
|
dongsheng@653
|
2347 "load their users generate."
|
dongsheng@653
|
2348 msgstr ""
|
dongsheng@653
|
2349
|
dongsheng@653
|
2350 #. type: Content of: <book><preface><sect1><sect2><title>
|
dongsheng@653
|
2351 #: ../en/ch00-preface.xml:603
|
dongsheng@653
|
2352 msgid "Choosing a revision control tool"
|
dongsheng@653
|
2353 msgstr "选择版本控制工具"
|
dongsheng@653
|
2354
|
dongsheng@653
|
2355 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2356 #: ../en/ch00-preface.xml:605
|
dongsheng@653
|
2357 msgid ""
|
dongsheng@653
|
2358 "With the exception of CVS, all of the tools listed above have unique "
|
dongsheng@653
|
2359 "strengths that suit them to particular styles of work. There is no single "
|
dongsheng@653
|
2360 "revision control tool that is best in all situations."
|
dongsheng@653
|
2361 msgstr ""
|
dongsheng@653
|
2362
|
dongsheng@653
|
2363 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2364 #: ../en/ch00-preface.xml:610
|
dongsheng@653
|
2365 msgid ""
|
dongsheng@653
|
2366 "As an example, Subversion is a good choice for working with frequently edited "
|
dongsheng@653
|
2367 "binary files, due to its centralised nature and support for file locking."
|
dongsheng@653
|
2368 msgstr ""
|
dongsheng@653
|
2369
|
dongsheng@653
|
2370 #. type: Content of: <book><preface><sect1><sect2><para>
|
dongsheng@653
|
2371 #: ../en/ch00-preface.xml:614
|
dongsheng@653
|
2372 msgid ""
|
dongsheng@653
|
2373 "I personally find Mercurial's properties of simplicity, performance, and good "
|
dongsheng@653
|
2374 "merge support to be a compelling combination that has served me well for "
|
dongsheng@653
|
2375 "several years."
|
dongsheng@653
|
2376 msgstr ""
|
dongsheng@653
|
2377
|
dongsheng@653
|
2378 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
2379 #: ../en/ch00-preface.xml:622
|
dongsheng@653
|
2380 msgid "Switching from another tool to Mercurial"
|
dongsheng@653
|
2381 msgstr "从其它工具切换到 Mercurial"
|
dongsheng@653
|
2382
|
dongsheng@653
|
2383 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2384 #: ../en/ch00-preface.xml:624
|
dongsheng@653
|
2385 msgid ""
|
dongsheng@653
|
2386 "Mercurial is bundled with an extension named <literal role=\"hg-ext"
|
dongsheng@653
|
2387 "\">convert</literal>, which can incrementally import revision history from "
|
dongsheng@653
|
2388 "several other revision control tools. By <quote>incremental</quote>, I mean "
|
dongsheng@653
|
2389 "that you can convert all of a project's history to date in one go, then rerun "
|
dongsheng@653
|
2390 "the conversion later to obtain new changes that happened after the initial "
|
dongsheng@653
|
2391 "conversion."
|
dongsheng@653
|
2392 msgstr ""
|
dongsheng@653
|
2393
|
dongsheng@653
|
2394 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2395 #: ../en/ch00-preface.xml:632
|
dongsheng@653
|
2396 msgid ""
|
dongsheng@653
|
2397 "The revision control tools supported by <literal role=\"hg-ext\">convert</"
|
dongsheng@653
|
2398 "literal> are as follows:"
|
dongsheng@653
|
2399 msgstr "<literal role=\"hg-ext\">convert</literal> 支持的版本控制工具有:"
|
dongsheng@653
|
2400
|
dongsheng@653
|
2401 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
|
dongsheng@653
|
2402 #: ../en/ch00-preface.xml:638
|
dongsheng@653
|
2403 msgid "Darcs"
|
dongsheng@653
|
2404 msgstr ""
|
dongsheng@653
|
2405
|
dongsheng@653
|
2406 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2407 #: ../en/ch00-preface.xml:640
|
dongsheng@653
|
2408 msgid ""
|
dongsheng@653
|
2409 "In addition, <literal role=\"hg-ext\">convert</literal> can export changes "
|
dongsheng@653
|
2410 "from Mercurial to Subversion. This makes it possible to try Subversion and "
|
dongsheng@653
|
2411 "Mercurial in parallel before committing to a switchover, without risking the "
|
dongsheng@653
|
2412 "loss of any work."
|
dongsheng@653
|
2413 msgstr ""
|
dongsheng@653
|
2414
|
dongsheng@653
|
2415 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2416 #: ../en/ch00-preface.xml:646
|
dongsheng@653
|
2417 msgid ""
|
dongsheng@653
|
2418 "The <command role=\"hg-ext-convert\">convert</command> command is easy to "
|
dongsheng@653
|
2419 "use. Simply point it at the path or URL of the source repository, optionally "
|
dongsheng@653
|
2420 "give it the name of the destination repository, and it will start working. "
|
dongsheng@653
|
2421 "After the initial conversion, just run the same command again to import new "
|
dongsheng@653
|
2422 "changes."
|
dongsheng@653
|
2423 msgstr ""
|
dongsheng@653
|
2424
|
dongsheng@653
|
2425 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
2426 #: ../en/ch00-preface.xml:655
|
dongsheng@653
|
2427 msgid "A short history of revision control"
|
dongsheng@653
|
2428 msgstr "版本控制简史"
|
dongsheng@653
|
2429
|
dongsheng@653
|
2430 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2431 #: ../en/ch00-preface.xml:657
|
dongsheng@653
|
2432 msgid ""
|
dongsheng@653
|
2433 "The best known of the old-time revision control tools is SCCS (Source Code "
|
dongsheng@653
|
2434 "Control System), which Marc Rochkind wrote at Bell Labs, in the early 1970s. "
|
dongsheng@653
|
2435 "SCCS operated on individual files, and required every person working on a "
|
dongsheng@653
|
2436 "project to have access to a shared workspace on a single system. Only one "
|
dongsheng@653
|
2437 "person could modify a file at any time; arbitration for access to files was "
|
dongsheng@653
|
2438 "via locks. It was common for people to lock files, and later forget to "
|
dongsheng@653
|
2439 "unlock them, preventing anyone else from modifying those files without the "
|
dongsheng@653
|
2440 "help of an administrator."
|
dongsheng@653
|
2441 msgstr ""
|
dongsheng@653
|
2442
|
dongsheng@653
|
2443 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2444 #: ../en/ch00-preface.xml:668
|
dongsheng@653
|
2445 msgid ""
|
dongsheng@653
|
2446 "Walter Tichy developed a free alternative to SCCS in the early 1980s; he "
|
dongsheng@653
|
2447 "called his program RCS (Revision Control System). Like SCCS, RCS required "
|
dongsheng@653
|
2448 "developers to work in a single shared workspace, and to lock files to prevent "
|
dongsheng@653
|
2449 "multiple people from modifying them simultaneously."
|
dongsheng@653
|
2450 msgstr ""
|
dongsheng@653
|
2451
|
dongsheng@653
|
2452 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2453 #: ../en/ch00-preface.xml:674
|
dongsheng@653
|
2454 msgid ""
|
dongsheng@653
|
2455 "Later in the 1980s, Dick Grune used RCS as a building block for a set of "
|
dongsheng@653
|
2456 "shell scripts he initially called cmt, but then renamed to CVS (Concurrent "
|
dongsheng@653
|
2457 "Versions System). The big innovation of CVS was that it let developers work "
|
dongsheng@653
|
2458 "simultaneously and somewhat independently in their own personal workspaces. "
|
dongsheng@653
|
2459 "The personal workspaces prevented developers from stepping on each other's "
|
dongsheng@653
|
2460 "toes all the time, as was common with SCCS and RCS. Each developer had a copy "
|
dongsheng@653
|
2461 "of every project file, and could modify their copies independently. They had "
|
dongsheng@653
|
2462 "to merge their edits prior to committing changes to the central repository."
|
dongsheng@653
|
2463 msgstr ""
|
dongsheng@653
|
2464
|
dongsheng@653
|
2465 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2466 #: ../en/ch00-preface.xml:685
|
dongsheng@653
|
2467 msgid ""
|
dongsheng@653
|
2468 "Brian Berliner took Grune's original scripts and rewrote them in C, releasing "
|
dongsheng@653
|
2469 "in 1989 the code that has since developed into the modern version of CVS. "
|
dongsheng@653
|
2470 "CVS subsequently acquired the ability to operate over a network connection, "
|
dongsheng@653
|
2471 "giving it a client/server architecture. CVS's architecture is centralised; "
|
dongsheng@653
|
2472 "only the server has a copy of the history of the project. Client workspaces "
|
dongsheng@653
|
2473 "just contain copies of recent versions of the project's files, and a little "
|
dongsheng@653
|
2474 "metadata to tell them where the server is. CVS has been enormously "
|
dongsheng@653
|
2475 "successful; it is probably the world's most widely used revision control "
|
dongsheng@653
|
2476 "system."
|
dongsheng@653
|
2477 msgstr ""
|
dongsheng@653
|
2478
|
dongsheng@653
|
2479 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2480 #: ../en/ch00-preface.xml:696
|
dongsheng@653
|
2481 msgid ""
|
dongsheng@653
|
2482 "In the early 1990s, Sun Microsystems developed an early distributed revision "
|
dongsheng@653
|
2483 "control system, called TeamWare. A TeamWare workspace contains a complete "
|
dongsheng@653
|
2484 "copy of the project's history. TeamWare has no notion of a central "
|
dongsheng@653
|
2485 "repository. (CVS relied upon RCS for its history storage; TeamWare used "
|
dongsheng@653
|
2486 "SCCS.)"
|
dongsheng@653
|
2487 msgstr ""
|
dongsheng@653
|
2488
|
dongsheng@653
|
2489 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2490 #: ../en/ch00-preface.xml:703
|
dongsheng@653
|
2491 msgid ""
|
dongsheng@653
|
2492 "As the 1990s progressed, awareness grew of a number of problems with CVS. It "
|
dongsheng@653
|
2493 "records simultaneous changes to multiple files individually, instead of "
|
dongsheng@653
|
2494 "grouping them together as a single logically atomic operation. It does not "
|
dongsheng@653
|
2495 "manage its file hierarchy well; it is easy to make a mess of a repository by "
|
dongsheng@653
|
2496 "renaming files and directories. Worse, its source code is difficult to read "
|
dongsheng@653
|
2497 "and maintain, which made the <quote>pain level</quote> of fixing these "
|
dongsheng@653
|
2498 "architectural problems prohibitive."
|
dongsheng@653
|
2499 msgstr ""
|
dongsheng@653
|
2500
|
dongsheng@653
|
2501 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2502 #: ../en/ch00-preface.xml:713
|
dongsheng@653
|
2503 msgid ""
|
dongsheng@653
|
2504 "In 2001, Jim Blandy and Karl Fogel, two developers who had worked on CVS, "
|
dongsheng@653
|
2505 "started a project to replace it with a tool that would have a better "
|
dongsheng@653
|
2506 "architecture and cleaner code. The result, Subversion, does not stray from "
|
dongsheng@653
|
2507 "CVS's centralised client/server model, but it adds multi-file atomic commits, "
|
dongsheng@653
|
2508 "better namespace management, and a number of other features that make it a "
|
dongsheng@653
|
2509 "generally better tool than CVS. Since its initial release, it has rapidly "
|
dongsheng@653
|
2510 "grown in popularity."
|
dongsheng@653
|
2511 msgstr ""
|
dongsheng@653
|
2512
|
dongsheng@653
|
2513 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2514 #: ../en/ch00-preface.xml:722
|
dongsheng@653
|
2515 msgid ""
|
dongsheng@653
|
2516 "More or less simultaneously, Graydon Hoare began working on an ambitious "
|
dongsheng@653
|
2517 "distributed revision control system that he named Monotone. While Monotone "
|
dongsheng@653
|
2518 "addresses many of CVS's design flaws and has a peer-to-peer architecture, it "
|
dongsheng@653
|
2519 "goes beyond earlier (and subsequent) revision control tools in a number of "
|
dongsheng@653
|
2520 "innovative ways. It uses cryptographic hashes as identifiers, and has an "
|
dongsheng@653
|
2521 "integral notion of <quote>trust</quote> for code from different sources."
|
dongsheng@653
|
2522 msgstr ""
|
dongsheng@653
|
2523
|
dongsheng@653
|
2524 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2525 #: ../en/ch00-preface.xml:731
|
dongsheng@653
|
2526 msgid ""
|
dongsheng@653
|
2527 "Mercurial began life in 2005. While a few aspects of its design are "
|
dongsheng@653
|
2528 "influenced by Monotone, Mercurial focuses on ease of use, high performance, "
|
dongsheng@653
|
2529 "and scalability to very large projects."
|
dongsheng@653
|
2530 msgstr ""
|
dongsheng@653
|
2531
|
dongsheng@653
|
2532 #. type: Content of: <book><preface><sect1><title>
|
dongsheng@653
|
2533 #: ../en/ch00-preface.xml:739
|
dongsheng@653
|
2534 msgid "Colophon&emdash;this book is Free"
|
dongsheng@653
|
2535 msgstr "后记&emdash;本书是自由的!"
|
dongsheng@653
|
2536
|
dongsheng@653
|
2537 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2538 #: ../en/ch00-preface.xml:741
|
dongsheng@653
|
2539 msgid ""
|
dongsheng@653
|
2540 "This book is licensed under the Open Publication License, and is produced "
|
dongsheng@653
|
2541 "entirely using Free Software tools. It is typeset with DocBook XML. "
|
dongsheng@653
|
2542 "Illustrations are drawn and rendered with <ulink url=\"http://www.inkscape."
|
dongsheng@653
|
2543 "org/\">Inkscape</ulink>."
|
dongsheng@653
|
2544 msgstr ""
|
dongsheng@653
|
2545
|
dongsheng@653
|
2546 #. type: Content of: <book><preface><sect1><para>
|
dongsheng@653
|
2547 #: ../en/ch00-preface.xml:746
|
dongsheng@653
|
2548 msgid ""
|
dongsheng@653
|
2549 "The complete source code for this book is published as a Mercurial "
|
dongsheng@653
|
2550 "repository, at <ulink url=\"http://hg.serpentine.com/mercurial/book\">http://"
|
dongsheng@653
|
2551 "hg.serpentine.com/mercurial/book</ulink>."
|
dongsheng@653
|
2552 msgstr ""
|
dongsheng@653
|
2553
|
dongsheng@627
|
2554 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
2555 #: ../en/ch01-tour-basic.xml:5
|
dongsheng@627
|
2556 msgid "A tour of Mercurial: the basics"
|
dongsheng@627
|
2557 msgstr "Mercurial 教程: 基础知识"
|
dongsheng@627
|
2558
|
dongsheng@627
|
2559 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
2560 #: ../en/ch01-tour-basic.xml:8
|
dongsheng@627
|
2561 msgid "Installing Mercurial on your system"
|
dongsheng@627
|
2562 msgstr "安装 Mercurial"
|
dongsheng@627
|
2563
|
dongsheng@627
|
2564 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2565 #: ../en/ch01-tour-basic.xml:10
|
dongsheng@627
|
2566 msgid ""
|
dongsheng@627
|
2567 "Prebuilt binary packages of Mercurial are available for every popular "
|
dongsheng@627
|
2568 "operating system. These make it easy to start using Mercurial on your "
|
dongsheng@627
|
2569 "computer immediately."
|
dongsheng@627
|
2570 msgstr ""
|
dongsheng@644
|
2571 "对于每种流行的操作系统,都有已经构建的二进制软件包。这让在你的计算机上开始使"
|
dongsheng@644
|
2572 "用 Mercurial 变得很容易。"
|
dongsheng@627
|
2573
|
dongsheng@627
|
2574 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2575 #: ../en/ch01-tour-basic.xml:15
|
dongsheng@627
|
2576 msgid "Linux"
|
dongsheng@644
|
2577 msgstr "Linux"
|
dongsheng@627
|
2578
|
dongsheng@627
|
2579 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2580 #: ../en/ch01-tour-basic.xml:17
|
dongsheng@627
|
2581 msgid ""
|
dongsheng@627
|
2582 "Because each Linux distribution has its own packaging tools, policies, and "
|
dongsheng@627
|
2583 "rate of development, it's difficult to give a comprehensive set of "
|
dongsheng@627
|
2584 "instructions on how to install Mercurial binaries. The version of Mercurial "
|
dongsheng@627
|
2585 "that you will end up with can vary depending on how active the person is who "
|
dongsheng@627
|
2586 "maintains the package for your distribution."
|
dongsheng@627
|
2587 msgstr ""
|
dongsheng@644
|
2588 "由于每种 Linux 发行版都有自己的包管理工具,开发策略和进度,从而很难给出安装 "
|
dongsheng@644
|
2589 "Mercurial 二进制包的全面说明。你安装的 Mercurial 版本,在很大程度上依赖于你所"
|
dongsheng@644
|
2590 "使用的发行版的 Mercurial 维护者的活跃程度。"
|
dongsheng@627
|
2591
|
dongsheng@627
|
2592 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2593 #: ../en/ch01-tour-basic.xml:24
|
dongsheng@627
|
2594 msgid ""
|
dongsheng@627
|
2595 "To keep things simple, I will focus on installing Mercurial from the command "
|
dongsheng@627
|
2596 "line under the most popular Linux distributions. Most of these distributions "
|
dongsheng@627
|
2597 "provide graphical package managers that will let you install Mercurial with a "
|
dongsheng@627
|
2598 "single click; the package name to look for is <literal>mercurial</literal>."
|
dongsheng@627
|
2599 msgstr ""
|
dongsheng@644
|
2600 "为了让事情简单,我会致力于说明在最流行的 Linux 发行版中,从命令行安装 "
|
dongsheng@644
|
2601 "Mercurial 的方法。这些发行版都提供了图形界面的包管理器,让你通过点击鼠标安装 "
|
dongsheng@644
|
2602 "Mercurial;寻找的包名称是 <literal>mercurial</literal>。"
|
dongsheng@627
|
2603
|
dongsheng@627
|
2604 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
2605 #: ../en/ch01-tour-basic.xml:32
|
dongsheng@627
|
2606 msgid "Debian:"
|
dongsheng@644
|
2607 msgstr "Debian:"
|
dongsheng@627
|
2608
|
dongsheng@627
|
2609 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
2610 #: ../en/ch01-tour-basic.xml:34
|
dongsheng@627
|
2611 msgid "Fedora Core:"
|
dongsheng@644
|
2612 msgstr "Fedora Core:"
|
dongsheng@627
|
2613
|
dongsheng@627
|
2614 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
2615 #: ../en/ch01-tour-basic.xml:36
|
dongsheng@627
|
2616 msgid "Gentoo:"
|
dongsheng@644
|
2617 msgstr "Gentoo:"
|
dongsheng@627
|
2618
|
dongsheng@627
|
2619 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
2620 #: ../en/ch01-tour-basic.xml:38
|
dongsheng@627
|
2621 msgid "OpenSUSE:"
|
dongsheng@644
|
2622 msgstr "OpenSUSE:"
|
dongsheng@627
|
2623
|
dongsheng@627
|
2624 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
2625 #: ../en/ch01-tour-basic.xml:40
|
dongsheng@627
|
2626 msgid ""
|
dongsheng@627
|
2627 "Ubuntu: Ubuntu's Mercurial package is based on Debian's. To install it, run "
|
dongsheng@627
|
2628 "the following command."
|
dongsheng@646
|
2629 msgstr "Ubuntu: Ubuntu 的 Mercurial 包基于 Debian。安装时,使用如下命令:"
|
dongsheng@646
|
2630
|
dongsheng@646
|
2631 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2632 #: ../en/ch01-tour-basic.xml:48
|
dongsheng@627
|
2633 msgid "Solaris"
|
dongsheng@646
|
2634 msgstr "Solaris"
|
dongsheng@646
|
2635
|
dongsheng@646
|
2636 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2637 #: ../en/ch01-tour-basic.xml:50
|
dongsheng@627
|
2638 msgid ""
|
dongsheng@627
|
2639 "SunFreeWare, at <ulink url=\"http://www.sunfreeware.com\">http://www."
|
dongsheng@627
|
2640 "sunfreeware.com</ulink>, is a good source for a large number of pre-built "
|
dongsheng@627
|
2641 "Solaris packages for 32 and 64 bit Intel and Sparc architectures, including "
|
dongsheng@627
|
2642 "current versions of Mercurial."
|
dongsheng@627
|
2643 msgstr ""
|
dongsheng@646
|
2644 "位于 <ulink url=\"http://www.sunfreeware.com\">http://www.sunfreeware.com</"
|
dongsheng@646
|
2645 "ulink> 的 SunFreeWare 是很好的二进制安装源,它包含 Intel 和 Sparc 架构的 32 位"
|
dongsheng@646
|
2646 "和 64 位包,包含 Mercurial 的当前版本。"
|
dongsheng@646
|
2647
|
dongsheng@646
|
2648 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2649 #: ../en/ch01-tour-basic.xml:58
|
dongsheng@627
|
2650 msgid "Mac OS X"
|
dongsheng@646
|
2651 msgstr "Mac OS X"
|
dongsheng@646
|
2652
|
dongsheng@646
|
2653 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2654 #: ../en/ch01-tour-basic.xml:60
|
dongsheng@627
|
2655 msgid ""
|
dongsheng@627
|
2656 "Lee Cantey publishes an installer of Mercurial for Mac OS X at <ulink url="
|
dongsheng@627
|
2657 "\"http://mercurial.berkwood.com\">http://mercurial.berkwood.com</ulink>. "
|
dongsheng@627
|
2658 "This package works on both Intel- and Power-based Macs. Before you can use "
|
dongsheng@627
|
2659 "it, you must install a compatible version of Universal MacPython "
|
dongsheng@627
|
2660 "<citation>web:macpython</citation>. This is easy to do; simply follow the "
|
dongsheng@627
|
2661 "instructions on Lee's site."
|
dongsheng@627
|
2662 msgstr ""
|
dongsheng@627
|
2663
|
dongsheng@627
|
2664 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2665 #: ../en/ch01-tour-basic.xml:69
|
dongsheng@627
|
2666 msgid ""
|
dongsheng@627
|
2667 "It's also possible to install Mercurial using Fink or MacPorts, two popular "
|
dongsheng@627
|
2668 "free package managers for Mac OS X. If you have Fink, use <command>sudo apt-"
|
dongsheng@627
|
2669 "get install mercurial-py25</command>. If MacPorts, <command>sudo port "
|
dongsheng@627
|
2670 "install mercurial</command>."
|
dongsheng@627
|
2671 msgstr ""
|
dongsheng@627
|
2672
|
dongsheng@627
|
2673 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2674 #: ../en/ch01-tour-basic.xml:77
|
dongsheng@627
|
2675 msgid "Windows"
|
dongsheng@627
|
2676 msgstr ""
|
dongsheng@627
|
2677
|
dongsheng@627
|
2678 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2679 #: ../en/ch01-tour-basic.xml:79
|
dongsheng@627
|
2680 msgid ""
|
dongsheng@627
|
2681 "Lee Cantey publishes an installer of Mercurial for Windows at <ulink url="
|
dongsheng@627
|
2682 "\"http://mercurial.berkwood.com\">http://mercurial.berkwood.com</ulink>. "
|
dongsheng@627
|
2683 "This package has no external dependencies; it <quote>just works</quote>."
|
dongsheng@627
|
2684 msgstr ""
|
dongsheng@627
|
2685
|
dongsheng@627
|
2686 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
2687 #: ../en/ch01-tour-basic.xml:86
|
dongsheng@627
|
2688 msgid ""
|
dongsheng@627
|
2689 "The Windows version of Mercurial does not automatically convert line endings "
|
dongsheng@627
|
2690 "between Windows and Unix styles. If you want to share work with Unix users, "
|
dongsheng@627
|
2691 "you must do a little additional configuration work. XXX Flesh this out."
|
dongsheng@627
|
2692 msgstr ""
|
dongsheng@627
|
2693
|
dongsheng@627
|
2694 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
2695 #: ../en/ch01-tour-basic.xml:96
|
dongsheng@627
|
2696 msgid "Getting started"
|
dongsheng@627
|
2697 msgstr "开始"
|
dongsheng@627
|
2698
|
dongsheng@627
|
2699 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2700 #: ../en/ch01-tour-basic.xml:98
|
dongsheng@627
|
2701 msgid ""
|
dongsheng@627
|
2702 "To begin, we'll use the <command role=\"hg-cmd\">hg version</command> command "
|
dongsheng@627
|
2703 "to find out whether Mercurial is actually installed properly. The actual "
|
dongsheng@627
|
2704 "version information that it prints isn't so important; it's whether it prints "
|
dongsheng@627
|
2705 "anything at all that we care about."
|
dongsheng@627
|
2706 msgstr ""
|
dongsheng@627
|
2707
|
dongsheng@627
|
2708 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2709 #: ../en/ch01-tour-basic.xml:107
|
dongsheng@627
|
2710 msgid "Built-in help"
|
dongsheng@627
|
2711 msgstr "内置帮助"
|
dongsheng@627
|
2712
|
dongsheng@627
|
2713 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2714 #: ../en/ch01-tour-basic.xml:109
|
dongsheng@627
|
2715 msgid ""
|
dongsheng@627
|
2716 "Mercurial provides a built-in help system. This is invaluable for those "
|
dongsheng@627
|
2717 "times when you find yourself stuck trying to remember how to run a command. "
|
dongsheng@627
|
2718 "If you are completely stuck, simply run <command role=\"hg-cmd\">hg help</"
|
dongsheng@627
|
2719 "command>; it will print a brief list of commands, along with a description of "
|
dongsheng@627
|
2720 "what each does. If you ask for help on a specific command (as below), it "
|
dongsheng@627
|
2721 "prints more detailed information."
|
dongsheng@627
|
2722 msgstr ""
|
dongsheng@627
|
2723
|
dongsheng@627
|
2724 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2725 #: ../en/ch01-tour-basic.xml:120
|
dongsheng@627
|
2726 msgid ""
|
dongsheng@627
|
2727 "For a more impressive level of detail (which you won't usually need) run "
|
dongsheng@627
|
2728 "<command role=\"hg-cmd\">hg help <option role=\"hg-opt-global\">-v</option></"
|
dongsheng@627
|
2729 "command>. The <option role=\"hg-opt-global\">-v</option> option is short for "
|
dongsheng@627
|
2730 "<option role=\"hg-opt-global\">--verbose</option>, and tells Mercurial to "
|
dongsheng@627
|
2731 "print more information than it usually would."
|
dongsheng@627
|
2732 msgstr ""
|
dongsheng@627
|
2733
|
dongsheng@627
|
2734 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
2735 #: ../en/ch01-tour-basic.xml:131
|
dongsheng@627
|
2736 msgid "Working with a repository"
|
dongsheng@627
|
2737 msgstr "使用版本库"
|
dongsheng@627
|
2738
|
dongsheng@627
|
2739 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2740 #: ../en/ch01-tour-basic.xml:133
|
dongsheng@627
|
2741 msgid ""
|
dongsheng@627
|
2742 "In Mercurial, everything happens inside a <emphasis>repository</emphasis>. "
|
dongsheng@627
|
2743 "The repository for a project contains all of the files that <quote>belong to</"
|
dongsheng@627
|
2744 "quote> that project, along with a historical record of the project's files."
|
dongsheng@627
|
2745 msgstr ""
|
dongsheng@627
|
2746
|
dongsheng@627
|
2747 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2748 #: ../en/ch01-tour-basic.xml:139
|
dongsheng@627
|
2749 msgid ""
|
dongsheng@627
|
2750 "There's nothing particularly magical about a repository; it is simply a "
|
dongsheng@627
|
2751 "directory tree in your filesystem that Mercurial treats as special. You can "
|
dongsheng@627
|
2752 "rename or delete a repository any time you like, using either the command "
|
dongsheng@627
|
2753 "line or your file browser."
|
dongsheng@627
|
2754 msgstr ""
|
dongsheng@627
|
2755
|
dongsheng@627
|
2756 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2757 #: ../en/ch01-tour-basic.xml:146
|
dongsheng@627
|
2758 msgid "Making a local copy of a repository"
|
dongsheng@627
|
2759 msgstr "创建版本库的工作副本"
|
dongsheng@627
|
2760
|
dongsheng@627
|
2761 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2762 #: ../en/ch01-tour-basic.xml:148
|
dongsheng@627
|
2763 msgid ""
|
dongsheng@627
|
2764 "<emphasis>Copying</emphasis> a repository is just a little bit special. "
|
dongsheng@627
|
2765 "While you could use a normal file copying command to make a copy of a "
|
dongsheng@627
|
2766 "repository, it's best to use a built-in command that Mercurial provides. "
|
dongsheng@627
|
2767 "This command is called <command role=\"hg-cmd\">hg clone</command>, because "
|
dongsheng@627
|
2768 "it creates an identical copy of an existing repository."
|
dongsheng@627
|
2769 msgstr ""
|
dongsheng@627
|
2770
|
dongsheng@627
|
2771 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2772 #: ../en/ch01-tour-basic.xml:157
|
dongsheng@627
|
2773 msgid ""
|
dongsheng@627
|
2774 "If our clone succeeded, we should now have a local directory called <filename "
|
dongsheng@627
|
2775 "class=\"directory\">hello</filename>. This directory will contain some files."
|
dongsheng@627
|
2776 msgstr ""
|
dongsheng@627
|
2777
|
dongsheng@627
|
2778 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2779 #: ../en/ch01-tour-basic.xml:163
|
dongsheng@627
|
2780 msgid ""
|
dongsheng@627
|
2781 "These files have the same contents and history in our repository as they do "
|
dongsheng@627
|
2782 "in the repository we cloned."
|
dongsheng@627
|
2783 msgstr ""
|
dongsheng@627
|
2784
|
dongsheng@627
|
2785 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2786 #: ../en/ch01-tour-basic.xml:166
|
dongsheng@627
|
2787 msgid ""
|
dongsheng@627
|
2788 "Every Mercurial repository is complete, self-contained, and independent. It "
|
dongsheng@627
|
2789 "contains its own private copy of a project's files and history. A cloned "
|
dongsheng@627
|
2790 "repository remembers the location of the repository it was cloned from, but "
|
dongsheng@627
|
2791 "it does not communicate with that repository, or any other, unless you tell "
|
dongsheng@627
|
2792 "it to."
|
dongsheng@627
|
2793 msgstr ""
|
dongsheng@627
|
2794
|
dongsheng@627
|
2795 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2796 #: ../en/ch01-tour-basic.xml:173
|
dongsheng@627
|
2797 msgid ""
|
dongsheng@627
|
2798 "What this means for now is that we're free to experiment with our repository, "
|
dongsheng@627
|
2799 "safe in the knowledge that it's a private <quote>sandbox</quote> that won't "
|
dongsheng@627
|
2800 "affect anyone else."
|
dongsheng@627
|
2801 msgstr ""
|
dongsheng@627
|
2802
|
dongsheng@627
|
2803 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2804 #: ../en/ch01-tour-basic.xml:179
|
dongsheng@627
|
2805 msgid "What's in a repository?"
|
dongsheng@627
|
2806 msgstr "什么是版本库?"
|
dongsheng@627
|
2807
|
dongsheng@627
|
2808 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2809 #: ../en/ch01-tour-basic.xml:181
|
dongsheng@627
|
2810 msgid ""
|
dongsheng@627
|
2811 "When we take a more detailed look inside a repository, we can see that it "
|
dongsheng@627
|
2812 "contains a directory named <filename class=\"directory\">.hg</filename>. "
|
dongsheng@627
|
2813 "This is where Mercurial keeps all of its metadata for the repository."
|
dongsheng@627
|
2814 msgstr ""
|
dongsheng@627
|
2815
|
dongsheng@627
|
2816 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2817 #: ../en/ch01-tour-basic.xml:188
|
dongsheng@627
|
2818 msgid ""
|
dongsheng@627
|
2819 "The contents of the <filename class=\"directory\">.hg</filename> directory "
|
dongsheng@627
|
2820 "and its subdirectories are private to Mercurial. Every other file and "
|
dongsheng@627
|
2821 "directory in the repository is yours to do with as you please."
|
dongsheng@627
|
2822 msgstr ""
|
dongsheng@627
|
2823
|
dongsheng@627
|
2824 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2825 #: ../en/ch01-tour-basic.xml:194
|
dongsheng@627
|
2826 msgid ""
|
dongsheng@627
|
2827 "To introduce a little terminology, the <filename class=\"directory\">.hg</"
|
dongsheng@627
|
2828 "filename> directory is the <quote>real</quote> repository, and all of the "
|
dongsheng@627
|
2829 "files and directories that coexist with it are said to live in the "
|
dongsheng@627
|
2830 "<emphasis>working directory</emphasis>. An easy way to remember the "
|
dongsheng@627
|
2831 "distinction is that the <emphasis>repository</emphasis> contains the "
|
dongsheng@627
|
2832 "<emphasis>history</emphasis> of your project, while the <emphasis>working "
|
dongsheng@627
|
2833 "directory</emphasis> contains a <emphasis>snapshot</emphasis> of your project "
|
dongsheng@627
|
2834 "at a particular point in history."
|
dongsheng@627
|
2835 msgstr ""
|
dongsheng@627
|
2836
|
dongsheng@627
|
2837 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
2838 #: ../en/ch01-tour-basic.xml:209
|
dongsheng@627
|
2839 msgid "A tour through history"
|
dongsheng@627
|
2840 msgstr "回溯历史"
|
dongsheng@627
|
2841
|
dongsheng@627
|
2842 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2843 #: ../en/ch01-tour-basic.xml:211
|
dongsheng@627
|
2844 msgid ""
|
dongsheng@627
|
2845 "One of the first things we might want to do with a new, unfamiliar repository "
|
dongsheng@627
|
2846 "is understand its history. The <command role=\"hg-cmd\">hg log</command> "
|
dongsheng@627
|
2847 "command gives us a view of history."
|
dongsheng@627
|
2848 msgstr ""
|
dongsheng@627
|
2849
|
dongsheng@627
|
2850 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2851 #: ../en/ch01-tour-basic.xml:218
|
dongsheng@627
|
2852 msgid ""
|
dongsheng@627
|
2853 "By default, this command prints a brief paragraph of output for each change "
|
dongsheng@627
|
2854 "to the project that was recorded. In Mercurial terminology, we call each of "
|
dongsheng@627
|
2855 "these recorded events a <emphasis>changeset</emphasis>, because it can "
|
dongsheng@627
|
2856 "contain a record of changes to several files."
|
dongsheng@627
|
2857 msgstr ""
|
dongsheng@627
|
2858
|
dongsheng@627
|
2859 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2860 #: ../en/ch01-tour-basic.xml:224
|
dongsheng@627
|
2861 msgid ""
|
dongsheng@627
|
2862 "The fields in a record of output from <command role=\"hg-cmd\">hg log</"
|
dongsheng@627
|
2863 "command> are as follows."
|
dongsheng@627
|
2864 msgstr ""
|
dongsheng@627
|
2865
|
dongsheng@627
|
2866 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
2867 #: ../en/ch01-tour-basic.xml:227
|
dongsheng@627
|
2868 msgid ""
|
dongsheng@627
|
2869 "<literal>changeset</literal>: This field has the format of a number, followed "
|
dongsheng@627
|
2870 "by a colon, followed by a hexadecimal string. These are "
|
dongsheng@627
|
2871 "<emphasis>identifiers</emphasis> for the changeset. There are two "
|
dongsheng@627
|
2872 "identifiers because the number is shorter and easier to type than the hex "
|
dongsheng@627
|
2873 "string."
|
dongsheng@627
|
2874 msgstr ""
|
dongsheng@627
|
2875
|
dongsheng@627
|
2876 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
2877 #: ../en/ch01-tour-basic.xml:233
|
dongsheng@627
|
2878 msgid ""
|
dongsheng@627
|
2879 "<literal>user</literal>: The identity of the person who created the "
|
dongsheng@627
|
2880 "changeset. This is a free-form field, but it most often contains a person's "
|
dongsheng@627
|
2881 "name and email address."
|
dongsheng@627
|
2882 msgstr ""
|
dongsheng@627
|
2883
|
dongsheng@627
|
2884 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
2885 #: ../en/ch01-tour-basic.xml:237
|
dongsheng@627
|
2886 msgid ""
|
dongsheng@627
|
2887 "<literal>date</literal>: The date and time on which the changeset was "
|
dongsheng@627
|
2888 "created, and the timezone in which it was created. (The date and time are "
|
dongsheng@627
|
2889 "local to that timezone; they display what time and date it was for the person "
|
dongsheng@627
|
2890 "who created the changeset.)"
|
dongsheng@627
|
2891 msgstr ""
|
dongsheng@627
|
2892
|
dongsheng@627
|
2893 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
2894 #: ../en/ch01-tour-basic.xml:242
|
dongsheng@627
|
2895 msgid ""
|
dongsheng@627
|
2896 "<literal>summary</literal>: The first line of the text message that the "
|
dongsheng@627
|
2897 "creator of the changeset entered to describe the changeset."
|
dongsheng@627
|
2898 msgstr ""
|
dongsheng@627
|
2899
|
dongsheng@627
|
2900 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2901 #: ../en/ch01-tour-basic.xml:245
|
dongsheng@627
|
2902 msgid ""
|
dongsheng@627
|
2903 "The default output printed by <command role=\"hg-cmd\">hg log</command> is "
|
dongsheng@627
|
2904 "purely a summary; it is missing a lot of detail."
|
dongsheng@627
|
2905 msgstr ""
|
dongsheng@627
|
2906
|
dongsheng@627
|
2907 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
2908 #: ../en/ch01-tour-basic.xml:249
|
dongsheng@627
|
2909 msgid ""
|
dongsheng@641
|
2910 "Figure <xref endterm=\"fig.tour-basic.history.caption\" linkend=\"fig.tour-"
|
dongsheng@641
|
2911 "basic.history\"/> provides a graphical representation of the history of the "
|
dongsheng@641
|
2912 "<filename class=\"directory\">hello</filename> repository, to make it a "
|
dongsheng@641
|
2913 "little easier to see which direction history is <quote>flowing</quote> in. "
|
dongsheng@641
|
2914 "We'll be returning to this figure several times in this chapter and the "
|
dongsheng@641
|
2915 "chapter that follows."
|
dongsheng@627
|
2916 msgstr ""
|
dongsheng@627
|
2917
|
dongsheng@627
|
2918 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject>
|
dongsheng@650
|
2919 #: ../en/ch01-tour-basic.xml:260
|
dongsheng@627
|
2920 msgid ""
|
dongsheng@627
|
2921 "<imageobject><imagedata fileref=\"images/tour-history.png\"/></imageobject>"
|
dongsheng@627
|
2922 msgstr ""
|
dongsheng@627
|
2923
|
dongsheng@627
|
2924 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><textobject><phrase>
|
dongsheng@650
|
2925 #: ../en/ch01-tour-basic.xml:261 ../en/ch02-tour-merge.xml:48
|
dongsheng@650
|
2926 #: ../en/ch02-tour-merge.xml:78 ../en/ch02-tour-merge.xml:126
|
dongsheng@650
|
2927 #: ../en/ch02-tour-merge.xml:182 ../en/ch02-tour-merge.xml:254
|
dongsheng@650
|
2928 #: ../en/ch03-concepts.xml:56 ../en/ch03-concepts.xml:108
|
dongsheng@650
|
2929 #: ../en/ch03-concepts.xml:194 ../en/ch03-concepts.xml:301
|
dongsheng@650
|
2930 #: ../en/ch03-concepts.xml:353 ../en/ch03-concepts.xml:370
|
dongsheng@650
|
2931 #: ../en/ch03-concepts.xml:414 ../en/ch03-concepts.xml:436
|
dongsheng@650
|
2932 #: ../en/ch03-concepts.xml:480 ../en/ch05-collab.xml:277
|
dongsheng@650
|
2933 #: ../en/ch08-undo.xml:366 ../en/ch08-undo.xml:417 ../en/ch08-undo.xml:485
|
dongsheng@650
|
2934 #: ../en/ch08-undo.xml:527 ../en/ch11-mq.xml:410
|
dongsheng@627
|
2935 msgid "XXX add text"
|
dongsheng@627
|
2936 msgstr ""
|
dongsheng@627
|
2937
|
dongsheng@627
|
2938 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
2939 #: ../en/ch01-tour-basic.xml:262
|
dongsheng@627
|
2940 msgid ""
|
dongsheng@627
|
2941 "Graphical history of the <filename class=\"directory\">hello</filename> "
|
dongsheng@627
|
2942 "repository"
|
dongsheng@627
|
2943 msgstr ""
|
dongsheng@627
|
2944
|
dongsheng@627
|
2945 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
2946 #: ../en/ch01-tour-basic.xml:269
|
dongsheng@627
|
2947 msgid "Changesets, revisions, and talking to other people"
|
dongsheng@627
|
2948 msgstr "改变集,版本,与其它用户交互"
|
dongsheng@627
|
2949
|
dongsheng@627
|
2950 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2951 #: ../en/ch01-tour-basic.xml:272
|
dongsheng@627
|
2952 msgid ""
|
dongsheng@627
|
2953 "As English is a notoriously sloppy language, and computer science has a "
|
dongsheng@627
|
2954 "hallowed history of terminological confusion (why use one term when four will "
|
dongsheng@627
|
2955 "do?), revision control has a variety of words and phrases that mean the same "
|
dongsheng@627
|
2956 "thing. If you are talking about Mercurial history with other people, you "
|
dongsheng@627
|
2957 "will find that the word <quote>changeset</quote> is often compressed to "
|
dongsheng@627
|
2958 "<quote>change</quote> or (when written) <quote>cset</quote>, and sometimes a "
|
dongsheng@627
|
2959 "changeset is referred to as a <quote>revision</quote> or a <quote>rev</quote>."
|
dongsheng@627
|
2960 msgstr ""
|
dongsheng@627
|
2961
|
dongsheng@627
|
2962 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2963 #: ../en/ch01-tour-basic.xml:282
|
dongsheng@627
|
2964 msgid ""
|
dongsheng@627
|
2965 "While it doesn't matter what <emphasis>word</emphasis> you use to refer to "
|
dongsheng@627
|
2966 "the concept of <quote>a changeset</quote>, the <emphasis>identifier</"
|
dongsheng@627
|
2967 "emphasis> that you use to refer to <quote>a <emphasis>specific</emphasis> "
|
dongsheng@627
|
2968 "changeset</quote> is of great importance. Recall that the <literal>changeset</"
|
dongsheng@627
|
2969 "literal> field in the output from <command role=\"hg-cmd\">hg log</command> "
|
dongsheng@627
|
2970 "identifies a changeset using both a number and a hexadecimal string."
|
dongsheng@627
|
2971 msgstr ""
|
dongsheng@627
|
2972
|
dongsheng@627
|
2973 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
2974 #: ../en/ch01-tour-basic.xml:291
|
dongsheng@627
|
2975 msgid ""
|
dongsheng@627
|
2976 "The revision number is <emphasis>only valid in that repository</emphasis>,"
|
dongsheng@627
|
2977 msgstr ""
|
dongsheng@627
|
2978
|
dongsheng@627
|
2979 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
2980 #: ../en/ch01-tour-basic.xml:293
|
dongsheng@627
|
2981 msgid ""
|
dongsheng@627
|
2982 "while the hex string is the <emphasis>permanent, unchanging identifier</"
|
dongsheng@627
|
2983 "emphasis> that will always identify that exact changeset in <emphasis>every</"
|
dongsheng@627
|
2984 "emphasis> copy of the repository."
|
dongsheng@627
|
2985 msgstr ""
|
dongsheng@627
|
2986
|
dongsheng@627
|
2987 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
2988 #: ../en/ch01-tour-basic.xml:298
|
dongsheng@627
|
2989 msgid ""
|
dongsheng@627
|
2990 "This distinction is important. If you send someone an email talking about "
|
dongsheng@627
|
2991 "<quote>revision 33</quote>, there's a high likelihood that their revision 33 "
|
dongsheng@627
|
2992 "will <emphasis>not be the same</emphasis> as yours. The reason for this is "
|
dongsheng@627
|
2993 "that a revision number depends on the order in which changes arrived in a "
|
dongsheng@627
|
2994 "repository, and there is no guarantee that the same changes will happen in "
|
dongsheng@627
|
2995 "the same order in different repositories. Three changes $a,b,c$ can easily "
|
dongsheng@627
|
2996 "appear in one repository as $0,1,2$, while in another as $1,0,2$."
|
dongsheng@627
|
2997 msgstr ""
|
dongsheng@627
|
2998
|
dongsheng@627
|
2999 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3000 #: ../en/ch01-tour-basic.xml:308
|
dongsheng@627
|
3001 msgid ""
|
dongsheng@627
|
3002 "Mercurial uses revision numbers purely as a convenient shorthand. If you "
|
dongsheng@627
|
3003 "need to discuss a changeset with someone, or make a record of a changeset for "
|
dongsheng@627
|
3004 "some other reason (for example, in a bug report), use the hexadecimal "
|
dongsheng@627
|
3005 "identifier."
|
dongsheng@627
|
3006 msgstr ""
|
dongsheng@627
|
3007
|
dongsheng@627
|
3008 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3009 #: ../en/ch01-tour-basic.xml:316
|
dongsheng@627
|
3010 msgid "Viewing specific revisions"
|
dongsheng@627
|
3011 msgstr "察看指定版本"
|
dongsheng@627
|
3012
|
dongsheng@627
|
3013 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3014 #: ../en/ch01-tour-basic.xml:318
|
dongsheng@627
|
3015 msgid ""
|
dongsheng@627
|
3016 "To narrow the output of <command role=\"hg-cmd\">hg log</command> down to a "
|
dongsheng@627
|
3017 "single revision, use the <option role=\"hg-opt-log\">-r</option> (or <option "
|
dongsheng@627
|
3018 "role=\"hg-opt-log\">--rev</option>) option. You can use either a revision "
|
dongsheng@627
|
3019 "number or a long-form changeset identifier, and you can provide as many "
|
dongsheng@627
|
3020 "revisions as you want."
|
dongsheng@627
|
3021 msgstr ""
|
dongsheng@627
|
3022
|
dongsheng@627
|
3023 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3024 #: ../en/ch01-tour-basic.xml:327
|
dongsheng@627
|
3025 msgid ""
|
dongsheng@627
|
3026 "If you want to see the history of several revisions without having to list "
|
dongsheng@627
|
3027 "each one, you can use <emphasis>range notation</emphasis>; this lets you "
|
dongsheng@627
|
3028 "express the idea <quote>I want all revisions between <literal>abc</literal> "
|
dongsheng@627
|
3029 "and <literal>def</literal>, inclusive</quote>."
|
dongsheng@627
|
3030 msgstr ""
|
dongsheng@627
|
3031
|
dongsheng@627
|
3032 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3033 #: ../en/ch01-tour-basic.xml:335
|
dongsheng@627
|
3034 msgid ""
|
dongsheng@627
|
3035 "Mercurial also honours the order in which you specify revisions, so <command "
|
dongsheng@627
|
3036 "role=\"hg-cmd\">hg log -r 2:4</command> prints 2, 3, and 4. while <command "
|
dongsheng@627
|
3037 "role=\"hg-cmd\">hg log -r 4:2</command> prints 4, 3, and 2."
|
dongsheng@627
|
3038 msgstr ""
|
dongsheng@627
|
3039
|
dongsheng@627
|
3040 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3041 #: ../en/ch01-tour-basic.xml:342
|
dongsheng@627
|
3042 msgid "More detailed information"
|
dongsheng@627
|
3043 msgstr "更详细的信息"
|
dongsheng@627
|
3044
|
dongsheng@627
|
3045 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3046 #: ../en/ch01-tour-basic.xml:344
|
dongsheng@627
|
3047 msgid ""
|
dongsheng@627
|
3048 "While the summary information printed by <command role=\"hg-cmd\">hg log</"
|
dongsheng@627
|
3049 "command> is useful if you already know what you're looking for, you may need "
|
dongsheng@627
|
3050 "to see a complete description of the change, or a list of the files changed, "
|
dongsheng@627
|
3051 "if you're trying to decide whether a changeset is the one you're looking for. "
|
dongsheng@627
|
3052 "The <command role=\"hg-cmd\">hg log</command> command's <option role=\"hg-opt-"
|
dongsheng@627
|
3053 "global\">-v</option> (or <option role=\"hg-opt-global\">--verbose</option>) "
|
dongsheng@627
|
3054 "option gives you this extra detail."
|
dongsheng@627
|
3055 msgstr ""
|
dongsheng@627
|
3056
|
dongsheng@627
|
3057 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3058 #: ../en/ch01-tour-basic.xml:356
|
dongsheng@627
|
3059 msgid ""
|
dongsheng@627
|
3060 "If you want to see both the description and content of a change, add the "
|
dongsheng@627
|
3061 "<option role=\"hg-opt-log\">-p</option> (or <option role=\"hg-opt-log\">--"
|
dongsheng@627
|
3062 "patch</option>) option. This displays the content of a change as a "
|
dongsheng@627
|
3063 "<emphasis>unified diff</emphasis> (if you've never seen a unified diff "
|
dongsheng@627
|
3064 "before, see section <xref linkend=\"sec.mq.patch\"/> for an overview)."
|
dongsheng@627
|
3065 msgstr ""
|
dongsheng@627
|
3066
|
dongsheng@627
|
3067 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
3068 #: ../en/ch01-tour-basic.xml:369
|
dongsheng@627
|
3069 msgid "All about command options"
|
dongsheng@627
|
3070 msgstr "命令选项"
|
dongsheng@627
|
3071
|
dongsheng@627
|
3072 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3073 #: ../en/ch01-tour-basic.xml:371
|
dongsheng@627
|
3074 msgid ""
|
dongsheng@627
|
3075 "Let's take a brief break from exploring Mercurial commands to discuss a "
|
dongsheng@627
|
3076 "pattern in the way that they work; you may find this useful to keep in mind "
|
dongsheng@627
|
3077 "as we continue our tour."
|
dongsheng@627
|
3078 msgstr ""
|
dongsheng@627
|
3079
|
dongsheng@627
|
3080 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3081 #: ../en/ch01-tour-basic.xml:375
|
dongsheng@627
|
3082 msgid ""
|
dongsheng@627
|
3083 "Mercurial has a consistent and straightforward approach to dealing with the "
|
dongsheng@627
|
3084 "options that you can pass to commands. It follows the conventions for "
|
dongsheng@627
|
3085 "options that are common to modern Linux and Unix systems."
|
dongsheng@627
|
3086 msgstr ""
|
dongsheng@627
|
3087
|
dongsheng@627
|
3088 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
3089 #: ../en/ch01-tour-basic.xml:380
|
dongsheng@627
|
3090 msgid ""
|
dongsheng@627
|
3091 "Every option has a long name. For example, as we've already seen, the "
|
dongsheng@627
|
3092 "<command role=\"hg-cmd\">hg log</command> command accepts a <option role=\"hg-"
|
dongsheng@627
|
3093 "opt-log\">--rev</option> option."
|
dongsheng@627
|
3094 msgstr ""
|
dongsheng@627
|
3095
|
dongsheng@627
|
3096 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
3097 #: ../en/ch01-tour-basic.xml:384
|
dongsheng@627
|
3098 msgid ""
|
dongsheng@627
|
3099 "Most options have short names, too. Instead of <option role=\"hg-opt-log\">--"
|
dongsheng@627
|
3100 "rev</option>, we can use <option role=\"hg-opt-log\">-r</option>. (The "
|
dongsheng@627
|
3101 "reason that some options don't have short names is that the options in "
|
dongsheng@627
|
3102 "question are rarely used.)"
|
dongsheng@627
|
3103 msgstr ""
|
dongsheng@627
|
3104
|
dongsheng@627
|
3105 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
3106 #: ../en/ch01-tour-basic.xml:389
|
dongsheng@627
|
3107 msgid ""
|
dongsheng@627
|
3108 "Long options start with two dashes (e.g. <option role=\"hg-opt-log\">--rev</"
|
dongsheng@627
|
3109 "option>), while short options start with one (e.g. <option role=\"hg-opt-log"
|
dongsheng@627
|
3110 "\">-r</option>)."
|
dongsheng@627
|
3111 msgstr ""
|
dongsheng@627
|
3112
|
dongsheng@627
|
3113 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
3114 #: ../en/ch01-tour-basic.xml:393
|
dongsheng@627
|
3115 msgid ""
|
dongsheng@627
|
3116 "Option naming and usage is consistent across commands. For example, every "
|
dongsheng@627
|
3117 "command that lets you specify a changeset ID or revision number accepts both "
|
dongsheng@627
|
3118 "<option role=\"hg-opt-log\">-r</option> and <option role=\"hg-opt-log\">--"
|
dongsheng@627
|
3119 "rev</option> arguments."
|
dongsheng@627
|
3120 msgstr ""
|
dongsheng@627
|
3121
|
dongsheng@627
|
3122 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3123 #: ../en/ch01-tour-basic.xml:399
|
dongsheng@627
|
3124 msgid ""
|
dongsheng@627
|
3125 "In the examples throughout this book, I use short options instead of long. "
|
dongsheng@627
|
3126 "This just reflects my own preference, so don't read anything significant into "
|
dongsheng@627
|
3127 "it."
|
dongsheng@627
|
3128 msgstr ""
|
dongsheng@627
|
3129
|
dongsheng@627
|
3130 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3131 #: ../en/ch01-tour-basic.xml:403
|
dongsheng@627
|
3132 msgid ""
|
dongsheng@627
|
3133 "Most commands that print output of some kind will print more output when "
|
dongsheng@627
|
3134 "passed a <option role=\"hg-opt-global\">-v</option> (or <option role=\"hg-opt-"
|
dongsheng@627
|
3135 "global\">--verbose</option>) option, and less when passed <option role=\"hg-"
|
dongsheng@627
|
3136 "opt-global\">-q</option> (or <option role=\"hg-opt-global\">--quiet</option>)."
|
dongsheng@627
|
3137 msgstr ""
|
dongsheng@627
|
3138
|
dongsheng@627
|
3139 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
3140 #: ../en/ch01-tour-basic.xml:411
|
dongsheng@627
|
3141 msgid "Making and reviewing changes"
|
dongsheng@627
|
3142 msgstr "创建和复审修改"
|
dongsheng@627
|
3143
|
dongsheng@627
|
3144 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3145 #: ../en/ch01-tour-basic.xml:413
|
dongsheng@627
|
3146 msgid ""
|
dongsheng@627
|
3147 "Now that we have a grasp of viewing history in Mercurial, let's take a look "
|
dongsheng@627
|
3148 "at making some changes and examining them."
|
dongsheng@627
|
3149 msgstr ""
|
dongsheng@627
|
3150
|
dongsheng@627
|
3151 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3152 #: ../en/ch01-tour-basic.xml:417
|
dongsheng@627
|
3153 msgid ""
|
dongsheng@627
|
3154 "The first thing we'll do is isolate our experiment in a repository of its "
|
dongsheng@627
|
3155 "own. We use the <command role=\"hg-cmd\">hg clone</command> command, but we "
|
dongsheng@627
|
3156 "don't need to clone a copy of the remote repository. Since we already have a "
|
dongsheng@627
|
3157 "copy of it locally, we can just clone that instead. This is much faster than "
|
dongsheng@627
|
3158 "cloning over the network, and cloning a local repository uses less disk space "
|
dongsheng@627
|
3159 "in most cases, too."
|
dongsheng@627
|
3160 msgstr ""
|
dongsheng@627
|
3161
|
dongsheng@627
|
3162 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3163 #: ../en/ch01-tour-basic.xml:427
|
dongsheng@627
|
3164 msgid ""
|
dongsheng@627
|
3165 "As an aside, it's often good practice to keep a <quote>pristine</quote> copy "
|
dongsheng@627
|
3166 "of a remote repository around, which you can then make temporary clones of to "
|
dongsheng@627
|
3167 "create sandboxes for each task you want to work on. This lets you work on "
|
dongsheng@627
|
3168 "multiple tasks in parallel, each isolated from the others until it's complete "
|
dongsheng@627
|
3169 "and you're ready to integrate it back. Because local clones are so cheap, "
|
dongsheng@627
|
3170 "there's almost no overhead to cloning and destroying repositories whenever "
|
dongsheng@627
|
3171 "you want."
|
dongsheng@627
|
3172 msgstr ""
|
dongsheng@627
|
3173
|
dongsheng@627
|
3174 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3175 #: ../en/ch01-tour-basic.xml:436
|
dongsheng@627
|
3176 msgid ""
|
dongsheng@627
|
3177 "In our <filename class=\"directory\">my-hello</filename> repository, we have "
|
dongsheng@627
|
3178 "a file <filename>hello.c</filename> that contains the classic <quote>hello, "
|
dongsheng@627
|
3179 "world</quote> program. Let's use the ancient and venerable <command>sed</"
|
dongsheng@627
|
3180 "command> command to edit this file so that it prints a second line of "
|
dongsheng@627
|
3181 "output. (I'm only using <command>sed</command> to do this because it's easy "
|
dongsheng@627
|
3182 "to write a scripted example this way. Since you're not under the same "
|
dongsheng@627
|
3183 "constraint, you probably won't want to use <command>sed</command>; simply use "
|
dongsheng@627
|
3184 "your preferred text editor to do the same thing.)"
|
dongsheng@627
|
3185 msgstr ""
|
dongsheng@627
|
3186
|
dongsheng@627
|
3187 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3188 #: ../en/ch01-tour-basic.xml:449
|
dongsheng@627
|
3189 msgid ""
|
dongsheng@627
|
3190 "Mercurial's <command role=\"hg-cmd\">hg status</command> command will tell us "
|
dongsheng@627
|
3191 "what Mercurial knows about the files in the repository."
|
dongsheng@627
|
3192 msgstr ""
|
dongsheng@627
|
3193
|
dongsheng@627
|
3194 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3195 #: ../en/ch01-tour-basic.xml:455
|
dongsheng@627
|
3196 msgid ""
|
dongsheng@627
|
3197 "The <command role=\"hg-cmd\">hg status</command> command prints no output for "
|
dongsheng@627
|
3198 "some files, but a line starting with <quote><literal>M</literal></quote> for "
|
dongsheng@627
|
3199 "<filename>hello.c</filename>. Unless you tell it to, <command role=\"hg-cmd"
|
dongsheng@627
|
3200 "\">hg status</command> will not print any output for files that have not been "
|
dongsheng@627
|
3201 "modified."
|
dongsheng@627
|
3202 msgstr ""
|
dongsheng@627
|
3203
|
dongsheng@627
|
3204 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3205 #: ../en/ch01-tour-basic.xml:462
|
dongsheng@627
|
3206 msgid ""
|
dongsheng@627
|
3207 "The <quote><literal>M</literal></quote> indicates that Mercurial has noticed "
|
dongsheng@627
|
3208 "that we modified <filename>hello.c</filename>. We didn't need to "
|
dongsheng@627
|
3209 "<emphasis>inform</emphasis> Mercurial that we were going to modify the file "
|
dongsheng@627
|
3210 "before we started, or that we had modified the file after we were done; it "
|
dongsheng@627
|
3211 "was able to figure this out itself."
|
dongsheng@627
|
3212 msgstr ""
|
dongsheng@627
|
3213
|
dongsheng@627
|
3214 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3215 #: ../en/ch01-tour-basic.xml:470
|
dongsheng@627
|
3216 msgid ""
|
dongsheng@627
|
3217 "It's a little bit helpful to know that we've modified <filename>hello.c</"
|
dongsheng@627
|
3218 "filename>, but we might prefer to know exactly <emphasis>what</emphasis> "
|
dongsheng@627
|
3219 "changes we've made to it. To do this, we use the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
3220 "diff</command> command."
|
dongsheng@627
|
3221 msgstr ""
|
dongsheng@627
|
3222
|
dongsheng@627
|
3223 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
3224 #: ../en/ch01-tour-basic.xml:480
|
dongsheng@627
|
3225 msgid "Recording changes in a new changeset"
|
dongsheng@627
|
3226 msgstr "在新修改集中记录修改"
|
dongsheng@627
|
3227
|
dongsheng@627
|
3228 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3229 #: ../en/ch01-tour-basic.xml:482
|
dongsheng@627
|
3230 msgid ""
|
dongsheng@627
|
3231 "We can modify files, build and test our changes, and use <command role=\"hg-"
|
dongsheng@627
|
3232 "cmd\">hg status</command> and <command role=\"hg-cmd\">hg diff</command> to "
|
dongsheng@627
|
3233 "review our changes, until we're satisfied with what we've done and arrive at "
|
dongsheng@627
|
3234 "a natural stopping point where we want to record our work in a new changeset."
|
dongsheng@627
|
3235 msgstr ""
|
dongsheng@627
|
3236
|
dongsheng@627
|
3237 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3238 #: ../en/ch01-tour-basic.xml:489
|
dongsheng@627
|
3239 msgid ""
|
dongsheng@627
|
3240 "The <command role=\"hg-cmd\">hg commit</command> command lets us create a new "
|
dongsheng@627
|
3241 "changeset; we'll usually refer to this as <quote>making a commit</quote> or "
|
dongsheng@627
|
3242 "<quote>committing</quote>."
|
dongsheng@627
|
3243 msgstr ""
|
dongsheng@627
|
3244
|
dongsheng@627
|
3245 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3246 #: ../en/ch01-tour-basic.xml:495
|
dongsheng@627
|
3247 msgid "Setting up a username"
|
dongsheng@627
|
3248 msgstr "配置用户名称"
|
dongsheng@627
|
3249
|
dongsheng@627
|
3250 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3251 #: ../en/ch01-tour-basic.xml:497
|
dongsheng@627
|
3252 msgid ""
|
dongsheng@627
|
3253 "When you try to run <command role=\"hg-cmd\">hg commit</command> for the "
|
dongsheng@627
|
3254 "first time, it is not guaranteed to succeed. Mercurial records your name and "
|
dongsheng@627
|
3255 "address with each change that you commit, so that you and others will later "
|
dongsheng@627
|
3256 "be able to tell who made each change. Mercurial tries to automatically "
|
dongsheng@627
|
3257 "figure out a sensible username to commit the change with. It will attempt "
|
dongsheng@627
|
3258 "each of the following methods, in order:"
|
dongsheng@627
|
3259 msgstr ""
|
dongsheng@627
|
3260
|
dongsheng@627
|
3261 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
3262 #: ../en/ch01-tour-basic.xml:506
|
dongsheng@627
|
3263 msgid ""
|
dongsheng@627
|
3264 "If you specify a <option role=\"hg-opt-commit\">-u</option> option to the "
|
dongsheng@627
|
3265 "<command role=\"hg-cmd\">hg commit</command> command on the command line, "
|
dongsheng@627
|
3266 "followed by a username, this is always given the highest precedence."
|
dongsheng@627
|
3267 msgstr ""
|
dongsheng@627
|
3268
|
dongsheng@627
|
3269 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
3270 #: ../en/ch01-tour-basic.xml:511
|
dongsheng@627
|
3271 msgid ""
|
dongsheng@627
|
3272 "If you have set the <envar>HGUSER</envar> environment variable, this is "
|
dongsheng@627
|
3273 "checked next."
|
dongsheng@627
|
3274 msgstr ""
|
dongsheng@627
|
3275
|
dongsheng@627
|
3276 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
3277 #: ../en/ch01-tour-basic.xml:514
|
dongsheng@627
|
3278 msgid ""
|
dongsheng@627
|
3279 "If you create a file in your home directory called <filename role=\"special"
|
dongsheng@627
|
3280 "\">.hgrc</filename>, with a <envar role=\"rc-item-ui\">username</envar> "
|
dongsheng@627
|
3281 "entry, that will be used next. To see what the contents of this file should "
|
dongsheng@627
|
3282 "look like, refer to section <xref linkend=\"sec.tour-basic.username\"/> below."
|
dongsheng@627
|
3283 msgstr ""
|
dongsheng@627
|
3284
|
dongsheng@627
|
3285 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
3286 #: ../en/ch01-tour-basic.xml:521
|
dongsheng@627
|
3287 msgid ""
|
dongsheng@627
|
3288 "If you have set the <envar>EMAIL</envar> environment variable, this will be "
|
dongsheng@627
|
3289 "used next."
|
dongsheng@627
|
3290 msgstr ""
|
dongsheng@627
|
3291
|
dongsheng@627
|
3292 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
3293 #: ../en/ch01-tour-basic.xml:524
|
dongsheng@627
|
3294 msgid ""
|
dongsheng@627
|
3295 "Mercurial will query your system to find out your local user name and host "
|
dongsheng@627
|
3296 "name, and construct a username from these components. Since this often "
|
dongsheng@627
|
3297 "results in a username that is not very useful, it will print a warning if it "
|
dongsheng@627
|
3298 "has to do this."
|
dongsheng@627
|
3299 msgstr ""
|
dongsheng@627
|
3300
|
dongsheng@627
|
3301 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3302 #: ../en/ch01-tour-basic.xml:531
|
dongsheng@627
|
3303 msgid ""
|
dongsheng@627
|
3304 "If all of these mechanisms fail, Mercurial will fail, printing an error "
|
dongsheng@627
|
3305 "message. In this case, it will not let you commit until you set up a "
|
dongsheng@627
|
3306 "username."
|
dongsheng@627
|
3307 msgstr ""
|
dongsheng@627
|
3308
|
dongsheng@627
|
3309 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3310 #: ../en/ch01-tour-basic.xml:535
|
dongsheng@627
|
3311 msgid ""
|
dongsheng@627
|
3312 "You should think of the <envar>HGUSER</envar> environment variable and the "
|
dongsheng@627
|
3313 "<option role=\"hg-opt-commit\">-u</option> option to the <command role=\"hg-"
|
dongsheng@627
|
3314 "cmd\">hg commit</command> command as ways to <emphasis>override</emphasis> "
|
dongsheng@627
|
3315 "Mercurial's default selection of username. For normal use, the simplest and "
|
dongsheng@627
|
3316 "most robust way to set a username for yourself is by creating a <filename "
|
dongsheng@627
|
3317 "role=\"special\">.hgrc</filename> file; see below for details."
|
dongsheng@627
|
3318 msgstr ""
|
dongsheng@627
|
3319
|
dongsheng@627
|
3320 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
3321 #: ../en/ch01-tour-basic.xml:544
|
dongsheng@627
|
3322 msgid "Creating a Mercurial configuration file"
|
dongsheng@627
|
3323 msgstr "创建 Mercurial 的配置文件"
|
dongsheng@627
|
3324
|
dongsheng@627
|
3325 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
3326 #: ../en/ch01-tour-basic.xml:546
|
dongsheng@627
|
3327 msgid ""
|
dongsheng@627
|
3328 "To set a user name, use your favourite editor to create a file called "
|
dongsheng@627
|
3329 "<filename role=\"special\">.hgrc</filename> in your home directory. "
|
dongsheng@627
|
3330 "Mercurial will use this file to look up your personalised configuration "
|
dongsheng@627
|
3331 "settings. The initial contents of your <filename role=\"special\">.hgrc</"
|
dongsheng@627
|
3332 "filename> should look like this."
|
dongsheng@627
|
3333 msgstr ""
|
dongsheng@627
|
3334
|
dongsheng@627
|
3335 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
3336 #: ../en/ch01-tour-basic.xml:558
|
dongsheng@627
|
3337 msgid ""
|
dongsheng@627
|
3338 "The <quote><literal>[ui]</literal></quote> line begins a <emphasis>section</"
|
dongsheng@627
|
3339 "emphasis> of the config file, so you can read the <quote><literal>username "
|
dongsheng@627
|
3340 "= ...</literal></quote> line as meaning <quote>set the value of the "
|
dongsheng@627
|
3341 "<literal>username</literal> item in the <literal>ui</literal> section</"
|
dongsheng@627
|
3342 "quote>. A section continues until a new section begins, or the end of the "
|
dongsheng@627
|
3343 "file. Mercurial ignores empty lines and treats any text from "
|
dongsheng@627
|
3344 "<quote><literal>#</literal></quote> to the end of a line as a comment."
|
dongsheng@627
|
3345 msgstr ""
|
dongsheng@627
|
3346
|
dongsheng@627
|
3347 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
3348 #: ../en/ch01-tour-basic.xml:571
|
dongsheng@627
|
3349 msgid "Choosing a user name"
|
dongsheng@627
|
3350 msgstr "选择用户名称"
|
dongsheng@627
|
3351
|
dongsheng@627
|
3352 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
3353 #: ../en/ch01-tour-basic.xml:573
|
dongsheng@627
|
3354 msgid ""
|
dongsheng@627
|
3355 "You can use any text you like as the value of the <literal>username</literal> "
|
dongsheng@627
|
3356 "config item, since this information is for reading by other people, but for "
|
dongsheng@627
|
3357 "interpreting by Mercurial. The convention that most people follow is to use "
|
dongsheng@627
|
3358 "their name and email address, as in the example above."
|
dongsheng@627
|
3359 msgstr ""
|
dongsheng@627
|
3360
|
dongsheng@627
|
3361 #. type: Content of: <book><chapter><sect1><sect2><sect3><note><para>
|
dongsheng@650
|
3362 #: ../en/ch01-tour-basic.xml:580
|
dongsheng@627
|
3363 msgid ""
|
dongsheng@627
|
3364 "Mercurial's built-in web server obfuscates email addresses, to make it more "
|
dongsheng@627
|
3365 "difficult for the email harvesting tools that spammers use. This reduces the "
|
dongsheng@627
|
3366 "likelihood that you'll start receiving more junk email if you publish a "
|
dongsheng@627
|
3367 "Mercurial repository on the web."
|
dongsheng@627
|
3368 msgstr ""
|
dongsheng@627
|
3369
|
dongsheng@627
|
3370 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3371 #: ../en/ch01-tour-basic.xml:590
|
dongsheng@627
|
3372 msgid "Writing a commit message"
|
dongsheng@627
|
3373 msgstr "写提交日志"
|
dongsheng@627
|
3374
|
dongsheng@627
|
3375 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3376 #: ../en/ch01-tour-basic.xml:592
|
dongsheng@627
|
3377 msgid ""
|
dongsheng@627
|
3378 "When we commit a change, Mercurial drops us into a text editor, to enter a "
|
dongsheng@627
|
3379 "message that will describe the modifications we've made in this changeset. "
|
dongsheng@627
|
3380 "This is called the <emphasis>commit message</emphasis>. It will be a record "
|
dongsheng@627
|
3381 "for readers of what we did and why, and it will be printed by <command role="
|
dongsheng@627
|
3382 "\"hg-cmd\">hg log</command> after we've finished committing."
|
dongsheng@627
|
3383 msgstr ""
|
dongsheng@627
|
3384
|
dongsheng@627
|
3385 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3386 #: ../en/ch01-tour-basic.xml:602
|
dongsheng@627
|
3387 msgid ""
|
dongsheng@627
|
3388 "The editor that the <command role=\"hg-cmd\">hg commit</command> command "
|
dongsheng@627
|
3389 "drops us into will contain an empty line, followed by a number of lines "
|
dongsheng@627
|
3390 "starting with <quote><literal>HG:</literal></quote>."
|
dongsheng@627
|
3391 msgstr ""
|
dongsheng@627
|
3392
|
dongsheng@627
|
3393 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3394 #: ../en/ch01-tour-basic.xml:609
|
dongsheng@627
|
3395 msgid ""
|
dongsheng@627
|
3396 "Mercurial ignores the lines that start with <quote><literal>HG:</literal></"
|
dongsheng@627
|
3397 "quote>; it uses them only to tell us which files it's recording changes to. "
|
dongsheng@627
|
3398 "Modifying or deleting these lines has no effect."
|
dongsheng@627
|
3399 msgstr ""
|
dongsheng@627
|
3400
|
dongsheng@627
|
3401 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3402 #: ../en/ch01-tour-basic.xml:615
|
dongsheng@627
|
3403 msgid "Writing a good commit message"
|
dongsheng@627
|
3404 msgstr "写好提交日志"
|
dongsheng@627
|
3405
|
dongsheng@627
|
3406 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3407 #: ../en/ch01-tour-basic.xml:617
|
dongsheng@627
|
3408 msgid ""
|
dongsheng@627
|
3409 "Since <command role=\"hg-cmd\">hg log</command> only prints the first line of "
|
dongsheng@627
|
3410 "a commit message by default, it's best to write a commit message whose first "
|
dongsheng@627
|
3411 "line stands alone. Here's a real example of a commit message that "
|
dongsheng@627
|
3412 "<emphasis>doesn't</emphasis> follow this guideline, and hence has a summary "
|
dongsheng@627
|
3413 "that is not readable."
|
dongsheng@627
|
3414 msgstr ""
|
dongsheng@627
|
3415
|
dongsheng@627
|
3416 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3417 #: ../en/ch01-tour-basic.xml:631
|
dongsheng@627
|
3418 msgid ""
|
dongsheng@627
|
3419 "As far as the remainder of the contents of the commit message are concerned, "
|
dongsheng@627
|
3420 "there are no hard-and-fast rules. Mercurial itself doesn't interpret or care "
|
dongsheng@627
|
3421 "about the contents of the commit message, though your project may have "
|
dongsheng@627
|
3422 "policies that dictate a certain kind of formatting."
|
dongsheng@627
|
3423 msgstr ""
|
dongsheng@627
|
3424
|
dongsheng@627
|
3425 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3426 #: ../en/ch01-tour-basic.xml:637
|
dongsheng@627
|
3427 msgid ""
|
dongsheng@627
|
3428 "My personal preference is for short, but informative, commit messages that "
|
dongsheng@627
|
3429 "tell me something that I can't figure out with a quick glance at the output "
|
dongsheng@627
|
3430 "of <command role=\"hg-cmd\">hg log --patch</command>."
|
dongsheng@627
|
3431 msgstr ""
|
dongsheng@627
|
3432
|
dongsheng@627
|
3433 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3434 #: ../en/ch01-tour-basic.xml:644
|
dongsheng@627
|
3435 msgid "Aborting a commit"
|
dongsheng@627
|
3436 msgstr "终止提交"
|
dongsheng@627
|
3437
|
dongsheng@627
|
3438 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3439 #: ../en/ch01-tour-basic.xml:646
|
dongsheng@627
|
3440 msgid ""
|
dongsheng@627
|
3441 "If you decide that you don't want to commit while in the middle of editing a "
|
dongsheng@627
|
3442 "commit message, simply exit from your editor without saving the file that "
|
dongsheng@627
|
3443 "it's editing. This will cause nothing to happen to either the repository or "
|
dongsheng@627
|
3444 "the working directory."
|
dongsheng@627
|
3445 msgstr ""
|
dongsheng@627
|
3446
|
dongsheng@627
|
3447 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3448 #: ../en/ch01-tour-basic.xml:651
|
dongsheng@627
|
3449 msgid ""
|
dongsheng@627
|
3450 "If we run the <command role=\"hg-cmd\">hg commit</command> command without "
|
dongsheng@627
|
3451 "any arguments, it records all of the changes we've made, as reported by "
|
dongsheng@627
|
3452 "<command role=\"hg-cmd\">hg status</command> and <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
3453 "diff</command>."
|
dongsheng@627
|
3454 msgstr ""
|
dongsheng@627
|
3455
|
dongsheng@627
|
3456 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3457 #: ../en/ch01-tour-basic.xml:658
|
dongsheng@627
|
3458 msgid "Admiring our new handiwork"
|
dongsheng@627
|
3459 msgstr "欣赏我们的新手艺"
|
dongsheng@627
|
3460
|
dongsheng@627
|
3461 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3462 #: ../en/ch01-tour-basic.xml:660
|
dongsheng@627
|
3463 msgid ""
|
dongsheng@627
|
3464 "Once we've finished the commit, we can use the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
3465 "tip</command> command to display the changeset we just created. This command "
|
dongsheng@627
|
3466 "produces output that is identical to <command role=\"hg-cmd\">hg log</"
|
dongsheng@627
|
3467 "command>, but it only displays the newest revision in the repository."
|
dongsheng@627
|
3468 msgstr ""
|
dongsheng@627
|
3469
|
dongsheng@627
|
3470 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3471 #: ../en/ch01-tour-basic.xml:669
|
dongsheng@627
|
3472 msgid ""
|
dongsheng@627
|
3473 "We refer to the newest revision in the repository as the tip revision, or "
|
dongsheng@627
|
3474 "simply the tip."
|
dongsheng@627
|
3475 msgstr ""
|
dongsheng@627
|
3476
|
dongsheng@627
|
3477 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
3478 #: ../en/ch01-tour-basic.xml:676
|
dongsheng@627
|
3479 msgid "Sharing changes"
|
dongsheng@627
|
3480 msgstr "共享修改"
|
dongsheng@627
|
3481
|
dongsheng@627
|
3482 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3483 #: ../en/ch01-tour-basic.xml:678
|
dongsheng@627
|
3484 msgid ""
|
dongsheng@627
|
3485 "We mentioned earlier that repositories in Mercurial are self-contained. This "
|
dongsheng@627
|
3486 "means that the changeset we just created exists only in our <filename class="
|
dongsheng@627
|
3487 "\"directory\">my-hello</filename> repository. Let's look at a few ways that "
|
dongsheng@627
|
3488 "we can propagate this change into other repositories."
|
dongsheng@627
|
3489 msgstr ""
|
dongsheng@627
|
3490
|
dongsheng@627
|
3491 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3492 #: ../en/ch01-tour-basic.xml:686
|
dongsheng@627
|
3493 msgid "Pulling changes from another repository"
|
dongsheng@627
|
3494 msgstr "从其它版本库取得修改"
|
dongsheng@627
|
3495
|
dongsheng@627
|
3496 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3497 #: ../en/ch01-tour-basic.xml:687
|
dongsheng@627
|
3498 msgid ""
|
dongsheng@627
|
3499 "To get started, let's clone our original <filename class=\"directory\">hello</"
|
dongsheng@627
|
3500 "filename> repository, which does not contain the change we just committed. "
|
dongsheng@627
|
3501 "We'll call our temporary repository <filename class=\"directory\">hello-pull</"
|
dongsheng@627
|
3502 "filename>."
|
dongsheng@627
|
3503 msgstr ""
|
dongsheng@627
|
3504
|
dongsheng@627
|
3505 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3506 #: ../en/ch01-tour-basic.xml:695
|
dongsheng@627
|
3507 msgid ""
|
dongsheng@627
|
3508 "We'll use the <command role=\"hg-cmd\">hg pull</command> command to bring "
|
dongsheng@627
|
3509 "changes from <filename class=\"directory\">my-hello</filename> into <filename "
|
dongsheng@627
|
3510 "class=\"directory\">hello-pull</filename>. However, blindly pulling unknown "
|
dongsheng@627
|
3511 "changes into a repository is a somewhat scary prospect. Mercurial provides "
|
dongsheng@627
|
3512 "the <command role=\"hg-cmd\">hg incoming</command> command to tell us what "
|
dongsheng@627
|
3513 "changes the <command role=\"hg-cmd\">hg pull</command> command "
|
dongsheng@627
|
3514 "<emphasis>would</emphasis> pull into the repository, without actually pulling "
|
dongsheng@627
|
3515 "the changes in."
|
dongsheng@627
|
3516 msgstr ""
|
dongsheng@627
|
3517
|
dongsheng@627
|
3518 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3519 #: ../en/ch01-tour-basic.xml:708
|
dongsheng@627
|
3520 msgid ""
|
dongsheng@627
|
3521 "(Of course, someone could cause more changesets to appear in the repository "
|
dongsheng@627
|
3522 "that we ran <command role=\"hg-cmd\">hg incoming</command> in, before we get "
|
dongsheng@627
|
3523 "a chance to <command role=\"hg-cmd\">hg pull</command> the changes, so that "
|
dongsheng@627
|
3524 "we could end up pulling changes that we didn't expect.)"
|
dongsheng@627
|
3525 msgstr ""
|
dongsheng@627
|
3526
|
dongsheng@627
|
3527 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3528 #: ../en/ch01-tour-basic.xml:715
|
dongsheng@627
|
3529 msgid ""
|
dongsheng@627
|
3530 "Bringing changes into a repository is a simple matter of running the <command "
|
dongsheng@627
|
3531 "role=\"hg-cmd\">hg pull</command> command, and telling it which repository to "
|
dongsheng@627
|
3532 "pull from."
|
dongsheng@627
|
3533 msgstr ""
|
dongsheng@627
|
3534
|
dongsheng@627
|
3535 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3536 #: ../en/ch01-tour-basic.xml:722
|
dongsheng@627
|
3537 msgid ""
|
dongsheng@627
|
3538 "As you can see from the before-and-after output of <command role=\"hg-cmd"
|
dongsheng@627
|
3539 "\">hg tip</command>, we have successfully pulled changes into our "
|
dongsheng@627
|
3540 "repository. There remains one step before we can see these changes in the "
|
dongsheng@627
|
3541 "working directory."
|
dongsheng@627
|
3542 msgstr ""
|
dongsheng@627
|
3543
|
dongsheng@627
|
3544 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3545 #: ../en/ch01-tour-basic.xml:730
|
dongsheng@627
|
3546 msgid "Updating the working directory"
|
dongsheng@627
|
3547 msgstr "更新工作目录"
|
dongsheng@627
|
3548
|
dongsheng@627
|
3549 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3550 #: ../en/ch01-tour-basic.xml:732
|
dongsheng@627
|
3551 msgid ""
|
dongsheng@627
|
3552 "We have so far glossed over the relationship between a repository and its "
|
dongsheng@627
|
3553 "working directory. The <command role=\"hg-cmd\">hg pull</command> command "
|
dongsheng@627
|
3554 "that we ran in section <xref linkend=\"sec.tour.pull\"/> brought changes into "
|
dongsheng@627
|
3555 "the repository, but if we check, there's no sign of those changes in the "
|
dongsheng@627
|
3556 "working directory. This is because <command role=\"hg-cmd\">hg pull</"
|
dongsheng@627
|
3557 "command> does not (by default) touch the working directory. Instead, we use "
|
dongsheng@627
|
3558 "the <command role=\"hg-cmd\">hg update</command> command to do this."
|
dongsheng@627
|
3559 msgstr ""
|
dongsheng@627
|
3560
|
dongsheng@627
|
3561 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3562 #: ../en/ch01-tour-basic.xml:744
|
dongsheng@627
|
3563 msgid ""
|
dongsheng@627
|
3564 "It might seem a bit strange that <command role=\"hg-cmd\">hg pull</command> "
|
dongsheng@627
|
3565 "doesn't update the working directory automatically. There's actually a good "
|
dongsheng@627
|
3566 "reason for this: you can use <command role=\"hg-cmd\">hg update</command> to "
|
dongsheng@627
|
3567 "update the working directory to the state it was in at <emphasis>any "
|
dongsheng@627
|
3568 "revision</emphasis> in the history of the repository. If you had the working "
|
dongsheng@627
|
3569 "directory updated to an old revision---to hunt down the origin of a bug, "
|
dongsheng@627
|
3570 "say---and ran a <command role=\"hg-cmd\">hg pull</command> which "
|
dongsheng@627
|
3571 "automatically updated the working directory to a new revision, you might not "
|
dongsheng@627
|
3572 "be terribly happy."
|
dongsheng@627
|
3573 msgstr ""
|
dongsheng@627
|
3574
|
dongsheng@627
|
3575 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3576 #: ../en/ch01-tour-basic.xml:755
|
dongsheng@627
|
3577 msgid ""
|
dongsheng@627
|
3578 "However, since pull-then-update is such a common thing to do, Mercurial lets "
|
dongsheng@627
|
3579 "you combine the two by passing the <option role=\"hg-opt-pull\">-u</option> "
|
dongsheng@627
|
3580 "option to <command role=\"hg-cmd\">hg pull</command>."
|
dongsheng@627
|
3581 msgstr ""
|
dongsheng@627
|
3582
|
dongsheng@627
|
3583 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3584 #: ../en/ch01-tour-basic.xml:760
|
dongsheng@627
|
3585 msgid ""
|
dongsheng@627
|
3586 "If you look back at the output of <command role=\"hg-cmd\">hg pull</command> "
|
dongsheng@627
|
3587 "in section <xref linkend=\"sec.tour.pull\"/> when we ran it without <option "
|
dongsheng@627
|
3588 "role=\"hg-opt-pull\">-u</option>, you can see that it printed a helpful "
|
dongsheng@627
|
3589 "reminder that we'd have to take an explicit step to update the working "
|
dongsheng@627
|
3590 "directory:"
|
dongsheng@627
|
3591 msgstr ""
|
dongsheng@627
|
3592
|
dongsheng@627
|
3593 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3594 #: ../en/ch01-tour-basic.xml:769
|
dongsheng@627
|
3595 msgid ""
|
dongsheng@627
|
3596 "To find out what revision the working directory is at, use the <command role="
|
dongsheng@627
|
3597 "\"hg-cmd\">hg parents</command> command."
|
dongsheng@627
|
3598 msgstr ""
|
dongsheng@627
|
3599
|
dongsheng@627
|
3600 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3601 #: ../en/ch01-tour-basic.xml:775
|
dongsheng@641
|
3602 msgid ""
|
dongsheng@641
|
3603 "If you look back at figure <xref endterm=\"fig.tour-basic.history.caption\" "
|
dongsheng@641
|
3604 "linkend=\"fig.tour-basic.history\"/>, you'll see arrows connecting each "
|
dongsheng@641
|
3605 "changeset. The node that the arrow leads <emphasis>from</emphasis> in each "
|
dongsheng@641
|
3606 "case is a parent, and the node that the arrow leads <emphasis>to</emphasis> "
|
dongsheng@641
|
3607 "is its child. The working directory has a parent in just the same way; this "
|
dongsheng@641
|
3608 "is the changeset that the working directory currently contains."
|
dongsheng@641
|
3609 msgstr ""
|
dongsheng@641
|
3610
|
dongsheng@641
|
3611 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3612 #: ../en/ch01-tour-basic.xml:785
|
dongsheng@627
|
3613 msgid ""
|
dongsheng@627
|
3614 "To update the working directory to a particular revision, give a revision "
|
dongsheng@627
|
3615 "number or changeset ID to the <command role=\"hg-cmd\">hg update</command> "
|
dongsheng@627
|
3616 "command."
|
dongsheng@627
|
3617 msgstr ""
|
dongsheng@627
|
3618
|
dongsheng@627
|
3619 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3620 #: ../en/ch01-tour-basic.xml:792
|
dongsheng@627
|
3621 msgid ""
|
dongsheng@627
|
3622 "If you omit an explicit revision, <command role=\"hg-cmd\">hg update</"
|
dongsheng@627
|
3623 "command> will update to the tip revision, as shown by the second call to "
|
dongsheng@627
|
3624 "<command role=\"hg-cmd\">hg update</command> in the example above."
|
dongsheng@627
|
3625 msgstr ""
|
dongsheng@627
|
3626
|
dongsheng@627
|
3627 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3628 #: ../en/ch01-tour-basic.xml:800
|
dongsheng@627
|
3629 msgid "Pushing changes to another repository"
|
dongsheng@627
|
3630 msgstr "发布修改到其它版本库"
|
dongsheng@627
|
3631
|
dongsheng@627
|
3632 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3633 #: ../en/ch01-tour-basic.xml:802
|
dongsheng@627
|
3634 msgid ""
|
dongsheng@627
|
3635 "Mercurial lets us push changes to another repository, from the repository "
|
dongsheng@627
|
3636 "we're currently visiting. As with the example of <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
3637 "pull</command> above, we'll create a temporary repository to push our changes "
|
dongsheng@627
|
3638 "into."
|
dongsheng@627
|
3639 msgstr ""
|
dongsheng@627
|
3640
|
dongsheng@627
|
3641 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3642 #: ../en/ch01-tour-basic.xml:810
|
dongsheng@627
|
3643 msgid ""
|
dongsheng@627
|
3644 "The <command role=\"hg-cmd\">hg outgoing</command> command tells us what "
|
dongsheng@627
|
3645 "changes would be pushed into another repository."
|
dongsheng@627
|
3646 msgstr ""
|
dongsheng@627
|
3647
|
dongsheng@627
|
3648 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3649 #: ../en/ch01-tour-basic.xml:816
|
dongsheng@627
|
3650 msgid ""
|
dongsheng@627
|
3651 "And the <command role=\"hg-cmd\">hg push</command> command does the actual "
|
dongsheng@627
|
3652 "push."
|
dongsheng@627
|
3653 msgstr ""
|
dongsheng@627
|
3654
|
dongsheng@627
|
3655 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3656 #: ../en/ch01-tour-basic.xml:822
|
dongsheng@627
|
3657 msgid ""
|
dongsheng@627
|
3658 "As with <command role=\"hg-cmd\">hg pull</command>, the <command role=\"hg-cmd"
|
dongsheng@627
|
3659 "\">hg push</command> command does not update the working directory in the "
|
dongsheng@627
|
3660 "repository that it's pushing changes into. (Unlike <command role=\"hg-cmd"
|
dongsheng@627
|
3661 "\">hg pull</command>, <command role=\"hg-cmd\">hg push</command> does not "
|
dongsheng@627
|
3662 "provide a <literal>-u</literal> option that updates the other repository's "
|
dongsheng@627
|
3663 "working directory.)"
|
dongsheng@627
|
3664 msgstr ""
|
dongsheng@627
|
3665
|
dongsheng@627
|
3666 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3667 #: ../en/ch01-tour-basic.xml:831
|
dongsheng@627
|
3668 msgid ""
|
dongsheng@627
|
3669 "What happens if we try to pull or push changes and the receiving repository "
|
dongsheng@627
|
3670 "already has those changes? Nothing too exciting."
|
dongsheng@627
|
3671 msgstr ""
|
dongsheng@627
|
3672
|
dongsheng@627
|
3673 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3674 #: ../en/ch01-tour-basic.xml:838
|
dongsheng@627
|
3675 msgid "Sharing changes over a network"
|
dongsheng@627
|
3676 msgstr "通过网络共享修改"
|
dongsheng@627
|
3677
|
dongsheng@627
|
3678 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3679 #: ../en/ch01-tour-basic.xml:840
|
dongsheng@627
|
3680 msgid ""
|
dongsheng@627
|
3681 "The commands we have covered in the previous few sections are not limited to "
|
dongsheng@627
|
3682 "working with local repositories. Each works in exactly the same fashion over "
|
dongsheng@627
|
3683 "a network connection; simply pass in a URL instead of a local path."
|
dongsheng@627
|
3684 msgstr ""
|
dongsheng@627
|
3685
|
dongsheng@627
|
3686 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3687 #: ../en/ch01-tour-basic.xml:848
|
dongsheng@627
|
3688 msgid ""
|
dongsheng@627
|
3689 "In this example, we can see what changes we could push to the remote "
|
dongsheng@627
|
3690 "repository, but the repository is understandably not set up to let anonymous "
|
dongsheng@627
|
3691 "users push to it."
|
dongsheng@627
|
3692 msgstr ""
|
dongsheng@627
|
3693
|
dongsheng@627
|
3694 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
3695 #: ../en/ch02-tour-merge.xml:5
|
dongsheng@627
|
3696 msgid "A tour of Mercurial: merging work"
|
dongsheng@627
|
3697 msgstr "Mercurial 教程: 合并工作"
|
dongsheng@627
|
3698
|
dongsheng@627
|
3699 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
3700 #: ../en/ch02-tour-merge.xml:7
|
dongsheng@627
|
3701 msgid ""
|
dongsheng@627
|
3702 "We've now covered cloning a repository, making changes in a repository, and "
|
dongsheng@627
|
3703 "pulling or pushing changes from one repository into another. Our next step "
|
dongsheng@627
|
3704 "is <emphasis>merging</emphasis> changes from separate repositories."
|
dongsheng@627
|
3705 msgstr ""
|
dongsheng@627
|
3706
|
dongsheng@627
|
3707 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
3708 #: ../en/ch02-tour-merge.xml:13
|
dongsheng@627
|
3709 msgid "Merging streams of work"
|
dongsheng@627
|
3710 msgstr "合并的流程"
|
dongsheng@627
|
3711
|
dongsheng@627
|
3712 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3713 #: ../en/ch02-tour-merge.xml:15
|
dongsheng@627
|
3714 msgid ""
|
dongsheng@627
|
3715 "Merging is a fundamental part of working with a distributed revision control "
|
dongsheng@627
|
3716 "tool."
|
dongsheng@627
|
3717 msgstr ""
|
dongsheng@627
|
3718
|
dongsheng@627
|
3719 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
3720 #: ../en/ch02-tour-merge.xml:18
|
dongsheng@627
|
3721 msgid ""
|
dongsheng@627
|
3722 "Alice and Bob each have a personal copy of a repository for a project they're "
|
dongsheng@627
|
3723 "collaborating on. Alice fixes a bug in her repository; Bob adds a new "
|
dongsheng@627
|
3724 "feature in his. They want the shared repository to contain both the bug fix "
|
dongsheng@627
|
3725 "and the new feature."
|
dongsheng@627
|
3726 msgstr ""
|
dongsheng@627
|
3727
|
dongsheng@627
|
3728 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
3729 #: ../en/ch02-tour-merge.xml:24
|
dongsheng@627
|
3730 msgid ""
|
dongsheng@627
|
3731 "I frequently work on several different tasks for a single project at once, "
|
dongsheng@627
|
3732 "each safely isolated in its own repository. Working this way means that I "
|
dongsheng@627
|
3733 "often need to merge one piece of my own work with another."
|
dongsheng@627
|
3734 msgstr ""
|
dongsheng@627
|
3735
|
dongsheng@627
|
3736 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3737 #: ../en/ch02-tour-merge.xml:30
|
dongsheng@627
|
3738 msgid ""
|
dongsheng@627
|
3739 "Because merging is such a common thing to need to do, Mercurial makes it "
|
dongsheng@627
|
3740 "easy. Let's walk through the process. We'll begin by cloning yet another "
|
dongsheng@627
|
3741 "repository (see how often they spring up?) and making a change in it."
|
dongsheng@627
|
3742 msgstr ""
|
dongsheng@627
|
3743
|
dongsheng@627
|
3744 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3745 #: ../en/ch02-tour-merge.xml:37
|
dongsheng@627
|
3746 msgid ""
|
dongsheng@627
|
3747 "We should now have two copies of <filename>hello.c</filename> with different "
|
dongsheng@627
|
3748 "contents. The histories of the two repositories have also diverged, as "
|
dongsheng@641
|
3749 "illustrated in figure <xref endterm=\"fig.tour-merge.sep-repos.caption\" "
|
dongsheng@641
|
3750 "linkend=\"fig.tour-merge.sep-repos\"/>."
|
dongsheng@627
|
3751 msgstr ""
|
dongsheng@627
|
3752
|
dongsheng@627
|
3753 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject>
|
dongsheng@650
|
3754 #: ../en/ch02-tour-merge.xml:47
|
dongsheng@627
|
3755 msgid ""
|
dongsheng@627
|
3756 "<imageobject><imagedata fileref=\"images/tour-merge-sep-repos.png\"/></"
|
dongsheng@627
|
3757 "imageobject>"
|
dongsheng@627
|
3758 msgstr ""
|
dongsheng@627
|
3759
|
dongsheng@627
|
3760 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
3761 #: ../en/ch02-tour-merge.xml:49
|
dongsheng@627
|
3762 msgid ""
|
dongsheng@627
|
3763 "Divergent recent histories of the <filename class=\"directory\">my-hello</"
|
dongsheng@627
|
3764 "filename> and <filename class=\"directory\">my-new-hello</filename> "
|
dongsheng@627
|
3765 "repositories"
|
dongsheng@627
|
3766 msgstr ""
|
dongsheng@627
|
3767
|
dongsheng@627
|
3768 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3769 #: ../en/ch02-tour-merge.xml:57
|
dongsheng@627
|
3770 msgid ""
|
dongsheng@627
|
3771 "We already know that pulling changes from our <filename class=\"directory"
|
dongsheng@627
|
3772 "\">my-hello</filename> repository will have no effect on the working "
|
dongsheng@627
|
3773 "directory."
|
dongsheng@627
|
3774 msgstr ""
|
dongsheng@627
|
3775
|
dongsheng@627
|
3776 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3777 #: ../en/ch02-tour-merge.xml:63
|
dongsheng@627
|
3778 msgid ""
|
dongsheng@627
|
3779 "However, the <command role=\"hg-cmd\">hg pull</command> command says "
|
dongsheng@627
|
3780 "something about <quote>heads</quote>."
|
dongsheng@627
|
3781 msgstr ""
|
dongsheng@627
|
3782
|
dongsheng@627
|
3783 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3784 #: ../en/ch02-tour-merge.xml:67
|
dongsheng@627
|
3785 msgid "Head changesets"
|
dongsheng@627
|
3786 msgstr "顶点改变集"
|
dongsheng@627
|
3787
|
dongsheng@627
|
3788 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3789 #: ../en/ch02-tour-merge.xml:69
|
dongsheng@627
|
3790 msgid ""
|
dongsheng@627
|
3791 "A head is a change that has no descendants, or children, as they're also "
|
dongsheng@627
|
3792 "known. The tip revision is thus a head, because the newest revision in a "
|
dongsheng@627
|
3793 "repository doesn't have any children, but a repository can contain more than "
|
dongsheng@627
|
3794 "one head."
|
dongsheng@627
|
3795 msgstr ""
|
dongsheng@627
|
3796
|
dongsheng@627
|
3797 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
3798 #: ../en/ch02-tour-merge.xml:77
|
dongsheng@627
|
3799 msgid ""
|
dongsheng@627
|
3800 "<imageobject><imagedata fileref=\"images/tour-merge-pull.png\"/></imageobject>"
|
dongsheng@627
|
3801 msgstr ""
|
dongsheng@627
|
3802
|
dongsheng@627
|
3803 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
3804 #: ../en/ch02-tour-merge.xml:79
|
dongsheng@627
|
3805 msgid ""
|
dongsheng@627
|
3806 "Repository contents after pulling from <filename class=\"directory\">my-"
|
dongsheng@627
|
3807 "hello</filename> into <filename class=\"directory\">my-new-hello</filename>"
|
dongsheng@627
|
3808 msgstr ""
|
dongsheng@627
|
3809
|
dongsheng@627
|
3810 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3811 #: ../en/ch02-tour-merge.xml:85
|
dongsheng@627
|
3812 msgid ""
|
dongsheng@641
|
3813 "In figure <xref endterm=\"fig.tour-merge.pull.caption\" linkend=\"fig.tour-"
|
dongsheng@641
|
3814 "merge.pull\"/>, you can see the effect of the pull from <filename class="
|
dongsheng@641
|
3815 "\"directory\">my-hello</filename> into <filename class=\"directory\">my-new-"
|
dongsheng@641
|
3816 "hello</filename>. The history that was already present in <filename class="
|
dongsheng@641
|
3817 "\"directory\">my-new-hello</filename> is untouched, but a new revision has "
|
dongsheng@641
|
3818 "been added. By referring to figure <xref endterm=\"fig.tour-merge.sep-repos."
|
dongsheng@641
|
3819 "caption\" linkend=\"fig.tour-merge.sep-repos\"/>, we can see that the "
|
dongsheng@627
|
3820 "<emphasis>changeset ID</emphasis> remains the same in the new repository, but "
|
dongsheng@627
|
3821 "the <emphasis>revision number</emphasis> has changed. (This, incidentally, "
|
dongsheng@627
|
3822 "is a fine example of why it's not safe to use revision numbers when "
|
dongsheng@627
|
3823 "discussing changesets.) We can view the heads in a repository using the "
|
dongsheng@627
|
3824 "<command role=\"hg-cmd\">hg heads</command> command."
|
dongsheng@627
|
3825 msgstr ""
|
dongsheng@627
|
3826
|
dongsheng@627
|
3827 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3828 #: ../en/ch02-tour-merge.xml:106
|
dongsheng@627
|
3829 msgid "Performing the merge"
|
dongsheng@627
|
3830 msgstr "执行合并"
|
dongsheng@627
|
3831
|
dongsheng@627
|
3832 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3833 #: ../en/ch02-tour-merge.xml:108
|
dongsheng@627
|
3834 msgid ""
|
dongsheng@627
|
3835 "What happens if we try to use the normal <command role=\"hg-cmd\">hg update</"
|
dongsheng@627
|
3836 "command> command to update to the new tip?"
|
dongsheng@627
|
3837 msgstr ""
|
dongsheng@627
|
3838
|
dongsheng@627
|
3839 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3840 #: ../en/ch02-tour-merge.xml:114
|
dongsheng@627
|
3841 msgid ""
|
dongsheng@627
|
3842 "Mercurial is telling us that the <command role=\"hg-cmd\">hg update</command> "
|
dongsheng@627
|
3843 "command won't do a merge; it won't update the working directory when it "
|
dongsheng@627
|
3844 "thinks we might be wanting to do a merge, unless we force it to do so. "
|
dongsheng@627
|
3845 "Instead, we use the <command role=\"hg-cmd\">hg merge</command> command to "
|
dongsheng@627
|
3846 "merge the two heads."
|
dongsheng@627
|
3847 msgstr ""
|
dongsheng@627
|
3848
|
dongsheng@627
|
3849 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
3850 #: ../en/ch02-tour-merge.xml:125
|
dongsheng@627
|
3851 msgid ""
|
dongsheng@627
|
3852 "<imageobject><imagedata fileref=\"images/tour-merge-merge.png\"/></"
|
dongsheng@627
|
3853 "imageobject>"
|
dongsheng@627
|
3854 msgstr ""
|
dongsheng@627
|
3855
|
dongsheng@627
|
3856 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
3857 #: ../en/ch02-tour-merge.xml:127
|
dongsheng@627
|
3858 msgid "Working directory and repository during merge, and following commit"
|
dongsheng@627
|
3859 msgstr ""
|
dongsheng@627
|
3860
|
dongsheng@627
|
3861 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3862 #: ../en/ch02-tour-merge.xml:132
|
dongsheng@627
|
3863 msgid ""
|
dongsheng@627
|
3864 "This updates the working directory so that it contains changes from "
|
dongsheng@627
|
3865 "<emphasis>both</emphasis> heads, which is reflected in both the output of "
|
dongsheng@627
|
3866 "<command role=\"hg-cmd\">hg parents</command> and the contents of "
|
dongsheng@627
|
3867 "<filename>hello.c</filename>."
|
dongsheng@627
|
3868 msgstr ""
|
dongsheng@627
|
3869
|
dongsheng@627
|
3870 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3871 #: ../en/ch02-tour-merge.xml:142
|
dongsheng@627
|
3872 msgid "Committing the results of the merge"
|
dongsheng@627
|
3873 msgstr "提交合并结果"
|
dongsheng@627
|
3874
|
dongsheng@627
|
3875 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3876 #: ../en/ch02-tour-merge.xml:144
|
dongsheng@627
|
3877 msgid ""
|
dongsheng@627
|
3878 "Whenever we've done a merge, <command role=\"hg-cmd\">hg parents</command> "
|
dongsheng@627
|
3879 "will display two parents until we <command role=\"hg-cmd\">hg commit</"
|
dongsheng@627
|
3880 "command> the results of the merge."
|
dongsheng@627
|
3881 msgstr ""
|
dongsheng@627
|
3882
|
dongsheng@627
|
3883 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3884 #: ../en/ch02-tour-merge.xml:151
|
dongsheng@627
|
3885 msgid ""
|
dongsheng@627
|
3886 "We now have a new tip revision; notice that it has <emphasis>both</emphasis> "
|
dongsheng@627
|
3887 "of our former heads as its parents. These are the same revisions that were "
|
dongsheng@627
|
3888 "previously displayed by <command role=\"hg-cmd\">hg parents</command>."
|
dongsheng@627
|
3889 msgstr ""
|
dongsheng@627
|
3890
|
dongsheng@627
|
3891 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3892 #: ../en/ch02-tour-merge.xml:158
|
dongsheng@641
|
3893 msgid ""
|
dongsheng@641
|
3894 "In figure <xref endterm=\"fig.tour-merge.merge.caption\" linkend=\"fig.tour-"
|
dongsheng@641
|
3895 "merge.merge\"/>, you can see a representation of what happens to the working "
|
dongsheng@641
|
3896 "directory during the merge, and how this affects the repository when the "
|
dongsheng@641
|
3897 "commit happens. During the merge, the working directory has two parent "
|
dongsheng@641
|
3898 "changesets, and these become the parents of the new changeset."
|
dongsheng@627
|
3899 msgstr ""
|
dongsheng@627
|
3900
|
dongsheng@627
|
3901 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
3902 #: ../en/ch02-tour-merge.xml:169
|
dongsheng@627
|
3903 msgid "Merging conflicting changes"
|
dongsheng@627
|
3904 msgstr "合并有冲突的改变"
|
dongsheng@627
|
3905
|
dongsheng@627
|
3906 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3907 #: ../en/ch02-tour-merge.xml:171
|
dongsheng@627
|
3908 msgid ""
|
dongsheng@627
|
3909 "Most merges are simple affairs, but sometimes you'll find yourself merging "
|
dongsheng@627
|
3910 "changes where each modifies the same portions of the same files. Unless both "
|
dongsheng@627
|
3911 "modifications are identical, this results in a <emphasis>conflict</emphasis>, "
|
dongsheng@627
|
3912 "where you have to decide how to reconcile the different changes into "
|
dongsheng@627
|
3913 "something coherent."
|
dongsheng@627
|
3914 msgstr ""
|
dongsheng@627
|
3915
|
dongsheng@627
|
3916 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject>
|
dongsheng@650
|
3917 #: ../en/ch02-tour-merge.xml:180
|
dongsheng@627
|
3918 msgid ""
|
dongsheng@641
|
3919 "<imageobject><imagedata fileref=\"images/tour-merge-conflict.png\"/> </"
|
dongsheng@627
|
3920 "imageobject>"
|
dongsheng@627
|
3921 msgstr ""
|
dongsheng@627
|
3922
|
dongsheng@627
|
3923 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
3924 #: ../en/ch02-tour-merge.xml:183
|
dongsheng@627
|
3925 msgid "Conflicting changes to a document"
|
dongsheng@627
|
3926 msgstr ""
|
dongsheng@627
|
3927
|
dongsheng@627
|
3928 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3929 #: ../en/ch02-tour-merge.xml:188
|
dongsheng@641
|
3930 msgid ""
|
dongsheng@641
|
3931 "Figure <xref endterm=\"fig.tour-merge.conflict.caption\" linkend=\"fig.tour-"
|
dongsheng@641
|
3932 "merge.conflict\"/> illustrates an instance of two conflicting changes to a "
|
dongsheng@641
|
3933 "document. We started with a single version of the file; then we made some "
|
dongsheng@641
|
3934 "changes; while someone else made different changes to the same text. Our "
|
dongsheng@641
|
3935 "task in resolving the conflicting changes is to decide what the file should "
|
dongsheng@641
|
3936 "look like."
|
dongsheng@641
|
3937 msgstr ""
|
dongsheng@641
|
3938
|
dongsheng@641
|
3939 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3940 #: ../en/ch02-tour-merge.xml:196
|
dongsheng@627
|
3941 msgid ""
|
dongsheng@627
|
3942 "Mercurial doesn't have a built-in facility for handling conflicts. Instead, "
|
dongsheng@627
|
3943 "it runs an external program called <command>hgmerge</command>. This is a "
|
dongsheng@627
|
3944 "shell script that is bundled with Mercurial; you can change it to behave "
|
dongsheng@627
|
3945 "however you please. What it does by default is try to find one of several "
|
dongsheng@627
|
3946 "different merging tools that are likely to be installed on your system. It "
|
dongsheng@627
|
3947 "first tries a few fully automatic merging tools; if these don't succeed "
|
dongsheng@627
|
3948 "(because the resolution process requires human guidance) or aren't present, "
|
dongsheng@627
|
3949 "the script tries a few different graphical merging tools."
|
dongsheng@627
|
3950 msgstr ""
|
dongsheng@627
|
3951
|
dongsheng@627
|
3952 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
3953 #: ../en/ch02-tour-merge.xml:207
|
dongsheng@627
|
3954 msgid ""
|
dongsheng@627
|
3955 "It's also possible to get Mercurial to run another program or script instead "
|
dongsheng@627
|
3956 "of <command>hgmerge</command>, by setting the <envar>HGMERGE</envar> "
|
dongsheng@627
|
3957 "environment variable to the name of your preferred program."
|
dongsheng@627
|
3958 msgstr ""
|
dongsheng@627
|
3959
|
dongsheng@627
|
3960 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
3961 #: ../en/ch02-tour-merge.xml:213
|
dongsheng@627
|
3962 msgid "Using a graphical merge tool"
|
dongsheng@627
|
3963 msgstr "使用图形合并工具"
|
dongsheng@627
|
3964
|
dongsheng@627
|
3965 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
3966 #: ../en/ch02-tour-merge.xml:215
|
dongsheng@627
|
3967 msgid ""
|
dongsheng@627
|
3968 "My preferred graphical merge tool is <command>kdiff3</command>, which I'll "
|
dongsheng@627
|
3969 "use to describe the features that are common to graphical file merging "
|
dongsheng@627
|
3970 "tools. You can see a screenshot of <command>kdiff3</command> in action in "
|
dongsheng@641
|
3971 "figure <xref endterm=\"fig.tour-merge.kdiff3.caption\" linkend=\"fig.tour-"
|
dongsheng@641
|
3972 "merge.kdiff3\"/>. The kind of merge it is performing is called a "
|
dongsheng@641
|
3973 "<emphasis>three-way merge</emphasis>, because there are three different "
|
dongsheng@641
|
3974 "versions of the file of interest to us. The tool thus splits the upper "
|
dongsheng@641
|
3975 "portion of the window into three panes:"
|
dongsheng@627
|
3976 msgstr ""
|
dongsheng@627
|
3977
|
dongsheng@627
|
3978 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
3979 #: ../en/ch02-tour-merge.xml:226
|
dongsheng@627
|
3980 msgid ""
|
dongsheng@627
|
3981 "At the left is the <emphasis>base</emphasis> version of the file, i.e. the "
|
dongsheng@627
|
3982 "most recent version from which the two versions we're trying to merge are "
|
dongsheng@627
|
3983 "descended."
|
dongsheng@627
|
3984 msgstr ""
|
dongsheng@627
|
3985
|
dongsheng@627
|
3986 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
3987 #: ../en/ch02-tour-merge.xml:231
|
dongsheng@627
|
3988 msgid ""
|
dongsheng@627
|
3989 "In the middle is <quote>our</quote> version of the file, with the contents "
|
dongsheng@627
|
3990 "that we modified."
|
dongsheng@627
|
3991 msgstr ""
|
dongsheng@627
|
3992
|
dongsheng@627
|
3993 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
3994 #: ../en/ch02-tour-merge.xml:234
|
dongsheng@627
|
3995 msgid ""
|
dongsheng@627
|
3996 "On the right is <quote>their</quote> version of the file, the one that from "
|
dongsheng@627
|
3997 "the changeset that we're trying to merge with."
|
dongsheng@627
|
3998 msgstr ""
|
dongsheng@627
|
3999
|
dongsheng@627
|
4000 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4001 #: ../en/ch02-tour-merge.xml:238
|
dongsheng@627
|
4002 msgid ""
|
dongsheng@627
|
4003 "In the pane below these is the current <emphasis>result</emphasis> of the "
|
dongsheng@627
|
4004 "merge. Our task is to replace all of the red text, which indicates unresolved "
|
dongsheng@627
|
4005 "conflicts, with some sensible merger of the <quote>ours</quote> and "
|
dongsheng@627
|
4006 "<quote>theirs</quote> versions of the file."
|
dongsheng@627
|
4007 msgstr ""
|
dongsheng@627
|
4008
|
dongsheng@627
|
4009 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4010 #: ../en/ch02-tour-merge.xml:245
|
dongsheng@627
|
4011 msgid ""
|
dongsheng@627
|
4012 "All four of these panes are <emphasis>locked together</emphasis>; if we "
|
dongsheng@627
|
4013 "scroll vertically or horizontally in any of them, the others are updated to "
|
dongsheng@627
|
4014 "display the corresponding sections of their respective files."
|
dongsheng@627
|
4015 msgstr ""
|
dongsheng@627
|
4016
|
dongsheng@627
|
4017 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4018 #: ../en/ch02-tour-merge.xml:252
|
dongsheng@641
|
4019 msgid ""
|
dongsheng@641
|
4020 "<imageobject><imagedata width=\"100%\" fileref=\"images/kdiff3.png\"/> </"
|
dongsheng@630
|
4021 "imageobject>"
|
dongsheng@627
|
4022 msgstr ""
|
dongsheng@627
|
4023
|
dongsheng@627
|
4024 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4025 #: ../en/ch02-tour-merge.xml:255
|
dongsheng@627
|
4026 msgid "Using <command>kdiff3</command> to merge versions of a file"
|
dongsheng@627
|
4027 msgstr ""
|
dongsheng@627
|
4028
|
dongsheng@627
|
4029 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4030 #: ../en/ch02-tour-merge.xml:261
|
dongsheng@627
|
4031 msgid ""
|
dongsheng@627
|
4032 "For each conflicting portion of the file, we can choose to resolve the "
|
dongsheng@627
|
4033 "conflict using some combination of text from the base version, ours, or "
|
dongsheng@627
|
4034 "theirs. We can also manually edit the merged file at any time, in case we "
|
dongsheng@627
|
4035 "need to make further modifications."
|
dongsheng@627
|
4036 msgstr ""
|
dongsheng@627
|
4037
|
dongsheng@627
|
4038 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4039 #: ../en/ch02-tour-merge.xml:267
|
dongsheng@627
|
4040 msgid ""
|
dongsheng@627
|
4041 "There are <emphasis>many</emphasis> file merging tools available, too many to "
|
dongsheng@627
|
4042 "cover here. They vary in which platforms they are available for, and in "
|
dongsheng@627
|
4043 "their particular strengths and weaknesses. Most are tuned for merging files "
|
dongsheng@627
|
4044 "containing plain text, while a few are aimed at specialised file formats "
|
dongsheng@627
|
4045 "(generally XML)."
|
dongsheng@627
|
4046 msgstr ""
|
dongsheng@627
|
4047
|
dongsheng@627
|
4048 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4049 #: ../en/ch02-tour-merge.xml:276
|
dongsheng@627
|
4050 msgid "A worked example"
|
dongsheng@627
|
4051 msgstr "合并实例"
|
dongsheng@627
|
4052
|
dongsheng@627
|
4053 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4054 #: ../en/ch02-tour-merge.xml:278
|
dongsheng@627
|
4055 msgid ""
|
dongsheng@627
|
4056 "In this example, we will reproduce the file modification history of figure "
|
dongsheng@641
|
4057 "<xref endterm=\"fig.tour-merge.conflict.caption\" linkend=\"fig.tour-merge."
|
dongsheng@641
|
4058 "conflict\"/> above. Let's begin by creating a repository with a base version "
|
dongsheng@641
|
4059 "of our document."
|
dongsheng@641
|
4060 msgstr ""
|
dongsheng@641
|
4061
|
dongsheng@641
|
4062 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4063 #: ../en/ch02-tour-merge.xml:286
|
dongsheng@627
|
4064 msgid "We'll clone the repository and make a change to the file."
|
dongsheng@627
|
4065 msgstr ""
|
dongsheng@627
|
4066
|
dongsheng@627
|
4067 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4068 #: ../en/ch02-tour-merge.xml:291
|
dongsheng@627
|
4069 msgid ""
|
dongsheng@627
|
4070 "And another clone, to simulate someone else making a change to the file. "
|
dongsheng@627
|
4071 "(This hints at the idea that it's not all that unusual to merge with yourself "
|
dongsheng@627
|
4072 "when you isolate tasks in separate repositories, and indeed to find and "
|
dongsheng@627
|
4073 "resolve conflicts while doing so.)"
|
dongsheng@627
|
4074 msgstr ""
|
dongsheng@627
|
4075
|
dongsheng@627
|
4076 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4077 #: ../en/ch02-tour-merge.xml:299
|
dongsheng@627
|
4078 msgid ""
|
dongsheng@627
|
4079 "Having created two different versions of the file, we'll set up an "
|
dongsheng@627
|
4080 "environment suitable for running our merge."
|
dongsheng@627
|
4081 msgstr ""
|
dongsheng@627
|
4082
|
dongsheng@627
|
4083 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4084 #: ../en/ch02-tour-merge.xml:305
|
dongsheng@627
|
4085 msgid ""
|
dongsheng@627
|
4086 "In this example, I won't use Mercurial's normal <command>hgmerge</command> "
|
dongsheng@627
|
4087 "program to do the merge, because it would drop my nice automated example-"
|
dongsheng@627
|
4088 "running tool into a graphical user interface. Instead, I'll set "
|
dongsheng@627
|
4089 "<envar>HGMERGE</envar> to tell Mercurial to use the non-interactive "
|
dongsheng@627
|
4090 "<command>merge</command> command. This is bundled with many Unix-like "
|
dongsheng@627
|
4091 "systems. If you're following this example on your computer, don't bother "
|
dongsheng@627
|
4092 "setting <envar>HGMERGE</envar>."
|
dongsheng@627
|
4093 msgstr ""
|
dongsheng@627
|
4094
|
dongsheng@627
|
4095 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4096 #: ../en/ch02-tour-merge.xml:315
|
dongsheng@627
|
4097 msgid "<emphasis role=\"bold\">XXX FIX THIS EXAMPLE.</emphasis>"
|
dongsheng@627
|
4098 msgstr ""
|
dongsheng@627
|
4099
|
dongsheng@627
|
4100 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4101 #: ../en/ch02-tour-merge.xml:320
|
dongsheng@627
|
4102 msgid ""
|
dongsheng@627
|
4103 "Because <command>merge</command> can't resolve the conflicting changes, it "
|
dongsheng@627
|
4104 "leaves <emphasis>merge markers</emphasis> inside the file that has conflicts, "
|
dongsheng@627
|
4105 "indicating which lines have conflicts, and whether they came from our version "
|
dongsheng@627
|
4106 "of the file or theirs."
|
dongsheng@627
|
4107 msgstr ""
|
dongsheng@627
|
4108
|
dongsheng@627
|
4109 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4110 #: ../en/ch02-tour-merge.xml:326
|
dongsheng@627
|
4111 msgid ""
|
dongsheng@627
|
4112 "Mercurial can tell from the way <command>merge</command> exits that it wasn't "
|
dongsheng@627
|
4113 "able to merge successfully, so it tells us what commands we'll need to run if "
|
dongsheng@627
|
4114 "we want to redo the merging operation. This could be useful if, for example, "
|
dongsheng@627
|
4115 "we were running a graphical merge tool and quit because we were confused or "
|
dongsheng@627
|
4116 "realised we had made a mistake."
|
dongsheng@627
|
4117 msgstr ""
|
dongsheng@627
|
4118
|
dongsheng@627
|
4119 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4120 #: ../en/ch02-tour-merge.xml:333
|
dongsheng@627
|
4121 msgid ""
|
dongsheng@627
|
4122 "If automatic or manual merges fail, there's nothing to prevent us from "
|
dongsheng@627
|
4123 "<quote>fixing up</quote> the affected files ourselves, and committing the "
|
dongsheng@627
|
4124 "results of our merge:"
|
dongsheng@627
|
4125 msgstr ""
|
dongsheng@627
|
4126
|
dongsheng@627
|
4127 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
4128 #: ../en/ch02-tour-merge.xml:342
|
dongsheng@627
|
4129 msgid "Simplifying the pull-merge-commit sequence"
|
dongsheng@627
|
4130 msgstr "简化拉-合并-提交程序"
|
dongsheng@627
|
4131
|
dongsheng@627
|
4132 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4133 #: ../en/ch02-tour-merge.xml:344
|
dongsheng@627
|
4134 msgid ""
|
dongsheng@627
|
4135 "The process of merging changes as outlined above is straightforward, but "
|
dongsheng@627
|
4136 "requires running three commands in sequence."
|
dongsheng@627
|
4137 msgstr ""
|
dongsheng@627
|
4138
|
dongsheng@627
|
4139 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4140 #: ../en/ch02-tour-merge.xml:350
|
dongsheng@627
|
4141 msgid ""
|
dongsheng@627
|
4142 "In the case of the final commit, you also need to enter a commit message, "
|
dongsheng@627
|
4143 "which is almost always going to be a piece of uninteresting "
|
dongsheng@627
|
4144 "<quote>boilerplate</quote> text."
|
dongsheng@627
|
4145 msgstr ""
|
dongsheng@627
|
4146
|
dongsheng@627
|
4147 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4148 #: ../en/ch02-tour-merge.xml:354
|
dongsheng@627
|
4149 msgid ""
|
dongsheng@627
|
4150 "It would be nice to reduce the number of steps needed, if this were "
|
dongsheng@627
|
4151 "possible. Indeed, Mercurial is distributed with an extension called <literal "
|
dongsheng@627
|
4152 "role=\"hg-ext\">fetch</literal> that does just this."
|
dongsheng@627
|
4153 msgstr ""
|
dongsheng@627
|
4154
|
dongsheng@627
|
4155 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4156 #: ../en/ch02-tour-merge.xml:359
|
dongsheng@627
|
4157 msgid ""
|
dongsheng@627
|
4158 "Mercurial provides a flexible extension mechanism that lets people extend its "
|
dongsheng@627
|
4159 "functionality, while keeping the core of Mercurial small and easy to deal "
|
dongsheng@627
|
4160 "with. Some extensions add new commands that you can use from the command "
|
dongsheng@627
|
4161 "line, while others work <quote>behind the scenes,</quote> for example adding "
|
dongsheng@627
|
4162 "capabilities to the server."
|
dongsheng@627
|
4163 msgstr ""
|
dongsheng@627
|
4164
|
dongsheng@627
|
4165 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4166 #: ../en/ch02-tour-merge.xml:366
|
dongsheng@627
|
4167 msgid ""
|
dongsheng@627
|
4168 "The <literal role=\"hg-ext\">fetch</literal> extension adds a new command "
|
dongsheng@627
|
4169 "called, not surprisingly, <command role=\"hg-cmd\">hg fetch</command>. This "
|
dongsheng@627
|
4170 "extension acts as a combination of <command role=\"hg-cmd\">hg pull</"
|
dongsheng@627
|
4171 "command>, <command role=\"hg-cmd\">hg update</command> and <command role=\"hg-"
|
dongsheng@627
|
4172 "cmd\">hg merge</command>. It begins by pulling changes from another "
|
dongsheng@627
|
4173 "repository into the current repository. If it finds that the changes added a "
|
dongsheng@627
|
4174 "new head to the repository, it begins a merge, then commits the result of the "
|
dongsheng@627
|
4175 "merge with an automatically-generated commit message. If no new heads were "
|
dongsheng@627
|
4176 "added, it updates the working directory to the new tip changeset."
|
dongsheng@627
|
4177 msgstr ""
|
dongsheng@627
|
4178
|
dongsheng@627
|
4179 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4180 #: ../en/ch02-tour-merge.xml:379
|
dongsheng@627
|
4181 msgid ""
|
dongsheng@627
|
4182 "Enabling the <literal role=\"hg-ext\">fetch</literal> extension is easy. "
|
dongsheng@627
|
4183 "Edit your <filename role=\"special\">.hgrc</filename>, and either go to the "
|
dongsheng@627
|
4184 "<literal role=\"rc-extensions\">extensions</literal> section or create an "
|
dongsheng@627
|
4185 "<literal role=\"rc-extensions\">extensions</literal> section. Then add a line "
|
dongsheng@627
|
4186 "that simply reads <quote><literal>fetch </literal></quote>."
|
dongsheng@627
|
4187 msgstr ""
|
dongsheng@627
|
4188
|
dongsheng@627
|
4189 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4190 #: ../en/ch02-tour-merge.xml:388
|
dongsheng@627
|
4191 msgid ""
|
dongsheng@627
|
4192 "(Normally, on the right-hand side of the <quote><literal>=</literal></quote> "
|
dongsheng@627
|
4193 "would appear the location of the extension, but since the <literal role=\"hg-"
|
dongsheng@627
|
4194 "ext\">fetch</literal> extension is in the standard distribution, Mercurial "
|
dongsheng@627
|
4195 "knows where to search for it.)"
|
dongsheng@627
|
4196 msgstr ""
|
dongsheng@627
|
4197
|
dongsheng@627
|
4198 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
4199 #: ../en/ch03-concepts.xml:5
|
dongsheng@627
|
4200 msgid "Behind the scenes"
|
dongsheng@627
|
4201 msgstr "Mercurial 内幕"
|
dongsheng@627
|
4202
|
dongsheng@627
|
4203 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
4204 #: ../en/ch03-concepts.xml:7
|
dongsheng@627
|
4205 msgid ""
|
dongsheng@627
|
4206 "Unlike many revision control systems, the concepts upon which Mercurial is "
|
dongsheng@627
|
4207 "built are simple enough that it's easy to understand how the software really "
|
dongsheng@627
|
4208 "works. Knowing this certainly isn't necessary, but I find it useful to have "
|
dongsheng@627
|
4209 "a <quote>mental model</quote> of what's going on."
|
dongsheng@627
|
4210 msgstr ""
|
dongsheng@627
|
4211
|
dongsheng@627
|
4212 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
4213 #: ../en/ch03-concepts.xml:13
|
dongsheng@627
|
4214 msgid ""
|
dongsheng@627
|
4215 "This understanding gives me confidence that Mercurial has been carefully "
|
dongsheng@627
|
4216 "designed to be both <emphasis>safe</emphasis> and <emphasis>efficient</"
|
dongsheng@627
|
4217 "emphasis>. And just as importantly, if it's easy for me to retain a good "
|
dongsheng@627
|
4218 "idea of what the software is doing when I perform a revision control task, "
|
dongsheng@627
|
4219 "I'm less likely to be surprised by its behaviour."
|
dongsheng@627
|
4220 msgstr ""
|
dongsheng@627
|
4221
|
dongsheng@627
|
4222 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
4223 #: ../en/ch03-concepts.xml:20
|
dongsheng@627
|
4224 msgid ""
|
dongsheng@627
|
4225 "In this chapter, we'll initially cover the core concepts behind Mercurial's "
|
dongsheng@627
|
4226 "design, then continue to discuss some of the interesting details of its "
|
dongsheng@627
|
4227 "implementation."
|
dongsheng@627
|
4228 msgstr ""
|
dongsheng@627
|
4229
|
dongsheng@627
|
4230 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
4231 #: ../en/ch03-concepts.xml:25
|
dongsheng@627
|
4232 msgid "Mercurial's historical record"
|
dongsheng@627
|
4233 msgstr "Mercurial 的历史记录"
|
dongsheng@627
|
4234
|
dongsheng@627
|
4235 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4236 #: ../en/ch03-concepts.xml:28
|
dongsheng@627
|
4237 msgid "Tracking the history of a single file"
|
dongsheng@627
|
4238 msgstr "跟踪单一文件的历史"
|
dongsheng@627
|
4239
|
dongsheng@627
|
4240 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4241 #: ../en/ch03-concepts.xml:30
|
dongsheng@627
|
4242 msgid ""
|
dongsheng@627
|
4243 "When Mercurial tracks modifications to a file, it stores the history of that "
|
dongsheng@627
|
4244 "file in a metadata object called a <emphasis>filelog</emphasis>. Each entry "
|
dongsheng@627
|
4245 "in the filelog contains enough information to reconstruct one revision of the "
|
dongsheng@627
|
4246 "file that is being tracked. Filelogs are stored as files in the <filename "
|
dongsheng@627
|
4247 "role=\"special\" class=\"directory\">.hg/store/data</filename> directory. A "
|
dongsheng@627
|
4248 "filelog contains two kinds of information: revision data, and an index to "
|
dongsheng@627
|
4249 "help Mercurial to find a revision efficiently."
|
dongsheng@627
|
4250 msgstr ""
|
dongsheng@627
|
4251
|
dongsheng@627
|
4252 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4253 #: ../en/ch03-concepts.xml:41
|
dongsheng@627
|
4254 msgid ""
|
dongsheng@627
|
4255 "A file that is large, or has a lot of history, has its filelog stored in "
|
dongsheng@627
|
4256 "separate data (<quote><literal>.d</literal></quote> suffix) and index "
|
dongsheng@627
|
4257 "(<quote><literal>.i</literal></quote> suffix) files. For small files without "
|
dongsheng@627
|
4258 "much history, the revision data and index are combined in a single "
|
dongsheng@627
|
4259 "<quote><literal>.i</literal></quote> file. The correspondence between a file "
|
dongsheng@627
|
4260 "in the working directory and the filelog that tracks its history in the "
|
dongsheng@641
|
4261 "repository is illustrated in figure <xref endterm=\"fig.concepts.filelog."
|
dongsheng@641
|
4262 "caption\" linkend=\"fig.concepts.filelog\"/>."
|
dongsheng@627
|
4263 msgstr ""
|
dongsheng@627
|
4264
|
dongsheng@627
|
4265 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4266 #: ../en/ch03-concepts.xml:55
|
dongsheng@627
|
4267 msgid "<imageobject><imagedata fileref=\"images/filelog.png\"/></imageobject>"
|
dongsheng@627
|
4268 msgstr ""
|
dongsheng@627
|
4269
|
dongsheng@627
|
4270 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4271 #: ../en/ch03-concepts.xml:57
|
dongsheng@627
|
4272 msgid ""
|
dongsheng@627
|
4273 "Relationships between files in working directory and filelogs in repository"
|
dongsheng@627
|
4274 msgstr ""
|
dongsheng@627
|
4275
|
dongsheng@627
|
4276 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4277 #: ../en/ch03-concepts.xml:65
|
dongsheng@627
|
4278 msgid "Managing tracked files"
|
dongsheng@627
|
4279 msgstr "管理跟踪的文件"
|
dongsheng@627
|
4280
|
dongsheng@627
|
4281 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4282 #: ../en/ch03-concepts.xml:67
|
dongsheng@627
|
4283 msgid ""
|
dongsheng@627
|
4284 "Mercurial uses a structure called a <emphasis>manifest</emphasis> to collect "
|
dongsheng@627
|
4285 "together information about the files that it tracks. Each entry in the "
|
dongsheng@627
|
4286 "manifest contains information about the files present in a single changeset. "
|
dongsheng@627
|
4287 "An entry records which files are present in the changeset, the revision of "
|
dongsheng@627
|
4288 "each file, and a few other pieces of file metadata."
|
dongsheng@627
|
4289 msgstr ""
|
dongsheng@627
|
4290
|
dongsheng@627
|
4291 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4292 #: ../en/ch03-concepts.xml:77
|
dongsheng@627
|
4293 msgid "Recording changeset information"
|
dongsheng@627
|
4294 msgstr "记录修改集信息"
|
dongsheng@627
|
4295
|
dongsheng@627
|
4296 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4297 #: ../en/ch03-concepts.xml:79
|
dongsheng@627
|
4298 msgid ""
|
dongsheng@627
|
4299 "The <emphasis>changelog</emphasis> contains information about each "
|
dongsheng@627
|
4300 "changeset. Each revision records who committed a change, the changeset "
|
dongsheng@627
|
4301 "comment, other pieces of changeset-related information, and the revision of "
|
dongsheng@627
|
4302 "the manifest to use."
|
dongsheng@627
|
4303 msgstr ""
|
dongsheng@627
|
4304
|
dongsheng@627
|
4305 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4306 #: ../en/ch03-concepts.xml:87
|
dongsheng@627
|
4307 msgid "Relationships between revisions"
|
dongsheng@627
|
4308 msgstr "版本之间的关系"
|
dongsheng@627
|
4309
|
dongsheng@627
|
4310 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4311 #: ../en/ch03-concepts.xml:89
|
dongsheng@627
|
4312 msgid ""
|
dongsheng@627
|
4313 "Within a changelog, a manifest, or a filelog, each revision stores a pointer "
|
dongsheng@627
|
4314 "to its immediate parent (or to its two parents, if it's a merge revision). "
|
dongsheng@627
|
4315 "As I mentioned above, there are also relationships between revisions "
|
dongsheng@627
|
4316 "<emphasis>across</emphasis> these structures, and they are hierarchical in "
|
dongsheng@627
|
4317 "nature."
|
dongsheng@627
|
4318 msgstr ""
|
dongsheng@627
|
4319
|
dongsheng@627
|
4320 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4321 #: ../en/ch03-concepts.xml:96
|
dongsheng@627
|
4322 msgid ""
|
dongsheng@627
|
4323 "For every changeset in a repository, there is exactly one revision stored in "
|
dongsheng@627
|
4324 "the changelog. Each revision of the changelog contains a pointer to a single "
|
dongsheng@627
|
4325 "revision of the manifest. A revision of the manifest stores a pointer to a "
|
dongsheng@627
|
4326 "single revision of each filelog tracked when that changeset was created. "
|
dongsheng@641
|
4327 "These relationships are illustrated in figure <xref endterm=\"fig.concepts."
|
dongsheng@641
|
4328 "metadata.caption\" linkend=\"fig.concepts.metadata\"/>."
|
dongsheng@627
|
4329 msgstr ""
|
dongsheng@627
|
4330
|
dongsheng@627
|
4331 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4332 #: ../en/ch03-concepts.xml:107
|
dongsheng@627
|
4333 msgid "<imageobject><imagedata fileref=\"images/metadata.png\"/></imageobject>"
|
dongsheng@627
|
4334 msgstr ""
|
dongsheng@627
|
4335
|
dongsheng@627
|
4336 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4337 #: ../en/ch03-concepts.xml:109
|
dongsheng@627
|
4338 msgid "Metadata relationships"
|
dongsheng@627
|
4339 msgstr ""
|
dongsheng@627
|
4340
|
dongsheng@627
|
4341 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4342 #: ../en/ch03-concepts.xml:114
|
dongsheng@627
|
4343 msgid ""
|
dongsheng@627
|
4344 "As the illustration shows, there is <emphasis>not</emphasis> a <quote>one to "
|
dongsheng@627
|
4345 "one</quote> relationship between revisions in the changelog, manifest, or "
|
dongsheng@627
|
4346 "filelog. If the manifest hasn't changed between two changesets, the changelog "
|
dongsheng@627
|
4347 "entries for those changesets will point to the same revision of the "
|
dongsheng@627
|
4348 "manifest. If a file that Mercurial tracks hasn't changed between two "
|
dongsheng@627
|
4349 "changesets, the entry for that file in the two revisions of the manifest will "
|
dongsheng@627
|
4350 "point to the same revision of its filelog."
|
dongsheng@627
|
4351 msgstr ""
|
dongsheng@627
|
4352
|
dongsheng@627
|
4353 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
4354 #: ../en/ch03-concepts.xml:127
|
dongsheng@627
|
4355 msgid "Safe, efficient storage"
|
dongsheng@627
|
4356 msgstr "安全,高效的存储"
|
dongsheng@627
|
4357
|
dongsheng@627
|
4358 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4359 #: ../en/ch03-concepts.xml:129
|
dongsheng@627
|
4360 msgid ""
|
dongsheng@627
|
4361 "The underpinnings of changelogs, manifests, and filelogs are provided by a "
|
dongsheng@627
|
4362 "single structure called the <emphasis>revlog</emphasis>."
|
dongsheng@627
|
4363 msgstr ""
|
dongsheng@627
|
4364
|
dongsheng@627
|
4365 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4366 #: ../en/ch03-concepts.xml:134
|
dongsheng@627
|
4367 msgid "Efficient storage"
|
dongsheng@627
|
4368 msgstr "高效存储"
|
dongsheng@627
|
4369
|
dongsheng@627
|
4370 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4371 #: ../en/ch03-concepts.xml:136
|
dongsheng@627
|
4372 msgid ""
|
dongsheng@627
|
4373 "The revlog provides efficient storage of revisions using a <emphasis>delta</"
|
dongsheng@627
|
4374 "emphasis> mechanism. Instead of storing a complete copy of a file for each "
|
dongsheng@627
|
4375 "revision, it stores the changes needed to transform an older revision into "
|
dongsheng@627
|
4376 "the new revision. For many kinds of file data, these deltas are typically a "
|
dongsheng@627
|
4377 "fraction of a percent of the size of a full copy of a file."
|
dongsheng@627
|
4378 msgstr ""
|
dongsheng@627
|
4379
|
dongsheng@627
|
4380 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4381 #: ../en/ch03-concepts.xml:144
|
dongsheng@627
|
4382 msgid ""
|
dongsheng@627
|
4383 "Some obsolete revision control systems can only work with deltas of text "
|
dongsheng@627
|
4384 "files. They must either store binary files as complete snapshots or encoded "
|
dongsheng@627
|
4385 "into a text representation, both of which are wasteful approaches. Mercurial "
|
dongsheng@627
|
4386 "can efficiently handle deltas of files with arbitrary binary contents; it "
|
dongsheng@627
|
4387 "doesn't need to treat text as special."
|
dongsheng@627
|
4388 msgstr ""
|
dongsheng@627
|
4389
|
dongsheng@627
|
4390 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4391 #: ../en/ch03-concepts.xml:153
|
dongsheng@627
|
4392 msgid "Safe operation"
|
dongsheng@627
|
4393 msgstr "安全操作"
|
dongsheng@627
|
4394
|
dongsheng@627
|
4395 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4396 #: ../en/ch03-concepts.xml:155
|
dongsheng@627
|
4397 msgid ""
|
dongsheng@627
|
4398 "Mercurial only ever <emphasis>appends</emphasis> data to the end of a revlog "
|
dongsheng@627
|
4399 "file. It never modifies a section of a file after it has written it. This is "
|
dongsheng@627
|
4400 "both more robust and efficient than schemes that need to modify or rewrite "
|
dongsheng@627
|
4401 "data."
|
dongsheng@627
|
4402 msgstr ""
|
dongsheng@627
|
4403
|
dongsheng@627
|
4404 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4405 #: ../en/ch03-concepts.xml:161
|
dongsheng@627
|
4406 msgid ""
|
dongsheng@627
|
4407 "In addition, Mercurial treats every write as part of a <emphasis>transaction</"
|
dongsheng@627
|
4408 "emphasis> that can span a number of files. A transaction is "
|
dongsheng@627
|
4409 "<emphasis>atomic</emphasis>: either the entire transaction succeeds and its "
|
dongsheng@627
|
4410 "effects are all visible to readers in one go, or the whole thing is undone. "
|
dongsheng@627
|
4411 "This guarantee of atomicity means that if you're running two copies of "
|
dongsheng@627
|
4412 "Mercurial, where one is reading data and one is writing it, the reader will "
|
dongsheng@627
|
4413 "never see a partially written result that might confuse it."
|
dongsheng@627
|
4414 msgstr ""
|
dongsheng@627
|
4415
|
dongsheng@627
|
4416 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4417 #: ../en/ch03-concepts.xml:171
|
dongsheng@627
|
4418 msgid ""
|
dongsheng@627
|
4419 "The fact that Mercurial only appends to files makes it easier to provide this "
|
dongsheng@627
|
4420 "transactional guarantee. The easier it is to do stuff like this, the more "
|
dongsheng@627
|
4421 "confident you should be that it's done correctly."
|
dongsheng@627
|
4422 msgstr ""
|
dongsheng@627
|
4423
|
dongsheng@627
|
4424 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4425 #: ../en/ch03-concepts.xml:178
|
dongsheng@627
|
4426 msgid "Fast retrieval"
|
dongsheng@627
|
4427 msgstr "快速检索"
|
dongsheng@627
|
4428
|
dongsheng@627
|
4429 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4430 #: ../en/ch03-concepts.xml:180
|
dongsheng@627
|
4431 msgid ""
|
dongsheng@627
|
4432 "Mercurial cleverly avoids a pitfall common to all earlier revision control "
|
dongsheng@627
|
4433 "systems: the problem of <emphasis>inefficient retrieval</emphasis>. Most "
|
dongsheng@627
|
4434 "revision control systems store the contents of a revision as an incremental "
|
dongsheng@627
|
4435 "series of modifications against a <quote>snapshot</quote>. To reconstruct a "
|
dongsheng@627
|
4436 "specific revision, you must first read the snapshot, and then every one of "
|
dongsheng@627
|
4437 "the revisions between the snapshot and your target revision. The more "
|
dongsheng@627
|
4438 "history that a file accumulates, the more revisions you must read, hence the "
|
dongsheng@627
|
4439 "longer it takes to reconstruct a particular revision."
|
dongsheng@627
|
4440 msgstr ""
|
dongsheng@627
|
4441
|
dongsheng@627
|
4442 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4443 #: ../en/ch03-concepts.xml:193
|
dongsheng@627
|
4444 msgid "<imageobject><imagedata fileref=\"images/snapshot.png\"/></imageobject>"
|
dongsheng@627
|
4445 msgstr ""
|
dongsheng@627
|
4446
|
dongsheng@627
|
4447 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4448 #: ../en/ch03-concepts.xml:195
|
dongsheng@627
|
4449 msgid "Snapshot of a revlog, with incremental deltas"
|
dongsheng@627
|
4450 msgstr ""
|
dongsheng@627
|
4451
|
dongsheng@627
|
4452 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4453 #: ../en/ch03-concepts.xml:200
|
dongsheng@627
|
4454 msgid ""
|
dongsheng@627
|
4455 "The innovation that Mercurial applies to this problem is simple but "
|
dongsheng@627
|
4456 "effective. Once the cumulative amount of delta information stored since the "
|
dongsheng@627
|
4457 "last snapshot exceeds a fixed threshold, it stores a new snapshot "
|
dongsheng@627
|
4458 "(compressed, of course), instead of another delta. This makes it possible to "
|
dongsheng@627
|
4459 "reconstruct <emphasis>any</emphasis> revision of a file quickly. This "
|
dongsheng@627
|
4460 "approach works so well that it has since been copied by several other "
|
dongsheng@627
|
4461 "revision control systems."
|
dongsheng@627
|
4462 msgstr ""
|
dongsheng@627
|
4463
|
dongsheng@627
|
4464 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4465 #: ../en/ch03-concepts.xml:209
|
dongsheng@641
|
4466 msgid ""
|
dongsheng@641
|
4467 "Figure <xref endterm=\"fig.concepts.snapshot.caption\" linkend=\"fig.concepts."
|
dongsheng@641
|
4468 "snapshot\"/> illustrates the idea. In an entry in a revlog's index file, "
|
dongsheng@641
|
4469 "Mercurial stores the range of entries from the data file that it must read to "
|
dongsheng@641
|
4470 "reconstruct a particular revision."
|
dongsheng@627
|
4471 msgstr ""
|
dongsheng@627
|
4472
|
dongsheng@627
|
4473 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
4474 #: ../en/ch03-concepts.xml:216
|
dongsheng@627
|
4475 msgid "Aside: the influence of video compression"
|
dongsheng@627
|
4476 msgstr ""
|
dongsheng@627
|
4477
|
dongsheng@627
|
4478 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
4479 #: ../en/ch03-concepts.xml:218
|
dongsheng@627
|
4480 msgid ""
|
dongsheng@627
|
4481 "If you're familiar with video compression or have ever watched a TV feed "
|
dongsheng@627
|
4482 "through a digital cable or satellite service, you may know that most video "
|
dongsheng@627
|
4483 "compression schemes store each frame of video as a delta against its "
|
dongsheng@627
|
4484 "predecessor frame. In addition, these schemes use <quote>lossy</quote> "
|
dongsheng@627
|
4485 "compression techniques to increase the compression ratio, so visual errors "
|
dongsheng@627
|
4486 "accumulate over the course of a number of inter-frame deltas."
|
dongsheng@627
|
4487 msgstr ""
|
dongsheng@627
|
4488
|
dongsheng@627
|
4489 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
4490 #: ../en/ch03-concepts.xml:227
|
dongsheng@627
|
4491 msgid ""
|
dongsheng@627
|
4492 "Because it's possible for a video stream to <quote>drop out</quote> "
|
dongsheng@627
|
4493 "occasionally due to signal glitches, and to limit the accumulation of "
|
dongsheng@627
|
4494 "artefacts introduced by the lossy compression process, video encoders "
|
dongsheng@627
|
4495 "periodically insert a complete frame (called a <quote>key frame</quote>) into "
|
dongsheng@627
|
4496 "the video stream; the next delta is generated against that frame. This means "
|
dongsheng@627
|
4497 "that if the video signal gets interrupted, it will resume once the next key "
|
dongsheng@627
|
4498 "frame is received. Also, the accumulation of encoding errors restarts anew "
|
dongsheng@627
|
4499 "with each key frame."
|
dongsheng@627
|
4500 msgstr ""
|
dongsheng@627
|
4501
|
dongsheng@627
|
4502 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4503 #: ../en/ch03-concepts.xml:241
|
dongsheng@627
|
4504 msgid "Identification and strong integrity"
|
dongsheng@627
|
4505 msgstr "鉴别和强完整性"
|
dongsheng@627
|
4506
|
dongsheng@627
|
4507 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4508 #: ../en/ch03-concepts.xml:243
|
dongsheng@627
|
4509 msgid ""
|
dongsheng@627
|
4510 "Along with delta or snapshot information, a revlog entry contains a "
|
dongsheng@627
|
4511 "cryptographic hash of the data that it represents. This makes it difficult "
|
dongsheng@627
|
4512 "to forge the contents of a revision, and easy to detect accidental corruption."
|
dongsheng@627
|
4513 msgstr ""
|
dongsheng@627
|
4514
|
dongsheng@627
|
4515 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4516 #: ../en/ch03-concepts.xml:248
|
dongsheng@627
|
4517 msgid ""
|
dongsheng@627
|
4518 "Hashes provide more than a mere check against corruption; they are used as "
|
dongsheng@627
|
4519 "the identifiers for revisions. The changeset identification hashes that you "
|
dongsheng@627
|
4520 "see as an end user are from revisions of the changelog. Although filelogs "
|
dongsheng@627
|
4521 "and the manifest also use hashes, Mercurial only uses these behind the scenes."
|
dongsheng@627
|
4522 msgstr ""
|
dongsheng@627
|
4523
|
dongsheng@627
|
4524 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4525 #: ../en/ch03-concepts.xml:255
|
dongsheng@627
|
4526 msgid ""
|
dongsheng@627
|
4527 "Mercurial verifies that hashes are correct when it retrieves file revisions "
|
dongsheng@627
|
4528 "and when it pulls changes from another repository. If it encounters an "
|
dongsheng@627
|
4529 "integrity problem, it will complain and stop whatever it's doing."
|
dongsheng@627
|
4530 msgstr ""
|
dongsheng@627
|
4531
|
dongsheng@627
|
4532 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4533 #: ../en/ch03-concepts.xml:260
|
dongsheng@627
|
4534 msgid ""
|
dongsheng@627
|
4535 "In addition to the effect it has on retrieval efficiency, Mercurial's use of "
|
dongsheng@627
|
4536 "periodic snapshots makes it more robust against partial data corruption. If "
|
dongsheng@627
|
4537 "a revlog becomes partly corrupted due to a hardware error or system bug, it's "
|
dongsheng@627
|
4538 "often possible to reconstruct some or most revisions from the uncorrupted "
|
dongsheng@627
|
4539 "sections of the revlog, both before and after the corrupted section. This "
|
dongsheng@627
|
4540 "would not be possible with a delta-only storage model."
|
dongsheng@627
|
4541 msgstr ""
|
dongsheng@627
|
4542
|
dongsheng@627
|
4543 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
4544 #: ../en/ch03-concepts.xml:272
|
dongsheng@627
|
4545 msgid "Revision history, branching, and merging"
|
dongsheng@627
|
4546 msgstr "修订历史,分支与合并"
|
dongsheng@627
|
4547
|
dongsheng@627
|
4548 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4549 #: ../en/ch03-concepts.xml:274
|
dongsheng@627
|
4550 msgid ""
|
dongsheng@627
|
4551 "Every entry in a Mercurial revlog knows the identity of its immediate "
|
dongsheng@627
|
4552 "ancestor revision, usually referred to as its <emphasis>parent</emphasis>. "
|
dongsheng@627
|
4553 "In fact, a revision contains room for not one parent, but two. Mercurial "
|
dongsheng@627
|
4554 "uses a special hash, called the <quote>null ID</quote>, to represent the idea "
|
dongsheng@627
|
4555 "<quote>there is no parent here</quote>. This hash is simply a string of "
|
dongsheng@627
|
4556 "zeroes."
|
dongsheng@627
|
4557 msgstr ""
|
dongsheng@627
|
4558
|
dongsheng@627
|
4559 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4560 #: ../en/ch03-concepts.xml:282
|
dongsheng@627
|
4561 msgid ""
|
dongsheng@641
|
4562 "In figure <xref endterm=\"fig.concepts.revlog.caption\" linkend=\"fig."
|
dongsheng@641
|
4563 "concepts.revlog\"/>, you can see an example of the conceptual structure of a "
|
dongsheng@641
|
4564 "revlog. Filelogs, manifests, and changelogs all have this same structure; "
|
dongsheng@641
|
4565 "they differ only in the kind of data stored in each delta or snapshot."
|
dongsheng@641
|
4566 msgstr ""
|
dongsheng@641
|
4567
|
dongsheng@641
|
4568 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4569 #: ../en/ch03-concepts.xml:289
|
dongsheng@641
|
4570 msgid ""
|
dongsheng@627
|
4571 "The first revision in a revlog (at the bottom of the image) has the null ID "
|
dongsheng@627
|
4572 "in both of its parent slots. For a <quote>normal</quote> revision, its first "
|
dongsheng@627
|
4573 "parent slot contains the ID of its parent revision, and its second contains "
|
dongsheng@627
|
4574 "the null ID, indicating that the revision has only one real parent. Any two "
|
dongsheng@627
|
4575 "revisions that have the same parent ID are branches. A revision that "
|
dongsheng@627
|
4576 "represents a merge between branches has two normal revision IDs in its parent "
|
dongsheng@627
|
4577 "slots."
|
dongsheng@627
|
4578 msgstr ""
|
dongsheng@627
|
4579
|
dongsheng@627
|
4580 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject>
|
dongsheng@650
|
4581 #: ../en/ch03-concepts.xml:300
|
dongsheng@627
|
4582 msgid "<imageobject><imagedata fileref=\"images/revlog.png\"/></imageobject>"
|
dongsheng@627
|
4583 msgstr ""
|
dongsheng@627
|
4584
|
dongsheng@641
|
4585 #. type: Content of: <book><chapter><sect1><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4586 #: ../en/ch03-concepts.xml:302
|
dongsheng@641
|
4587 msgid "Revision in revlog"
|
dongsheng@641
|
4588 msgstr ""
|
dongsheng@641
|
4589
|
dongsheng@627
|
4590 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
4591 #: ../en/ch03-concepts.xml:309
|
dongsheng@627
|
4592 msgid "The working directory"
|
dongsheng@627
|
4593 msgstr "工作目录"
|
dongsheng@627
|
4594
|
dongsheng@627
|
4595 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4596 #: ../en/ch03-concepts.xml:311
|
dongsheng@627
|
4597 msgid ""
|
dongsheng@627
|
4598 "In the working directory, Mercurial stores a snapshot of the files from the "
|
dongsheng@627
|
4599 "repository as of a particular changeset."
|
dongsheng@627
|
4600 msgstr ""
|
dongsheng@627
|
4601
|
dongsheng@627
|
4602 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4603 #: ../en/ch03-concepts.xml:314
|
dongsheng@627
|
4604 msgid ""
|
dongsheng@627
|
4605 "The working directory <quote>knows</quote> which changeset it contains. When "
|
dongsheng@627
|
4606 "you update the working directory to contain a particular changeset, Mercurial "
|
dongsheng@627
|
4607 "looks up the appropriate revision of the manifest to find out which files it "
|
dongsheng@627
|
4608 "was tracking at the time that changeset was committed, and which revision of "
|
dongsheng@627
|
4609 "each file was then current. It then recreates a copy of each of those files, "
|
dongsheng@627
|
4610 "with the same contents it had when the changeset was committed."
|
dongsheng@627
|
4611 msgstr ""
|
dongsheng@627
|
4612
|
dongsheng@627
|
4613 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4614 #: ../en/ch03-concepts.xml:323
|
dongsheng@627
|
4615 msgid ""
|
dongsheng@627
|
4616 "The <emphasis>dirstate</emphasis> contains Mercurial's knowledge of the "
|
dongsheng@627
|
4617 "working directory. This details which changeset the working directory is "
|
dongsheng@627
|
4618 "updated to, and all of the files that Mercurial is tracking in the working "
|
dongsheng@627
|
4619 "directory."
|
dongsheng@627
|
4620 msgstr ""
|
dongsheng@627
|
4621
|
dongsheng@627
|
4622 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4623 #: ../en/ch03-concepts.xml:329
|
dongsheng@627
|
4624 msgid ""
|
dongsheng@627
|
4625 "Just as a revision of a revlog has room for two parents, so that it can "
|
dongsheng@627
|
4626 "represent either a normal revision (with one parent) or a merge of two "
|
dongsheng@627
|
4627 "earlier revisions, the dirstate has slots for two parents. When you use the "
|
dongsheng@627
|
4628 "<command role=\"hg-cmd\">hg update</command> command, the changeset that you "
|
dongsheng@627
|
4629 "update to is stored in the <quote>first parent</quote> slot, and the null ID "
|
dongsheng@627
|
4630 "in the second. When you <command role=\"hg-cmd\">hg merge</command> with "
|
dongsheng@627
|
4631 "another changeset, the first parent remains unchanged, and the second parent "
|
dongsheng@627
|
4632 "is filled in with the changeset you're merging with. The <command role=\"hg-"
|
dongsheng@627
|
4633 "cmd\">hg parents</command> command tells you what the parents of the dirstate "
|
dongsheng@627
|
4634 "are."
|
dongsheng@627
|
4635 msgstr ""
|
dongsheng@627
|
4636
|
dongsheng@627
|
4637 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4638 #: ../en/ch03-concepts.xml:343
|
dongsheng@627
|
4639 msgid "What happens when you commit"
|
dongsheng@627
|
4640 msgstr "当你提交时发生的事情"
|
dongsheng@627
|
4641
|
dongsheng@627
|
4642 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4643 #: ../en/ch03-concepts.xml:345
|
dongsheng@627
|
4644 msgid ""
|
dongsheng@627
|
4645 "The dirstate stores parent information for more than just book-keeping "
|
dongsheng@627
|
4646 "purposes. Mercurial uses the parents of the dirstate as <emphasis>the "
|
dongsheng@627
|
4647 "parents of a new changeset</emphasis> when you perform a commit."
|
dongsheng@627
|
4648 msgstr ""
|
dongsheng@627
|
4649
|
dongsheng@627
|
4650 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4651 #: ../en/ch03-concepts.xml:352
|
dongsheng@627
|
4652 msgid "<imageobject><imagedata fileref=\"images/wdir.png\"/></imageobject>"
|
dongsheng@627
|
4653 msgstr ""
|
dongsheng@627
|
4654
|
dongsheng@627
|
4655 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4656 #: ../en/ch03-concepts.xml:354
|
dongsheng@627
|
4657 msgid "The working directory can have two parents"
|
dongsheng@627
|
4658 msgstr ""
|
dongsheng@627
|
4659
|
dongsheng@627
|
4660 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4661 #: ../en/ch03-concepts.xml:359
|
dongsheng@641
|
4662 msgid ""
|
dongsheng@641
|
4663 "Figure <xref endterm=\"fig.concepts.wdir.caption\" linkend=\"fig.concepts.wdir"
|
dongsheng@641
|
4664 "\"/> shows the normal state of the working directory, where it has a single "
|
dongsheng@641
|
4665 "changeset as parent. That changeset is the <emphasis>tip</emphasis>, the "
|
dongsheng@641
|
4666 "newest changeset in the repository that has no children."
|
dongsheng@627
|
4667 msgstr ""
|
dongsheng@627
|
4668
|
dongsheng@627
|
4669 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4670 #: ../en/ch03-concepts.xml:368
|
dongsheng@641
|
4671 msgid ""
|
dongsheng@641
|
4672 "<imageobject><imagedata fileref=\"images/wdir-after-commit.png\"/> </"
|
dongsheng@627
|
4673 "imageobject>"
|
dongsheng@627
|
4674 msgstr ""
|
dongsheng@627
|
4675
|
dongsheng@627
|
4676 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4677 #: ../en/ch03-concepts.xml:371
|
dongsheng@627
|
4678 msgid "The working directory gains new parents after a commit"
|
dongsheng@627
|
4679 msgstr ""
|
dongsheng@627
|
4680
|
dongsheng@627
|
4681 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4682 #: ../en/ch03-concepts.xml:376
|
dongsheng@627
|
4683 msgid ""
|
dongsheng@627
|
4684 "It's useful to think of the working directory as <quote>the changeset I'm "
|
dongsheng@627
|
4685 "about to commit</quote>. Any files that you tell Mercurial that you've "
|
dongsheng@627
|
4686 "added, removed, renamed, or copied will be reflected in that changeset, as "
|
dongsheng@627
|
4687 "will modifications to any files that Mercurial is already tracking; the new "
|
dongsheng@627
|
4688 "changeset will have the parents of the working directory as its parents."
|
dongsheng@627
|
4689 msgstr ""
|
dongsheng@627
|
4690
|
dongsheng@627
|
4691 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4692 #: ../en/ch03-concepts.xml:384
|
dongsheng@627
|
4693 msgid ""
|
dongsheng@627
|
4694 "After a commit, Mercurial will update the parents of the working directory, "
|
dongsheng@627
|
4695 "so that the first parent is the ID of the new changeset, and the second is "
|
dongsheng@641
|
4696 "the null ID. This is shown in figure <xref endterm=\"fig.concepts.wdir-after-"
|
dongsheng@641
|
4697 "commit.caption\" linkend=\"fig.concepts.wdir-after-commit\"/>. Mercurial "
|
dongsheng@641
|
4698 "doesn't touch any of the files in the working directory when you commit; it "
|
dongsheng@641
|
4699 "just modifies the dirstate to note its new parents."
|
dongsheng@641
|
4700 msgstr ""
|
dongsheng@641
|
4701
|
dongsheng@641
|
4702 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4703 #: ../en/ch03-concepts.xml:396
|
dongsheng@627
|
4704 msgid "Creating a new head"
|
dongsheng@627
|
4705 msgstr "创建新顶点"
|
dongsheng@627
|
4706
|
dongsheng@627
|
4707 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4708 #: ../en/ch03-concepts.xml:398
|
dongsheng@627
|
4709 msgid ""
|
dongsheng@627
|
4710 "It's perfectly normal to update the working directory to a changeset other "
|
dongsheng@627
|
4711 "than the current tip. For example, you might want to know what your project "
|
dongsheng@627
|
4712 "looked like last Tuesday, or you could be looking through changesets to see "
|
dongsheng@627
|
4713 "which one introduced a bug. In cases like this, the natural thing to do is "
|
dongsheng@627
|
4714 "update the working directory to the changeset you're interested in, and then "
|
dongsheng@627
|
4715 "examine the files in the working directory directly to see their contents as "
|
dongsheng@627
|
4716 "they were when you committed that changeset. The effect of this is shown in "
|
dongsheng@641
|
4717 "figure <xref endterm=\"fig.concepts.wdir-pre-branch.caption\" linkend=\"fig."
|
dongsheng@641
|
4718 "concepts.wdir-pre-branch\"/>."
|
dongsheng@627
|
4719 msgstr ""
|
dongsheng@627
|
4720
|
dongsheng@627
|
4721 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4722 #: ../en/ch03-concepts.xml:412
|
dongsheng@641
|
4723 msgid ""
|
dongsheng@641
|
4724 "<imageobject><imagedata fileref=\"images/wdir-pre-branch.png\"/> </"
|
dongsheng@641
|
4725 "imageobject>"
|
dongsheng@627
|
4726 msgstr ""
|
dongsheng@627
|
4727
|
dongsheng@627
|
4728 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4729 #: ../en/ch03-concepts.xml:415
|
dongsheng@627
|
4730 msgid "The working directory, updated to an older changeset"
|
dongsheng@627
|
4731 msgstr ""
|
dongsheng@627
|
4732
|
dongsheng@627
|
4733 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4734 #: ../en/ch03-concepts.xml:420
|
dongsheng@627
|
4735 msgid ""
|
dongsheng@627
|
4736 "Having updated the working directory to an older changeset, what happens if "
|
dongsheng@627
|
4737 "you make some changes, and then commit? Mercurial behaves in the same way as "
|
dongsheng@627
|
4738 "I outlined above. The parents of the working directory become the parents of "
|
dongsheng@627
|
4739 "the new changeset. This new changeset has no children, so it becomes the new "
|
dongsheng@627
|
4740 "tip. And the repository now contains two changesets that have no children; "
|
dongsheng@627
|
4741 "we call these <emphasis>heads</emphasis>. You can see the structure that "
|
dongsheng@641
|
4742 "this creates in figure <xref endterm=\"fig.concepts.wdir-branch.caption\" "
|
dongsheng@641
|
4743 "linkend=\"fig.concepts.wdir-branch\"/>."
|
dongsheng@627
|
4744 msgstr ""
|
dongsheng@627
|
4745
|
dongsheng@627
|
4746 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4747 #: ../en/ch03-concepts.xml:434
|
dongsheng@641
|
4748 msgid ""
|
dongsheng@641
|
4749 "<imageobject><imagedata fileref=\"images/wdir-branch.png\"/> </imageobject>"
|
dongsheng@627
|
4750 msgstr ""
|
dongsheng@627
|
4751
|
dongsheng@627
|
4752 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4753 #: ../en/ch03-concepts.xml:437
|
dongsheng@627
|
4754 msgid "After a commit made while synced to an older changeset"
|
dongsheng@627
|
4755 msgstr ""
|
dongsheng@627
|
4756
|
dongsheng@627
|
4757 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
4758 #: ../en/ch03-concepts.xml:443
|
dongsheng@627
|
4759 msgid ""
|
dongsheng@627
|
4760 "If you're new to Mercurial, you should keep in mind a common <quote>error</"
|
dongsheng@627
|
4761 "quote>, which is to use the <command role=\"hg-cmd\">hg pull</command> "
|
dongsheng@627
|
4762 "command without any options. By default, the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
4763 "pull</command> command <emphasis>does not</emphasis> update the working "
|
dongsheng@627
|
4764 "directory, so you'll bring new changesets into your repository, but the "
|
dongsheng@627
|
4765 "working directory will stay synced at the same changeset as before the pull. "
|
dongsheng@627
|
4766 "If you make some changes and commit afterwards, you'll thus create a new "
|
dongsheng@627
|
4767 "head, because your working directory isn't synced to whatever the current tip "
|
dongsheng@627
|
4768 "is."
|
dongsheng@627
|
4769 msgstr ""
|
dongsheng@627
|
4770
|
dongsheng@627
|
4771 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
4772 #: ../en/ch03-concepts.xml:455
|
dongsheng@627
|
4773 msgid ""
|
dongsheng@627
|
4774 "I put the word <quote>error</quote> in quotes because all that you need to do "
|
dongsheng@627
|
4775 "to rectify this situation is <command role=\"hg-cmd\">hg merge</command>, "
|
dongsheng@627
|
4776 "then <command role=\"hg-cmd\">hg commit</command>. In other words, this "
|
dongsheng@627
|
4777 "almost never has negative consequences; it just surprises people. I'll "
|
dongsheng@627
|
4778 "discuss other ways to avoid this behaviour, and why Mercurial behaves in this "
|
dongsheng@627
|
4779 "initially surprising way, later on."
|
dongsheng@627
|
4780 msgstr ""
|
dongsheng@627
|
4781
|
dongsheng@627
|
4782 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4783 #: ../en/ch03-concepts.xml:467
|
dongsheng@627
|
4784 msgid "Merging heads"
|
dongsheng@627
|
4785 msgstr "合并顶点"
|
dongsheng@627
|
4786
|
dongsheng@627
|
4787 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4788 #: ../en/ch03-concepts.xml:469
|
dongsheng@627
|
4789 msgid ""
|
dongsheng@627
|
4790 "When you run the <command role=\"hg-cmd\">hg merge</command> command, "
|
dongsheng@627
|
4791 "Mercurial leaves the first parent of the working directory unchanged, and "
|
dongsheng@627
|
4792 "sets the second parent to the changeset you're merging with, as shown in "
|
dongsheng@641
|
4793 "figure <xref endterm=\"fig.concepts.wdir-merge.caption\" linkend=\"fig."
|
dongsheng@641
|
4794 "concepts.wdir-merge\"/>."
|
dongsheng@627
|
4795 msgstr ""
|
dongsheng@627
|
4796
|
dongsheng@627
|
4797 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
4798 #: ../en/ch03-concepts.xml:478
|
dongsheng@641
|
4799 msgid ""
|
dongsheng@641
|
4800 "<imageobject><imagedata fileref=\"images/wdir-merge.png\"/> </imageobject>"
|
dongsheng@627
|
4801 msgstr ""
|
dongsheng@627
|
4802
|
dongsheng@627
|
4803 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
4804 #: ../en/ch03-concepts.xml:481
|
dongsheng@627
|
4805 msgid "Merging two heads"
|
dongsheng@627
|
4806 msgstr ""
|
dongsheng@627
|
4807
|
dongsheng@627
|
4808 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4809 #: ../en/ch03-concepts.xml:486
|
dongsheng@627
|
4810 msgid ""
|
dongsheng@627
|
4811 "Mercurial also has to modify the working directory, to merge the files "
|
dongsheng@627
|
4812 "managed in the two changesets. Simplified a little, the merging process goes "
|
dongsheng@627
|
4813 "like this, for every file in the manifests of both changesets."
|
dongsheng@627
|
4814 msgstr ""
|
dongsheng@627
|
4815
|
dongsheng@627
|
4816 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
4817 #: ../en/ch03-concepts.xml:491
|
dongsheng@627
|
4818 msgid "If neither changeset has modified a file, do nothing with that file."
|
dongsheng@627
|
4819 msgstr ""
|
dongsheng@627
|
4820
|
dongsheng@627
|
4821 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
4822 #: ../en/ch03-concepts.xml:494
|
dongsheng@627
|
4823 msgid ""
|
dongsheng@627
|
4824 "If one changeset has modified a file, and the other hasn't, create the "
|
dongsheng@627
|
4825 "modified copy of the file in the working directory."
|
dongsheng@627
|
4826 msgstr ""
|
dongsheng@627
|
4827
|
dongsheng@627
|
4828 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
4829 #: ../en/ch03-concepts.xml:498
|
dongsheng@627
|
4830 msgid ""
|
dongsheng@627
|
4831 "If one changeset has removed a file, and the other hasn't (or has also "
|
dongsheng@627
|
4832 "deleted it), delete the file from the working directory."
|
dongsheng@627
|
4833 msgstr ""
|
dongsheng@627
|
4834
|
dongsheng@627
|
4835 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
4836 #: ../en/ch03-concepts.xml:502
|
dongsheng@627
|
4837 msgid ""
|
dongsheng@627
|
4838 "If one changeset has removed a file, but the other has modified the file, ask "
|
dongsheng@627
|
4839 "the user what to do: keep the modified file, or remove it?"
|
dongsheng@627
|
4840 msgstr ""
|
dongsheng@627
|
4841
|
dongsheng@627
|
4842 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
4843 #: ../en/ch03-concepts.xml:506
|
dongsheng@627
|
4844 msgid ""
|
dongsheng@627
|
4845 "If both changesets have modified a file, invoke an external merge program to "
|
dongsheng@627
|
4846 "choose the new contents for the merged file. This may require input from the "
|
dongsheng@627
|
4847 "user."
|
dongsheng@627
|
4848 msgstr ""
|
dongsheng@627
|
4849
|
dongsheng@627
|
4850 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
4851 #: ../en/ch03-concepts.xml:511
|
dongsheng@627
|
4852 msgid ""
|
dongsheng@627
|
4853 "If one changeset has modified a file, and the other has renamed or copied the "
|
dongsheng@627
|
4854 "file, make sure that the changes follow the new name of the file."
|
dongsheng@627
|
4855 msgstr ""
|
dongsheng@627
|
4856
|
dongsheng@627
|
4857 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4858 #: ../en/ch03-concepts.xml:515
|
dongsheng@627
|
4859 msgid ""
|
dongsheng@627
|
4860 "There are more details&emdash;merging has plenty of corner cases&emdash;but "
|
dongsheng@627
|
4861 "these are the most common choices that are involved in a merge. As you can "
|
dongsheng@627
|
4862 "see, most cases are completely automatic, and indeed most merges finish "
|
dongsheng@627
|
4863 "automatically, without requiring your input to resolve any conflicts."
|
dongsheng@627
|
4864 msgstr ""
|
dongsheng@627
|
4865
|
dongsheng@627
|
4866 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4867 #: ../en/ch03-concepts.xml:522
|
dongsheng@627
|
4868 msgid ""
|
dongsheng@627
|
4869 "When you're thinking about what happens when you commit after a merge, once "
|
dongsheng@627
|
4870 "again the working directory is <quote>the changeset I'm about to commit</"
|
dongsheng@627
|
4871 "quote>. After the <command role=\"hg-cmd\">hg merge</command> command "
|
dongsheng@627
|
4872 "completes, the working directory has two parents; these will become the "
|
dongsheng@627
|
4873 "parents of the new changeset."
|
dongsheng@627
|
4874 msgstr ""
|
dongsheng@627
|
4875
|
dongsheng@627
|
4876 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4877 #: ../en/ch03-concepts.xml:529
|
dongsheng@627
|
4878 msgid ""
|
dongsheng@627
|
4879 "Mercurial lets you perform multiple merges, but you must commit the results "
|
dongsheng@627
|
4880 "of each individual merge as you go. This is necessary because Mercurial only "
|
dongsheng@627
|
4881 "tracks two parents for both revisions and the working directory. While it "
|
dongsheng@627
|
4882 "would be technically possible to merge multiple changesets at once, the "
|
dongsheng@627
|
4883 "prospect of user confusion and making a terrible mess of a merge immediately "
|
dongsheng@627
|
4884 "becomes overwhelming."
|
dongsheng@627
|
4885 msgstr ""
|
dongsheng@627
|
4886
|
dongsheng@627
|
4887 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
4888 #: ../en/ch03-concepts.xml:540
|
dongsheng@627
|
4889 msgid "Other interesting design features"
|
dongsheng@627
|
4890 msgstr "其它有趣的设计特性"
|
dongsheng@627
|
4891
|
dongsheng@627
|
4892 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
4893 #: ../en/ch03-concepts.xml:542
|
dongsheng@627
|
4894 msgid ""
|
dongsheng@627
|
4895 "In the sections above, I've tried to highlight some of the most important "
|
dongsheng@627
|
4896 "aspects of Mercurial's design, to illustrate that it pays careful attention "
|
dongsheng@627
|
4897 "to reliability and performance. However, the attention to detail doesn't "
|
dongsheng@627
|
4898 "stop there. There are a number of other aspects of Mercurial's construction "
|
dongsheng@627
|
4899 "that I personally find interesting. I'll detail a few of them here, separate "
|
dongsheng@627
|
4900 "from the <quote>big ticket</quote> items above, so that if you're interested, "
|
dongsheng@627
|
4901 "you can gain a better idea of the amount of thinking that goes into a well-"
|
dongsheng@627
|
4902 "designed system."
|
dongsheng@627
|
4903 msgstr ""
|
dongsheng@627
|
4904
|
dongsheng@627
|
4905 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4906 #: ../en/ch03-concepts.xml:553
|
dongsheng@627
|
4907 msgid "Clever compression"
|
dongsheng@627
|
4908 msgstr "智能压缩"
|
dongsheng@627
|
4909
|
dongsheng@627
|
4910 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4911 #: ../en/ch03-concepts.xml:555
|
dongsheng@627
|
4912 msgid ""
|
dongsheng@627
|
4913 "When appropriate, Mercurial will store both snapshots and deltas in "
|
dongsheng@627
|
4914 "compressed form. It does this by always <emphasis>trying to</emphasis> "
|
dongsheng@627
|
4915 "compress a snapshot or delta, but only storing the compressed version if it's "
|
dongsheng@627
|
4916 "smaller than the uncompressed version."
|
dongsheng@627
|
4917 msgstr ""
|
dongsheng@627
|
4918
|
dongsheng@627
|
4919 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4920 #: ../en/ch03-concepts.xml:561
|
dongsheng@627
|
4921 msgid ""
|
dongsheng@627
|
4922 "This means that Mercurial does <quote>the right thing</quote> when storing a "
|
dongsheng@627
|
4923 "file whose native form is compressed, such as a <literal>zip</literal> "
|
dongsheng@627
|
4924 "archive or a JPEG image. When these types of files are compressed a second "
|
dongsheng@627
|
4925 "time, the resulting file is usually bigger than the once-compressed form, and "
|
dongsheng@627
|
4926 "so Mercurial will store the plain <literal>zip</literal> or JPEG."
|
dongsheng@627
|
4927 msgstr ""
|
dongsheng@627
|
4928
|
dongsheng@627
|
4929 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4930 #: ../en/ch03-concepts.xml:569
|
dongsheng@627
|
4931 msgid ""
|
dongsheng@627
|
4932 "Deltas between revisions of a compressed file are usually larger than "
|
dongsheng@627
|
4933 "snapshots of the file, and Mercurial again does <quote>the right thing</"
|
dongsheng@627
|
4934 "quote> in these cases. It finds that such a delta exceeds the threshold at "
|
dongsheng@627
|
4935 "which it should store a complete snapshot of the file, so it stores the "
|
dongsheng@627
|
4936 "snapshot, again saving space compared to a naive delta-only approach."
|
dongsheng@627
|
4937 msgstr ""
|
dongsheng@627
|
4938
|
dongsheng@627
|
4939 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
4940 #: ../en/ch03-concepts.xml:578
|
dongsheng@627
|
4941 msgid "Network recompression"
|
dongsheng@627
|
4942 msgstr "网络重新压缩"
|
dongsheng@627
|
4943
|
dongsheng@627
|
4944 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
4945 #: ../en/ch03-concepts.xml:580
|
dongsheng@627
|
4946 msgid ""
|
dongsheng@627
|
4947 "When storing revisions on disk, Mercurial uses the <quote>deflate</quote> "
|
dongsheng@627
|
4948 "compression algorithm (the same one used by the popular <literal>zip</"
|
dongsheng@627
|
4949 "literal> archive format), which balances good speed with a respectable "
|
dongsheng@627
|
4950 "compression ratio. However, when transmitting revision data over a network "
|
dongsheng@627
|
4951 "connection, Mercurial uncompresses the compressed revision data."
|
dongsheng@627
|
4952 msgstr ""
|
dongsheng@627
|
4953
|
dongsheng@627
|
4954 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
4955 #: ../en/ch03-concepts.xml:588
|
dongsheng@627
|
4956 msgid ""
|
dongsheng@627
|
4957 "If the connection is over HTTP, Mercurial recompresses the entire stream of "
|
dongsheng@627
|
4958 "data using a compression algorithm that gives a better compression ratio (the "
|
dongsheng@627
|
4959 "Burrows-Wheeler algorithm from the widely used <literal>bzip2</literal> "
|
dongsheng@627
|
4960 "compression package). This combination of algorithm and compression of the "
|
dongsheng@627
|
4961 "entire stream (instead of a revision at a time) substantially reduces the "
|
dongsheng@627
|
4962 "number of bytes to be transferred, yielding better network performance over "
|
dongsheng@627
|
4963 "almost all kinds of network."
|
dongsheng@627
|
4964 msgstr ""
|
dongsheng@627
|
4965
|
dongsheng@627
|
4966 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
4967 #: ../en/ch03-concepts.xml:598
|
dongsheng@627
|
4968 msgid ""
|
dongsheng@627
|
4969 "(If the connection is over <command>ssh</command>, Mercurial "
|
dongsheng@627
|
4970 "<emphasis>doesn't</emphasis> recompress the stream, because <command>ssh</"
|
dongsheng@627
|
4971 "command> can already do this itself.)"
|
dongsheng@627
|
4972 msgstr ""
|
dongsheng@627
|
4973
|
dongsheng@627
|
4974 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
4975 #: ../en/ch03-concepts.xml:606
|
dongsheng@627
|
4976 msgid "Read/write ordering and atomicity"
|
dongsheng@627
|
4977 msgstr "读写顺序与原子性"
|
dongsheng@627
|
4978
|
dongsheng@627
|
4979 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4980 #: ../en/ch03-concepts.xml:608
|
dongsheng@627
|
4981 msgid ""
|
dongsheng@627
|
4982 "Appending to files isn't the whole story when it comes to guaranteeing that a "
|
dongsheng@641
|
4983 "reader won't see a partial write. If you recall figure <xref endterm=\"fig."
|
dongsheng@641
|
4984 "concepts.metadata.caption\" linkend=\"fig.concepts.metadata\"/>, revisions in "
|
dongsheng@641
|
4985 "the changelog point to revisions in the manifest, and revisions in the "
|
dongsheng@641
|
4986 "manifest point to revisions in filelogs. This hierarchy is deliberate."
|
dongsheng@641
|
4987 msgstr ""
|
dongsheng@641
|
4988
|
dongsheng@641
|
4989 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4990 #: ../en/ch03-concepts.xml:616
|
dongsheng@627
|
4991 msgid ""
|
dongsheng@627
|
4992 "A writer starts a transaction by writing filelog and manifest data, and "
|
dongsheng@627
|
4993 "doesn't write any changelog data until those are finished. A reader starts "
|
dongsheng@627
|
4994 "by reading changelog data, then manifest data, followed by filelog data."
|
dongsheng@627
|
4995 msgstr ""
|
dongsheng@627
|
4996
|
dongsheng@627
|
4997 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
4998 #: ../en/ch03-concepts.xml:621
|
dongsheng@627
|
4999 msgid ""
|
dongsheng@627
|
5000 "Since the writer has always finished writing filelog and manifest data before "
|
dongsheng@627
|
5001 "it writes to the changelog, a reader will never read a pointer to a partially "
|
dongsheng@627
|
5002 "written manifest revision from the changelog, and it will never read a "
|
dongsheng@627
|
5003 "pointer to a partially written filelog revision from the manifest."
|
dongsheng@627
|
5004 msgstr ""
|
dongsheng@627
|
5005
|
dongsheng@627
|
5006 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5007 #: ../en/ch03-concepts.xml:629
|
dongsheng@627
|
5008 msgid "Concurrent access"
|
dongsheng@627
|
5009 msgstr "并发访问"
|
dongsheng@627
|
5010
|
dongsheng@627
|
5011 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5012 #: ../en/ch03-concepts.xml:631
|
dongsheng@627
|
5013 msgid ""
|
dongsheng@627
|
5014 "The read/write ordering and atomicity guarantees mean that Mercurial never "
|
dongsheng@627
|
5015 "needs to <emphasis>lock</emphasis> a repository when it's reading data, even "
|
dongsheng@627
|
5016 "if the repository is being written to while the read is occurring. This has a "
|
dongsheng@627
|
5017 "big effect on scalability; you can have an arbitrary number of Mercurial "
|
dongsheng@627
|
5018 "processes safely reading data from a repository safely all at once, no matter "
|
dongsheng@627
|
5019 "whether it's being written to or not."
|
dongsheng@627
|
5020 msgstr ""
|
dongsheng@627
|
5021
|
dongsheng@627
|
5022 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5023 #: ../en/ch03-concepts.xml:640
|
dongsheng@627
|
5024 msgid ""
|
dongsheng@627
|
5025 "The lockless nature of reading means that if you're sharing a repository on a "
|
dongsheng@627
|
5026 "multi-user system, you don't need to grant other local users permission to "
|
dongsheng@627
|
5027 "<emphasis>write</emphasis> to your repository in order for them to be able to "
|
dongsheng@627
|
5028 "clone it or pull changes from it; they only need <emphasis>read</emphasis> "
|
dongsheng@627
|
5029 "permission. (This is <emphasis>not</emphasis> a common feature among "
|
dongsheng@627
|
5030 "revision control systems, so don't take it for granted! Most require readers "
|
dongsheng@627
|
5031 "to be able to lock a repository to access it safely, and this requires write "
|
dongsheng@627
|
5032 "permission on at least one directory, which of course makes for all kinds of "
|
dongsheng@627
|
5033 "nasty and annoying security and administrative problems.)"
|
dongsheng@627
|
5034 msgstr ""
|
dongsheng@627
|
5035
|
dongsheng@627
|
5036 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5037 #: ../en/ch03-concepts.xml:653
|
dongsheng@627
|
5038 msgid ""
|
dongsheng@627
|
5039 "Mercurial uses locks to ensure that only one process can write to a "
|
dongsheng@627
|
5040 "repository at a time (the locking mechanism is safe even over filesystems "
|
dongsheng@627
|
5041 "that are notoriously hostile to locking, such as NFS). If a repository is "
|
dongsheng@627
|
5042 "locked, a writer will wait for a while to retry if the repository becomes "
|
dongsheng@627
|
5043 "unlocked, but if the repository remains locked for too long, the process "
|
dongsheng@627
|
5044 "attempting to write will time out after a while. This means that your daily "
|
dongsheng@627
|
5045 "automated scripts won't get stuck forever and pile up if a system crashes "
|
dongsheng@627
|
5046 "unnoticed, for example. (Yes, the timeout is configurable, from zero to "
|
dongsheng@627
|
5047 "infinity.)"
|
dongsheng@627
|
5048 msgstr ""
|
dongsheng@627
|
5049
|
dongsheng@627
|
5050 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
5051 #: ../en/ch03-concepts.xml:665
|
dongsheng@627
|
5052 msgid "Safe dirstate access"
|
dongsheng@627
|
5053 msgstr "安全的目录状态访问"
|
dongsheng@627
|
5054
|
dongsheng@627
|
5055 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
5056 #: ../en/ch03-concepts.xml:667
|
dongsheng@627
|
5057 msgid ""
|
dongsheng@627
|
5058 "As with revision data, Mercurial doesn't take a lock to read the dirstate "
|
dongsheng@627
|
5059 "file; it does acquire a lock to write it. To avoid the possibility of "
|
dongsheng@627
|
5060 "reading a partially written copy of the dirstate file, Mercurial writes to a "
|
dongsheng@627
|
5061 "file with a unique name in the same directory as the dirstate file, then "
|
dongsheng@627
|
5062 "renames the temporary file atomically to <filename>dirstate</filename>. The "
|
dongsheng@627
|
5063 "file named <filename>dirstate</filename> is thus guaranteed to be complete, "
|
dongsheng@627
|
5064 "not partially written."
|
dongsheng@627
|
5065 msgstr ""
|
dongsheng@627
|
5066
|
dongsheng@627
|
5067 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5068 #: ../en/ch03-concepts.xml:680
|
dongsheng@627
|
5069 msgid "Avoiding seeks"
|
dongsheng@627
|
5070 msgstr "避免查找"
|
dongsheng@627
|
5071
|
dongsheng@627
|
5072 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5073 #: ../en/ch03-concepts.xml:682
|
dongsheng@627
|
5074 msgid ""
|
dongsheng@627
|
5075 "Critical to Mercurial's performance is the avoidance of seeks of the disk "
|
dongsheng@627
|
5076 "head, since any seek is far more expensive than even a comparatively large "
|
dongsheng@627
|
5077 "read operation."
|
dongsheng@627
|
5078 msgstr ""
|
dongsheng@627
|
5079
|
dongsheng@627
|
5080 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5081 #: ../en/ch03-concepts.xml:686
|
dongsheng@627
|
5082 msgid ""
|
dongsheng@627
|
5083 "This is why, for example, the dirstate is stored in a single file. If there "
|
dongsheng@627
|
5084 "were a dirstate file per directory that Mercurial tracked, the disk would "
|
dongsheng@627
|
5085 "seek once per directory. Instead, Mercurial reads the entire single dirstate "
|
dongsheng@627
|
5086 "file in one step."
|
dongsheng@627
|
5087 msgstr ""
|
dongsheng@627
|
5088
|
dongsheng@627
|
5089 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5090 #: ../en/ch03-concepts.xml:692
|
dongsheng@627
|
5091 msgid ""
|
dongsheng@627
|
5092 "Mercurial also uses a <quote>copy on write</quote> scheme when cloning a "
|
dongsheng@627
|
5093 "repository on local storage. Instead of copying every revlog file from the "
|
dongsheng@627
|
5094 "old repository into the new repository, it makes a <quote>hard link</quote>, "
|
dongsheng@627
|
5095 "which is a shorthand way to say <quote>these two names point to the same "
|
dongsheng@627
|
5096 "file</quote>. When Mercurial is about to write to one of a revlog's files, "
|
dongsheng@627
|
5097 "it checks to see if the number of names pointing at the file is greater than "
|
dongsheng@627
|
5098 "one. If it is, more than one repository is using the file, so Mercurial "
|
dongsheng@627
|
5099 "makes a new copy of the file that is private to this repository."
|
dongsheng@627
|
5100 msgstr ""
|
dongsheng@627
|
5101
|
dongsheng@627
|
5102 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5103 #: ../en/ch03-concepts.xml:703
|
dongsheng@627
|
5104 msgid ""
|
dongsheng@627
|
5105 "A few revision control developers have pointed out that this idea of making a "
|
dongsheng@627
|
5106 "complete private copy of a file is not very efficient in its use of storage. "
|
dongsheng@627
|
5107 "While this is true, storage is cheap, and this method gives the highest "
|
dongsheng@627
|
5108 "performance while deferring most book-keeping to the operating system. An "
|
dongsheng@627
|
5109 "alternative scheme would most likely reduce performance and increase the "
|
dongsheng@627
|
5110 "complexity of the software, each of which is much more important to the "
|
dongsheng@627
|
5111 "<quote>feel</quote> of day-to-day use."
|
dongsheng@627
|
5112 msgstr ""
|
dongsheng@627
|
5113
|
dongsheng@627
|
5114 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5115 #: ../en/ch03-concepts.xml:715
|
dongsheng@627
|
5116 msgid "Other contents of the dirstate"
|
dongsheng@627
|
5117 msgstr "目录状态的其它内容"
|
dongsheng@627
|
5118
|
dongsheng@627
|
5119 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5120 #: ../en/ch03-concepts.xml:717
|
dongsheng@627
|
5121 msgid ""
|
dongsheng@627
|
5122 "Because Mercurial doesn't force you to tell it when you're modifying a file, "
|
dongsheng@627
|
5123 "it uses the dirstate to store some extra information so it can determine "
|
dongsheng@627
|
5124 "efficiently whether you have modified a file. For each file in the working "
|
dongsheng@627
|
5125 "directory, it stores the time that it last modified the file itself, and the "
|
dongsheng@627
|
5126 "size of the file at that time."
|
dongsheng@627
|
5127 msgstr ""
|
dongsheng@627
|
5128
|
dongsheng@627
|
5129 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5130 #: ../en/ch03-concepts.xml:724
|
dongsheng@627
|
5131 msgid ""
|
dongsheng@627
|
5132 "When you explicitly <command role=\"hg-cmd\">hg add</command>, <command role="
|
dongsheng@627
|
5133 "\"hg-cmd\">hg remove</command>, <command role=\"hg-cmd\">hg rename</command> "
|
dongsheng@627
|
5134 "or <command role=\"hg-cmd\">hg copy</command> files, Mercurial updates the "
|
dongsheng@627
|
5135 "dirstate so that it knows what to do with those files when you commit."
|
dongsheng@627
|
5136 msgstr ""
|
dongsheng@627
|
5137
|
dongsheng@627
|
5138 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5139 #: ../en/ch03-concepts.xml:731
|
dongsheng@627
|
5140 msgid ""
|
dongsheng@627
|
5141 "When Mercurial is checking the states of files in the working directory, it "
|
dongsheng@627
|
5142 "first checks a file's modification time. If that has not changed, the file "
|
dongsheng@627
|
5143 "must not have been modified. If the file's size has changed, the file must "
|
dongsheng@627
|
5144 "have been modified. If the modification time has changed, but the size has "
|
dongsheng@627
|
5145 "not, only then does Mercurial need to read the actual contents of the file to "
|
dongsheng@627
|
5146 "see if they've changed. Storing these few extra pieces of information "
|
dongsheng@627
|
5147 "dramatically reduces the amount of data that Mercurial needs to read, which "
|
dongsheng@627
|
5148 "yields large performance improvements compared to other revision control "
|
dongsheng@627
|
5149 "systems."
|
dongsheng@627
|
5150 msgstr ""
|
dongsheng@627
|
5151
|
dongsheng@627
|
5152 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
5153 #: ../en/ch04-daily.xml:5
|
dongsheng@627
|
5154 msgid "Mercurial in daily use"
|
dongsheng@627
|
5155 msgstr "Mercurial 的日常使用"
|
dongsheng@627
|
5156
|
dongsheng@627
|
5157 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
5158 #: ../en/ch04-daily.xml:8
|
dongsheng@627
|
5159 msgid "Telling Mercurial which files to track"
|
dongsheng@627
|
5160 msgstr "告诉 Mercurial 要跟踪哪些文件"
|
dongsheng@627
|
5161
|
dongsheng@627
|
5162 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5163 #: ../en/ch04-daily.xml:10
|
dongsheng@627
|
5164 msgid ""
|
dongsheng@627
|
5165 "Mercurial does not work with files in your repository unless you tell it to "
|
dongsheng@627
|
5166 "manage them. The <command role=\"hg-cmd\">hg status</command> command will "
|
dongsheng@627
|
5167 "tell you which files Mercurial doesn't know about; it uses a <quote><literal>?"
|
dongsheng@627
|
5168 "</literal></quote> to display such files."
|
dongsheng@627
|
5169 msgstr ""
|
dongsheng@627
|
5170
|
dongsheng@627
|
5171 #
|
dongsheng@627
|
5172 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5173 #: ../en/ch04-daily.xml:17
|
dongsheng@627
|
5174 msgid ""
|
dongsheng@627
|
5175 "To tell Mercurial to track a file, use the <command role=\"hg-cmd\">hg add</"
|
dongsheng@627
|
5176 "command> command. Once you have added a file, the entry in the output of "
|
dongsheng@627
|
5177 "<command role=\"hg-cmd\">hg status</command> for that file changes from "
|
dongsheng@627
|
5178 "<quote><literal>?</literal></quote> to <quote><literal>A</literal></quote>."
|
dongsheng@627
|
5179 msgstr ""
|
dongsheng@627
|
5180
|
dongsheng@627
|
5181 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5182 #: ../en/ch04-daily.xml:26
|
dongsheng@627
|
5183 msgid ""
|
dongsheng@627
|
5184 "After you run a <command role=\"hg-cmd\">hg commit</command>, the files that "
|
dongsheng@627
|
5185 "you added before the commit will no longer be listed in the output of "
|
dongsheng@627
|
5186 "<command role=\"hg-cmd\">hg status</command>. The reason for this is that "
|
dongsheng@627
|
5187 "<command role=\"hg-cmd\">hg status</command> only tells you about "
|
dongsheng@627
|
5188 "<quote>interesting</quote> files&emdash;those that you have modified or told "
|
dongsheng@627
|
5189 "Mercurial to do something with&emdash;by default. If you have a repository "
|
dongsheng@627
|
5190 "that contains thousands of files, you will rarely want to know about files "
|
dongsheng@627
|
5191 "that Mercurial is tracking, but that have not changed. (You can still get "
|
dongsheng@627
|
5192 "this information; we'll return to this later.)"
|
dongsheng@627
|
5193 msgstr ""
|
dongsheng@627
|
5194
|
dongsheng@627
|
5195 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5196 #: ../en/ch04-daily.xml:38
|
dongsheng@627
|
5197 msgid ""
|
dongsheng@627
|
5198 "Once you add a file, Mercurial doesn't do anything with it immediately. "
|
dongsheng@627
|
5199 "Instead, it will take a snapshot of the file's state the next time you "
|
dongsheng@627
|
5200 "perform a commit. It will then continue to track the changes you make to the "
|
dongsheng@627
|
5201 "file every time you commit, until you remove the file."
|
dongsheng@627
|
5202 msgstr ""
|
dongsheng@627
|
5203
|
dongsheng@627
|
5204 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5205 #: ../en/ch04-daily.xml:45
|
dongsheng@627
|
5206 msgid "Explicit versus implicit file naming"
|
dongsheng@627
|
5207 msgstr "明确与隐含文件命名"
|
dongsheng@627
|
5208
|
dongsheng@627
|
5209 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5210 #: ../en/ch04-daily.xml:47
|
dongsheng@627
|
5211 msgid ""
|
dongsheng@627
|
5212 "A useful behaviour that Mercurial has is that if you pass the name of a "
|
dongsheng@627
|
5213 "directory to a command, every Mercurial command will treat this as <quote>I "
|
dongsheng@627
|
5214 "want to operate on every file in this directory and its subdirectories</"
|
dongsheng@627
|
5215 "quote>."
|
dongsheng@627
|
5216 msgstr ""
|
dongsheng@627
|
5217
|
dongsheng@627
|
5218 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5219 #: ../en/ch04-daily.xml:54
|
dongsheng@627
|
5220 msgid ""
|
dongsheng@627
|
5221 "Notice in this example that Mercurial printed the names of the files it "
|
dongsheng@627
|
5222 "added, whereas it didn't do so when we added the file named <filename>a</"
|
dongsheng@627
|
5223 "filename> in the earlier example."
|
dongsheng@627
|
5224 msgstr ""
|
dongsheng@627
|
5225
|
dongsheng@627
|
5226 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5227 #: ../en/ch04-daily.xml:59
|
dongsheng@627
|
5228 msgid ""
|
dongsheng@627
|
5229 "What's going on is that in the former case, we explicitly named the file to "
|
dongsheng@627
|
5230 "add on the command line, so the assumption that Mercurial makes in such cases "
|
dongsheng@627
|
5231 "is that you know what you were doing, and it doesn't print any output."
|
dongsheng@627
|
5232 msgstr ""
|
dongsheng@627
|
5233
|
dongsheng@627
|
5234 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5235 #: ../en/ch04-daily.xml:64
|
dongsheng@627
|
5236 msgid ""
|
dongsheng@627
|
5237 "However, when we <emphasis>imply</emphasis> the names of files by giving the "
|
dongsheng@627
|
5238 "name of a directory, Mercurial takes the extra step of printing the name of "
|
dongsheng@627
|
5239 "each file that it does something with. This makes it more clear what is "
|
dongsheng@627
|
5240 "happening, and reduces the likelihood of a silent and nasty surprise. This "
|
dongsheng@627
|
5241 "behaviour is common to most Mercurial commands."
|
dongsheng@627
|
5242 msgstr ""
|
dongsheng@627
|
5243
|
dongsheng@627
|
5244 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5245 #: ../en/ch04-daily.xml:73
|
dongsheng@627
|
5246 msgid "Aside: Mercurial tracks files, not directories"
|
dongsheng@627
|
5247 msgstr "旁白: Mercurial 只跟踪文件,不跟踪目录"
|
dongsheng@627
|
5248
|
dongsheng@627
|
5249 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5250 #: ../en/ch04-daily.xml:75
|
dongsheng@627
|
5251 msgid ""
|
dongsheng@627
|
5252 "Mercurial does not track directory information. Instead, it tracks the path "
|
dongsheng@627
|
5253 "to a file. Before creating a file, it first creates any missing directory "
|
dongsheng@627
|
5254 "components of the path. After it deletes a file, it then deletes any empty "
|
dongsheng@627
|
5255 "directories that were in the deleted file's path. This sounds like a trivial "
|
dongsheng@627
|
5256 "distinction, but it has one minor practical consequence: it is not possible "
|
dongsheng@627
|
5257 "to represent a completely empty directory in Mercurial."
|
dongsheng@627
|
5258 msgstr ""
|
dongsheng@627
|
5259
|
dongsheng@627
|
5260 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5261 #: ../en/ch04-daily.xml:84
|
dongsheng@627
|
5262 msgid ""
|
dongsheng@627
|
5263 "Empty directories are rarely useful, and there are unintrusive workarounds "
|
dongsheng@627
|
5264 "that you can use to achieve an appropriate effect. The developers of "
|
dongsheng@627
|
5265 "Mercurial thus felt that the complexity that would be required to manage "
|
dongsheng@627
|
5266 "empty directories was not worth the limited benefit this feature would bring."
|
dongsheng@627
|
5267 msgstr ""
|
dongsheng@627
|
5268
|
dongsheng@627
|
5269 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5270 #: ../en/ch04-daily.xml:91
|
dongsheng@627
|
5271 msgid ""
|
dongsheng@627
|
5272 "If you need an empty directory in your repository, there are a few ways to "
|
dongsheng@627
|
5273 "achieve this. One is to create a directory, then <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
5274 "add</command> a <quote>hidden</quote> file to that directory. On Unix-like "
|
dongsheng@627
|
5275 "systems, any file name that begins with a period (<quote><literal>.</"
|
dongsheng@627
|
5276 "literal></quote>) is treated as hidden by most commands and GUI tools. This "
|
dongsheng@627
|
5277 "approach is illustrated below."
|
dongsheng@627
|
5278 msgstr ""
|
dongsheng@627
|
5279
|
dongsheng@627
|
5280 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5281 #: ../en/ch04-daily.xml:102
|
dongsheng@627
|
5282 msgid ""
|
dongsheng@627
|
5283 "Another way to tackle a need for an empty directory is to simply create one "
|
dongsheng@627
|
5284 "in your automated build scripts before they will need it."
|
dongsheng@627
|
5285 msgstr ""
|
dongsheng@627
|
5286
|
dongsheng@627
|
5287 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
5288 #: ../en/ch04-daily.xml:109
|
dongsheng@627
|
5289 msgid "How to stop tracking a file"
|
dongsheng@627
|
5290 msgstr "如何停止跟踪文件"
|
dongsheng@627
|
5291
|
dongsheng@627
|
5292 #
|
dongsheng@627
|
5293 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5294 #: ../en/ch04-daily.xml:111
|
dongsheng@627
|
5295 msgid ""
|
dongsheng@627
|
5296 "Once you decide that a file no longer belongs in your repository, use the "
|
dongsheng@627
|
5297 "<command role=\"hg-cmd\">hg remove</command> command; this deletes the file, "
|
dongsheng@627
|
5298 "and tells Mercurial to stop tracking it. A removed file is represented in "
|
dongsheng@627
|
5299 "the output of <command role=\"hg-cmd\">hg status</command> with a "
|
dongsheng@627
|
5300 "<quote><literal>R</literal></quote>."
|
dongsheng@627
|
5301 msgstr ""
|
dongsheng@627
|
5302
|
dongsheng@627
|
5303 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5304 #: ../en/ch04-daily.xml:120
|
dongsheng@627
|
5305 msgid ""
|
dongsheng@627
|
5306 "After you <command role=\"hg-cmd\">hg remove</command> a file, Mercurial will "
|
dongsheng@627
|
5307 "no longer track changes to that file, even if you recreate a file with the "
|
dongsheng@627
|
5308 "same name in your working directory. If you do recreate a file with the same "
|
dongsheng@627
|
5309 "name and want Mercurial to track the new file, simply <command role=\"hg-cmd"
|
dongsheng@627
|
5310 "\">hg add</command> it. Mercurial will know that the newly added file is not "
|
dongsheng@627
|
5311 "related to the old file of the same name."
|
dongsheng@627
|
5312 msgstr ""
|
dongsheng@627
|
5313
|
dongsheng@627
|
5314 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5315 #: ../en/ch04-daily.xml:129
|
dongsheng@627
|
5316 msgid "Removing a file does not affect its history"
|
dongsheng@627
|
5317 msgstr "删除文件不影响历史"
|
dongsheng@627
|
5318
|
dongsheng@627
|
5319 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5320 #: ../en/ch04-daily.xml:131
|
dongsheng@627
|
5321 msgid "It is important to understand that removing a file has only two effects."
|
dongsheng@627
|
5322 msgstr ""
|
dongsheng@627
|
5323
|
dongsheng@627
|
5324 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
5325 #: ../en/ch04-daily.xml:134
|
dongsheng@627
|
5326 msgid "It removes the current version of the file from the working directory."
|
dongsheng@627
|
5327 msgstr ""
|
dongsheng@627
|
5328
|
dongsheng@627
|
5329 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
5330 #: ../en/ch04-daily.xml:137
|
dongsheng@627
|
5331 msgid ""
|
dongsheng@627
|
5332 "It stops Mercurial from tracking changes to the file, from the time of the "
|
dongsheng@627
|
5333 "next commit."
|
dongsheng@627
|
5334 msgstr ""
|
dongsheng@627
|
5335
|
dongsheng@627
|
5336 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5337 #: ../en/ch04-daily.xml:140
|
dongsheng@627
|
5338 msgid ""
|
dongsheng@627
|
5339 "Removing a file <emphasis>does not</emphasis> in any way alter the "
|
dongsheng@627
|
5340 "<emphasis>history</emphasis> of the file."
|
dongsheng@627
|
5341 msgstr ""
|
dongsheng@627
|
5342
|
dongsheng@627
|
5343 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5344 #: ../en/ch04-daily.xml:143
|
dongsheng@627
|
5345 msgid ""
|
dongsheng@627
|
5346 "If you update the working directory to a changeset in which a file that you "
|
dongsheng@627
|
5347 "have removed was still tracked, it will reappear in the working directory, "
|
dongsheng@627
|
5348 "with the contents it had when you committed that changeset. If you then "
|
dongsheng@627
|
5349 "update the working directory to a later changeset, in which the file had been "
|
dongsheng@627
|
5350 "removed, Mercurial will once again remove the file from the working directory."
|
dongsheng@627
|
5351 msgstr ""
|
dongsheng@627
|
5352
|
dongsheng@627
|
5353 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5354 #: ../en/ch04-daily.xml:153
|
dongsheng@627
|
5355 msgid "Missing files"
|
dongsheng@627
|
5356 msgstr "丢失的文件"
|
dongsheng@627
|
5357
|
dongsheng@627
|
5358 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5359 #: ../en/ch04-daily.xml:155
|
dongsheng@627
|
5360 msgid ""
|
dongsheng@627
|
5361 "Mercurial considers a file that you have deleted, but not used <command role="
|
dongsheng@627
|
5362 "\"hg-cmd\">hg remove</command> to delete, to be <emphasis>missing</"
|
dongsheng@627
|
5363 "emphasis>. A missing file is represented with <quote><literal>!</literal></"
|
dongsheng@627
|
5364 "quote> in the output of <command role=\"hg-cmd\">hg status</command>. "
|
dongsheng@627
|
5365 "Mercurial commands will not generally do anything with missing files."
|
dongsheng@627
|
5366 msgstr ""
|
dongsheng@627
|
5367
|
dongsheng@627
|
5368 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5369 #: ../en/ch04-daily.xml:165
|
dongsheng@627
|
5370 msgid ""
|
dongsheng@627
|
5371 "If your repository contains a file that <command role=\"hg-cmd\">hg status</"
|
dongsheng@627
|
5372 "command> reports as missing, and you want the file to stay gone, you can run "
|
dongsheng@627
|
5373 "<command role=\"hg-cmd\">hg remove <option role=\"hg-opt-remove\">--after</"
|
dongsheng@627
|
5374 "option></command> at any time later on, to tell Mercurial that you really did "
|
dongsheng@627
|
5375 "mean to remove the file."
|
dongsheng@627
|
5376 msgstr ""
|
dongsheng@627
|
5377
|
dongsheng@627
|
5378 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5379 #: ../en/ch04-daily.xml:175
|
dongsheng@627
|
5380 msgid ""
|
dongsheng@627
|
5381 "On the other hand, if you deleted the missing file by accident, give <command "
|
dongsheng@627
|
5382 "role=\"hg-cmd\">hg revert</command> the name of the file to recover. It will "
|
dongsheng@627
|
5383 "reappear, in unmodified form."
|
dongsheng@627
|
5384 msgstr ""
|
dongsheng@627
|
5385
|
dongsheng@627
|
5386 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5387 #: ../en/ch04-daily.xml:184
|
dongsheng@627
|
5388 msgid "Aside: why tell Mercurial explicitly to remove a file?"
|
dongsheng@627
|
5389 msgstr "旁白: 为什么要明确告诉 Mercurial 删除文件?"
|
dongsheng@627
|
5390
|
dongsheng@627
|
5391 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5392 #: ../en/ch04-daily.xml:187
|
dongsheng@627
|
5393 msgid ""
|
dongsheng@627
|
5394 "You might wonder why Mercurial requires you to explicitly tell it that you "
|
dongsheng@627
|
5395 "are deleting a file. Early during the development of Mercurial, it let you "
|
dongsheng@627
|
5396 "delete a file however you pleased; Mercurial would notice the absence of the "
|
dongsheng@627
|
5397 "file automatically when you next ran a <command role=\"hg-cmd\">hg commit</"
|
dongsheng@627
|
5398 "command>, and stop tracking the file. In practice, this made it too easy to "
|
dongsheng@627
|
5399 "accidentally remove a file without noticing."
|
dongsheng@627
|
5400 msgstr ""
|
dongsheng@627
|
5401
|
dongsheng@627
|
5402 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5403 #: ../en/ch04-daily.xml:198
|
dongsheng@627
|
5404 msgid "Useful shorthand&emdash;adding and removing files in one step"
|
dongsheng@627
|
5405 msgstr "有用的速记&emdash;一个步骤添加和删除文件"
|
dongsheng@627
|
5406
|
dongsheng@627
|
5407 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5408 #: ../en/ch04-daily.xml:201
|
dongsheng@627
|
5409 msgid ""
|
dongsheng@627
|
5410 "Mercurial offers a combination command, <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
5411 "addremove</command>, that adds untracked files and marks missing files as "
|
dongsheng@627
|
5412 "removed."
|
dongsheng@627
|
5413 msgstr ""
|
dongsheng@627
|
5414
|
dongsheng@627
|
5415 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5416 #: ../en/ch04-daily.xml:207
|
dongsheng@627
|
5417 msgid ""
|
dongsheng@627
|
5418 "The <command role=\"hg-cmd\">hg commit</command> command also provides a "
|
dongsheng@627
|
5419 "<option role=\"hg-opt-commit\">-A</option> option that performs this same add-"
|
dongsheng@627
|
5420 "and-remove, immediately followed by a commit."
|
dongsheng@627
|
5421 msgstr ""
|
dongsheng@627
|
5422
|
dongsheng@627
|
5423 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
5424 #: ../en/ch04-daily.xml:217
|
dongsheng@627
|
5425 msgid "Copying files"
|
dongsheng@627
|
5426 msgstr "复制文件"
|
dongsheng@627
|
5427
|
dongsheng@627
|
5428 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5429 #: ../en/ch04-daily.xml:219
|
dongsheng@627
|
5430 msgid ""
|
dongsheng@627
|
5431 "Mercurial provides a <command role=\"hg-cmd\">hg copy</command> command that "
|
dongsheng@627
|
5432 "lets you make a new copy of a file. When you copy a file using this command, "
|
dongsheng@627
|
5433 "Mercurial makes a record of the fact that the new file is a copy of the "
|
dongsheng@627
|
5434 "original file. It treats these copied files specially when you merge your "
|
dongsheng@627
|
5435 "work with someone else's."
|
dongsheng@627
|
5436 msgstr ""
|
dongsheng@627
|
5437
|
dongsheng@627
|
5438 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5439 #: ../en/ch04-daily.xml:227
|
dongsheng@627
|
5440 msgid "The results of copying during a merge"
|
dongsheng@627
|
5441 msgstr "合并期间的复制结果"
|
dongsheng@627
|
5442
|
dongsheng@627
|
5443 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5444 #: ../en/ch04-daily.xml:229
|
dongsheng@627
|
5445 msgid ""
|
dongsheng@627
|
5446 "What happens during a merge is that changes <quote>follow</quote> a copy. To "
|
dongsheng@627
|
5447 "best illustrate what this means, let's create an example. We'll start with "
|
dongsheng@627
|
5448 "the usual tiny repository that contains a single file."
|
dongsheng@627
|
5449 msgstr ""
|
dongsheng@627
|
5450
|
dongsheng@627
|
5451 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5452 #: ../en/ch04-daily.xml:236
|
dongsheng@627
|
5453 msgid ""
|
dongsheng@627
|
5454 "We need to do some work in parallel, so that we'll have something to merge. "
|
dongsheng@627
|
5455 "So let's clone our repository."
|
dongsheng@627
|
5456 msgstr ""
|
dongsheng@627
|
5457
|
dongsheng@627
|
5458 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5459 #: ../en/ch04-daily.xml:242
|
dongsheng@627
|
5460 msgid ""
|
dongsheng@627
|
5461 "Back in our initial repository, let's use the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
5462 "copy</command> command to make a copy of the first file we created."
|
dongsheng@627
|
5463 msgstr ""
|
dongsheng@627
|
5464
|
dongsheng@627
|
5465 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5466 #: ../en/ch04-daily.xml:248
|
dongsheng@627
|
5467 msgid ""
|
dongsheng@627
|
5468 "If we look at the output of the <command role=\"hg-cmd\">hg status</command> "
|
dongsheng@627
|
5469 "command afterwards, the copied file looks just like a normal added file."
|
dongsheng@627
|
5470 msgstr ""
|
dongsheng@627
|
5471
|
dongsheng@627
|
5472 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5473 #: ../en/ch04-daily.xml:254
|
dongsheng@627
|
5474 msgid ""
|
dongsheng@627
|
5475 "But if we pass the <option role=\"hg-opt-status\">-C</option> option to "
|
dongsheng@627
|
5476 "<command role=\"hg-cmd\">hg status</command>, it prints another line of "
|
dongsheng@627
|
5477 "output: this is the file that our newly-added file was copied <emphasis>from</"
|
dongsheng@627
|
5478 "emphasis>."
|
dongsheng@627
|
5479 msgstr ""
|
dongsheng@627
|
5480
|
dongsheng@627
|
5481 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5482 #: ../en/ch04-daily.xml:262
|
dongsheng@627
|
5483 msgid ""
|
dongsheng@627
|
5484 "Now, back in the repository we cloned, let's make a change in parallel. "
|
dongsheng@627
|
5485 "We'll add a line of content to the original file that we created."
|
dongsheng@627
|
5486 msgstr ""
|
dongsheng@627
|
5487
|
dongsheng@627
|
5488 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5489 #: ../en/ch04-daily.xml:268
|
dongsheng@627
|
5490 msgid ""
|
dongsheng@627
|
5491 "Now we have a modified <filename>file</filename> in this repository. When we "
|
dongsheng@627
|
5492 "pull the changes from the first repository, and merge the two heads, "
|
dongsheng@627
|
5493 "Mercurial will propagate the changes that we made locally to <filename>file</"
|
dongsheng@627
|
5494 "filename> into its copy, <filename>new-file</filename>."
|
dongsheng@627
|
5495 msgstr ""
|
dongsheng@627
|
5496
|
dongsheng@627
|
5497 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5498 #: ../en/ch04-daily.xml:278
|
dongsheng@627
|
5499 msgid "Why should changes follow copies?"
|
dongsheng@627
|
5500 msgstr "为什么复制后需要后续修改?"
|
dongsheng@627
|
5501
|
dongsheng@627
|
5502 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5503 #: ../en/ch04-daily.xml:280
|
dongsheng@627
|
5504 msgid ""
|
dongsheng@627
|
5505 "This behaviour, of changes to a file propagating out to copies of the file, "
|
dongsheng@627
|
5506 "might seem esoteric, but in most cases it's highly desirable."
|
dongsheng@627
|
5507 msgstr ""
|
dongsheng@627
|
5508
|
dongsheng@627
|
5509 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5510 #: ../en/ch04-daily.xml:284
|
dongsheng@627
|
5511 msgid ""
|
dongsheng@627
|
5512 "First of all, remember that this propagation <emphasis>only</emphasis> "
|
dongsheng@627
|
5513 "happens when you merge. So if you <command role=\"hg-cmd\">hg copy</command> "
|
dongsheng@627
|
5514 "a file, and subsequently modify the original file during the normal course of "
|
dongsheng@627
|
5515 "your work, nothing will happen."
|
dongsheng@627
|
5516 msgstr ""
|
dongsheng@627
|
5517
|
dongsheng@627
|
5518 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5519 #: ../en/ch04-daily.xml:290
|
dongsheng@627
|
5520 msgid ""
|
dongsheng@627
|
5521 "The second thing to know is that modifications will only propagate across a "
|
dongsheng@627
|
5522 "copy as long as the repository that you're pulling changes from "
|
dongsheng@627
|
5523 "<emphasis>doesn't know</emphasis> about the copy."
|
dongsheng@627
|
5524 msgstr ""
|
dongsheng@627
|
5525
|
dongsheng@627
|
5526 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5527 #: ../en/ch04-daily.xml:295
|
dongsheng@627
|
5528 msgid ""
|
dongsheng@627
|
5529 "The reason that Mercurial does this is as follows. Let's say I make an "
|
dongsheng@627
|
5530 "important bug fix in a source file, and commit my changes. Meanwhile, you've "
|
dongsheng@627
|
5531 "decided to <command role=\"hg-cmd\">hg copy</command> the file in your "
|
dongsheng@627
|
5532 "repository, without knowing about the bug or having seen the fix, and you "
|
dongsheng@627
|
5533 "have started hacking on your copy of the file."
|
dongsheng@627
|
5534 msgstr ""
|
dongsheng@627
|
5535
|
dongsheng@627
|
5536 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5537 #: ../en/ch04-daily.xml:302
|
dongsheng@627
|
5538 msgid ""
|
dongsheng@627
|
5539 "If you pulled and merged my changes, and Mercurial <emphasis>didn't</"
|
dongsheng@627
|
5540 "emphasis> propagate changes across copies, your source file would now contain "
|
dongsheng@627
|
5541 "the bug, and unless you remembered to propagate the bug fix by hand, the bug "
|
dongsheng@627
|
5542 "would <emphasis>remain</emphasis> in your copy of the file."
|
dongsheng@627
|
5543 msgstr ""
|
dongsheng@627
|
5544
|
dongsheng@627
|
5545 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5546 #: ../en/ch04-daily.xml:308
|
dongsheng@627
|
5547 msgid ""
|
dongsheng@627
|
5548 "By automatically propagating the change that fixed the bug from the original "
|
dongsheng@627
|
5549 "file to the copy, Mercurial prevents this class of problem. To my knowledge, "
|
dongsheng@627
|
5550 "Mercurial is the <emphasis>only</emphasis> revision control system that "
|
dongsheng@627
|
5551 "propagates changes across copies like this."
|
dongsheng@627
|
5552 msgstr ""
|
dongsheng@627
|
5553
|
dongsheng@627
|
5554 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5555 #: ../en/ch04-daily.xml:314
|
dongsheng@627
|
5556 msgid ""
|
dongsheng@627
|
5557 "Once your change history has a record that the copy and subsequent merge "
|
dongsheng@627
|
5558 "occurred, there's usually no further need to propagate changes from the "
|
dongsheng@627
|
5559 "original file to the copied file, and that's why Mercurial only propagates "
|
dongsheng@627
|
5560 "changes across copies until this point, and no further."
|
dongsheng@627
|
5561 msgstr ""
|
dongsheng@627
|
5562
|
dongsheng@627
|
5563 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5564 #: ../en/ch04-daily.xml:322
|
dongsheng@627
|
5565 msgid "How to make changes <emphasis>not</emphasis> follow a copy"
|
dongsheng@627
|
5566 msgstr "如何让复制后<emphasis>不</emphasis>修改?"
|
dongsheng@627
|
5567
|
dongsheng@627
|
5568 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5569 #: ../en/ch04-daily.xml:325
|
dongsheng@627
|
5570 msgid ""
|
dongsheng@627
|
5571 "If, for some reason, you decide that this business of automatically "
|
dongsheng@627
|
5572 "propagating changes across copies is not for you, simply use your system's "
|
dongsheng@627
|
5573 "normal file copy command (on Unix-like systems, that's <command>cp</command>) "
|
dongsheng@627
|
5574 "to make a copy of a file, then <command role=\"hg-cmd\">hg add</command> the "
|
dongsheng@627
|
5575 "new copy by hand. Before you do so, though, please do reread section <xref "
|
dongsheng@627
|
5576 "linkend=\"sec.daily.why-copy\"/>, and make an informed decision that this "
|
dongsheng@627
|
5577 "behaviour is not appropriate to your specific case."
|
dongsheng@627
|
5578 msgstr ""
|
dongsheng@627
|
5579
|
dongsheng@627
|
5580 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5581 #: ../en/ch04-daily.xml:338
|
dongsheng@627
|
5582 msgid "Behaviour of the <command role=\"hg-cmd\">hg copy</command> command"
|
dongsheng@627
|
5583 msgstr "命令 <command role=\"hg-cmd\">hg copy</command> 的特性"
|
dongsheng@627
|
5584
|
dongsheng@627
|
5585 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5586 #: ../en/ch04-daily.xml:341
|
dongsheng@627
|
5587 msgid ""
|
dongsheng@627
|
5588 "When you use the <command role=\"hg-cmd\">hg copy</command> command, "
|
dongsheng@627
|
5589 "Mercurial makes a copy of each source file as it currently stands in the "
|
dongsheng@627
|
5590 "working directory. This means that if you make some modifications to a file, "
|
dongsheng@627
|
5591 "then <command role=\"hg-cmd\">hg copy</command> it without first having "
|
dongsheng@627
|
5592 "committed those changes, the new copy will also contain the modifications you "
|
dongsheng@627
|
5593 "have made up until that point. (I find this behaviour a little "
|
dongsheng@627
|
5594 "counterintuitive, which is why I mention it here.)"
|
dongsheng@627
|
5595 msgstr ""
|
dongsheng@627
|
5596
|
dongsheng@627
|
5597 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5598 #: ../en/ch04-daily.xml:351
|
dongsheng@627
|
5599 msgid ""
|
dongsheng@627
|
5600 "The <command role=\"hg-cmd\">hg copy</command> command acts similarly to the "
|
dongsheng@627
|
5601 "Unix <command>cp</command> command (you can use the <command role=\"hg-cmd"
|
dongsheng@627
|
5602 "\">hg cp</command> alias if you prefer). The last argument is the "
|
dongsheng@627
|
5603 "<emphasis>destination</emphasis>, and all prior arguments are "
|
dongsheng@627
|
5604 "<emphasis>sources</emphasis>. If you pass it a single file as the source, "
|
dongsheng@627
|
5605 "and the destination does not exist, it creates a new file with that name."
|
dongsheng@627
|
5606 msgstr ""
|
dongsheng@627
|
5607
|
dongsheng@627
|
5608 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5609 #: ../en/ch04-daily.xml:362
|
dongsheng@627
|
5610 msgid ""
|
dongsheng@627
|
5611 "If the destination is a directory, Mercurial copies its sources into that "
|
dongsheng@627
|
5612 "directory."
|
dongsheng@627
|
5613 msgstr ""
|
dongsheng@627
|
5614
|
dongsheng@627
|
5615 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5616 #: ../en/ch04-daily.xml:367
|
dongsheng@627
|
5617 msgid ""
|
dongsheng@627
|
5618 "Copying a directory is recursive, and preserves the directory structure of "
|
dongsheng@627
|
5619 "the source."
|
dongsheng@627
|
5620 msgstr ""
|
dongsheng@627
|
5621
|
dongsheng@627
|
5622 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5623 #: ../en/ch04-daily.xml:373
|
dongsheng@627
|
5624 msgid ""
|
dongsheng@627
|
5625 "If the source and destination are both directories, the source tree is "
|
dongsheng@627
|
5626 "recreated in the destination directory."
|
dongsheng@627
|
5627 msgstr ""
|
dongsheng@627
|
5628
|
dongsheng@627
|
5629 #
|
dongsheng@627
|
5630 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5631 #: ../en/ch04-daily.xml:378
|
dongsheng@627
|
5632 msgid ""
|
dongsheng@627
|
5633 "As with the <command role=\"hg-cmd\">hg rename</command> command, if you copy "
|
dongsheng@627
|
5634 "a file manually and then want Mercurial to know that you've copied the file, "
|
dongsheng@627
|
5635 "simply use the <option role=\"hg-opt-copy\">--after</option> option to "
|
dongsheng@627
|
5636 "<command role=\"hg-cmd\">hg copy</command>."
|
dongsheng@627
|
5637 msgstr ""
|
dongsheng@627
|
5638
|
dongsheng@627
|
5639 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
5640 #: ../en/ch04-daily.xml:389
|
dongsheng@627
|
5641 msgid "Renaming files"
|
dongsheng@627
|
5642 msgstr "改名文件"
|
dongsheng@627
|
5643
|
dongsheng@627
|
5644 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5645 #: ../en/ch04-daily.xml:391
|
dongsheng@627
|
5646 msgid ""
|
dongsheng@627
|
5647 "It's rather more common to need to rename a file than to make a copy of it. "
|
dongsheng@627
|
5648 "The reason I discussed the <command role=\"hg-cmd\">hg copy</command> command "
|
dongsheng@627
|
5649 "before talking about renaming files is that Mercurial treats a rename in "
|
dongsheng@627
|
5650 "essentially the same way as a copy. Therefore, knowing what Mercurial does "
|
dongsheng@627
|
5651 "when you copy a file tells you what to expect when you rename a file."
|
dongsheng@627
|
5652 msgstr ""
|
dongsheng@627
|
5653
|
dongsheng@627
|
5654 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5655 #: ../en/ch04-daily.xml:399
|
dongsheng@627
|
5656 msgid ""
|
dongsheng@627
|
5657 "When you use the <command role=\"hg-cmd\">hg rename</command> command, "
|
dongsheng@627
|
5658 "Mercurial makes a copy of each source file, then deletes it and marks the "
|
dongsheng@627
|
5659 "file as removed."
|
dongsheng@627
|
5660 msgstr ""
|
dongsheng@627
|
5661
|
dongsheng@627
|
5662 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5663 #: ../en/ch04-daily.xml:405
|
dongsheng@627
|
5664 msgid ""
|
dongsheng@627
|
5665 "The <command role=\"hg-cmd\">hg status</command> command shows the newly "
|
dongsheng@627
|
5666 "copied file as added, and the copied-from file as removed."
|
dongsheng@627
|
5667 msgstr ""
|
dongsheng@627
|
5668
|
dongsheng@627
|
5669 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5670 #: ../en/ch04-daily.xml:411
|
dongsheng@627
|
5671 msgid ""
|
dongsheng@627
|
5672 "As with the results of a <command role=\"hg-cmd\">hg copy</command>, we must "
|
dongsheng@627
|
5673 "use the <option role=\"hg-opt-status\">-C</option> option to <command role="
|
dongsheng@627
|
5674 "\"hg-cmd\">hg status</command> to see that the added file is really being "
|
dongsheng@627
|
5675 "tracked by Mercurial as a copy of the original, now removed, file."
|
dongsheng@627
|
5676 msgstr ""
|
dongsheng@627
|
5677
|
dongsheng@627
|
5678 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5679 #: ../en/ch04-daily.xml:420
|
dongsheng@627
|
5680 msgid ""
|
dongsheng@627
|
5681 "As with <command role=\"hg-cmd\">hg remove</command> and <command role=\"hg-"
|
dongsheng@627
|
5682 "cmd\">hg copy</command>, you can tell Mercurial about a rename after the fact "
|
dongsheng@627
|
5683 "using the <option role=\"hg-opt-rename\">--after</option> option. In most "
|
dongsheng@627
|
5684 "other respects, the behaviour of the <command role=\"hg-cmd\">hg rename</"
|
dongsheng@627
|
5685 "command> command, and the options it accepts, are similar to the <command "
|
dongsheng@627
|
5686 "role=\"hg-cmd\">hg copy</command> command."
|
dongsheng@627
|
5687 msgstr ""
|
dongsheng@627
|
5688
|
dongsheng@627
|
5689 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5690 #: ../en/ch04-daily.xml:430
|
dongsheng@627
|
5691 msgid "Renaming files and merging changes"
|
dongsheng@627
|
5692 msgstr "改名文件与合并修改"
|
dongsheng@627
|
5693
|
dongsheng@627
|
5694 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5695 #: ../en/ch04-daily.xml:432
|
dongsheng@627
|
5696 msgid ""
|
dongsheng@627
|
5697 "Since Mercurial's rename is implemented as copy-and-remove, the same "
|
dongsheng@627
|
5698 "propagation of changes happens when you merge after a rename as after a copy."
|
dongsheng@627
|
5699 msgstr ""
|
dongsheng@627
|
5700
|
dongsheng@627
|
5701 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5702 #: ../en/ch04-daily.xml:436
|
dongsheng@627
|
5703 msgid ""
|
dongsheng@627
|
5704 "If I modify a file, and you rename it to a new name, and then we merge our "
|
dongsheng@627
|
5705 "respective changes, my modifications to the file under its original name will "
|
dongsheng@627
|
5706 "be propagated into the file under its new name. (This is something you might "
|
dongsheng@627
|
5707 "expect to <quote>simply work,</quote> but not all revision control systems "
|
dongsheng@627
|
5708 "actually do this.)"
|
dongsheng@627
|
5709 msgstr ""
|
dongsheng@627
|
5710
|
dongsheng@627
|
5711 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5712 #: ../en/ch04-daily.xml:443
|
dongsheng@627
|
5713 msgid ""
|
dongsheng@627
|
5714 "Whereas having changes follow a copy is a feature where you can perhaps nod "
|
dongsheng@627
|
5715 "and say <quote>yes, that might be useful,</quote> it should be clear that "
|
dongsheng@627
|
5716 "having them follow a rename is definitely important. Without this facility, "
|
dongsheng@627
|
5717 "it would simply be too easy for changes to become orphaned when files are "
|
dongsheng@627
|
5718 "renamed."
|
dongsheng@627
|
5719 msgstr ""
|
dongsheng@627
|
5720
|
dongsheng@627
|
5721 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5722 #: ../en/ch04-daily.xml:452
|
dongsheng@627
|
5723 msgid "Divergent renames and merging"
|
dongsheng@627
|
5724 msgstr "改名与合并的分歧"
|
dongsheng@627
|
5725
|
dongsheng@627
|
5726 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5727 #: ../en/ch04-daily.xml:454
|
dongsheng@627
|
5728 msgid ""
|
dongsheng@627
|
5729 "The case of diverging names occurs when two developers start with a "
|
dongsheng@627
|
5730 "file&emdash;let's call it <filename>foo</filename>&emdash;in their respective "
|
dongsheng@627
|
5731 "repositories."
|
dongsheng@627
|
5732 msgstr ""
|
dongsheng@627
|
5733
|
dongsheng@627
|
5734 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5735 #: ../en/ch04-daily.xml:461
|
dongsheng@627
|
5736 msgid "Anne renames the file to <filename>bar</filename>."
|
dongsheng@627
|
5737 msgstr ""
|
dongsheng@627
|
5738
|
dongsheng@627
|
5739 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5740 #: ../en/ch04-daily.xml:465
|
dongsheng@627
|
5741 msgid "Meanwhile, Bob renames it to <filename>quux</filename>."
|
dongsheng@627
|
5742 msgstr ""
|
dongsheng@627
|
5743
|
dongsheng@627
|
5744 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5745 #: ../en/ch04-daily.xml:470
|
dongsheng@627
|
5746 msgid ""
|
dongsheng@627
|
5747 "I like to think of this as a conflict because each developer has expressed "
|
dongsheng@627
|
5748 "different intentions about what the file ought to be named."
|
dongsheng@627
|
5749 msgstr ""
|
dongsheng@627
|
5750
|
dongsheng@627
|
5751 #
|
dongsheng@627
|
5752 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5753 #: ../en/ch04-daily.xml:474
|
dongsheng@627
|
5754 msgid ""
|
dongsheng@627
|
5755 "What do you think should happen when they merge their work? Mercurial's "
|
dongsheng@627
|
5756 "actual behaviour is that it always preserves <emphasis>both</emphasis> names "
|
dongsheng@627
|
5757 "when it merges changesets that contain divergent renames."
|
dongsheng@627
|
5758 msgstr ""
|
dongsheng@627
|
5759
|
dongsheng@627
|
5760 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5761 #: ../en/ch04-daily.xml:481
|
dongsheng@627
|
5762 msgid ""
|
dongsheng@627
|
5763 "Notice that Mercurial does warn about the divergent renames, but it leaves it "
|
dongsheng@627
|
5764 "up to you to do something about the divergence after the merge."
|
dongsheng@627
|
5765 msgstr ""
|
dongsheng@627
|
5766
|
dongsheng@627
|
5767 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5768 #: ../en/ch04-daily.xml:487
|
dongsheng@627
|
5769 msgid "Convergent renames and merging"
|
dongsheng@627
|
5770 msgstr "收敛改名与合并"
|
dongsheng@627
|
5771
|
dongsheng@627
|
5772 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5773 #: ../en/ch04-daily.xml:489
|
dongsheng@627
|
5774 msgid ""
|
dongsheng@627
|
5775 "Another kind of rename conflict occurs when two people choose to rename "
|
dongsheng@627
|
5776 "different <emphasis>source</emphasis> files to the same "
|
dongsheng@627
|
5777 "<emphasis>destination</emphasis>. In this case, Mercurial runs its normal "
|
dongsheng@627
|
5778 "merge machinery, and lets you guide it to a suitable resolution."
|
dongsheng@627
|
5779 msgstr ""
|
dongsheng@627
|
5780
|
dongsheng@627
|
5781 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5782 #: ../en/ch04-daily.xml:497
|
dongsheng@627
|
5783 msgid "Other name-related corner cases"
|
dongsheng@627
|
5784 msgstr "其它名称相关的角落"
|
dongsheng@627
|
5785
|
dongsheng@627
|
5786 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5787 #: ../en/ch04-daily.xml:499
|
dongsheng@627
|
5788 msgid ""
|
dongsheng@627
|
5789 "Mercurial has a longstanding bug in which it fails to handle a merge where "
|
dongsheng@627
|
5790 "one side has a file with a given name, while another has a directory with the "
|
dongsheng@627
|
5791 "same name. This is documented as <ulink role=\"hg-bug\" url=\"http://www."
|
dongsheng@627
|
5792 "selenic.com/mercurial/bts/issue29\">issue 29</ulink>."
|
dongsheng@627
|
5793 msgstr ""
|
dongsheng@627
|
5794
|
dongsheng@627
|
5795 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
5796 #: ../en/ch04-daily.xml:511
|
dongsheng@627
|
5797 msgid "Recovering from mistakes"
|
dongsheng@627
|
5798 msgstr "从错误恢复"
|
dongsheng@627
|
5799
|
dongsheng@627
|
5800 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5801 #: ../en/ch04-daily.xml:513
|
dongsheng@627
|
5802 msgid ""
|
dongsheng@627
|
5803 "Mercurial has some useful commands that will help you to recover from some "
|
dongsheng@627
|
5804 "common mistakes."
|
dongsheng@627
|
5805 msgstr ""
|
dongsheng@627
|
5806
|
dongsheng@627
|
5807 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5808 #: ../en/ch04-daily.xml:516
|
dongsheng@627
|
5809 msgid ""
|
dongsheng@627
|
5810 "The <command role=\"hg-cmd\">hg revert</command> command lets you undo "
|
dongsheng@627
|
5811 "changes that you have made to your working directory. For example, if you "
|
dongsheng@627
|
5812 "<command role=\"hg-cmd\">hg add</command> a file by accident, just run "
|
dongsheng@627
|
5813 "<command role=\"hg-cmd\">hg revert</command> with the name of the file you "
|
dongsheng@627
|
5814 "added, and while the file won't be touched in any way, it won't be tracked "
|
dongsheng@627
|
5815 "for adding by Mercurial any longer, either. You can also use <command role="
|
dongsheng@627
|
5816 "\"hg-cmd\">hg revert</command> to get rid of erroneous changes to a file."
|
dongsheng@627
|
5817 msgstr ""
|
dongsheng@627
|
5818
|
dongsheng@627
|
5819 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5820 #: ../en/ch04-daily.xml:526
|
dongsheng@627
|
5821 msgid ""
|
dongsheng@627
|
5822 "It's useful to remember that the <command role=\"hg-cmd\">hg revert</command> "
|
dongsheng@627
|
5823 "command is useful for changes that you have not yet committed. Once you've "
|
dongsheng@627
|
5824 "committed a change, if you decide it was a mistake, you can still do "
|
dongsheng@627
|
5825 "something about it, though your options may be more limited."
|
dongsheng@627
|
5826 msgstr ""
|
dongsheng@627
|
5827
|
dongsheng@627
|
5828 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5829 #: ../en/ch04-daily.xml:532
|
dongsheng@627
|
5830 msgid ""
|
dongsheng@627
|
5831 "For more information about the <command role=\"hg-cmd\">hg revert</command> "
|
dongsheng@627
|
5832 "command, and details about how to deal with changes you have already "
|
dongsheng@627
|
5833 "committed, see chapter <xref linkend=\"chap.undo\"/>."
|
dongsheng@627
|
5834 msgstr ""
|
dongsheng@627
|
5835
|
dongsheng@627
|
5836 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
5837 #: ../en/ch05-collab.xml:5
|
dongsheng@627
|
5838 msgid "Collaborating with other people"
|
dongsheng@627
|
5839 msgstr "团体协作"
|
dongsheng@627
|
5840
|
dongsheng@627
|
5841 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
5842 #: ../en/ch05-collab.xml:7
|
dongsheng@627
|
5843 msgid ""
|
dongsheng@627
|
5844 "As a completely decentralised tool, Mercurial doesn't impose any policy on "
|
dongsheng@627
|
5845 "how people ought to work with each other. However, if you're new to "
|
dongsheng@627
|
5846 "distributed revision control, it helps to have some tools and examples in "
|
dongsheng@627
|
5847 "mind when you're thinking about possible workflow models."
|
dongsheng@627
|
5848 msgstr ""
|
dongsheng@627
|
5849
|
dongsheng@627
|
5850 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
5851 #: ../en/ch05-collab.xml:14
|
dongsheng@627
|
5852 msgid "Mercurial's web interface"
|
dongsheng@630
|
5853 msgstr "Mercurial 的 web 接口"
|
dongsheng@627
|
5854
|
dongsheng@627
|
5855 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5856 #: ../en/ch05-collab.xml:16
|
dongsheng@627
|
5857 msgid ""
|
dongsheng@627
|
5858 "Mercurial has a powerful web interface that provides several useful "
|
dongsheng@627
|
5859 "capabilities."
|
dongsheng@627
|
5860 msgstr ""
|
dongsheng@627
|
5861
|
dongsheng@627
|
5862 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5863 #: ../en/ch05-collab.xml:19
|
dongsheng@627
|
5864 msgid ""
|
dongsheng@627
|
5865 "For interactive use, the web interface lets you browse a single repository or "
|
dongsheng@627
|
5866 "a collection of repositories. You can view the history of a repository, "
|
dongsheng@627
|
5867 "examine each change (comments and diffs), and view the contents of each "
|
dongsheng@627
|
5868 "directory and file."
|
dongsheng@627
|
5869 msgstr ""
|
dongsheng@627
|
5870
|
dongsheng@627
|
5871 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5872 #: ../en/ch05-collab.xml:24
|
dongsheng@627
|
5873 msgid ""
|
dongsheng@627
|
5874 "Also for human consumption, the web interface provides an RSS feed of the "
|
dongsheng@627
|
5875 "changes in a repository. This lets you <quote>subscribe</quote> to a "
|
dongsheng@627
|
5876 "repository using your favourite feed reader, and be automatically notified of "
|
dongsheng@627
|
5877 "activity in that repository as soon as it happens. I find this capability "
|
dongsheng@627
|
5878 "much more convenient than the model of subscribing to a mailing list to which "
|
dongsheng@627
|
5879 "notifications are sent, as it requires no additional configuration on the "
|
dongsheng@627
|
5880 "part of whoever is serving the repository."
|
dongsheng@627
|
5881 msgstr ""
|
dongsheng@627
|
5882
|
dongsheng@627
|
5883 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5884 #: ../en/ch05-collab.xml:34
|
dongsheng@627
|
5885 msgid ""
|
dongsheng@627
|
5886 "The web interface also lets remote users clone a repository, pull changes "
|
dongsheng@627
|
5887 "from it, and (when the server is configured to permit it) push changes back "
|
dongsheng@627
|
5888 "to it. Mercurial's HTTP tunneling protocol aggressively compresses data, so "
|
dongsheng@627
|
5889 "that it works efficiently even over low-bandwidth network connections."
|
dongsheng@627
|
5890 msgstr ""
|
dongsheng@627
|
5891
|
dongsheng@627
|
5892 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5893 #: ../en/ch05-collab.xml:40
|
dongsheng@627
|
5894 msgid ""
|
dongsheng@627
|
5895 "The easiest way to get started with the web interface is to use your web "
|
dongsheng@627
|
5896 "browser to visit an existing repository, such as the master Mercurial "
|
dongsheng@627
|
5897 "repository at <ulink url=\"http://www.selenic.com/repo/hg?style=gitweb"
|
dongsheng@627
|
5898 "\">http://www.selenic.com/repo/hg?style=gitweb</ulink>."
|
dongsheng@627
|
5899 msgstr ""
|
dongsheng@627
|
5900
|
dongsheng@627
|
5901 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5902 #: ../en/ch05-collab.xml:45
|
dongsheng@627
|
5903 msgid ""
|
dongsheng@627
|
5904 "If you're interested in providing a web interface to your own repositories, "
|
dongsheng@627
|
5905 "Mercurial provides two ways to do this. The first is using the <command role="
|
dongsheng@627
|
5906 "\"hg-cmd\">hg serve</command> command, which is best suited to short-term "
|
dongsheng@627
|
5907 "<quote>lightweight</quote> serving. See section <xref linkend=\"sec.collab."
|
dongsheng@627
|
5908 "serve\"/> below for details of how to use this command. If you have a long-"
|
dongsheng@627
|
5909 "lived repository that you'd like to make permanently available, Mercurial has "
|
dongsheng@627
|
5910 "built-in support for the CGI (Common Gateway Interface) standard, which all "
|
dongsheng@627
|
5911 "common web servers support. See section <xref linkend=\"sec.collab.cgi\"/> "
|
dongsheng@627
|
5912 "for details of CGI configuration."
|
dongsheng@627
|
5913 msgstr ""
|
dongsheng@627
|
5914
|
dongsheng@627
|
5915 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
5916 #: ../en/ch05-collab.xml:60
|
dongsheng@627
|
5917 msgid "Collaboration models"
|
dongsheng@630
|
5918 msgstr "协作模型"
|
dongsheng@627
|
5919
|
dongsheng@627
|
5920 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
5921 #: ../en/ch05-collab.xml:62
|
dongsheng@627
|
5922 msgid ""
|
dongsheng@627
|
5923 "With a suitably flexible tool, making decisions about workflow is much more "
|
dongsheng@627
|
5924 "of a social engineering challenge than a technical one. Mercurial imposes few "
|
dongsheng@627
|
5925 "limitations on how you can structure the flow of work in a project, so it's "
|
dongsheng@627
|
5926 "up to you and your group to set up and live with a model that matches your "
|
dongsheng@627
|
5927 "own particular needs."
|
dongsheng@627
|
5928 msgstr ""
|
dongsheng@627
|
5929
|
dongsheng@627
|
5930 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5931 #: ../en/ch05-collab.xml:70
|
dongsheng@627
|
5932 msgid "Factors to keep in mind"
|
dongsheng@630
|
5933 msgstr "要牢记的因素"
|
dongsheng@627
|
5934
|
dongsheng@627
|
5935 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5936 #: ../en/ch05-collab.xml:72
|
dongsheng@627
|
5937 msgid ""
|
dongsheng@627
|
5938 "The most important aspect of any model that you must keep in mind is how well "
|
dongsheng@627
|
5939 "it matches the needs and capabilities of the people who will be using it. "
|
dongsheng@627
|
5940 "This might seem self-evident; even so, you still can't afford to forget it "
|
dongsheng@627
|
5941 "for a moment."
|
dongsheng@627
|
5942 msgstr ""
|
dongsheng@627
|
5943
|
dongsheng@627
|
5944 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5945 #: ../en/ch05-collab.xml:78
|
dongsheng@627
|
5946 msgid ""
|
dongsheng@627
|
5947 "I once put together a workflow model that seemed to make perfect sense to me, "
|
dongsheng@627
|
5948 "but that caused a considerable amount of consternation and strife within my "
|
dongsheng@627
|
5949 "development team. In spite of my attempts to explain why we needed a complex "
|
dongsheng@627
|
5950 "set of branches, and how changes ought to flow between them, a few team "
|
dongsheng@627
|
5951 "members revolted. Even though they were smart people, they didn't want to "
|
dongsheng@627
|
5952 "pay attention to the constraints we were operating under, or face the "
|
dongsheng@627
|
5953 "consequences of those constraints in the details of the model that I was "
|
dongsheng@627
|
5954 "advocating."
|
dongsheng@627
|
5955 msgstr ""
|
dongsheng@627
|
5956
|
dongsheng@627
|
5957 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5958 #: ../en/ch05-collab.xml:88
|
dongsheng@627
|
5959 msgid ""
|
dongsheng@627
|
5960 "Don't sweep foreseeable social or technical problems under the rug. Whatever "
|
dongsheng@627
|
5961 "scheme you put into effect, you should plan for mistakes and problem "
|
dongsheng@627
|
5962 "scenarios. Consider adding automated machinery to prevent, or quickly "
|
dongsheng@627
|
5963 "recover from, trouble that you can anticipate. As an example, if you intend "
|
dongsheng@627
|
5964 "to have a branch with not-for-release changes in it, you'd do well to think "
|
dongsheng@627
|
5965 "early about the possibility that someone might accidentally merge those "
|
dongsheng@627
|
5966 "changes into a release branch. You could avoid this particular problem by "
|
dongsheng@627
|
5967 "writing a hook that prevents changes from being merged from an inappropriate "
|
dongsheng@627
|
5968 "branch."
|
dongsheng@627
|
5969 msgstr ""
|
dongsheng@627
|
5970
|
dongsheng@627
|
5971 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
5972 #: ../en/ch05-collab.xml:102
|
dongsheng@627
|
5973 msgid "Informal anarchy"
|
dongsheng@630
|
5974 msgstr "无政府状态"
|
dongsheng@627
|
5975
|
dongsheng@627
|
5976 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5977 #: ../en/ch05-collab.xml:104
|
dongsheng@627
|
5978 msgid ""
|
dongsheng@627
|
5979 "I wouldn't suggest an <quote>anything goes</quote> approach as something "
|
dongsheng@627
|
5980 "sustainable, but it's a model that's easy to grasp, and it works perfectly "
|
dongsheng@627
|
5981 "well in a few unusual situations."
|
dongsheng@627
|
5982 msgstr ""
|
dongsheng@627
|
5983
|
dongsheng@627
|
5984 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5985 #: ../en/ch05-collab.xml:109
|
dongsheng@627
|
5986 msgid ""
|
dongsheng@627
|
5987 "As one example, many projects have a loose-knit group of collaborators who "
|
dongsheng@627
|
5988 "rarely physically meet each other. Some groups like to overcome the "
|
dongsheng@627
|
5989 "isolation of working at a distance by organising occasional <quote>sprints</"
|
dongsheng@627
|
5990 "quote>. In a sprint, a number of people get together in a single location (a "
|
dongsheng@627
|
5991 "company's conference room, a hotel meeting room, that kind of place) and "
|
dongsheng@627
|
5992 "spend several days more or less locked in there, hacking intensely on a "
|
dongsheng@627
|
5993 "handful of projects."
|
dongsheng@627
|
5994 msgstr ""
|
dongsheng@627
|
5995
|
dongsheng@627
|
5996 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
5997 #: ../en/ch05-collab.xml:118
|
dongsheng@627
|
5998 msgid ""
|
dongsheng@627
|
5999 "A sprint is the perfect place to use the <command role=\"hg-cmd\">hg serve</"
|
dongsheng@627
|
6000 "command> command, since <command role=\"hg-cmd\">hg serve</command> does not "
|
dongsheng@627
|
6001 "require any fancy server infrastructure. You can get started with <command "
|
dongsheng@627
|
6002 "role=\"hg-cmd\">hg serve</command> in moments, by reading section <xref "
|
dongsheng@627
|
6003 "linkend=\"sec.collab.serve\"/> below. Then simply tell the person next to "
|
dongsheng@627
|
6004 "you that you're running a server, send the URL to them in an instant message, "
|
dongsheng@627
|
6005 "and you immediately have a quick-turnaround way to work together. They can "
|
dongsheng@627
|
6006 "type your URL into their web browser and quickly review your changes; or they "
|
dongsheng@627
|
6007 "can pull a bugfix from you and verify it; or they can clone a branch "
|
dongsheng@627
|
6008 "containing a new feature and try it out."
|
dongsheng@627
|
6009 msgstr ""
|
dongsheng@627
|
6010
|
dongsheng@627
|
6011 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6012 #: ../en/ch05-collab.xml:132
|
dongsheng@627
|
6013 msgid ""
|
dongsheng@627
|
6014 "The charm, and the problem, with doing things in an ad hoc fashion like this "
|
dongsheng@627
|
6015 "is that only people who know about your changes, and where they are, can see "
|
dongsheng@627
|
6016 "them. Such an informal approach simply doesn't scale beyond a handful "
|
dongsheng@627
|
6017 "people, because each individual needs to know about $n$ different "
|
dongsheng@627
|
6018 "repositories to pull from."
|
dongsheng@627
|
6019 msgstr ""
|
dongsheng@627
|
6020
|
dongsheng@627
|
6021 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6022 #: ../en/ch05-collab.xml:141
|
dongsheng@627
|
6023 msgid "A single central repository"
|
dongsheng@630
|
6024 msgstr "单一中央版本库"
|
dongsheng@627
|
6025
|
dongsheng@627
|
6026 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6027 #: ../en/ch05-collab.xml:143
|
dongsheng@627
|
6028 msgid ""
|
dongsheng@627
|
6029 "For smaller projects migrating from a centralised revision control tool, "
|
dongsheng@627
|
6030 "perhaps the easiest way to get started is to have changes flow through a "
|
dongsheng@627
|
6031 "single shared central repository. This is also the most common "
|
dongsheng@627
|
6032 "<quote>building block</quote> for more ambitious workflow schemes."
|
dongsheng@627
|
6033 msgstr ""
|
dongsheng@627
|
6034
|
dongsheng@627
|
6035 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6036 #: ../en/ch05-collab.xml:149
|
dongsheng@627
|
6037 msgid ""
|
dongsheng@627
|
6038 "Contributors start by cloning a copy of this repository. They can pull "
|
dongsheng@627
|
6039 "changes from it whenever they need to, and some (perhaps all) developers have "
|
dongsheng@627
|
6040 "permission to push a change back when they're ready for other people to see "
|
dongsheng@627
|
6041 "it."
|
dongsheng@627
|
6042 msgstr ""
|
dongsheng@627
|
6043
|
dongsheng@627
|
6044 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6045 #: ../en/ch05-collab.xml:154
|
dongsheng@627
|
6046 msgid ""
|
dongsheng@627
|
6047 "Under this model, it can still often make sense for people to pull changes "
|
dongsheng@627
|
6048 "directly from each other, without going through the central repository. "
|
dongsheng@627
|
6049 "Consider a case in which I have a tentative bug fix, but I am worried that if "
|
dongsheng@627
|
6050 "I were to publish it to the central repository, it might subsequently break "
|
dongsheng@627
|
6051 "everyone else's trees as they pull it. To reduce the potential for damage, I "
|
dongsheng@627
|
6052 "can ask you to clone my repository into a temporary repository of your own "
|
dongsheng@627
|
6053 "and test it. This lets us put off publishing the potentially unsafe change "
|
dongsheng@627
|
6054 "until it has had a little testing."
|
dongsheng@627
|
6055 msgstr ""
|
dongsheng@627
|
6056
|
dongsheng@627
|
6057 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6058 #: ../en/ch05-collab.xml:165
|
dongsheng@627
|
6059 msgid ""
|
dongsheng@627
|
6060 "In this kind of scenario, people usually use the <command>ssh</command> "
|
dongsheng@627
|
6061 "protocol to securely push changes to the central repository, as documented in "
|
dongsheng@627
|
6062 "section <xref linkend=\"sec.collab.ssh\"/>. It's also usual to publish a "
|
dongsheng@627
|
6063 "read-only copy of the repository over HTTP using CGI, as in section <xref "
|
dongsheng@627
|
6064 "linkend=\"sec.collab.cgi\"/>. Publishing over HTTP satisfies the needs of "
|
dongsheng@627
|
6065 "people who don't have push access, and those who want to use web browsers to "
|
dongsheng@627
|
6066 "browse the repository's history."
|
dongsheng@627
|
6067 msgstr ""
|
dongsheng@627
|
6068
|
dongsheng@627
|
6069 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6070 #: ../en/ch05-collab.xml:178
|
dongsheng@627
|
6071 msgid "Working with multiple branches"
|
dongsheng@630
|
6072 msgstr "使用多个分支工作"
|
dongsheng@627
|
6073
|
dongsheng@627
|
6074 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6075 #: ../en/ch05-collab.xml:180
|
dongsheng@627
|
6076 msgid ""
|
dongsheng@627
|
6077 "Projects of any significant size naturally tend to make progress on several "
|
dongsheng@627
|
6078 "fronts simultaneously. In the case of software, it's common for a project to "
|
dongsheng@627
|
6079 "go through periodic official releases. A release might then go into "
|
dongsheng@627
|
6080 "<quote>maintenance mode</quote> for a while after its first publication; "
|
dongsheng@627
|
6081 "maintenance releases tend to contain only bug fixes, not new features. In "
|
dongsheng@627
|
6082 "parallel with these maintenance releases, one or more future releases may be "
|
dongsheng@627
|
6083 "under development. People normally use the word <quote>branch</quote> to "
|
dongsheng@627
|
6084 "refer to one of these many slightly different directions in which development "
|
dongsheng@627
|
6085 "is proceeding."
|
dongsheng@627
|
6086 msgstr ""
|
dongsheng@627
|
6087
|
dongsheng@627
|
6088 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6089 #: ../en/ch05-collab.xml:193
|
dongsheng@627
|
6090 msgid ""
|
dongsheng@627
|
6091 "Mercurial is particularly well suited to managing a number of simultaneous, "
|
dongsheng@627
|
6092 "but not identical, branches. Each <quote>development direction</quote> can "
|
dongsheng@627
|
6093 "live in its own central repository, and you can merge changes from one to "
|
dongsheng@627
|
6094 "another as the need arises. Because repositories are independent of each "
|
dongsheng@627
|
6095 "other, unstable changes in a development branch will never affect a stable "
|
dongsheng@627
|
6096 "branch unless someone explicitly merges those changes in."
|
dongsheng@627
|
6097 msgstr ""
|
dongsheng@627
|
6098
|
dongsheng@627
|
6099 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6100 #: ../en/ch05-collab.xml:202
|
dongsheng@627
|
6101 msgid ""
|
dongsheng@627
|
6102 "Here's an example of how this can work in practice. Let's say you have one "
|
dongsheng@627
|
6103 "<quote>main branch</quote> on a central server."
|
dongsheng@627
|
6104 msgstr ""
|
dongsheng@627
|
6105
|
dongsheng@627
|
6106 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6107 #: ../en/ch05-collab.xml:208
|
dongsheng@627
|
6108 msgid "People clone it, make changes locally, test them, and push them back."
|
dongsheng@627
|
6109 msgstr ""
|
dongsheng@627
|
6110
|
dongsheng@627
|
6111 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6112 #: ../en/ch05-collab.xml:211
|
dongsheng@627
|
6113 msgid ""
|
dongsheng@627
|
6114 "Once the main branch reaches a release milestone, you can use the <command "
|
dongsheng@627
|
6115 "role=\"hg-cmd\">hg tag</command> command to give a permanent name to the "
|
dongsheng@627
|
6116 "milestone revision."
|
dongsheng@627
|
6117 msgstr ""
|
dongsheng@627
|
6118
|
dongsheng@627
|
6119 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6120 #: ../en/ch05-collab.xml:217
|
dongsheng@627
|
6121 msgid "Let's say some ongoing development occurs on the main branch."
|
dongsheng@627
|
6122 msgstr ""
|
dongsheng@627
|
6123
|
dongsheng@627
|
6124 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6125 #: ../en/ch05-collab.xml:222
|
dongsheng@627
|
6126 msgid ""
|
dongsheng@627
|
6127 "Using the tag that was recorded at the milestone, people who clone that "
|
dongsheng@627
|
6128 "repository at any time in the future can use <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
6129 "update</command> to get a copy of the working directory exactly as it was "
|
dongsheng@627
|
6130 "when that tagged revision was committed."
|
dongsheng@627
|
6131 msgstr ""
|
dongsheng@627
|
6132
|
dongsheng@627
|
6133 #
|
dongsheng@627
|
6134 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6135 #: ../en/ch05-collab.xml:230
|
dongsheng@627
|
6136 msgid ""
|
dongsheng@627
|
6137 "In addition, immediately after the main branch is tagged, someone can then "
|
dongsheng@627
|
6138 "clone the main branch on the server to a new <quote>stable</quote> branch, "
|
dongsheng@627
|
6139 "also on the server."
|
dongsheng@627
|
6140 msgstr ""
|
dongsheng@627
|
6141
|
dongsheng@627
|
6142 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6143 #: ../en/ch05-collab.xml:236
|
dongsheng@627
|
6144 msgid ""
|
dongsheng@627
|
6145 "Someone who needs to make a change to the stable branch can then clone "
|
dongsheng@627
|
6146 "<emphasis>that</emphasis> repository, make their changes, commit, and push "
|
dongsheng@627
|
6147 "their changes back there."
|
dongsheng@627
|
6148 msgstr ""
|
dongsheng@627
|
6149
|
dongsheng@627
|
6150 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6151 #: ../en/ch05-collab.xml:242
|
dongsheng@627
|
6152 msgid ""
|
dongsheng@627
|
6153 "Because Mercurial repositories are independent, and Mercurial doesn't move "
|
dongsheng@627
|
6154 "changes around automatically, the stable and main branches are "
|
dongsheng@627
|
6155 "<emphasis>isolated</emphasis> from each other. The changes that you made on "
|
dongsheng@627
|
6156 "the main branch don't <quote>leak</quote> to the stable branch, and vice "
|
dongsheng@627
|
6157 "versa."
|
dongsheng@627
|
6158 msgstr ""
|
dongsheng@627
|
6159
|
dongsheng@627
|
6160 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6161 #: ../en/ch05-collab.xml:249
|
dongsheng@627
|
6162 msgid ""
|
dongsheng@627
|
6163 "You'll often want all of your bugfixes on the stable branch to show up on the "
|
dongsheng@627
|
6164 "main branch, too. Rather than rewrite a bugfix on the main branch, you can "
|
dongsheng@627
|
6165 "simply pull and merge changes from the stable to the main branch, and "
|
dongsheng@627
|
6166 "Mercurial will bring those bugfixes in for you."
|
dongsheng@627
|
6167 msgstr ""
|
dongsheng@627
|
6168
|
dongsheng@627
|
6169 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6170 #: ../en/ch05-collab.xml:257
|
dongsheng@627
|
6171 msgid ""
|
dongsheng@627
|
6172 "The main branch will still contain changes that are not on the stable branch, "
|
dongsheng@627
|
6173 "but it will also contain all of the bugfixes from the stable branch. The "
|
dongsheng@627
|
6174 "stable branch remains unaffected by these changes."
|
dongsheng@627
|
6175 msgstr ""
|
dongsheng@627
|
6176
|
dongsheng@627
|
6177 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
6178 #: ../en/ch05-collab.xml:264 ../en/ch05-collab.xml:278
|
dongsheng@627
|
6179 msgid "Feature branches"
|
dongsheng@630
|
6180 msgstr "特性分支"
|
dongsheng@627
|
6181
|
dongsheng@627
|
6182 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6183 #: ../en/ch05-collab.xml:266
|
dongsheng@627
|
6184 msgid ""
|
dongsheng@627
|
6185 "For larger projects, an effective way to manage change is to break up a team "
|
dongsheng@627
|
6186 "into smaller groups. Each group has a shared branch of its own, cloned from "
|
dongsheng@627
|
6187 "a single <quote>master</quote> branch used by the entire project. People "
|
dongsheng@627
|
6188 "working on an individual branch are typically quite isolated from "
|
dongsheng@627
|
6189 "developments on other branches."
|
dongsheng@627
|
6190 msgstr ""
|
dongsheng@627
|
6191
|
dongsheng@627
|
6192 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
6193 #: ../en/ch05-collab.xml:275
|
dongsheng@641
|
6194 msgid ""
|
dongsheng@641
|
6195 "<imageobject><imagedata fileref=\"images/feature-branches.png\"/> </"
|
dongsheng@627
|
6196 "imageobject>"
|
dongsheng@627
|
6197 msgstr ""
|
dongsheng@627
|
6198
|
dongsheng@627
|
6199 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6200 #: ../en/ch05-collab.xml:283
|
dongsheng@627
|
6201 msgid ""
|
dongsheng@627
|
6202 "When a particular feature is deemed to be in suitable shape, someone on that "
|
dongsheng@627
|
6203 "feature team pulls and merges from the master branch into the feature branch, "
|
dongsheng@627
|
6204 "then pushes back up to the master branch."
|
dongsheng@627
|
6205 msgstr ""
|
dongsheng@627
|
6206
|
dongsheng@627
|
6207 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6208 #: ../en/ch05-collab.xml:290
|
dongsheng@627
|
6209 msgid "The release train"
|
dongsheng@630
|
6210 msgstr "发布列车"
|
dongsheng@627
|
6211
|
dongsheng@627
|
6212 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6213 #: ../en/ch05-collab.xml:292
|
dongsheng@627
|
6214 msgid ""
|
dongsheng@627
|
6215 "Some projects are organised on a <quote>train</quote> basis: a release is "
|
dongsheng@627
|
6216 "scheduled to happen every few months, and whatever features are ready when "
|
dongsheng@627
|
6217 "the <quote>train</quote> is ready to leave are allowed in."
|
dongsheng@627
|
6218 msgstr ""
|
dongsheng@627
|
6219
|
dongsheng@627
|
6220 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6221 #: ../en/ch05-collab.xml:297
|
dongsheng@627
|
6222 msgid ""
|
dongsheng@627
|
6223 "This model resembles working with feature branches. The difference is that "
|
dongsheng@627
|
6224 "when a feature branch misses a train, someone on the feature team pulls and "
|
dongsheng@627
|
6225 "merges the changes that went out on that train release into the feature "
|
dongsheng@627
|
6226 "branch, and the team continues its work on top of that release so that their "
|
dongsheng@627
|
6227 "feature can make the next release."
|
dongsheng@627
|
6228 msgstr ""
|
dongsheng@627
|
6229
|
dongsheng@627
|
6230 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6231 #: ../en/ch05-collab.xml:306
|
dongsheng@627
|
6232 msgid "The Linux kernel model"
|
dongsheng@630
|
6233 msgstr "Linux 内核模型"
|
dongsheng@627
|
6234
|
dongsheng@627
|
6235 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6236 #: ../en/ch05-collab.xml:308
|
dongsheng@627
|
6237 msgid ""
|
dongsheng@627
|
6238 "The development of the Linux kernel has a shallow hierarchical structure, "
|
dongsheng@627
|
6239 "surrounded by a cloud of apparent chaos. Because most Linux developers use "
|
dongsheng@627
|
6240 "<command>git</command>, a distributed revision control tool with capabilities "
|
dongsheng@627
|
6241 "similar to Mercurial, it's useful to describe the way work flows in that "
|
dongsheng@627
|
6242 "environment; if you like the ideas, the approach translates well across tools."
|
dongsheng@627
|
6243 msgstr ""
|
dongsheng@627
|
6244
|
dongsheng@627
|
6245 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6246 #: ../en/ch05-collab.xml:316
|
dongsheng@627
|
6247 msgid ""
|
dongsheng@627
|
6248 "At the center of the community sits Linus Torvalds, the creator of Linux. He "
|
dongsheng@627
|
6249 "publishes a single source repository that is considered the "
|
dongsheng@627
|
6250 "<quote>authoritative</quote> current tree by the entire developer community. "
|
dongsheng@627
|
6251 "Anyone can clone Linus's tree, but he is very choosy about whose trees he "
|
dongsheng@627
|
6252 "pulls from."
|
dongsheng@627
|
6253 msgstr ""
|
dongsheng@627
|
6254
|
dongsheng@627
|
6255 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6256 #: ../en/ch05-collab.xml:323
|
dongsheng@627
|
6257 msgid ""
|
dongsheng@627
|
6258 "Linus has a number of <quote>trusted lieutenants</quote>. As a general rule, "
|
dongsheng@627
|
6259 "he pulls whatever changes they publish, in most cases without even reviewing "
|
dongsheng@627
|
6260 "those changes. Some of those lieutenants are generally agreed to be "
|
dongsheng@627
|
6261 "<quote>maintainers</quote>, responsible for specific subsystems within the "
|
dongsheng@627
|
6262 "kernel. If a random kernel hacker wants to make a change to a subsystem that "
|
dongsheng@627
|
6263 "they want to end up in Linus's tree, they must find out who the subsystem's "
|
dongsheng@627
|
6264 "maintainer is, and ask that maintainer to take their change. If the "
|
dongsheng@627
|
6265 "maintainer reviews their changes and agrees to take them, they'll pass them "
|
dongsheng@627
|
6266 "along to Linus in due course."
|
dongsheng@627
|
6267 msgstr ""
|
dongsheng@627
|
6268
|
dongsheng@627
|
6269 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6270 #: ../en/ch05-collab.xml:335
|
dongsheng@627
|
6271 msgid ""
|
dongsheng@627
|
6272 "Individual lieutenants have their own approaches to reviewing, accepting, and "
|
dongsheng@627
|
6273 "publishing changes; and for deciding when to feed them to Linus. In "
|
dongsheng@627
|
6274 "addition, there are several well known branches that people use for different "
|
dongsheng@627
|
6275 "purposes. For example, a few people maintain <quote>stable</quote> "
|
dongsheng@627
|
6276 "repositories of older versions of the kernel, to which they apply critical "
|
dongsheng@627
|
6277 "fixes as needed. Some maintainers publish multiple trees: one for "
|
dongsheng@627
|
6278 "experimental changes; one for changes that they are about to feed upstream; "
|
dongsheng@627
|
6279 "and so on. Others just publish a single tree."
|
dongsheng@627
|
6280 msgstr ""
|
dongsheng@627
|
6281
|
dongsheng@627
|
6282 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6283 #: ../en/ch05-collab.xml:346
|
dongsheng@627
|
6284 msgid ""
|
dongsheng@627
|
6285 "This model has two notable features. The first is that it's <quote>pull "
|
dongsheng@627
|
6286 "only</quote>. You have to ask, convince, or beg another developer to take a "
|
dongsheng@627
|
6287 "change from you, because there are almost no trees to which more than one "
|
dongsheng@627
|
6288 "person can push, and there's no way to push changes into a tree that someone "
|
dongsheng@627
|
6289 "else controls."
|
dongsheng@627
|
6290 msgstr ""
|
dongsheng@627
|
6291
|
dongsheng@627
|
6292 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6293 #: ../en/ch05-collab.xml:353
|
dongsheng@627
|
6294 msgid ""
|
dongsheng@627
|
6295 "The second is that it's based on reputation and acclaim. If you're an "
|
dongsheng@627
|
6296 "unknown, Linus will probably ignore changes from you without even "
|
dongsheng@627
|
6297 "responding. But a subsystem maintainer will probably review them, and will "
|
dongsheng@627
|
6298 "likely take them if they pass their criteria for suitability. The more "
|
dongsheng@627
|
6299 "<quote>good</quote> changes you contribute to a maintainer, the more likely "
|
dongsheng@627
|
6300 "they are to trust your judgment and accept your changes. If you're well-"
|
dongsheng@627
|
6301 "known and maintain a long-lived branch for something Linus hasn't yet "
|
dongsheng@627
|
6302 "accepted, people with similar interests may pull your changes regularly to "
|
dongsheng@627
|
6303 "keep up with your work."
|
dongsheng@627
|
6304 msgstr ""
|
dongsheng@627
|
6305
|
dongsheng@627
|
6306 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6307 #: ../en/ch05-collab.xml:364
|
dongsheng@627
|
6308 msgid ""
|
dongsheng@627
|
6309 "Reputation and acclaim don't necessarily cross subsystem or <quote>people</"
|
dongsheng@627
|
6310 "quote> boundaries. If you're a respected but specialised storage hacker, and "
|
dongsheng@627
|
6311 "you try to fix a networking bug, that change will receive a level of scrutiny "
|
dongsheng@627
|
6312 "from a network maintainer comparable to a change from a complete stranger."
|
dongsheng@627
|
6313 msgstr ""
|
dongsheng@627
|
6314
|
dongsheng@627
|
6315 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6316 #: ../en/ch05-collab.xml:371
|
dongsheng@627
|
6317 msgid ""
|
dongsheng@627
|
6318 "To people who come from more orderly project backgrounds, the comparatively "
|
dongsheng@627
|
6319 "chaotic Linux kernel development process often seems completely insane. It's "
|
dongsheng@627
|
6320 "subject to the whims of individuals; people make sweeping changes whenever "
|
dongsheng@627
|
6321 "they deem it appropriate; and the pace of development is astounding. And yet "
|
dongsheng@627
|
6322 "Linux is a highly successful, well-regarded piece of software."
|
dongsheng@627
|
6323 msgstr ""
|
dongsheng@627
|
6324
|
dongsheng@627
|
6325 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6326 #: ../en/ch05-collab.xml:381
|
dongsheng@627
|
6327 msgid "Pull-only versus shared-push collaboration"
|
dongsheng@630
|
6328 msgstr "只读与共享写协作"
|
dongsheng@627
|
6329
|
dongsheng@627
|
6330 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6331 #: ../en/ch05-collab.xml:383
|
dongsheng@627
|
6332 msgid ""
|
dongsheng@627
|
6333 "A perpetual source of heat in the open source community is whether a "
|
dongsheng@627
|
6334 "development model in which people only ever pull changes from others is "
|
dongsheng@627
|
6335 "<quote>better than</quote> one in which multiple people can push changes to a "
|
dongsheng@627
|
6336 "shared repository."
|
dongsheng@627
|
6337 msgstr ""
|
dongsheng@627
|
6338
|
dongsheng@627
|
6339 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6340 #: ../en/ch05-collab.xml:389
|
dongsheng@627
|
6341 msgid ""
|
dongsheng@627
|
6342 "Typically, the backers of the shared-push model use tools that actively "
|
dongsheng@627
|
6343 "enforce this approach. If you're using a centralised revision control tool "
|
dongsheng@627
|
6344 "such as Subversion, there's no way to make a choice over which model you'll "
|
dongsheng@627
|
6345 "use: the tool gives you shared-push, and if you want to do anything else, "
|
dongsheng@627
|
6346 "you'll have to roll your own approach on top (such as applying a patch by "
|
dongsheng@627
|
6347 "hand)."
|
dongsheng@627
|
6348 msgstr ""
|
dongsheng@627
|
6349
|
dongsheng@627
|
6350 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6351 #: ../en/ch05-collab.xml:397
|
dongsheng@627
|
6352 msgid ""
|
dongsheng@627
|
6353 "A good distributed revision control tool, such as Mercurial, will support "
|
dongsheng@627
|
6354 "both models. You and your collaborators can then structure how you work "
|
dongsheng@627
|
6355 "together based on your own needs and preferences, not on what contortions "
|
dongsheng@627
|
6356 "your tools force you into."
|
dongsheng@627
|
6357 msgstr ""
|
dongsheng@627
|
6358
|
dongsheng@627
|
6359 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6360 #: ../en/ch05-collab.xml:405
|
dongsheng@627
|
6361 msgid "Where collaboration meets branch management"
|
dongsheng@630
|
6362 msgstr "协作与分支管理"
|
dongsheng@627
|
6363
|
dongsheng@627
|
6364 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6365 #: ../en/ch05-collab.xml:407
|
dongsheng@627
|
6366 msgid ""
|
dongsheng@627
|
6367 "Once you and your team set up some shared repositories and start propagating "
|
dongsheng@627
|
6368 "changes back and forth between local and shared repos, you begin to face a "
|
dongsheng@627
|
6369 "related, but slightly different challenge: that of managing the multiple "
|
dongsheng@627
|
6370 "directions in which your team may be moving at once. Even though this "
|
dongsheng@627
|
6371 "subject is intimately related to how your team collaborates, it's dense "
|
dongsheng@627
|
6372 "enough to merit treatment of its own, in chapter <xref linkend=\"chap.branch"
|
dongsheng@627
|
6373 "\"/>."
|
dongsheng@627
|
6374 msgstr ""
|
dongsheng@627
|
6375
|
dongsheng@627
|
6376 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
6377 #: ../en/ch05-collab.xml:419
|
dongsheng@627
|
6378 msgid "The technical side of sharing"
|
dongsheng@630
|
6379 msgstr "共享的技术因素"
|
dongsheng@627
|
6380
|
dongsheng@627
|
6381 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6382 #: ../en/ch05-collab.xml:421
|
dongsheng@627
|
6383 msgid ""
|
dongsheng@627
|
6384 "The remainder of this chapter is devoted to the question of serving data to "
|
dongsheng@627
|
6385 "your collaborators."
|
dongsheng@627
|
6386 msgstr ""
|
dongsheng@627
|
6387
|
dongsheng@627
|
6388 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
6389 #: ../en/ch05-collab.xml:426
|
dongsheng@627
|
6390 msgid "Informal sharing with <command role=\"hg-cmd\">hg serve</command>"
|
dongsheng@630
|
6391 msgstr "使用 <command role=\"hg-cmd\">hg serve</command> 进行非正式共享"
|
dongsheng@627
|
6392
|
dongsheng@627
|
6393 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6394 #: ../en/ch05-collab.xml:429
|
dongsheng@627
|
6395 msgid ""
|
dongsheng@627
|
6396 "Mercurial's <command role=\"hg-cmd\">hg serve</command> command is "
|
dongsheng@627
|
6397 "wonderfully suited to small, tight-knit, and fast-paced group environments. "
|
dongsheng@627
|
6398 "It also provides a great way to get a feel for using Mercurial commands over "
|
dongsheng@627
|
6399 "a network."
|
dongsheng@627
|
6400 msgstr ""
|
dongsheng@627
|
6401
|
dongsheng@627
|
6402 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6403 #: ../en/ch05-collab.xml:434
|
dongsheng@627
|
6404 msgid ""
|
dongsheng@627
|
6405 "Run <command role=\"hg-cmd\">hg serve</command> inside a repository, and in "
|
dongsheng@627
|
6406 "under a second it will bring up a specialised HTTP server; this will accept "
|
dongsheng@627
|
6407 "connections from any client, and serve up data for that repository until you "
|
dongsheng@627
|
6408 "terminate it. Anyone who knows the URL of the server you just started, and "
|
dongsheng@627
|
6409 "can talk to your computer over the network, can then use a web browser or "
|
dongsheng@627
|
6410 "Mercurial to read data from that repository. A URL for a <command role=\"hg-"
|
dongsheng@627
|
6411 "cmd\">hg serve</command> instance running on a laptop is likely to look "
|
dongsheng@627
|
6412 "something like <literal>http://my-laptop.local:8000/</literal>."
|
dongsheng@627
|
6413 msgstr ""
|
dongsheng@627
|
6414
|
dongsheng@627
|
6415 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6416 #: ../en/ch05-collab.xml:445
|
dongsheng@627
|
6417 msgid ""
|
dongsheng@627
|
6418 "The <command role=\"hg-cmd\">hg serve</command> command is <emphasis>not</"
|
dongsheng@627
|
6419 "emphasis> a general-purpose web server. It can do only two things:"
|
dongsheng@627
|
6420 msgstr ""
|
dongsheng@627
|
6421
|
dongsheng@627
|
6422 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
6423 #: ../en/ch05-collab.xml:449
|
dongsheng@627
|
6424 msgid ""
|
dongsheng@627
|
6425 "Allow people to browse the history of the repository it's serving, from their "
|
dongsheng@627
|
6426 "normal web browsers."
|
dongsheng@627
|
6427 msgstr ""
|
dongsheng@627
|
6428
|
dongsheng@627
|
6429 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
6430 #: ../en/ch05-collab.xml:453
|
dongsheng@627
|
6431 msgid ""
|
dongsheng@627
|
6432 "Speak Mercurial's wire protocol, so that people can <command role=\"hg-cmd"
|
dongsheng@627
|
6433 "\">hg clone</command> or <command role=\"hg-cmd\">hg pull</command> changes "
|
dongsheng@627
|
6434 "from that repository."
|
dongsheng@627
|
6435 msgstr ""
|
dongsheng@627
|
6436
|
dongsheng@627
|
6437 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6438 #: ../en/ch05-collab.xml:458
|
dongsheng@627
|
6439 msgid ""
|
dongsheng@627
|
6440 "In particular, <command role=\"hg-cmd\">hg serve</command> won't allow remote "
|
dongsheng@627
|
6441 "users to <emphasis>modify</emphasis> your repository. It's intended for read-"
|
dongsheng@627
|
6442 "only use."
|
dongsheng@627
|
6443 msgstr ""
|
dongsheng@627
|
6444
|
dongsheng@627
|
6445 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6446 #: ../en/ch05-collab.xml:462
|
dongsheng@627
|
6447 msgid ""
|
dongsheng@627
|
6448 "If you're getting started with Mercurial, there's nothing to prevent you from "
|
dongsheng@627
|
6449 "using <command role=\"hg-cmd\">hg serve</command> to serve up a repository on "
|
dongsheng@627
|
6450 "your own computer, then use commands like <command role=\"hg-cmd\">hg clone</"
|
dongsheng@627
|
6451 "command>, <command role=\"hg-cmd\">hg incoming</command>, and so on to talk "
|
dongsheng@627
|
6452 "to that server as if the repository was hosted remotely. This can help you to "
|
dongsheng@627
|
6453 "quickly get acquainted with using commands on network-hosted repositories."
|
dongsheng@627
|
6454 msgstr ""
|
dongsheng@627
|
6455
|
dongsheng@627
|
6456 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6457 #: ../en/ch05-collab.xml:472
|
dongsheng@627
|
6458 msgid "A few things to keep in mind"
|
dongsheng@630
|
6459 msgstr "要牢记的几件事"
|
dongsheng@627
|
6460
|
dongsheng@627
|
6461 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6462 #: ../en/ch05-collab.xml:474
|
dongsheng@627
|
6463 msgid ""
|
dongsheng@627
|
6464 "Because it provides unauthenticated read access to all clients, you should "
|
dongsheng@627
|
6465 "only use <command role=\"hg-cmd\">hg serve</command> in an environment where "
|
dongsheng@627
|
6466 "you either don't care, or have complete control over, who can access your "
|
dongsheng@627
|
6467 "network and pull data from your repository."
|
dongsheng@627
|
6468 msgstr ""
|
dongsheng@627
|
6469
|
dongsheng@627
|
6470 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6471 #: ../en/ch05-collab.xml:480
|
dongsheng@627
|
6472 msgid ""
|
dongsheng@627
|
6473 "The <command role=\"hg-cmd\">hg serve</command> command knows nothing about "
|
dongsheng@627
|
6474 "any firewall software you might have installed on your system or network. It "
|
dongsheng@627
|
6475 "cannot detect or control your firewall software. If other people are unable "
|
dongsheng@627
|
6476 "to talk to a running <command role=\"hg-cmd\">hg serve</command> instance, "
|
dongsheng@627
|
6477 "the second thing you should do (<emphasis>after</emphasis> you make sure that "
|
dongsheng@627
|
6478 "they're using the correct URL) is check your firewall configuration."
|
dongsheng@627
|
6479 msgstr ""
|
dongsheng@627
|
6480
|
dongsheng@627
|
6481 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6482 #: ../en/ch05-collab.xml:489
|
dongsheng@627
|
6483 msgid ""
|
dongsheng@627
|
6484 "By default, <command role=\"hg-cmd\">hg serve</command> listens for incoming "
|
dongsheng@627
|
6485 "connections on port 8000. If another process is already listening on the "
|
dongsheng@627
|
6486 "port you want to use, you can specify a different port to listen on using the "
|
dongsheng@627
|
6487 "<option role=\"hg-opt-serve\">-p</option> option."
|
dongsheng@627
|
6488 msgstr ""
|
dongsheng@627
|
6489
|
dongsheng@627
|
6490 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6491 #: ../en/ch05-collab.xml:495
|
dongsheng@627
|
6492 msgid ""
|
dongsheng@627
|
6493 "Normally, when <command role=\"hg-cmd\">hg serve</command> starts, it prints "
|
dongsheng@627
|
6494 "no output, which can be a bit unnerving. If you'd like to confirm that it is "
|
dongsheng@627
|
6495 "indeed running correctly, and find out what URL you should send to your "
|
dongsheng@627
|
6496 "collaborators, start it with the <option role=\"hg-opt-global\">-v</option> "
|
dongsheng@627
|
6497 "option."
|
dongsheng@627
|
6498 msgstr ""
|
dongsheng@627
|
6499
|
dongsheng@627
|
6500 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
6501 #: ../en/ch05-collab.xml:505
|
dongsheng@627
|
6502 msgid "Using the Secure Shell (ssh) protocol"
|
dongsheng@630
|
6503 msgstr "使用 ssh 协议"
|
dongsheng@627
|
6504
|
dongsheng@627
|
6505 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6506 #: ../en/ch05-collab.xml:507
|
dongsheng@627
|
6507 msgid ""
|
dongsheng@627
|
6508 "You can pull and push changes securely over a network connection using the "
|
dongsheng@627
|
6509 "Secure Shell (<literal>ssh</literal>) protocol. To use this successfully, "
|
dongsheng@627
|
6510 "you may have to do a little bit of configuration on the client or server "
|
dongsheng@627
|
6511 "sides."
|
dongsheng@627
|
6512 msgstr ""
|
dongsheng@627
|
6513
|
dongsheng@627
|
6514 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6515 #: ../en/ch05-collab.xml:512
|
dongsheng@627
|
6516 msgid ""
|
dongsheng@627
|
6517 "If you're not familiar with ssh, it's a network protocol that lets you "
|
dongsheng@627
|
6518 "securely communicate with another computer. To use it with Mercurial, you'll "
|
dongsheng@627
|
6519 "be setting up one or more user accounts on a server so that remote users can "
|
dongsheng@627
|
6520 "log in and execute commands."
|
dongsheng@627
|
6521 msgstr ""
|
dongsheng@627
|
6522
|
dongsheng@627
|
6523 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
6524 #: ../en/ch05-collab.xml:518
|
dongsheng@627
|
6525 msgid ""
|
dongsheng@627
|
6526 "(If you <emphasis>are</emphasis> familiar with ssh, you'll probably find some "
|
dongsheng@627
|
6527 "of the material that follows to be elementary in nature.)"
|
dongsheng@627
|
6528 msgstr ""
|
dongsheng@627
|
6529
|
dongsheng@627
|
6530 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6531 #: ../en/ch05-collab.xml:523
|
dongsheng@627
|
6532 msgid "How to read and write ssh URLs"
|
dongsheng@630
|
6533 msgstr "如何读写 ssh 路径"
|
dongsheng@627
|
6534
|
dongsheng@627
|
6535 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6536 #: ../en/ch05-collab.xml:525
|
dongsheng@627
|
6537 msgid "An ssh URL tends to look like this:"
|
dongsheng@627
|
6538 msgstr ""
|
dongsheng@627
|
6539
|
dongsheng@627
|
6540 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
6541 #: ../en/ch05-collab.xml:528
|
dongsheng@627
|
6542 msgid ""
|
dongsheng@627
|
6543 "The <quote><literal>ssh://</literal></quote> part tells Mercurial to use the "
|
dongsheng@627
|
6544 "ssh protocol."
|
dongsheng@627
|
6545 msgstr ""
|
dongsheng@627
|
6546
|
dongsheng@627
|
6547 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
6548 #: ../en/ch05-collab.xml:531
|
dongsheng@627
|
6549 msgid ""
|
dongsheng@627
|
6550 "The <quote><literal>bos@</literal></quote> component indicates what username "
|
dongsheng@627
|
6551 "to log into the server as. You can leave this out if the remote username is "
|
dongsheng@627
|
6552 "the same as your local username."
|
dongsheng@627
|
6553 msgstr ""
|
dongsheng@627
|
6554
|
dongsheng@627
|
6555 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
6556 #: ../en/ch05-collab.xml:536
|
dongsheng@627
|
6557 msgid ""
|
dongsheng@627
|
6558 "The <quote><literal>hg.serpentine.com</literal></quote> gives the hostname of "
|
dongsheng@627
|
6559 "the server to log into."
|
dongsheng@627
|
6560 msgstr ""
|
dongsheng@627
|
6561
|
dongsheng@627
|
6562 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
6563 #: ../en/ch05-collab.xml:540
|
dongsheng@627
|
6564 msgid ""
|
dongsheng@627
|
6565 "The <quote>:22</quote> identifies the port number to connect to the server "
|
dongsheng@650
|
6566 "on. The default port is 22, so you only need to specify a colon and port "
|
dongsheng@650
|
6567 "number if you're <emphasis>not</emphasis> using port 22."
|
dongsheng@627
|
6568 msgstr ""
|
dongsheng@627
|
6569
|
dongsheng@627
|
6570 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
6571 #: ../en/ch05-collab.xml:545
|
dongsheng@627
|
6572 msgid ""
|
dongsheng@627
|
6573 "The remainder of the URL is the local path to the repository on the server."
|
dongsheng@627
|
6574 msgstr ""
|
dongsheng@627
|
6575
|
dongsheng@627
|
6576 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6577 #: ../en/ch05-collab.xml:549
|
dongsheng@627
|
6578 msgid ""
|
dongsheng@627
|
6579 "There's plenty of scope for confusion with the path component of ssh URLs, as "
|
dongsheng@627
|
6580 "there is no standard way for tools to interpret it. Some programs behave "
|
dongsheng@627
|
6581 "differently than others when dealing with these paths. This isn't an ideal "
|
dongsheng@627
|
6582 "situation, but it's unlikely to change. Please read the following paragraphs "
|
dongsheng@627
|
6583 "carefully."
|
dongsheng@627
|
6584 msgstr ""
|
dongsheng@627
|
6585
|
dongsheng@627
|
6586 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6587 #: ../en/ch05-collab.xml:556
|
dongsheng@627
|
6588 msgid ""
|
dongsheng@627
|
6589 "Mercurial treats the path to a repository on the server as relative to the "
|
dongsheng@627
|
6590 "remote user's home directory. For example, if user <literal>foo</literal> on "
|
dongsheng@627
|
6591 "the server has a home directory of <filename class=\"directory\">/home/foo</"
|
dongsheng@627
|
6592 "filename>, then an ssh URL that contains a path component of <filename class="
|
dongsheng@627
|
6593 "\"directory\">bar</filename> <emphasis>really</emphasis> refers to the "
|
dongsheng@627
|
6594 "directory <filename class=\"directory\">/home/foo/bar</filename>."
|
dongsheng@627
|
6595 msgstr ""
|
dongsheng@627
|
6596
|
dongsheng@627
|
6597 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6598 #: ../en/ch05-collab.xml:565
|
dongsheng@627
|
6599 msgid ""
|
dongsheng@627
|
6600 "If you want to specify a path relative to another user's home directory, you "
|
dongsheng@627
|
6601 "can use a path that starts with a tilde character followed by the user's name "
|
dongsheng@627
|
6602 "(let's call them <literal>otheruser</literal>), like this."
|
dongsheng@627
|
6603 msgstr ""
|
dongsheng@627
|
6604
|
dongsheng@627
|
6605 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6606 #: ../en/ch05-collab.xml:571
|
dongsheng@627
|
6607 msgid ""
|
dongsheng@627
|
6608 "And if you really want to specify an <emphasis>absolute</emphasis> path on "
|
dongsheng@627
|
6609 "the server, begin the path component with two slashes, as in this example."
|
dongsheng@627
|
6610 msgstr ""
|
dongsheng@627
|
6611
|
dongsheng@627
|
6612 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6613 #: ../en/ch05-collab.xml:578
|
dongsheng@627
|
6614 msgid "Finding an ssh client for your system"
|
dongsheng@630
|
6615 msgstr "为你的系统寻找 ssh 客户端"
|
dongsheng@627
|
6616
|
dongsheng@627
|
6617 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6618 #: ../en/ch05-collab.xml:580
|
dongsheng@627
|
6619 msgid ""
|
dongsheng@627
|
6620 "Almost every Unix-like system comes with OpenSSH preinstalled. If you're "
|
dongsheng@627
|
6621 "using such a system, run <literal>which ssh</literal> to find out if the "
|
dongsheng@627
|
6622 "<command>ssh</command> command is installed (it's usually in <filename class="
|
dongsheng@627
|
6623 "\"directory\">/usr/bin</filename>). In the unlikely event that it isn't "
|
dongsheng@627
|
6624 "present, take a look at your system documentation to figure out how to "
|
dongsheng@627
|
6625 "install it."
|
dongsheng@627
|
6626 msgstr ""
|
dongsheng@627
|
6627
|
dongsheng@627
|
6628 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6629 #: ../en/ch05-collab.xml:588
|
dongsheng@627
|
6630 msgid ""
|
dongsheng@627
|
6631 "On Windows, you'll first need to download a suitable ssh client. There are "
|
dongsheng@627
|
6632 "two alternatives."
|
dongsheng@627
|
6633 msgstr ""
|
dongsheng@627
|
6634
|
dongsheng@627
|
6635 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6636 #: ../en/ch05-collab.xml:591
|
dongsheng@627
|
6637 msgid ""
|
dongsheng@627
|
6638 "Simon Tatham's excellent PuTTY package <citation>web:putty</citation> "
|
dongsheng@627
|
6639 "provides a complete suite of ssh client commands."
|
dongsheng@627
|
6640 msgstr ""
|
dongsheng@627
|
6641
|
dongsheng@627
|
6642 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6643 #: ../en/ch05-collab.xml:595
|
dongsheng@627
|
6644 msgid ""
|
dongsheng@627
|
6645 "If you have a high tolerance for pain, you can use the Cygwin port of OpenSSH."
|
dongsheng@627
|
6646 msgstr ""
|
dongsheng@627
|
6647
|
dongsheng@627
|
6648 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6649 #: ../en/ch05-collab.xml:598
|
dongsheng@650
|
6650 msgid ""
|
dongsheng@650
|
6651 "In either case, you'll need to edit your <filename role=\"special\">hg.ini</"
|
dongsheng@650
|
6652 "filename> file to tell Mercurial where to find the actual client command. "
|
dongsheng@650
|
6653 "For example, if you're using PuTTY, you'll need to use the <command>plink</"
|
dongsheng@650
|
6654 "command> command as a command-line ssh client."
|
dongsheng@627
|
6655 msgstr ""
|
dongsheng@627
|
6656
|
dongsheng@627
|
6657 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
6658 #: ../en/ch05-collab.xml:608
|
dongsheng@627
|
6659 msgid ""
|
dongsheng@627
|
6660 "The path to <command>plink</command> shouldn't contain any whitespace "
|
dongsheng@627
|
6661 "characters, or Mercurial may not be able to run it correctly (so putting it "
|
dongsheng@650
|
6662 "in <filename class=\"directory\">C:\\Program Files</filename> is probably not "
|
dongsheng@650
|
6663 "a good idea)."
|
dongsheng@650
|
6664 msgstr ""
|
dongsheng@650
|
6665
|
dongsheng@650
|
6666 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6667 #: ../en/ch05-collab.xml:617
|
dongsheng@627
|
6668 msgid "Generating a key pair"
|
dongsheng@630
|
6669 msgstr "产生密钥对"
|
dongsheng@627
|
6670
|
dongsheng@627
|
6671 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6672 #: ../en/ch05-collab.xml:619
|
dongsheng@627
|
6673 msgid ""
|
dongsheng@627
|
6674 "To avoid the need to repetitively type a password every time you need to use "
|
dongsheng@627
|
6675 "your ssh client, I recommend generating a key pair. On a Unix-like system, "
|
dongsheng@627
|
6676 "the <command>ssh-keygen</command> command will do the trick. On Windows, if "
|
dongsheng@627
|
6677 "you're using PuTTY, the <command>puttygen</command> command is what you'll "
|
dongsheng@627
|
6678 "need."
|
dongsheng@627
|
6679 msgstr ""
|
dongsheng@627
|
6680
|
dongsheng@627
|
6681 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6682 #: ../en/ch05-collab.xml:627
|
dongsheng@627
|
6683 msgid ""
|
dongsheng@627
|
6684 "When you generate a key pair, it's usually <emphasis>highly</emphasis> "
|
dongsheng@627
|
6685 "advisable to protect it with a passphrase. (The only time that you might not "
|
dongsheng@627
|
6686 "want to do this is when you're using the ssh protocol for automated tasks on "
|
dongsheng@627
|
6687 "a secure network.)"
|
dongsheng@627
|
6688 msgstr ""
|
dongsheng@627
|
6689
|
dongsheng@627
|
6690 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6691 #: ../en/ch05-collab.xml:633
|
dongsheng@627
|
6692 msgid ""
|
dongsheng@627
|
6693 "Simply generating a key pair isn't enough, however. You'll need to add the "
|
dongsheng@627
|
6694 "public key to the set of authorised keys for whatever user you're logging in "
|
dongsheng@627
|
6695 "remotely as. For servers using OpenSSH (the vast majority), this will mean "
|
dongsheng@627
|
6696 "adding the public key to a list in a file called <filename role=\"special"
|
dongsheng@627
|
6697 "\">authorized_keys</filename> in their <filename role=\"special\" class="
|
dongsheng@627
|
6698 "\"directory\">.ssh</filename> directory."
|
dongsheng@627
|
6699 msgstr ""
|
dongsheng@627
|
6700
|
dongsheng@627
|
6701 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6702 #: ../en/ch05-collab.xml:642
|
dongsheng@627
|
6703 msgid ""
|
dongsheng@627
|
6704 "On a Unix-like system, your public key will have a <filename>.pub</filename> "
|
dongsheng@627
|
6705 "extension. If you're using <command>puttygen</command> on Windows, you can "
|
dongsheng@627
|
6706 "save the public key to a file of your choosing, or paste it from the window "
|
dongsheng@627
|
6707 "it's displayed in straight into the <filename role=\"special"
|
dongsheng@627
|
6708 "\">authorized_keys</filename> file."
|
dongsheng@627
|
6709 msgstr ""
|
dongsheng@627
|
6710
|
dongsheng@627
|
6711 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6712 #: ../en/ch05-collab.xml:651
|
dongsheng@627
|
6713 msgid "Using an authentication agent"
|
dongsheng@630
|
6714 msgstr "使用认证代理"
|
dongsheng@627
|
6715
|
dongsheng@627
|
6716 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6717 #: ../en/ch05-collab.xml:653
|
dongsheng@627
|
6718 msgid ""
|
dongsheng@627
|
6719 "An authentication agent is a daemon that stores passphrases in memory (so it "
|
dongsheng@627
|
6720 "will forget passphrases if you log out and log back in again). An ssh client "
|
dongsheng@627
|
6721 "will notice if it's running, and query it for a passphrase. If there's no "
|
dongsheng@627
|
6722 "authentication agent running, or the agent doesn't store the necessary "
|
dongsheng@627
|
6723 "passphrase, you'll have to type your passphrase every time Mercurial tries to "
|
dongsheng@627
|
6724 "communicate with a server on your behalf (e.g. whenever you pull or push "
|
dongsheng@627
|
6725 "changes)."
|
dongsheng@627
|
6726 msgstr ""
|
dongsheng@627
|
6727
|
dongsheng@627
|
6728 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6729 #: ../en/ch05-collab.xml:662
|
dongsheng@627
|
6730 msgid ""
|
dongsheng@627
|
6731 "The downside of storing passphrases in an agent is that it's possible for a "
|
dongsheng@627
|
6732 "well-prepared attacker to recover the plain text of your passphrases, in some "
|
dongsheng@627
|
6733 "cases even if your system has been power-cycled. You should make your own "
|
dongsheng@627
|
6734 "judgment as to whether this is an acceptable risk. It certainly saves a lot "
|
dongsheng@627
|
6735 "of repeated typing."
|
dongsheng@627
|
6736 msgstr ""
|
dongsheng@627
|
6737
|
dongsheng@627
|
6738 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6739 #: ../en/ch05-collab.xml:669
|
dongsheng@627
|
6740 msgid ""
|
dongsheng@627
|
6741 "On Unix-like systems, the agent is called <command>ssh-agent</command>, and "
|
dongsheng@627
|
6742 "it's often run automatically for you when you log in. You'll need to use the "
|
dongsheng@627
|
6743 "<command>ssh-add</command> command to add passphrases to the agent's store. "
|
dongsheng@627
|
6744 "On Windows, if you're using PuTTY, the <command>pageant</command> command "
|
dongsheng@627
|
6745 "acts as the agent. It adds an icon to your system tray that will let you "
|
dongsheng@627
|
6746 "manage stored passphrases."
|
dongsheng@627
|
6747 msgstr ""
|
dongsheng@627
|
6748
|
dongsheng@627
|
6749 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6750 #: ../en/ch05-collab.xml:680
|
dongsheng@627
|
6751 msgid "Configuring the server side properly"
|
dongsheng@630
|
6752 msgstr "正确配置服务器端"
|
dongsheng@627
|
6753
|
dongsheng@627
|
6754 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6755 #: ../en/ch05-collab.xml:682
|
dongsheng@627
|
6756 msgid ""
|
dongsheng@627
|
6757 "Because ssh can be fiddly to set up if you're new to it, there's a variety of "
|
dongsheng@627
|
6758 "things that can go wrong. Add Mercurial on top, and there's plenty more "
|
dongsheng@627
|
6759 "scope for head-scratching. Most of these potential problems occur on the "
|
dongsheng@627
|
6760 "server side, not the client side. The good news is that once you've gotten a "
|
dongsheng@627
|
6761 "configuration working, it will usually continue to work indefinitely."
|
dongsheng@627
|
6762 msgstr ""
|
dongsheng@627
|
6763
|
dongsheng@627
|
6764 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6765 #: ../en/ch05-collab.xml:690
|
dongsheng@627
|
6766 msgid ""
|
dongsheng@627
|
6767 "Before you try using Mercurial to talk to an ssh server, it's best to make "
|
dongsheng@627
|
6768 "sure that you can use the normal <command>ssh</command> or <command>putty</"
|
dongsheng@627
|
6769 "command> command to talk to the server first. If you run into problems with "
|
dongsheng@627
|
6770 "using these commands directly, Mercurial surely won't work. Worse, it will "
|
dongsheng@627
|
6771 "obscure the underlying problem. Any time you want to debug ssh-related "
|
dongsheng@627
|
6772 "Mercurial problems, you should drop back to making sure that plain ssh client "
|
dongsheng@627
|
6773 "commands work first, <emphasis>before</emphasis> you worry about whether "
|
dongsheng@627
|
6774 "there's a problem with Mercurial."
|
dongsheng@627
|
6775 msgstr ""
|
dongsheng@627
|
6776
|
dongsheng@627
|
6777 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6778 #: ../en/ch05-collab.xml:701
|
dongsheng@627
|
6779 msgid ""
|
dongsheng@627
|
6780 "The first thing to be sure of on the server side is that you can actually log "
|
dongsheng@627
|
6781 "in from another machine at all. If you can't use <command>ssh</command> or "
|
dongsheng@627
|
6782 "<command>putty</command> to log in, the error message you get may give you a "
|
dongsheng@627
|
6783 "few hints as to what's wrong. The most common problems are as follows."
|
dongsheng@627
|
6784 msgstr ""
|
dongsheng@627
|
6785
|
dongsheng@627
|
6786 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6787 #: ../en/ch05-collab.xml:708
|
dongsheng@627
|
6788 msgid ""
|
dongsheng@627
|
6789 "If you get a <quote>connection refused</quote> error, either there isn't an "
|
dongsheng@627
|
6790 "SSH daemon running on the server at all, or it's inaccessible due to firewall "
|
dongsheng@627
|
6791 "configuration."
|
dongsheng@627
|
6792 msgstr ""
|
dongsheng@627
|
6793
|
dongsheng@627
|
6794 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6795 #: ../en/ch05-collab.xml:713
|
dongsheng@627
|
6796 msgid ""
|
dongsheng@627
|
6797 "If you get a <quote>no route to host</quote> error, you either have an "
|
dongsheng@627
|
6798 "incorrect address for the server or a seriously locked down firewall that "
|
dongsheng@627
|
6799 "won't admit its existence at all."
|
dongsheng@627
|
6800 msgstr ""
|
dongsheng@627
|
6801
|
dongsheng@627
|
6802 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6803 #: ../en/ch05-collab.xml:718
|
dongsheng@627
|
6804 msgid ""
|
dongsheng@627
|
6805 "If you get a <quote>permission denied</quote> error, you may have mistyped "
|
dongsheng@627
|
6806 "the username on the server, or you could have mistyped your key's passphrase "
|
dongsheng@627
|
6807 "or the remote user's password."
|
dongsheng@627
|
6808 msgstr ""
|
dongsheng@627
|
6809
|
dongsheng@627
|
6810 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6811 #: ../en/ch05-collab.xml:723
|
dongsheng@627
|
6812 msgid ""
|
dongsheng@627
|
6813 "In summary, if you're having trouble talking to the server's ssh daemon, "
|
dongsheng@627
|
6814 "first make sure that one is running at all. On many systems it will be "
|
dongsheng@627
|
6815 "installed, but disabled, by default. Once you're done with this step, you "
|
dongsheng@627
|
6816 "should then check that the server's firewall is configured to allow incoming "
|
dongsheng@627
|
6817 "connections on the port the ssh daemon is listening on (usually 22). Don't "
|
dongsheng@627
|
6818 "worry about more exotic possibilities for misconfiguration until you've "
|
dongsheng@627
|
6819 "checked these two first."
|
dongsheng@627
|
6820 msgstr ""
|
dongsheng@627
|
6821
|
dongsheng@627
|
6822 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6823 #: ../en/ch05-collab.xml:733
|
dongsheng@627
|
6824 msgid ""
|
dongsheng@627
|
6825 "If you're using an authentication agent on the client side to store "
|
dongsheng@627
|
6826 "passphrases for your keys, you ought to be able to log into the server "
|
dongsheng@627
|
6827 "without being prompted for a passphrase or a password. If you're prompted "
|
dongsheng@627
|
6828 "for a passphrase, there are a few possible culprits."
|
dongsheng@627
|
6829 msgstr ""
|
dongsheng@627
|
6830
|
dongsheng@627
|
6831 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6832 #: ../en/ch05-collab.xml:739
|
dongsheng@627
|
6833 msgid ""
|
dongsheng@627
|
6834 "You might have forgotten to use <command>ssh-add</command> or "
|
dongsheng@627
|
6835 "<command>pageant</command> to store the passphrase."
|
dongsheng@627
|
6836 msgstr ""
|
dongsheng@627
|
6837
|
dongsheng@627
|
6838 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6839 #: ../en/ch05-collab.xml:743
|
dongsheng@627
|
6840 msgid "You might have stored the passphrase for the wrong key."
|
dongsheng@627
|
6841 msgstr ""
|
dongsheng@627
|
6842
|
dongsheng@627
|
6843 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6844 #: ../en/ch05-collab.xml:746
|
dongsheng@627
|
6845 msgid ""
|
dongsheng@627
|
6846 "If you're being prompted for the remote user's password, there are another "
|
dongsheng@627
|
6847 "few possible problems to check."
|
dongsheng@627
|
6848 msgstr ""
|
dongsheng@627
|
6849
|
dongsheng@627
|
6850 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6851 #: ../en/ch05-collab.xml:749
|
dongsheng@627
|
6852 msgid ""
|
dongsheng@627
|
6853 "Either the user's home directory or their <filename role=\"special\" class="
|
dongsheng@627
|
6854 "\"directory\">.ssh</filename> directory might have excessively liberal "
|
dongsheng@627
|
6855 "permissions. As a result, the ssh daemon will not trust or read their "
|
dongsheng@627
|
6856 "<filename role=\"special\">authorized_keys</filename> file. For example, a "
|
dongsheng@627
|
6857 "group-writable home or <filename role=\"special\" class=\"directory\">.ssh</"
|
dongsheng@627
|
6858 "filename> directory will often cause this symptom."
|
dongsheng@627
|
6859 msgstr ""
|
dongsheng@627
|
6860
|
dongsheng@627
|
6861 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6862 #: ../en/ch05-collab.xml:758
|
dongsheng@627
|
6863 msgid ""
|
dongsheng@627
|
6864 "The user's <filename role=\"special\">authorized_keys</filename> file may "
|
dongsheng@627
|
6865 "have a problem. If anyone other than the user owns or can write to that file, "
|
dongsheng@627
|
6866 "the ssh daemon will not trust or read it."
|
dongsheng@627
|
6867 msgstr ""
|
dongsheng@627
|
6868
|
dongsheng@627
|
6869 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6870 #: ../en/ch05-collab.xml:765
|
dongsheng@627
|
6871 msgid ""
|
dongsheng@627
|
6872 "In the ideal world, you should be able to run the following command "
|
dongsheng@627
|
6873 "successfully, and it should print exactly one line of output, the current "
|
dongsheng@627
|
6874 "date and time."
|
dongsheng@627
|
6875 msgstr ""
|
dongsheng@627
|
6876
|
dongsheng@627
|
6877 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6878 #: ../en/ch05-collab.xml:770
|
dongsheng@627
|
6879 msgid ""
|
dongsheng@627
|
6880 "If, on your server, you have login scripts that print banners or other junk "
|
dongsheng@627
|
6881 "even when running non-interactive commands like this, you should fix them "
|
dongsheng@627
|
6882 "before you continue, so that they only print output if they're run "
|
dongsheng@627
|
6883 "interactively. Otherwise these banners will at least clutter up Mercurial's "
|
dongsheng@627
|
6884 "output. Worse, they could potentially cause problems with running Mercurial "
|
dongsheng@627
|
6885 "commands remotely. Mercurial makes tries to detect and ignore banners in non-"
|
dongsheng@627
|
6886 "interactive <command>ssh</command> sessions, but it is not foolproof. (If "
|
dongsheng@627
|
6887 "you're editing your login scripts on your server, the usual way to see if a "
|
dongsheng@627
|
6888 "login script is running in an interactive shell is to check the return code "
|
dongsheng@627
|
6889 "from the command <literal>tty -s</literal>.)"
|
dongsheng@627
|
6890 msgstr ""
|
dongsheng@627
|
6891
|
dongsheng@627
|
6892 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6893 #: ../en/ch05-collab.xml:784
|
dongsheng@627
|
6894 msgid ""
|
dongsheng@627
|
6895 "Once you've verified that plain old ssh is working with your server, the next "
|
dongsheng@627
|
6896 "step is to ensure that Mercurial runs on the server. The following command "
|
dongsheng@627
|
6897 "should run successfully:"
|
dongsheng@627
|
6898 msgstr ""
|
dongsheng@627
|
6899
|
dongsheng@627
|
6900 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6901 #: ../en/ch05-collab.xml:791
|
dongsheng@627
|
6902 msgid ""
|
dongsheng@627
|
6903 "If you see an error message instead of normal <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
6904 "version</command> output, this is usually because you haven't installed "
|
dongsheng@627
|
6905 "Mercurial to <filename class=\"directory\">/usr/bin</filename>. Don't worry "
|
dongsheng@627
|
6906 "if this is the case; you don't need to do that. But you should check for a "
|
dongsheng@627
|
6907 "few possible problems."
|
dongsheng@627
|
6908 msgstr ""
|
dongsheng@627
|
6909
|
dongsheng@627
|
6910 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6911 #: ../en/ch05-collab.xml:798
|
dongsheng@627
|
6912 msgid ""
|
dongsheng@627
|
6913 "Is Mercurial really installed on the server at all? I know this sounds "
|
dongsheng@627
|
6914 "trivial, but it's worth checking!"
|
dongsheng@627
|
6915 msgstr ""
|
dongsheng@627
|
6916
|
dongsheng@627
|
6917 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6918 #: ../en/ch05-collab.xml:802
|
dongsheng@627
|
6919 msgid ""
|
dongsheng@627
|
6920 "Maybe your shell's search path (usually set via the <envar>PATH</envar> "
|
dongsheng@627
|
6921 "environment variable) is simply misconfigured."
|
dongsheng@627
|
6922 msgstr ""
|
dongsheng@627
|
6923
|
dongsheng@627
|
6924 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6925 #: ../en/ch05-collab.xml:806
|
dongsheng@627
|
6926 msgid ""
|
dongsheng@627
|
6927 "Perhaps your <envar>PATH</envar> environment variable is only being set to "
|
dongsheng@627
|
6928 "point to the location of the <command>hg</command> executable if the login "
|
dongsheng@627
|
6929 "session is interactive. This can happen if you're setting the path in the "
|
dongsheng@627
|
6930 "wrong shell login script. See your shell's documentation for details."
|
dongsheng@627
|
6931 msgstr ""
|
dongsheng@627
|
6932
|
dongsheng@627
|
6933 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
6934 #: ../en/ch05-collab.xml:813
|
dongsheng@627
|
6935 msgid ""
|
dongsheng@627
|
6936 "The <envar>PYTHONPATH</envar> environment variable may need to contain the "
|
dongsheng@627
|
6937 "path to the Mercurial Python modules. It might not be set at all; it could "
|
dongsheng@627
|
6938 "be incorrect; or it may be set only if the login is interactive."
|
dongsheng@627
|
6939 msgstr ""
|
dongsheng@627
|
6940
|
dongsheng@627
|
6941 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6942 #: ../en/ch05-collab.xml:820
|
dongsheng@627
|
6943 msgid ""
|
dongsheng@627
|
6944 "If you can run <command role=\"hg-cmd\">hg version</command> over an ssh "
|
dongsheng@627
|
6945 "connection, well done! You've got the server and client sorted out. You "
|
dongsheng@627
|
6946 "should now be able to use Mercurial to access repositories hosted by that "
|
dongsheng@627
|
6947 "username on that server. If you run into problems with Mercurial and ssh at "
|
dongsheng@627
|
6948 "this point, try using the <option role=\"hg-opt-global\">--debug</option> "
|
dongsheng@627
|
6949 "option to get a clearer picture of what's going on."
|
dongsheng@627
|
6950 msgstr ""
|
dongsheng@627
|
6951
|
dongsheng@627
|
6952 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
6953 #: ../en/ch05-collab.xml:830
|
dongsheng@627
|
6954 msgid "Using compression with ssh"
|
dongsheng@630
|
6955 msgstr "通过 ssh 使用压缩"
|
dongsheng@627
|
6956
|
dongsheng@627
|
6957 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6958 #: ../en/ch05-collab.xml:832
|
dongsheng@627
|
6959 msgid ""
|
dongsheng@627
|
6960 "Mercurial does not compress data when it uses the ssh protocol, because the "
|
dongsheng@627
|
6961 "ssh protocol can transparently compress data. However, the default behaviour "
|
dongsheng@627
|
6962 "of ssh clients is <emphasis>not</emphasis> to request compression."
|
dongsheng@627
|
6963 msgstr ""
|
dongsheng@627
|
6964
|
dongsheng@627
|
6965 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6966 #: ../en/ch05-collab.xml:837
|
dongsheng@627
|
6967 msgid ""
|
dongsheng@627
|
6968 "Over any network other than a fast LAN (even a wireless network), using "
|
dongsheng@627
|
6969 "compression is likely to significantly speed up Mercurial's network "
|
dongsheng@627
|
6970 "operations. For example, over a WAN, someone measured compression as "
|
dongsheng@627
|
6971 "reducing the amount of time required to clone a particularly large repository "
|
dongsheng@627
|
6972 "from 51 minutes to 17 minutes."
|
dongsheng@627
|
6973 msgstr ""
|
dongsheng@627
|
6974
|
dongsheng@627
|
6975 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6976 #: ../en/ch05-collab.xml:844
|
dongsheng@627
|
6977 msgid ""
|
dongsheng@627
|
6978 "Both <command>ssh</command> and <command>plink</command> accept a <option "
|
dongsheng@627
|
6979 "role=\"cmd-opt-ssh\">-C</option> option which turns on compression. You can "
|
dongsheng@650
|
6980 "easily edit your <filename role=\"special\">~/.hgrc</filename> to enable "
|
dongsheng@627
|
6981 "compression for all of Mercurial's uses of the ssh protocol."
|
dongsheng@627
|
6982 msgstr ""
|
dongsheng@627
|
6983
|
dongsheng@627
|
6984 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6985 #: ../en/ch05-collab.xml:852
|
dongsheng@627
|
6986 msgid ""
|
dongsheng@627
|
6987 "If you use <command>ssh</command>, you can configure it to always use "
|
dongsheng@627
|
6988 "compression when talking to your server. To do this, edit your <filename "
|
dongsheng@627
|
6989 "role=\"special\">.ssh/config</filename> file (which may not yet exist), as "
|
dongsheng@627
|
6990 "follows."
|
dongsheng@627
|
6991 msgstr ""
|
dongsheng@627
|
6992
|
dongsheng@627
|
6993 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
6994 #: ../en/ch05-collab.xml:860
|
dongsheng@627
|
6995 msgid ""
|
dongsheng@627
|
6996 "This defines an alias, <literal>hg</literal>. When you use it on the "
|
dongsheng@627
|
6997 "<command>ssh</command> command line or in a Mercurial <literal>ssh</literal>-"
|
dongsheng@627
|
6998 "protocol URL, it will cause <command>ssh</command> to connect to <literal>hg."
|
dongsheng@627
|
6999 "example.com</literal> and use compression. This gives you both a shorter "
|
dongsheng@627
|
7000 "name to type and compression, each of which is a good thing in its own right."
|
dongsheng@627
|
7001 msgstr ""
|
dongsheng@627
|
7002
|
dongsheng@627
|
7003 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
7004 #: ../en/ch05-collab.xml:871
|
dongsheng@627
|
7005 msgid "Serving over HTTP using CGI"
|
dongsheng@630
|
7006 msgstr "使用 CGI 通过 HTTP 提供服务"
|
dongsheng@627
|
7007
|
dongsheng@627
|
7008 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7009 #: ../en/ch05-collab.xml:873
|
dongsheng@627
|
7010 msgid ""
|
dongsheng@627
|
7011 "Depending on how ambitious you are, configuring Mercurial's CGI interface can "
|
dongsheng@627
|
7012 "take anything from a few moments to several hours."
|
dongsheng@627
|
7013 msgstr ""
|
dongsheng@627
|
7014
|
dongsheng@627
|
7015 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7016 #: ../en/ch05-collab.xml:877
|
dongsheng@627
|
7017 msgid ""
|
dongsheng@627
|
7018 "We'll begin with the simplest of examples, and work our way towards a more "
|
dongsheng@627
|
7019 "complex configuration. Even for the most basic case, you're almost certainly "
|
dongsheng@627
|
7020 "going to need to read and modify your web server's configuration."
|
dongsheng@627
|
7021 msgstr ""
|
dongsheng@627
|
7022
|
dongsheng@627
|
7023 #. type: Content of: <book><chapter><sect1><note><para>
|
dongsheng@650
|
7024 #: ../en/ch05-collab.xml:883
|
dongsheng@627
|
7025 msgid ""
|
dongsheng@627
|
7026 "Configuring a web server is a complex, fiddly, and highly system-dependent "
|
dongsheng@627
|
7027 "activity. I can't possibly give you instructions that will cover anything "
|
dongsheng@627
|
7028 "like all of the cases you will encounter. Please use your discretion and "
|
dongsheng@627
|
7029 "judgment in following the sections below. Be prepared to make plenty of "
|
dongsheng@627
|
7030 "mistakes, and to spend a lot of time reading your server's error logs."
|
dongsheng@627
|
7031 msgstr ""
|
dongsheng@627
|
7032
|
dongsheng@627
|
7033 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
7034 #: ../en/ch05-collab.xml:893
|
dongsheng@627
|
7035 msgid "Web server configuration checklist"
|
dongsheng@630
|
7036 msgstr "Web 服务器配置检查表"
|
dongsheng@627
|
7037
|
dongsheng@627
|
7038 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7039 #: ../en/ch05-collab.xml:895
|
dongsheng@627
|
7040 msgid ""
|
dongsheng@627
|
7041 "Before you continue, do take a few moments to check a few aspects of your "
|
dongsheng@627
|
7042 "system's setup."
|
dongsheng@627
|
7043 msgstr ""
|
dongsheng@627
|
7044
|
dongsheng@627
|
7045 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
7046 #: ../en/ch05-collab.xml:899
|
dongsheng@627
|
7047 msgid ""
|
dongsheng@627
|
7048 "Do you have a web server installed at all? Mac OS X ships with Apache, but "
|
dongsheng@627
|
7049 "many other systems may not have a web server installed."
|
dongsheng@627
|
7050 msgstr ""
|
dongsheng@627
|
7051
|
dongsheng@627
|
7052 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
7053 #: ../en/ch05-collab.xml:903
|
dongsheng@627
|
7054 msgid ""
|
dongsheng@627
|
7055 "If you have a web server installed, is it actually running? On most systems, "
|
dongsheng@627
|
7056 "even if one is present, it will be disabled by default."
|
dongsheng@627
|
7057 msgstr ""
|
dongsheng@627
|
7058
|
dongsheng@627
|
7059 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
7060 #: ../en/ch05-collab.xml:907
|
dongsheng@627
|
7061 msgid ""
|
dongsheng@627
|
7062 "Is your server configured to allow you to run CGI programs in the directory "
|
dongsheng@627
|
7063 "where you plan to do so? Most servers default to explicitly disabling the "
|
dongsheng@627
|
7064 "ability to run CGI programs."
|
dongsheng@627
|
7065 msgstr ""
|
dongsheng@627
|
7066
|
dongsheng@627
|
7067 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7068 #: ../en/ch05-collab.xml:913
|
dongsheng@627
|
7069 msgid ""
|
dongsheng@627
|
7070 "If you don't have a web server installed, and don't have substantial "
|
dongsheng@627
|
7071 "experience configuring Apache, you should consider using the "
|
dongsheng@627
|
7072 "<literal>lighttpd</literal> web server instead of Apache. Apache has a well-"
|
dongsheng@627
|
7073 "deserved reputation for baroque and confusing configuration. While "
|
dongsheng@627
|
7074 "<literal>lighttpd</literal> is less capable in some ways than Apache, most of "
|
dongsheng@627
|
7075 "these capabilities are not relevant to serving Mercurial repositories. And "
|
dongsheng@627
|
7076 "<literal>lighttpd</literal> is undeniably <emphasis>much</emphasis> easier to "
|
dongsheng@627
|
7077 "get started with than Apache."
|
dongsheng@627
|
7078 msgstr ""
|
dongsheng@627
|
7079
|
dongsheng@627
|
7080 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
7081 #: ../en/ch05-collab.xml:926
|
dongsheng@627
|
7082 msgid "Basic CGI configuration"
|
dongsheng@630
|
7083 msgstr "基本 CGI 配置"
|
dongsheng@627
|
7084
|
dongsheng@627
|
7085 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7086 #: ../en/ch05-collab.xml:928
|
dongsheng@627
|
7087 msgid ""
|
dongsheng@627
|
7088 "On Unix-like systems, it's common for users to have a subdirectory named "
|
dongsheng@627
|
7089 "something like <filename class=\"directory\">public_html</filename> in their "
|
dongsheng@627
|
7090 "home directory, from which they can serve up web pages. A file named "
|
dongsheng@627
|
7091 "<filename>foo</filename> in this directory will be accessible at a URL of the "
|
dongsheng@650
|
7092 "form <literal>http://www.example.com/username/foo</literal>."
|
dongsheng@650
|
7093 msgstr ""
|
dongsheng@650
|
7094
|
dongsheng@650
|
7095 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7096 #: ../en/ch05-collab.xml:936
|
dongsheng@627
|
7097 msgid ""
|
dongsheng@627
|
7098 "To get started, find the <filename role=\"special\">hgweb.cgi</filename> "
|
dongsheng@627
|
7099 "script that should be present in your Mercurial installation. If you can't "
|
dongsheng@627
|
7100 "quickly find a local copy on your system, simply download one from the master "
|
dongsheng@627
|
7101 "Mercurial repository at <ulink url=\"http://www.selenic.com/repo/hg/raw-file/"
|
dongsheng@627
|
7102 "tip/hgweb.cgi\">http://www.selenic.com/repo/hg/raw-file/tip/hgweb.cgi</ulink>."
|
dongsheng@627
|
7103 msgstr ""
|
dongsheng@627
|
7104
|
dongsheng@627
|
7105 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7106 #: ../en/ch05-collab.xml:943 ../en/ch05-collab.xml:1112
|
dongsheng@627
|
7107 msgid ""
|
dongsheng@627
|
7108 "You'll need to copy this script into your <filename class=\"directory"
|
dongsheng@627
|
7109 "\">public_html</filename> directory, and ensure that it's executable."
|
dongsheng@627
|
7110 msgstr ""
|
dongsheng@627
|
7111
|
dongsheng@627
|
7112 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7113 #: ../en/ch05-collab.xml:948
|
dongsheng@627
|
7114 msgid ""
|
dongsheng@627
|
7115 "The <literal>755</literal> argument to <command>chmod</command> is a little "
|
dongsheng@627
|
7116 "more general than just making the script executable: it ensures that the "
|
dongsheng@627
|
7117 "script is executable by anyone, and that <quote>group</quote> and "
|
dongsheng@627
|
7118 "<quote>other</quote> write permissions are <emphasis>not</emphasis> set. If "
|
dongsheng@627
|
7119 "you were to leave those write permissions enabled, Apache's <literal>suexec</"
|
dongsheng@627
|
7120 "literal> subsystem would likely refuse to execute the script. In fact, "
|
dongsheng@627
|
7121 "<literal>suexec</literal> also insists that the <emphasis>directory</"
|
dongsheng@627
|
7122 "emphasis> in which the script resides must not be writable by others."
|
dongsheng@627
|
7123 msgstr ""
|
dongsheng@627
|
7124
|
dongsheng@627
|
7125 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
7126 #: ../en/ch05-collab.xml:962
|
dongsheng@627
|
7127 msgid "What could <emphasis>possibly</emphasis> go wrong?"
|
dongsheng@630
|
7128 msgstr "什么<emphasis>可能</emphasis>会出错?"
|
dongsheng@627
|
7129
|
dongsheng@627
|
7130 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7131 #: ../en/ch05-collab.xml:965
|
dongsheng@627
|
7132 msgid ""
|
dongsheng@627
|
7133 "Once you've copied the CGI script into place, go into a web browser, and try "
|
dongsheng@627
|
7134 "to open the URL <ulink url=\"http://myhostname/ myuser/hgweb.cgi\">http://"
|
dongsheng@627
|
7135 "myhostname/ myuser/hgweb.cgi</ulink>, <emphasis>but</emphasis> brace yourself "
|
dongsheng@627
|
7136 "for instant failure. There's a high probability that trying to visit this "
|
dongsheng@627
|
7137 "URL will fail, and there are many possible reasons for this. In fact, you're "
|
dongsheng@627
|
7138 "likely to stumble over almost every one of the possible errors below, so "
|
dongsheng@627
|
7139 "please read carefully. The following are all of the problems I ran into on a "
|
dongsheng@627
|
7140 "system running Fedora 7, with a fresh installation of Apache, and a user "
|
dongsheng@627
|
7141 "account that I created specially to perform this exercise."
|
dongsheng@627
|
7142 msgstr ""
|
dongsheng@627
|
7143
|
dongsheng@627
|
7144 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7145 #: ../en/ch05-collab.xml:979
|
dongsheng@627
|
7146 msgid ""
|
dongsheng@627
|
7147 "Your web server may have per-user directories disabled. If you're using "
|
dongsheng@627
|
7148 "Apache, search your config file for a <literal>UserDir</literal> directive. "
|
dongsheng@627
|
7149 "If there's none present, per-user directories will be disabled. If one "
|
dongsheng@627
|
7150 "exists, but its value is <literal>disabled</literal>, then per-user "
|
dongsheng@627
|
7151 "directories will be disabled. Otherwise, the string after <literal>UserDir</"
|
dongsheng@627
|
7152 "literal> gives the name of the subdirectory that Apache will look in under "
|
dongsheng@627
|
7153 "your home directory, for example <filename class=\"directory\">public_html</"
|
dongsheng@627
|
7154 "filename>."
|
dongsheng@627
|
7155 msgstr ""
|
dongsheng@627
|
7156
|
dongsheng@627
|
7157 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7158 #: ../en/ch05-collab.xml:990
|
dongsheng@627
|
7159 msgid ""
|
dongsheng@627
|
7160 "Your file access permissions may be too restrictive. The web server must be "
|
dongsheng@627
|
7161 "able to traverse your home directory and directories under your <filename "
|
dongsheng@627
|
7162 "class=\"directory\">public_html</filename> directory, and read files under "
|
dongsheng@627
|
7163 "the latter too. Here's a quick recipe to help you to make your permissions "
|
dongsheng@627
|
7164 "more appropriate."
|
dongsheng@627
|
7165 msgstr ""
|
dongsheng@627
|
7166
|
dongsheng@627
|
7167 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7168 #: ../en/ch05-collab.xml:1000
|
dongsheng@627
|
7169 msgid ""
|
dongsheng@627
|
7170 "The other possibility with permissions is that you might get a completely "
|
dongsheng@627
|
7171 "empty window when you try to load the script. In this case, it's likely that "
|
dongsheng@627
|
7172 "your access permissions are <emphasis>too permissive</emphasis>. Apache's "
|
dongsheng@627
|
7173 "<literal>suexec</literal> subsystem won't execute a script that's group- or "
|
dongsheng@627
|
7174 "world-writable, for example."
|
dongsheng@627
|
7175 msgstr ""
|
dongsheng@627
|
7176
|
dongsheng@627
|
7177 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7178 #: ../en/ch05-collab.xml:1007
|
dongsheng@627
|
7179 msgid ""
|
dongsheng@627
|
7180 "Your web server may be configured to disallow execution of CGI programs in "
|
dongsheng@627
|
7181 "your per-user web directory. Here's Apache's default per-user configuration "
|
dongsheng@627
|
7182 "from my Fedora system."
|
dongsheng@627
|
7183 msgstr ""
|
dongsheng@627
|
7184
|
dongsheng@650
|
7185 #. type: CDATA
|
dongsheng@650
|
7186 #: ../en/ch05-collab.xml:1012
|
dongsheng@650
|
7187 #, no-wrap
|
dongsheng@650
|
7188 msgid "&ch06-apache-config.lst;]]"
|
dongsheng@650
|
7189 msgstr ""
|
dongsheng@650
|
7190
|
dongsheng@627
|
7191 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7192 #: ../en/ch05-collab.xml:1014
|
dongsheng@627
|
7193 msgid ""
|
dongsheng@627
|
7194 "If you find a similar-looking <literal>Directory</literal> group in your "
|
dongsheng@627
|
7195 "Apache configuration, the directive to look at inside it is <literal>Options</"
|
dongsheng@627
|
7196 "literal>. Add <literal>ExecCGI</literal> to the end of this list if it's "
|
dongsheng@627
|
7197 "missing, and restart the web server."
|
dongsheng@627
|
7198 msgstr ""
|
dongsheng@627
|
7199
|
dongsheng@627
|
7200 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7201 #: ../en/ch05-collab.xml:1021
|
dongsheng@627
|
7202 msgid ""
|
dongsheng@627
|
7203 "If you find that Apache serves you the text of the CGI script instead of "
|
dongsheng@627
|
7204 "executing it, you may need to either uncomment (if already present) or add a "
|
dongsheng@627
|
7205 "directive like this."
|
dongsheng@627
|
7206 msgstr ""
|
dongsheng@627
|
7207
|
dongsheng@627
|
7208 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7209 #: ../en/ch05-collab.xml:1027
|
dongsheng@627
|
7210 msgid ""
|
dongsheng@627
|
7211 "The next possibility is that you might be served with a colourful Python "
|
dongsheng@627
|
7212 "backtrace claiming that it can't import a <literal>mercurial</literal>-"
|
dongsheng@627
|
7213 "related module. This is actually progress! The server is now capable of "
|
dongsheng@627
|
7214 "executing your CGI script. This error is only likely to occur if you're "
|
dongsheng@627
|
7215 "running a private installation of Mercurial, instead of a system-wide "
|
dongsheng@627
|
7216 "version. Remember that the web server runs the CGI program without any of "
|
dongsheng@627
|
7217 "the environment variables that you take for granted in an interactive "
|
dongsheng@627
|
7218 "session. If this error happens to you, edit your copy of <filename role="
|
dongsheng@627
|
7219 "\"special\">hgweb.cgi</filename> and follow the directions inside it to "
|
dongsheng@627
|
7220 "correctly set your <envar>PYTHONPATH</envar> environment variable."
|
dongsheng@627
|
7221 msgstr ""
|
dongsheng@627
|
7222
|
dongsheng@627
|
7223 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7224 #: ../en/ch05-collab.xml:1041
|
dongsheng@627
|
7225 msgid ""
|
dongsheng@627
|
7226 "Finally, you are <emphasis>certain</emphasis> to by served with another "
|
dongsheng@627
|
7227 "colourful Python backtrace: this one will complain that it can't find "
|
dongsheng@627
|
7228 "<filename class=\"directory\">/path/to/repository</filename>. Edit your "
|
dongsheng@627
|
7229 "<filename role=\"special\">hgweb.cgi</filename> script and replace the "
|
dongsheng@627
|
7230 "<filename class=\"directory\">/path/to/repository</filename> string with the "
|
dongsheng@627
|
7231 "complete path to the repository you want to serve up."
|
dongsheng@627
|
7232 msgstr ""
|
dongsheng@627
|
7233
|
dongsheng@627
|
7234 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7235 #: ../en/ch05-collab.xml:1051
|
dongsheng@627
|
7236 msgid ""
|
dongsheng@627
|
7237 "At this point, when you try to reload the page, you should be presented with "
|
dongsheng@627
|
7238 "a nice HTML view of your repository's history. Whew!"
|
dongsheng@627
|
7239 msgstr ""
|
dongsheng@627
|
7240
|
dongsheng@627
|
7241 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
7242 #: ../en/ch05-collab.xml:1057
|
dongsheng@627
|
7243 msgid "Configuring lighttpd"
|
dongsheng@630
|
7244 msgstr "配置 lighttpd"
|
dongsheng@627
|
7245
|
dongsheng@627
|
7246 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7247 #: ../en/ch05-collab.xml:1059
|
dongsheng@627
|
7248 msgid ""
|
dongsheng@627
|
7249 "To be exhaustive in my experiments, I tried configuring the increasingly "
|
dongsheng@627
|
7250 "popular <literal>lighttpd</literal> web server to serve the same repository "
|
dongsheng@627
|
7251 "as I described with Apache above. I had already overcome all of the problems "
|
dongsheng@627
|
7252 "I outlined with Apache, many of which are not server-specific. As a result, "
|
dongsheng@627
|
7253 "I was fairly sure that my file and directory permissions were good, and that "
|
dongsheng@627
|
7254 "my <filename role=\"special\">hgweb.cgi</filename> script was properly edited."
|
dongsheng@627
|
7255 msgstr ""
|
dongsheng@627
|
7256
|
dongsheng@627
|
7257 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7258 #: ../en/ch05-collab.xml:1069
|
dongsheng@627
|
7259 msgid ""
|
dongsheng@627
|
7260 "Once I had Apache running, getting <literal>lighttpd</literal> to serve the "
|
dongsheng@627
|
7261 "repository was a snap (in other words, even if you're trying to use "
|
dongsheng@627
|
7262 "<literal>lighttpd</literal>, you should read the Apache section). I first "
|
dongsheng@627
|
7263 "had to edit the <literal>mod_access</literal> section of its config file to "
|
dongsheng@627
|
7264 "enable <literal>mod_cgi</literal> and <literal>mod_userdir</literal>, both of "
|
dongsheng@627
|
7265 "which were disabled by default on my system. I then added a few lines to the "
|
dongsheng@627
|
7266 "end of the config file, to configure these modules."
|
dongsheng@627
|
7267 msgstr ""
|
dongsheng@627
|
7268
|
dongsheng@627
|
7269 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7270 #: ../en/ch05-collab.xml:1081
|
dongsheng@627
|
7271 msgid ""
|
dongsheng@627
|
7272 "With this done, <literal>lighttpd</literal> ran immediately for me. If I had "
|
dongsheng@627
|
7273 "configured <literal>lighttpd</literal> before Apache, I'd almost certainly "
|
dongsheng@627
|
7274 "have run into many of the same system-level configuration problems as I did "
|
dongsheng@627
|
7275 "with Apache. However, I found <literal>lighttpd</literal> to be noticeably "
|
dongsheng@627
|
7276 "easier to configure than Apache, even though I've used Apache for over a "
|
dongsheng@627
|
7277 "decade, and this was my first exposure to <literal>lighttpd</literal>."
|
dongsheng@627
|
7278 msgstr ""
|
dongsheng@627
|
7279
|
dongsheng@627
|
7280 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
7281 #: ../en/ch05-collab.xml:1094
|
dongsheng@627
|
7282 msgid "Sharing multiple repositories with one CGI script"
|
dongsheng@630
|
7283 msgstr "使用一个 CGI 脚本共享多个版本库"
|
dongsheng@627
|
7284
|
dongsheng@627
|
7285 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7286 #: ../en/ch05-collab.xml:1096
|
dongsheng@627
|
7287 msgid ""
|
dongsheng@627
|
7288 "The <filename role=\"special\">hgweb.cgi</filename> script only lets you "
|
dongsheng@627
|
7289 "publish a single repository, which is an annoying restriction. If you want "
|
dongsheng@627
|
7290 "to publish more than one without wracking yourself with multiple copies of "
|
dongsheng@627
|
7291 "the same script, each with different names, a better choice is to use the "
|
dongsheng@627
|
7292 "<filename role=\"special\">hgwebdir.cgi</filename> script."
|
dongsheng@627
|
7293 msgstr ""
|
dongsheng@627
|
7294
|
dongsheng@627
|
7295 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7296 #: ../en/ch05-collab.xml:1104
|
dongsheng@627
|
7297 msgid ""
|
dongsheng@627
|
7298 "The procedure to configure <filename role=\"special\">hgwebdir.cgi</filename> "
|
dongsheng@627
|
7299 "is only a little more involved than for <filename role=\"special\">hgweb.cgi</"
|
dongsheng@627
|
7300 "filename>. First, you must obtain a copy of the script. If you don't have "
|
dongsheng@627
|
7301 "one handy, you can download a copy from the master Mercurial repository at "
|
dongsheng@627
|
7302 "<ulink url=\"http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi"
|
dongsheng@627
|
7303 "\">http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi</ulink>."
|
dongsheng@627
|
7304 msgstr ""
|
dongsheng@627
|
7305
|
dongsheng@627
|
7306 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7307 #: ../en/ch05-collab.xml:1117
|
dongsheng@627
|
7308 msgid ""
|
dongsheng@627
|
7309 "With basic configuration out of the way, try to visit <ulink url=\"http://"
|
dongsheng@627
|
7310 "myhostname/ myuser/hgwebdir.cgi\">http://myhostname/ myuser/hgwebdir.cgi</"
|
dongsheng@627
|
7311 "ulink> in your browser. It should display an empty list of repositories. If "
|
dongsheng@627
|
7312 "you get a blank window or error message, try walking through the list of "
|
dongsheng@627
|
7313 "potential problems in section <xref linkend=\"sec.collab.wtf\"/>."
|
dongsheng@627
|
7314 msgstr ""
|
dongsheng@627
|
7315
|
dongsheng@627
|
7316 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7317 #: ../en/ch05-collab.xml:1126
|
dongsheng@627
|
7318 msgid ""
|
dongsheng@627
|
7319 "The <filename role=\"special\">hgwebdir.cgi</filename> script relies on an "
|
dongsheng@627
|
7320 "external configuration file. By default, it searches for a file named "
|
dongsheng@627
|
7321 "<filename role=\"special\">hgweb.config</filename> in the same directory as "
|
dongsheng@627
|
7322 "itself. You'll need to create this file, and make it world-readable. The "
|
dongsheng@627
|
7323 "format of the file is similar to a Windows <quote>ini</quote> file, as "
|
dongsheng@627
|
7324 "understood by Python's <literal>ConfigParser</literal> <citation>web:"
|
dongsheng@627
|
7325 "configparser</citation> module."
|
dongsheng@627
|
7326 msgstr ""
|
dongsheng@627
|
7327
|
dongsheng@627
|
7328 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7329 #: ../en/ch05-collab.xml:1136
|
dongsheng@627
|
7330 msgid ""
|
dongsheng@627
|
7331 "The easiest way to configure <filename role=\"special\">hgwebdir.cgi</"
|
dongsheng@627
|
7332 "filename> is with a section named <literal>collections</literal>. This will "
|
dongsheng@627
|
7333 "automatically publish <emphasis>every</emphasis> repository under the "
|
dongsheng@627
|
7334 "directories you name. The section should look like this:"
|
dongsheng@627
|
7335 msgstr ""
|
dongsheng@627
|
7336
|
dongsheng@627
|
7337 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7338 #: ../en/ch05-collab.xml:1144
|
dongsheng@627
|
7339 msgid ""
|
dongsheng@627
|
7340 "Mercurial interprets this by looking at the directory name on the "
|
dongsheng@627
|
7341 "<emphasis>right</emphasis> hand side of the <quote><literal>=</literal></"
|
dongsheng@627
|
7342 "quote> sign; finding repositories in that directory hierarchy; and using the "
|
dongsheng@627
|
7343 "text on the <emphasis>left</emphasis> to strip off matching text from the "
|
dongsheng@627
|
7344 "names it will actually list in the web interface. The remaining component of "
|
dongsheng@627
|
7345 "a path after this stripping has occurred is called a <quote>virtual path</"
|
dongsheng@627
|
7346 "quote>."
|
dongsheng@627
|
7347 msgstr ""
|
dongsheng@627
|
7348
|
dongsheng@627
|
7349 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7350 #: ../en/ch05-collab.xml:1153
|
dongsheng@627
|
7351 msgid ""
|
dongsheng@627
|
7352 "Given the example above, if we have a repository whose local path is "
|
dongsheng@627
|
7353 "<filename class=\"directory\">/my/root/this/repo</filename>, the CGI script "
|
dongsheng@627
|
7354 "will strip the leading <filename class=\"directory\">/my/root</filename> from "
|
dongsheng@627
|
7355 "the name, and publish the repository with a virtual path of <filename class="
|
dongsheng@627
|
7356 "\"directory\">this/repo</filename>. If the base URL for our CGI script is "
|
dongsheng@627
|
7357 "<ulink url=\"http://myhostname/ myuser/hgwebdir.cgi\">http://myhostname/ "
|
dongsheng@627
|
7358 "myuser/hgwebdir.cgi</ulink>, the complete URL for that repository will be "
|
dongsheng@627
|
7359 "<ulink url=\"http://myhostname/ myuser/hgwebdir.cgi/this/repo\">http://"
|
dongsheng@627
|
7360 "myhostname/ myuser/hgwebdir.cgi/this/repo</ulink>."
|
dongsheng@627
|
7361 msgstr ""
|
dongsheng@627
|
7362
|
dongsheng@627
|
7363 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7364 #: ../en/ch05-collab.xml:1167
|
dongsheng@627
|
7365 msgid ""
|
dongsheng@627
|
7366 "If we replace <filename class=\"directory\">/my/root</filename> on the left "
|
dongsheng@627
|
7367 "hand side of this example with <filename class=\"directory\">/my</filename>, "
|
dongsheng@627
|
7368 "then <filename role=\"special\">hgwebdir.cgi</filename> will only strip off "
|
dongsheng@627
|
7369 "<filename class=\"directory\">/my</filename> from the repository name, and "
|
dongsheng@627
|
7370 "will give us a virtual path of <filename class=\"directory\">root/this/repo</"
|
dongsheng@627
|
7371 "filename> instead of <filename class=\"directory\">this/repo</filename>."
|
dongsheng@627
|
7372 msgstr ""
|
dongsheng@627
|
7373
|
dongsheng@627
|
7374 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7375 #: ../en/ch05-collab.xml:1177
|
dongsheng@627
|
7376 msgid ""
|
dongsheng@627
|
7377 "The <filename role=\"special\">hgwebdir.cgi</filename> script will "
|
dongsheng@627
|
7378 "recursively search each directory listed in the <literal>collections</"
|
dongsheng@627
|
7379 "literal> section of its configuration file, but it will <literal>not</"
|
dongsheng@627
|
7380 "literal> recurse into the repositories it finds."
|
dongsheng@627
|
7381 msgstr ""
|
dongsheng@627
|
7382
|
dongsheng@627
|
7383 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7384 #: ../en/ch05-collab.xml:1183
|
dongsheng@627
|
7385 msgid ""
|
dongsheng@627
|
7386 "The <literal>collections</literal> mechanism makes it easy to publish many "
|
dongsheng@627
|
7387 "repositories in a <quote>fire and forget</quote> manner. You only need to "
|
dongsheng@627
|
7388 "set up the CGI script and configuration file one time. Afterwards, you can "
|
dongsheng@627
|
7389 "publish or unpublish a repository at any time by simply moving it into, or "
|
dongsheng@627
|
7390 "out of, the directory hierarchy in which you've configured <filename role="
|
dongsheng@627
|
7391 "\"special\">hgwebdir.cgi</filename> to look."
|
dongsheng@627
|
7392 msgstr ""
|
dongsheng@627
|
7393
|
dongsheng@627
|
7394 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
7395 #: ../en/ch05-collab.xml:1193
|
dongsheng@627
|
7396 msgid "Explicitly specifying which repositories to publish"
|
dongsheng@630
|
7397 msgstr "明确指出要发布的版本库"
|
dongsheng@627
|
7398
|
dongsheng@627
|
7399 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7400 #: ../en/ch05-collab.xml:1196
|
dongsheng@627
|
7401 msgid ""
|
dongsheng@627
|
7402 "In addition to the <literal>collections</literal> mechanism, the <filename "
|
dongsheng@627
|
7403 "role=\"special\">hgwebdir.cgi</filename> script allows you to publish a "
|
dongsheng@627
|
7404 "specific list of repositories. To do so, create a <literal>paths</literal> "
|
dongsheng@627
|
7405 "section, with contents of the following form."
|
dongsheng@627
|
7406 msgstr ""
|
dongsheng@627
|
7407
|
dongsheng@627
|
7408 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7409 #: ../en/ch05-collab.xml:1205
|
dongsheng@627
|
7410 msgid ""
|
dongsheng@627
|
7411 "In this case, the virtual path (the component that will appear in a URL) is "
|
dongsheng@627
|
7412 "on the left hand side of each definition, while the path to the repository is "
|
dongsheng@627
|
7413 "on the right. Notice that there does not need to be any relationship between "
|
dongsheng@627
|
7414 "the virtual path you choose and the location of a repository in your "
|
dongsheng@627
|
7415 "filesystem."
|
dongsheng@627
|
7416 msgstr ""
|
dongsheng@627
|
7417
|
dongsheng@627
|
7418 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7419 #: ../en/ch05-collab.xml:1212
|
dongsheng@627
|
7420 msgid ""
|
dongsheng@627
|
7421 "If you wish, you can use both the <literal>collections</literal> and "
|
dongsheng@627
|
7422 "<literal>paths</literal> mechanisms simultaneously in a single configuration "
|
dongsheng@627
|
7423 "file."
|
dongsheng@627
|
7424 msgstr ""
|
dongsheng@627
|
7425
|
dongsheng@627
|
7426 #. type: Content of: <book><chapter><sect1><sect2><sect3><note><para>
|
dongsheng@650
|
7427 #: ../en/ch05-collab.xml:1218
|
dongsheng@627
|
7428 msgid ""
|
dongsheng@627
|
7429 "If multiple repositories have the same virtual path, <filename role=\"special"
|
dongsheng@627
|
7430 "\">hgwebdir.cgi</filename> will not report an error. Instead, it will behave "
|
dongsheng@627
|
7431 "unpredictably."
|
dongsheng@627
|
7432 msgstr ""
|
dongsheng@627
|
7433
|
dongsheng@627
|
7434 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
7435 #: ../en/ch05-collab.xml:1227
|
dongsheng@627
|
7436 msgid "Downloading source archives"
|
dongsheng@630
|
7437 msgstr "下载源代码档案包"
|
dongsheng@627
|
7438
|
dongsheng@627
|
7439 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7440 #: ../en/ch05-collab.xml:1229
|
dongsheng@627
|
7441 msgid ""
|
dongsheng@627
|
7442 "Mercurial's web interface lets users download an archive of any revision. "
|
dongsheng@627
|
7443 "This archive will contain a snapshot of the working directory as of that "
|
dongsheng@627
|
7444 "revision, but it will not contain a copy of the repository data."
|
dongsheng@627
|
7445 msgstr ""
|
dongsheng@627
|
7446
|
dongsheng@627
|
7447 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7448 #: ../en/ch05-collab.xml:1234
|
dongsheng@627
|
7449 msgid ""
|
dongsheng@627
|
7450 "By default, this feature is not enabled. To enable it, you'll need to add an "
|
dongsheng@627
|
7451 "<envar role=\"rc-item-web\">allow_archive</envar> item to the <literal role="
|
dongsheng@650
|
7452 "\"rc-web\">web</literal> section of your <filename role=\"special\">~/.hgrc</"
|
dongsheng@627
|
7453 "filename>."
|
dongsheng@627
|
7454 msgstr ""
|
dongsheng@627
|
7455
|
dongsheng@627
|
7456 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
7457 #: ../en/ch05-collab.xml:1242
|
dongsheng@627
|
7458 msgid "Web configuration options"
|
dongsheng@630
|
7459 msgstr "Web 配置选项"
|
dongsheng@627
|
7460
|
dongsheng@627
|
7461 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7462 #: ../en/ch05-collab.xml:1244
|
dongsheng@627
|
7463 msgid ""
|
dongsheng@627
|
7464 "Mercurial's web interfaces (the <command role=\"hg-cmd\">hg serve</command> "
|
dongsheng@627
|
7465 "command, and the <filename role=\"special\">hgweb.cgi</filename> and "
|
dongsheng@627
|
7466 "<filename role=\"special\">hgwebdir.cgi</filename> scripts) have a number of "
|
dongsheng@627
|
7467 "configuration options that you can set. These belong in a section named "
|
dongsheng@627
|
7468 "<literal role=\"rc-web\">web</literal>."
|
dongsheng@627
|
7469 msgstr ""
|
dongsheng@627
|
7470
|
dongsheng@627
|
7471 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7472 #: ../en/ch05-collab.xml:1252
|
dongsheng@627
|
7473 msgid ""
|
dongsheng@627
|
7474 "<envar role=\"rc-item-web\">allow_archive</envar>: Determines which (if any) "
|
dongsheng@627
|
7475 "archive download mechanisms Mercurial supports. If you enable this feature, "
|
dongsheng@627
|
7476 "users of the web interface will be able to download an archive of whatever "
|
dongsheng@627
|
7477 "revision of a repository they are viewing. To enable the archive feature, "
|
dongsheng@627
|
7478 "this item must take the form of a sequence of words drawn from the list below."
|
dongsheng@627
|
7479 msgstr ""
|
dongsheng@627
|
7480
|
dongsheng@627
|
7481 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><itemizedlist><listitem><para>
|
dongsheng@650
|
7482 #: ../en/ch05-collab.xml:1261
|
dongsheng@627
|
7483 msgid ""
|
dongsheng@627
|
7484 "<literal>bz2</literal>: A <command>tar</command> archive, compressed using "
|
dongsheng@627
|
7485 "<literal>bzip2</literal> compression. This has the best compression ratio, "
|
dongsheng@627
|
7486 "but uses the most CPU time on the server."
|
dongsheng@627
|
7487 msgstr ""
|
dongsheng@627
|
7488
|
dongsheng@627
|
7489 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><itemizedlist><listitem><para>
|
dongsheng@650
|
7490 #: ../en/ch05-collab.xml:1267
|
dongsheng@627
|
7491 msgid ""
|
dongsheng@627
|
7492 "<literal>gz</literal>: A <command>tar</command> archive, compressed using "
|
dongsheng@627
|
7493 "<literal>gzip</literal> compression."
|
dongsheng@627
|
7494 msgstr ""
|
dongsheng@627
|
7495
|
dongsheng@627
|
7496 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><itemizedlist><listitem><para>
|
dongsheng@650
|
7497 #: ../en/ch05-collab.xml:1271
|
dongsheng@627
|
7498 msgid ""
|
dongsheng@627
|
7499 "<literal>zip</literal>: A <command>zip</command> archive, compressed using "
|
dongsheng@627
|
7500 "LZW compression. This format has the worst compression ratio, but is widely "
|
dongsheng@627
|
7501 "used in the Windows world."
|
dongsheng@627
|
7502 msgstr ""
|
dongsheng@627
|
7503
|
dongsheng@627
|
7504 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7505 #: ../en/ch05-collab.xml:1277
|
dongsheng@627
|
7506 msgid ""
|
dongsheng@627
|
7507 "If you provide an empty list, or don't have an <envar role=\"rc-item-web"
|
dongsheng@627
|
7508 "\">allow_archive</envar> entry at all, this feature will be disabled. Here "
|
dongsheng@627
|
7509 "is an example of how to enable all three supported formats."
|
dongsheng@627
|
7510 msgstr ""
|
dongsheng@627
|
7511
|
dongsheng@627
|
7512 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7513 #: ../en/ch05-collab.xml:1284
|
dongsheng@627
|
7514 msgid ""
|
dongsheng@627
|
7515 "<envar role=\"rc-item-web\">allowpull</envar>: Boolean. Determines whether "
|
dongsheng@627
|
7516 "the web interface allows remote users to <command role=\"hg-cmd\">hg pull</"
|
dongsheng@627
|
7517 "command> and <command role=\"hg-cmd\">hg clone</command> this repository over "
|
dongsheng@627
|
7518 "HTTP. If set to <literal>no</literal> or <literal>false</literal>, only the "
|
dongsheng@627
|
7519 "<quote>human-oriented</quote> portion of the web interface is available."
|
dongsheng@627
|
7520 msgstr ""
|
dongsheng@627
|
7521
|
dongsheng@627
|
7522 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7523 #: ../en/ch05-collab.xml:1293
|
dongsheng@627
|
7524 msgid ""
|
dongsheng@627
|
7525 "<envar role=\"rc-item-web\">contact</envar>: String. A free-form (but "
|
dongsheng@627
|
7526 "preferably brief) string identifying the person or group in charge of the "
|
dongsheng@627
|
7527 "repository. This often contains the name and email address of a person or "
|
dongsheng@627
|
7528 "mailing list. It often makes sense to place this entry in a repository's own "
|
dongsheng@627
|
7529 "<filename role=\"special\">.hg/hgrc</filename> file, but it can make sense to "
|
dongsheng@650
|
7530 "use in a global <filename role=\"special\">~/.hgrc</filename> if every "
|
dongsheng@627
|
7531 "repository has a single maintainer."
|
dongsheng@627
|
7532 msgstr ""
|
dongsheng@627
|
7533
|
dongsheng@627
|
7534 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7535 #: ../en/ch05-collab.xml:1304
|
dongsheng@627
|
7536 msgid ""
|
dongsheng@627
|
7537 "<envar role=\"rc-item-web\">maxchanges</envar>: Integer. The default maximum "
|
dongsheng@627
|
7538 "number of changesets to display in a single page of output."
|
dongsheng@627
|
7539 msgstr ""
|
dongsheng@627
|
7540
|
dongsheng@627
|
7541 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7542 #: ../en/ch05-collab.xml:1308
|
dongsheng@627
|
7543 msgid ""
|
dongsheng@627
|
7544 "<envar role=\"rc-item-web\">maxfiles</envar>: Integer. The default maximum "
|
dongsheng@627
|
7545 "number of modified files to display in a single page of output."
|
dongsheng@627
|
7546 msgstr ""
|
dongsheng@627
|
7547
|
dongsheng@627
|
7548 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7549 #: ../en/ch05-collab.xml:1312
|
dongsheng@627
|
7550 msgid ""
|
dongsheng@627
|
7551 "<envar role=\"rc-item-web\">stripes</envar>: Integer. If the web interface "
|
dongsheng@627
|
7552 "displays alternating <quote>stripes</quote> to make it easier to visually "
|
dongsheng@627
|
7553 "align rows when you are looking at a table, this number controls the number "
|
dongsheng@627
|
7554 "of rows in each stripe."
|
dongsheng@627
|
7555 msgstr ""
|
dongsheng@627
|
7556
|
dongsheng@627
|
7557 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7558 #: ../en/ch05-collab.xml:1318
|
dongsheng@627
|
7559 msgid ""
|
dongsheng@627
|
7560 "<envar role=\"rc-item-web\">style</envar>: Controls the template Mercurial "
|
dongsheng@627
|
7561 "uses to display the web interface. Mercurial ships with two web templates, "
|
dongsheng@627
|
7562 "named <literal>default</literal> and <literal>gitweb</literal> (the latter is "
|
dongsheng@627
|
7563 "much more visually attractive). You can also specify a custom template of "
|
dongsheng@627
|
7564 "your own; see chapter <xref linkend=\"chap.template\"/> for details. Here, "
|
dongsheng@627
|
7565 "you can see how to enable the <literal>gitweb</literal> style."
|
dongsheng@627
|
7566 msgstr ""
|
dongsheng@627
|
7567
|
dongsheng@627
|
7568 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
7569 #: ../en/ch05-collab.xml:1330
|
dongsheng@627
|
7570 msgid ""
|
dongsheng@627
|
7571 "<envar role=\"rc-item-web\">templates</envar>: Path. The directory in which "
|
dongsheng@627
|
7572 "to search for template files. By default, Mercurial searches in the "
|
dongsheng@627
|
7573 "directory in which it was installed."
|
dongsheng@627
|
7574 msgstr ""
|
dongsheng@627
|
7575
|
dongsheng@627
|
7576 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7577 #: ../en/ch05-collab.xml:1335
|
dongsheng@627
|
7578 msgid ""
|
dongsheng@627
|
7579 "If you are using <filename role=\"special\">hgwebdir.cgi</filename>, you can "
|
dongsheng@627
|
7580 "place a few configuration items in a <literal role=\"rc-web\">web</literal> "
|
dongsheng@627
|
7581 "section of the <filename role=\"special\">hgweb.config</filename> file "
|
dongsheng@650
|
7582 "instead of a <filename role=\"special\">~/.hgrc</filename> file, for "
|
dongsheng@627
|
7583 "convenience. These items are <envar role=\"rc-item-web\">motd</envar> and "
|
dongsheng@627
|
7584 "<envar role=\"rc-item-web\">style</envar>."
|
dongsheng@627
|
7585 msgstr ""
|
dongsheng@627
|
7586
|
dongsheng@627
|
7587 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
7588 #: ../en/ch05-collab.xml:1346
|
dongsheng@627
|
7589 msgid "Options specific to an individual repository"
|
dongsheng@630
|
7590 msgstr "针对单个版本库的选项"
|
dongsheng@627
|
7591
|
dongsheng@627
|
7592 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7593 #: ../en/ch05-collab.xml:1348
|
dongsheng@627
|
7594 msgid ""
|
dongsheng@627
|
7595 "A few <literal role=\"rc-web\">web</literal> configuration items ought to be "
|
dongsheng@627
|
7596 "placed in a repository's local <filename role=\"special\">.hg/hgrc</"
|
dongsheng@650
|
7597 "filename>, rather than a user's or global <filename role=\"special\">~/.hgrc</"
|
dongsheng@627
|
7598 "filename>."
|
dongsheng@627
|
7599 msgstr ""
|
dongsheng@627
|
7600
|
dongsheng@627
|
7601 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
7602 #: ../en/ch05-collab.xml:1353
|
dongsheng@627
|
7603 msgid ""
|
dongsheng@627
|
7604 "<envar role=\"rc-item-web\">description</envar>: String. A free-form (but "
|
dongsheng@627
|
7605 "preferably brief) string that describes the contents or purpose of the "
|
dongsheng@627
|
7606 "repository."
|
dongsheng@627
|
7607 msgstr ""
|
dongsheng@627
|
7608
|
dongsheng@627
|
7609 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
7610 #: ../en/ch05-collab.xml:1358
|
dongsheng@627
|
7611 msgid ""
|
dongsheng@627
|
7612 "<envar role=\"rc-item-web\">name</envar>: String. The name to use for the "
|
dongsheng@627
|
7613 "repository in the web interface. This overrides the default name, which is "
|
dongsheng@627
|
7614 "the last component of the repository's path."
|
dongsheng@627
|
7615 msgstr ""
|
dongsheng@627
|
7616
|
dongsheng@627
|
7617 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
7618 #: ../en/ch05-collab.xml:1366
|
dongsheng@627
|
7619 msgid ""
|
dongsheng@627
|
7620 "Options specific to the <command role=\"hg-cmd\">hg serve</command> command"
|
dongsheng@630
|
7621 msgstr "命令 <command role=\"hg-cmd\">hg serve</command> 的选项"
|
dongsheng@627
|
7622
|
dongsheng@627
|
7623 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7624 #: ../en/ch05-collab.xml:1369
|
dongsheng@627
|
7625 msgid ""
|
dongsheng@627
|
7626 "Some of the items in the <literal role=\"rc-web\">web</literal> section of a "
|
dongsheng@650
|
7627 "<filename role=\"special\">~/.hgrc</filename> file are only for use with the "
|
dongsheng@650
|
7628 "<command role=\"hg-cmd\">hg serve</command> command."
|
dongsheng@627
|
7629 msgstr ""
|
dongsheng@627
|
7630
|
dongsheng@627
|
7631 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
7632 #: ../en/ch05-collab.xml:1375
|
dongsheng@627
|
7633 msgid ""
|
dongsheng@627
|
7634 "<envar role=\"rc-item-web\">accesslog</envar>: Path. The name of a file into "
|
dongsheng@627
|
7635 "which to write an access log. By default, the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
7636 "serve</command> command writes this information to standard output, not to a "
|
dongsheng@627
|
7637 "file. Log entries are written in the standard <quote>combined</quote> file "
|
dongsheng@627
|
7638 "format used by almost all web servers."
|
dongsheng@627
|
7639 msgstr ""
|
dongsheng@627
|
7640
|
dongsheng@627
|
7641 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
7642 #: ../en/ch05-collab.xml:1383
|
dongsheng@627
|
7643 msgid ""
|
dongsheng@627
|
7644 "<envar role=\"rc-item-web\">address</envar>: String. The local address on "
|
dongsheng@627
|
7645 "which the server should listen for incoming connections. By default, the "
|
dongsheng@627
|
7646 "server listens on all addresses."
|
dongsheng@627
|
7647 msgstr ""
|
dongsheng@627
|
7648
|
dongsheng@627
|
7649 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
7650 #: ../en/ch05-collab.xml:1388
|
dongsheng@627
|
7651 msgid ""
|
dongsheng@627
|
7652 "<envar role=\"rc-item-web\">errorlog</envar>: Path. The name of a file into "
|
dongsheng@627
|
7653 "which to write an error log. By default, the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
7654 "serve</command> command writes this information to standard error, not to a "
|
dongsheng@627
|
7655 "file."
|
dongsheng@627
|
7656 msgstr ""
|
dongsheng@627
|
7657
|
dongsheng@627
|
7658 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
7659 #: ../en/ch05-collab.xml:1394
|
dongsheng@627
|
7660 msgid ""
|
dongsheng@627
|
7661 "<envar role=\"rc-item-web\">ipv6</envar>: Boolean. Whether to use the IPv6 "
|
dongsheng@627
|
7662 "protocol. By default, IPv6 is not used."
|
dongsheng@627
|
7663 msgstr ""
|
dongsheng@627
|
7664
|
dongsheng@627
|
7665 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
7666 #: ../en/ch05-collab.xml:1398
|
dongsheng@627
|
7667 msgid ""
|
dongsheng@627
|
7668 "<envar role=\"rc-item-web\">port</envar>: Integer. The TCP port number on "
|
dongsheng@627
|
7669 "which the server should listen. The default port number used is 8000."
|
dongsheng@627
|
7670 msgstr ""
|
dongsheng@627
|
7671
|
dongsheng@627
|
7672 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
7673 #: ../en/ch05-collab.xml:1405
|
dongsheng@650
|
7674 msgid ""
|
dongsheng@650
|
7675 "Choosing the right <filename role=\"special\">~/.hgrc</filename> file to add "
|
dongsheng@650
|
7676 "<literal role=\"rc-web\">web</literal> items to"
|
dongsheng@627
|
7677 msgstr ""
|
dongsheng@653
|
7678 "选择正确的 <filename role=\"special\"> ~/.hgrc</filename> 文件增加到 <literal "
|
dongsheng@630
|
7679 "role=\"rc-web\">web</literal> 条目"
|
dongsheng@627
|
7680
|
dongsheng@627
|
7681 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7682 #: ../en/ch05-collab.xml:1409
|
dongsheng@627
|
7683 msgid ""
|
dongsheng@627
|
7684 "It is important to remember that a web server like Apache or "
|
dongsheng@627
|
7685 "<literal>lighttpd</literal> will run under a user ID that is different to "
|
dongsheng@627
|
7686 "yours. CGI scripts run by your server, such as <filename role=\"special"
|
dongsheng@627
|
7687 "\">hgweb.cgi</filename>, will usually also run under that user ID."
|
dongsheng@627
|
7688 msgstr ""
|
dongsheng@627
|
7689
|
dongsheng@627
|
7690 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7691 #: ../en/ch05-collab.xml:1416
|
dongsheng@627
|
7692 msgid ""
|
dongsheng@627
|
7693 "If you add <literal role=\"rc-web\">web</literal> items to your own personal "
|
dongsheng@650
|
7694 "<filename role=\"special\">~/.hgrc</filename> file, CGI scripts won't read "
|
dongsheng@650
|
7695 "that <filename role=\"special\">~/.hgrc</filename> file. Those settings will "
|
dongsheng@650
|
7696 "thus only affect the behaviour of the <command role=\"hg-cmd\">hg serve</"
|
dongsheng@627
|
7697 "command> command when you run it. To cause CGI scripts to see your settings, "
|
dongsheng@650
|
7698 "either create a <filename role=\"special\">~/.hgrc</filename> file in the "
|
dongsheng@627
|
7699 "home directory of the user ID that runs your web server, or add those "
|
dongsheng@650
|
7700 "settings to a system-wide <filename role=\"special\">~/.hgrc</filename> file."
|
dongsheng@627
|
7701 msgstr ""
|
dongsheng@627
|
7702
|
dongsheng@627
|
7703 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
7704 #: ../en/ch06-filenames.xml:5
|
dongsheng@627
|
7705 msgid "File names and pattern matching"
|
dongsheng@627
|
7706 msgstr "文件名称与模式匹配"
|
dongsheng@627
|
7707
|
dongsheng@627
|
7708 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
7709 #: ../en/ch06-filenames.xml:7
|
dongsheng@627
|
7710 msgid ""
|
dongsheng@627
|
7711 "Mercurial provides mechanisms that let you work with file names in a "
|
dongsheng@627
|
7712 "consistent and expressive way."
|
dongsheng@627
|
7713 msgstr ""
|
dongsheng@627
|
7714
|
dongsheng@627
|
7715 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
7716 #: ../en/ch06-filenames.xml:11
|
dongsheng@627
|
7717 msgid "Simple file naming"
|
dongsheng@630
|
7718 msgstr "简单文件名称"
|
dongsheng@627
|
7719
|
dongsheng@627
|
7720 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7721 #: ../en/ch06-filenames.xml:13
|
dongsheng@627
|
7722 msgid ""
|
dongsheng@627
|
7723 "Mercurial uses a unified piece of machinery <quote>under the hood</quote> to "
|
dongsheng@627
|
7724 "handle file names. Every command behaves uniformly with respect to file "
|
dongsheng@627
|
7725 "names. The way in which commands work with file names is as follows."
|
dongsheng@627
|
7726 msgstr ""
|
dongsheng@627
|
7727
|
dongsheng@627
|
7728 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7729 #: ../en/ch06-filenames.xml:18
|
dongsheng@627
|
7730 msgid ""
|
dongsheng@627
|
7731 "If you explicitly name real files on the command line, Mercurial works with "
|
dongsheng@627
|
7732 "exactly those files, as you would expect. &interaction.filenames.files;"
|
dongsheng@627
|
7733 msgstr ""
|
dongsheng@627
|
7734
|
dongsheng@627
|
7735 #
|
dongsheng@627
|
7736 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7737 #: ../en/ch06-filenames.xml:22
|
dongsheng@627
|
7738 msgid ""
|
dongsheng@627
|
7739 "When you provide a directory name, Mercurial will interpret this as "
|
dongsheng@627
|
7740 "<quote>operate on every file in this directory and its subdirectories</"
|
dongsheng@627
|
7741 "quote>. Mercurial traverses the files and subdirectories in a directory in "
|
dongsheng@627
|
7742 "alphabetical order. When it encounters a subdirectory, it will traverse that "
|
dongsheng@627
|
7743 "subdirectory before continuing with the current directory."
|
dongsheng@627
|
7744 msgstr ""
|
dongsheng@627
|
7745
|
dongsheng@627
|
7746 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
7747 #: ../en/ch06-filenames.xml:33
|
dongsheng@627
|
7748 msgid "Running commands without any file names"
|
dongsheng@630
|
7749 msgstr "不提供文件名称的执行命令"
|
dongsheng@627
|
7750
|
dongsheng@627
|
7751 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7752 #: ../en/ch06-filenames.xml:35
|
dongsheng@627
|
7753 msgid ""
|
dongsheng@627
|
7754 "Mercurial's commands that work with file names have useful default behaviours "
|
dongsheng@627
|
7755 "when you invoke them without providing any file names or patterns. What kind "
|
dongsheng@627
|
7756 "of behaviour you should expect depends on what the command does. Here are a "
|
dongsheng@627
|
7757 "few rules of thumb you can use to predict what a command is likely to do if "
|
dongsheng@627
|
7758 "you don't give it any names to work with."
|
dongsheng@627
|
7759 msgstr ""
|
dongsheng@627
|
7760
|
dongsheng@627
|
7761 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
7762 #: ../en/ch06-filenames.xml:42
|
dongsheng@627
|
7763 msgid ""
|
dongsheng@627
|
7764 "Most commands will operate on the entire working directory. This is what the "
|
dongsheng@627
|
7765 "<command role=\"hg-cmd\">hg add</command> command does, for example."
|
dongsheng@627
|
7766 msgstr ""
|
dongsheng@627
|
7767
|
dongsheng@627
|
7768 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
7769 #: ../en/ch06-filenames.xml:46
|
dongsheng@627
|
7770 msgid ""
|
dongsheng@627
|
7771 "If the command has effects that are difficult or impossible to reverse, it "
|
dongsheng@627
|
7772 "will force you to explicitly provide at least one name or pattern (see "
|
dongsheng@627
|
7773 "below). This protects you from accidentally deleting files by running "
|
dongsheng@627
|
7774 "<command role=\"hg-cmd\">hg remove</command> with no arguments, for example."
|
dongsheng@627
|
7775 msgstr ""
|
dongsheng@627
|
7776
|
dongsheng@627
|
7777 #
|
dongsheng@627
|
7778 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7779 #: ../en/ch06-filenames.xml:54
|
dongsheng@627
|
7780 msgid ""
|
dongsheng@627
|
7781 "It's easy to work around these default behaviours if they don't suit you. If "
|
dongsheng@627
|
7782 "a command normally operates on the whole working directory, you can invoke it "
|
dongsheng@627
|
7783 "on just the current directory and its subdirectories by giving it the name "
|
dongsheng@627
|
7784 "<quote><filename class=\"directory\">.</filename></quote>."
|
dongsheng@627
|
7785 msgstr ""
|
dongsheng@627
|
7786
|
dongsheng@627
|
7787 #
|
dongsheng@627
|
7788 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7789 #: ../en/ch06-filenames.xml:62
|
dongsheng@627
|
7790 msgid ""
|
dongsheng@627
|
7791 "Along the same lines, some commands normally print file names relative to the "
|
dongsheng@627
|
7792 "root of the repository, even if you're invoking them from a subdirectory. "
|
dongsheng@627
|
7793 "Such a command will print file names relative to your subdirectory if you "
|
dongsheng@627
|
7794 "give it explicit names. Here, we're going to run <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
7795 "status</command> from a subdirectory, and get it to operate on the entire "
|
dongsheng@627
|
7796 "working directory while printing file names relative to our subdirectory, by "
|
dongsheng@627
|
7797 "passing it the output of the <command role=\"hg-cmd\">hg root</command> "
|
dongsheng@627
|
7798 "command."
|
dongsheng@627
|
7799 msgstr ""
|
dongsheng@627
|
7800
|
dongsheng@627
|
7801 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
7802 #: ../en/ch06-filenames.xml:76
|
dongsheng@627
|
7803 msgid "Telling you what's going on"
|
dongsheng@630
|
7804 msgstr "告诉你正在做什么"
|
dongsheng@627
|
7805
|
dongsheng@627
|
7806 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7807 #: ../en/ch06-filenames.xml:78
|
dongsheng@627
|
7808 msgid ""
|
dongsheng@627
|
7809 "The <command role=\"hg-cmd\">hg add</command> example in the preceding "
|
dongsheng@627
|
7810 "section illustrates something else that's helpful about Mercurial commands. "
|
dongsheng@627
|
7811 "If a command operates on a file that you didn't name explicitly on the "
|
dongsheng@627
|
7812 "command line, it will usually print the name of the file, so that you will "
|
dongsheng@627
|
7813 "not be surprised what's going on."
|
dongsheng@627
|
7814 msgstr ""
|
dongsheng@627
|
7815
|
dongsheng@627
|
7816 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7817 #: ../en/ch06-filenames.xml:85
|
dongsheng@627
|
7818 msgid ""
|
dongsheng@627
|
7819 "The principle here is of <emphasis>least surprise</emphasis>. If you've "
|
dongsheng@627
|
7820 "exactly named a file on the command line, there's no point in repeating it "
|
dongsheng@627
|
7821 "back at you. If Mercurial is acting on a file <emphasis>implicitly</"
|
dongsheng@627
|
7822 "emphasis>, because you provided no names, or a directory, or a pattern (see "
|
dongsheng@627
|
7823 "below), it's safest to tell you what it's doing."
|
dongsheng@627
|
7824 msgstr ""
|
dongsheng@627
|
7825
|
dongsheng@627
|
7826 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7827 #: ../en/ch06-filenames.xml:92
|
dongsheng@627
|
7828 msgid ""
|
dongsheng@627
|
7829 "For commands that behave this way, you can silence them using the <option "
|
dongsheng@627
|
7830 "role=\"hg-opt-global\">-q</option> option. You can also get them to print "
|
dongsheng@627
|
7831 "the name of every file, even those you've named explicitly, using the <option "
|
dongsheng@627
|
7832 "role=\"hg-opt-global\">-v</option> option."
|
dongsheng@627
|
7833 msgstr ""
|
dongsheng@627
|
7834
|
dongsheng@627
|
7835 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
7836 #: ../en/ch06-filenames.xml:100
|
dongsheng@627
|
7837 msgid "Using patterns to identify files"
|
dongsheng@630
|
7838 msgstr "使用模式标识文件"
|
dongsheng@627
|
7839
|
dongsheng@627
|
7840 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7841 #: ../en/ch06-filenames.xml:102
|
dongsheng@627
|
7842 msgid ""
|
dongsheng@627
|
7843 "In addition to working with file and directory names, Mercurial lets you use "
|
dongsheng@627
|
7844 "<emphasis>patterns</emphasis> to identify files. Mercurial's pattern "
|
dongsheng@627
|
7845 "handling is expressive."
|
dongsheng@627
|
7846 msgstr ""
|
dongsheng@627
|
7847
|
dongsheng@627
|
7848 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7849 #: ../en/ch06-filenames.xml:106
|
dongsheng@627
|
7850 msgid ""
|
dongsheng@627
|
7851 "On Unix-like systems (Linux, MacOS, etc.), the job of matching file names to "
|
dongsheng@627
|
7852 "patterns normally falls to the shell. On these systems, you must explicitly "
|
dongsheng@627
|
7853 "tell Mercurial that a name is a pattern. On Windows, the shell does not "
|
dongsheng@627
|
7854 "expand patterns, so Mercurial will automatically identify names that are "
|
dongsheng@627
|
7855 "patterns, and expand them for you."
|
dongsheng@627
|
7856 msgstr ""
|
dongsheng@627
|
7857
|
dongsheng@627
|
7858 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7859 #: ../en/ch06-filenames.xml:113
|
dongsheng@627
|
7860 msgid ""
|
dongsheng@627
|
7861 "To provide a pattern in place of a regular name on the command line, the "
|
dongsheng@627
|
7862 "mechanism is simple:"
|
dongsheng@627
|
7863 msgstr ""
|
dongsheng@627
|
7864
|
dongsheng@627
|
7865 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7866 #: ../en/ch06-filenames.xml:116
|
dongsheng@627
|
7867 msgid ""
|
dongsheng@627
|
7868 "That is, a pattern is identified by a short text string that says what kind "
|
dongsheng@627
|
7869 "of pattern this is, followed by a colon, followed by the actual pattern."
|
dongsheng@627
|
7870 msgstr ""
|
dongsheng@627
|
7871
|
dongsheng@627
|
7872 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7873 #: ../en/ch06-filenames.xml:120
|
dongsheng@627
|
7874 msgid ""
|
dongsheng@627
|
7875 "Mercurial supports two kinds of pattern syntax. The most frequently used is "
|
dongsheng@627
|
7876 "called <literal>glob</literal>; this is the same kind of pattern matching "
|
dongsheng@627
|
7877 "used by the Unix shell, and should be familiar to Windows command prompt "
|
dongsheng@627
|
7878 "users, too."
|
dongsheng@627
|
7879 msgstr ""
|
dongsheng@627
|
7880
|
dongsheng@627
|
7881 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7882 #: ../en/ch06-filenames.xml:125
|
dongsheng@627
|
7883 msgid ""
|
dongsheng@627
|
7884 "When Mercurial does automatic pattern matching on Windows, it uses "
|
dongsheng@627
|
7885 "<literal>glob</literal> syntax. You can thus omit the <quote><literal>glob:</"
|
dongsheng@627
|
7886 "literal></quote> prefix on Windows, but it's safe to use it, too."
|
dongsheng@627
|
7887 msgstr ""
|
dongsheng@627
|
7888
|
dongsheng@627
|
7889 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7890 #: ../en/ch06-filenames.xml:130
|
dongsheng@627
|
7891 msgid ""
|
dongsheng@627
|
7892 "The <literal>re</literal> syntax is more powerful; it lets you specify "
|
dongsheng@627
|
7893 "patterns using regular expressions, also known as regexps."
|
dongsheng@627
|
7894 msgstr ""
|
dongsheng@627
|
7895
|
dongsheng@627
|
7896 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
7897 #: ../en/ch06-filenames.xml:134
|
dongsheng@627
|
7898 msgid ""
|
dongsheng@627
|
7899 "By the way, in the examples that follow, notice that I'm careful to wrap all "
|
dongsheng@627
|
7900 "of my patterns in quote characters, so that they won't get expanded by the "
|
dongsheng@627
|
7901 "shell before Mercurial sees them."
|
dongsheng@627
|
7902 msgstr ""
|
dongsheng@627
|
7903
|
dongsheng@627
|
7904 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
7905 #: ../en/ch06-filenames.xml:140
|
dongsheng@627
|
7906 msgid "Shell-style <literal>glob</literal> patterns"
|
dongsheng@630
|
7907 msgstr "外壳风格的 <literal>glob</literal> 模式"
|
dongsheng@627
|
7908
|
dongsheng@627
|
7909 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7910 #: ../en/ch06-filenames.xml:142
|
dongsheng@627
|
7911 msgid ""
|
dongsheng@627
|
7912 "This is an overview of the kinds of patterns you can use when you're matching "
|
dongsheng@627
|
7913 "on glob patterns."
|
dongsheng@627
|
7914 msgstr ""
|
dongsheng@627
|
7915
|
dongsheng@627
|
7916 #
|
dongsheng@627
|
7917 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7918 #: ../en/ch06-filenames.xml:145
|
dongsheng@627
|
7919 msgid ""
|
dongsheng@627
|
7920 "The <quote><literal>*</literal></quote> character matches any string, within "
|
dongsheng@627
|
7921 "a single directory."
|
dongsheng@627
|
7922 msgstr ""
|
dongsheng@627
|
7923
|
dongsheng@627
|
7924 #
|
dongsheng@627
|
7925 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7926 #: ../en/ch06-filenames.xml:150
|
dongsheng@627
|
7927 msgid ""
|
dongsheng@627
|
7928 "The <quote><literal>**</literal></quote> pattern matches any string, and "
|
dongsheng@627
|
7929 "crosses directory boundaries. It's not a standard Unix glob token, but it's "
|
dongsheng@627
|
7930 "accepted by several popular Unix shells, and is very useful."
|
dongsheng@627
|
7931 msgstr ""
|
dongsheng@627
|
7932
|
dongsheng@627
|
7933 #
|
dongsheng@627
|
7934 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7935 #: ../en/ch06-filenames.xml:157
|
dongsheng@627
|
7936 msgid ""
|
dongsheng@627
|
7937 "The <quote><literal>?</literal></quote> pattern matches any single character."
|
dongsheng@627
|
7938 msgstr ""
|
dongsheng@627
|
7939
|
dongsheng@627
|
7940 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7941 #: ../en/ch06-filenames.xml:162
|
dongsheng@627
|
7942 msgid ""
|
dongsheng@627
|
7943 "The <quote><literal>[</literal></quote> character begins a "
|
dongsheng@627
|
7944 "<emphasis>character class</emphasis>. This matches any single character "
|
dongsheng@627
|
7945 "within the class. The class ends with a <quote><literal>]</literal></quote> "
|
dongsheng@627
|
7946 "character. A class may contain multiple <emphasis>range</emphasis>s of the "
|
dongsheng@627
|
7947 "form <quote><literal>a-f</literal></quote>, which is shorthand for "
|
dongsheng@627
|
7948 "<quote><literal>abcdef</literal></quote>."
|
dongsheng@627
|
7949 msgstr ""
|
dongsheng@627
|
7950
|
dongsheng@627
|
7951 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7952 #: ../en/ch06-filenames.xml:172
|
dongsheng@627
|
7953 msgid ""
|
dongsheng@627
|
7954 "If the first character after the <quote><literal>[</literal></quote> in a "
|
dongsheng@627
|
7955 "character class is a <quote><literal>!</literal></quote>, it "
|
dongsheng@627
|
7956 "<emphasis>negates</emphasis> the class, making it match any single character "
|
dongsheng@627
|
7957 "not in the class."
|
dongsheng@627
|
7958 msgstr ""
|
dongsheng@627
|
7959
|
dongsheng@627
|
7960 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7961 #: ../en/ch06-filenames.xml:178
|
dongsheng@627
|
7962 msgid ""
|
dongsheng@627
|
7963 "A <quote><literal>{</literal></quote> begins a group of subpatterns, where "
|
dongsheng@627
|
7964 "the whole group matches if any subpattern in the group matches. The "
|
dongsheng@627
|
7965 "<quote><literal>,</literal></quote> character separates subpatterns, and "
|
dongsheng@627
|
7966 "<quote><literal>}</literal></quote> ends the group."
|
dongsheng@627
|
7967 msgstr ""
|
dongsheng@627
|
7968
|
dongsheng@627
|
7969 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
7970 #: ../en/ch06-filenames.xml:187
|
dongsheng@627
|
7971 msgid "Watch out!"
|
dongsheng@630
|
7972 msgstr "千万小心!"
|
dongsheng@627
|
7973
|
dongsheng@627
|
7974 #
|
dongsheng@627
|
7975 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
7976 #: ../en/ch06-filenames.xml:189
|
dongsheng@627
|
7977 msgid ""
|
dongsheng@627
|
7978 "Don't forget that if you want to match a pattern in any directory, you should "
|
dongsheng@627
|
7979 "not be using the <quote><literal>*</literal></quote> match-any token, as this "
|
dongsheng@627
|
7980 "will only match within one directory. Instead, use the <quote><literal>**</"
|
dongsheng@627
|
7981 "literal></quote> token. This small example illustrates the difference "
|
dongsheng@627
|
7982 "between the two."
|
dongsheng@627
|
7983 msgstr ""
|
dongsheng@627
|
7984
|
dongsheng@627
|
7985 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
7986 #: ../en/ch06-filenames.xml:201
|
dongsheng@627
|
7987 msgid "Regular expression matching with <literal>re</literal> patterns"
|
dongsheng@630
|
7988 msgstr "使用 <literal>re</literal> 模式的正则表达式匹配"
|
dongsheng@627
|
7989
|
dongsheng@627
|
7990 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
7991 #: ../en/ch06-filenames.xml:204
|
dongsheng@627
|
7992 msgid ""
|
dongsheng@627
|
7993 "Mercurial accepts the same regular expression syntax as the Python "
|
dongsheng@627
|
7994 "programming language (it uses Python's regexp engine internally). This is "
|
dongsheng@627
|
7995 "based on the Perl language's regexp syntax, which is the most popular dialect "
|
dongsheng@627
|
7996 "in use (it's also used in Java, for example)."
|
dongsheng@627
|
7997 msgstr ""
|
dongsheng@627
|
7998
|
dongsheng@627
|
7999 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8000 #: ../en/ch06-filenames.xml:210
|
dongsheng@627
|
8001 msgid ""
|
dongsheng@627
|
8002 "I won't discuss Mercurial's regexp dialect in any detail here, as regexps are "
|
dongsheng@627
|
8003 "not often used. Perl-style regexps are in any case already exhaustively "
|
dongsheng@627
|
8004 "documented on a multitude of web sites, and in many books. Instead, I will "
|
dongsheng@627
|
8005 "focus here on a few things you should know if you find yourself needing to "
|
dongsheng@627
|
8006 "use regexps with Mercurial."
|
dongsheng@627
|
8007 msgstr ""
|
dongsheng@627
|
8008
|
dongsheng@627
|
8009 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8010 #: ../en/ch06-filenames.xml:217
|
dongsheng@627
|
8011 msgid ""
|
dongsheng@627
|
8012 "A regexp is matched against an entire file name, relative to the root of the "
|
dongsheng@627
|
8013 "repository. In other words, even if you're already in subbdirectory "
|
dongsheng@627
|
8014 "<filename class=\"directory\">foo</filename>, if you want to match files "
|
dongsheng@627
|
8015 "under this directory, your pattern must start with <quote><literal>foo/</"
|
dongsheng@627
|
8016 "literal></quote>."
|
dongsheng@627
|
8017 msgstr ""
|
dongsheng@627
|
8018
|
dongsheng@627
|
8019 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8020 #: ../en/ch06-filenames.xml:224
|
dongsheng@627
|
8021 msgid ""
|
dongsheng@627
|
8022 "One thing to note, if you're familiar with Perl-style regexps, is that "
|
dongsheng@627
|
8023 "Mercurial's are <emphasis>rooted</emphasis>. That is, a regexp starts "
|
dongsheng@627
|
8024 "matching against the beginning of a string; it doesn't look for a match "
|
dongsheng@627
|
8025 "anywhere within the string. To match anywhere in a string, start your "
|
dongsheng@627
|
8026 "pattern with <quote><literal>.*</literal></quote>."
|
dongsheng@627
|
8027 msgstr ""
|
dongsheng@627
|
8028
|
dongsheng@627
|
8029 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8030 #: ../en/ch06-filenames.xml:234
|
dongsheng@627
|
8031 msgid "Filtering files"
|
dongsheng@630
|
8032 msgstr "过滤文件"
|
dongsheng@627
|
8033
|
dongsheng@627
|
8034 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8035 #: ../en/ch06-filenames.xml:236
|
dongsheng@627
|
8036 msgid ""
|
dongsheng@627
|
8037 "Not only does Mercurial give you a variety of ways to specify files; it lets "
|
dongsheng@627
|
8038 "you further winnow those files using <emphasis>filters</emphasis>. Commands "
|
dongsheng@627
|
8039 "that work with file names accept two filtering options."
|
dongsheng@627
|
8040 msgstr ""
|
dongsheng@627
|
8041
|
dongsheng@627
|
8042 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8043 #: ../en/ch06-filenames.xml:241
|
dongsheng@627
|
8044 msgid ""
|
dongsheng@627
|
8045 "<option role=\"hg-opt-global\">-I</option>, or <option role=\"hg-opt-global"
|
dongsheng@627
|
8046 "\">--include</option>, lets you specify a pattern that file names must match "
|
dongsheng@627
|
8047 "in order to be processed."
|
dongsheng@627
|
8048 msgstr ""
|
dongsheng@627
|
8049
|
dongsheng@627
|
8050 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8051 #: ../en/ch06-filenames.xml:246
|
dongsheng@627
|
8052 msgid ""
|
dongsheng@627
|
8053 "<option role=\"hg-opt-global\">-X</option>, or <option role=\"hg-opt-global"
|
dongsheng@627
|
8054 "\">--exclude</option>, gives you a way to <emphasis>avoid</emphasis> "
|
dongsheng@627
|
8055 "processing files, if they match this pattern."
|
dongsheng@627
|
8056 msgstr ""
|
dongsheng@627
|
8057
|
dongsheng@627
|
8058 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8059 #: ../en/ch06-filenames.xml:251
|
dongsheng@627
|
8060 msgid ""
|
dongsheng@627
|
8061 "You can provide multiple <option role=\"hg-opt-global\">-I</option> and "
|
dongsheng@627
|
8062 "<option role=\"hg-opt-global\">-X</option> options on the command line, and "
|
dongsheng@627
|
8063 "intermix them as you please. Mercurial interprets the patterns you provide "
|
dongsheng@627
|
8064 "using glob syntax by default (but you can use regexps if you need to)."
|
dongsheng@627
|
8065 msgstr ""
|
dongsheng@627
|
8066
|
dongsheng@627
|
8067 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8068 #: ../en/ch06-filenames.xml:258
|
dongsheng@627
|
8069 msgid ""
|
dongsheng@627
|
8070 "You can read a <option role=\"hg-opt-global\">-I</option> filter as "
|
dongsheng@627
|
8071 "<quote>process only the files that match this filter</quote>."
|
dongsheng@627
|
8072 msgstr ""
|
dongsheng@627
|
8073
|
dongsheng@627
|
8074 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8075 #: ../en/ch06-filenames.xml:264
|
dongsheng@627
|
8076 msgid ""
|
dongsheng@627
|
8077 "The <option role=\"hg-opt-global\">-X</option> filter is best read as "
|
dongsheng@627
|
8078 "<quote>process only the files that don't match this pattern</quote>."
|
dongsheng@627
|
8079 msgstr ""
|
dongsheng@627
|
8080
|
dongsheng@627
|
8081 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8082 #: ../en/ch06-filenames.xml:272
|
dongsheng@627
|
8083 msgid "Ignoring unwanted files and directories"
|
dongsheng@630
|
8084 msgstr "忽略不需要的文件和目录"
|
dongsheng@627
|
8085
|
dongsheng@627
|
8086 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8087 #: ../en/ch06-filenames.xml:274
|
dongsheng@627
|
8088 msgid "XXX."
|
dongsheng@627
|
8089 msgstr ""
|
dongsheng@627
|
8090
|
dongsheng@627
|
8091 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8092 #: ../en/ch06-filenames.xml:278
|
dongsheng@627
|
8093 msgid "Case sensitivity"
|
dongsheng@630
|
8094 msgstr "大小写敏感性"
|
dongsheng@627
|
8095
|
dongsheng@627
|
8096 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8097 #: ../en/ch06-filenames.xml:280
|
dongsheng@627
|
8098 msgid ""
|
dongsheng@627
|
8099 "If you're working in a mixed development environment that contains both Linux "
|
dongsheng@627
|
8100 "(or other Unix) systems and Macs or Windows systems, you should keep in the "
|
dongsheng@627
|
8101 "back of your mind the knowledge that they treat the case (<quote>N</quote> "
|
dongsheng@627
|
8102 "versus <quote>n</quote>) of file names in incompatible ways. This is not "
|
dongsheng@627
|
8103 "very likely to affect you, and it's easy to deal with if it does, but it "
|
dongsheng@627
|
8104 "could surprise you if you don't know about it."
|
dongsheng@627
|
8105 msgstr ""
|
dongsheng@627
|
8106
|
dongsheng@627
|
8107 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8108 #: ../en/ch06-filenames.xml:289
|
dongsheng@627
|
8109 msgid ""
|
dongsheng@627
|
8110 "Operating systems and filesystems differ in the way they handle the "
|
dongsheng@627
|
8111 "<emphasis>case</emphasis> of characters in file and directory names. There "
|
dongsheng@627
|
8112 "are three common ways to handle case in names."
|
dongsheng@627
|
8113 msgstr ""
|
dongsheng@627
|
8114
|
dongsheng@627
|
8115 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8116 #: ../en/ch06-filenames.xml:294
|
dongsheng@627
|
8117 msgid ""
|
dongsheng@627
|
8118 "Completely case insensitive. Uppercase and lowercase versions of a letter "
|
dongsheng@627
|
8119 "are treated as identical, both when creating a file and during subsequent "
|
dongsheng@627
|
8120 "accesses. This is common on older DOS-based systems."
|
dongsheng@627
|
8121 msgstr ""
|
dongsheng@627
|
8122
|
dongsheng@627
|
8123 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8124 #: ../en/ch06-filenames.xml:299
|
dongsheng@627
|
8125 msgid ""
|
dongsheng@627
|
8126 "Case preserving, but insensitive. When a file or directory is created, the "
|
dongsheng@627
|
8127 "case of its name is stored, and can be retrieved and displayed by the "
|
dongsheng@627
|
8128 "operating system. When an existing file is being looked up, its case is "
|
dongsheng@627
|
8129 "ignored. This is the standard arrangement on Windows and MacOS. The names "
|
dongsheng@627
|
8130 "<filename>foo</filename> and <filename>FoO</filename> identify the same "
|
dongsheng@627
|
8131 "file. This treatment of uppercase and lowercase letters as interchangeable "
|
dongsheng@627
|
8132 "is also referred to as <emphasis>case folding</emphasis>."
|
dongsheng@627
|
8133 msgstr ""
|
dongsheng@627
|
8134
|
dongsheng@627
|
8135 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8136 #: ../en/ch06-filenames.xml:310
|
dongsheng@627
|
8137 msgid ""
|
dongsheng@627
|
8138 "Case sensitive. The case of a name is significant at all times. The names "
|
dongsheng@627
|
8139 "<filename>foo</filename> and {FoO} identify different files. This is the way "
|
dongsheng@627
|
8140 "Linux and Unix systems normally work."
|
dongsheng@627
|
8141 msgstr ""
|
dongsheng@627
|
8142
|
dongsheng@627
|
8143 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8144 #: ../en/ch06-filenames.xml:316
|
dongsheng@627
|
8145 msgid ""
|
dongsheng@627
|
8146 "On Unix-like systems, it is possible to have any or all of the above ways of "
|
dongsheng@627
|
8147 "handling case in action at once. For example, if you use a USB thumb drive "
|
dongsheng@627
|
8148 "formatted with a FAT32 filesystem on a Linux system, Linux will handle names "
|
dongsheng@627
|
8149 "on that filesystem in a case preserving, but insensitive, way."
|
dongsheng@627
|
8150 msgstr ""
|
dongsheng@627
|
8151
|
dongsheng@627
|
8152 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8153 #: ../en/ch06-filenames.xml:323
|
dongsheng@627
|
8154 msgid "Safe, portable repository storage"
|
dongsheng@630
|
8155 msgstr "安全,可移植的版本库存储"
|
dongsheng@627
|
8156
|
dongsheng@627
|
8157 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8158 #: ../en/ch06-filenames.xml:325
|
dongsheng@627
|
8159 msgid ""
|
dongsheng@627
|
8160 "Mercurial's repository storage mechanism is <emphasis>case safe</emphasis>. "
|
dongsheng@627
|
8161 "It translates file names so that they can be safely stored on both case "
|
dongsheng@627
|
8162 "sensitive and case insensitive filesystems. This means that you can use "
|
dongsheng@627
|
8163 "normal file copying tools to transfer a Mercurial repository onto, for "
|
dongsheng@627
|
8164 "example, a USB thumb drive, and safely move that drive and repository back "
|
dongsheng@627
|
8165 "and forth between a Mac, a PC running Windows, and a Linux box."
|
dongsheng@627
|
8166 msgstr ""
|
dongsheng@627
|
8167
|
dongsheng@627
|
8168 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8169 #: ../en/ch06-filenames.xml:336
|
dongsheng@627
|
8170 msgid "Detecting case conflicts"
|
dongsheng@630
|
8171 msgstr "检测大小写冲突"
|
dongsheng@627
|
8172
|
dongsheng@627
|
8173 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8174 #: ../en/ch06-filenames.xml:338
|
dongsheng@627
|
8175 msgid ""
|
dongsheng@627
|
8176 "When operating in the working directory, Mercurial honours the naming policy "
|
dongsheng@627
|
8177 "of the filesystem where the working directory is located. If the filesystem "
|
dongsheng@627
|
8178 "is case preserving, but insensitive, Mercurial will treat names that differ "
|
dongsheng@627
|
8179 "only in case as the same."
|
dongsheng@627
|
8180 msgstr ""
|
dongsheng@627
|
8181
|
dongsheng@627
|
8182 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8183 #: ../en/ch06-filenames.xml:344
|
dongsheng@627
|
8184 msgid ""
|
dongsheng@627
|
8185 "An important aspect of this approach is that it is possible to commit a "
|
dongsheng@627
|
8186 "changeset on a case sensitive (typically Linux or Unix) filesystem that will "
|
dongsheng@627
|
8187 "cause trouble for users on case insensitive (usually Windows and MacOS) "
|
dongsheng@627
|
8188 "users. If a Linux user commits changes to two files, one named "
|
dongsheng@627
|
8189 "<filename>myfile.c</filename> and the other named <filename>MyFile.C</"
|
dongsheng@627
|
8190 "filename>, they will be stored correctly in the repository. And in the "
|
dongsheng@627
|
8191 "working directories of other Linux users, they will be correctly represented "
|
dongsheng@627
|
8192 "as separate files."
|
dongsheng@627
|
8193 msgstr ""
|
dongsheng@627
|
8194
|
dongsheng@627
|
8195 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8196 #: ../en/ch06-filenames.xml:355
|
dongsheng@627
|
8197 msgid ""
|
dongsheng@627
|
8198 "If a Windows or Mac user pulls this change, they will not initially have a "
|
dongsheng@627
|
8199 "problem, because Mercurial's repository storage mechanism is case safe. "
|
dongsheng@627
|
8200 "However, once they try to <command role=\"hg-cmd\">hg update</command> the "
|
dongsheng@627
|
8201 "working directory to that changeset, or <command role=\"hg-cmd\">hg merge</"
|
dongsheng@627
|
8202 "command> with that changeset, Mercurial will spot the conflict between the "
|
dongsheng@627
|
8203 "two file names that the filesystem would treat as the same, and forbid the "
|
dongsheng@627
|
8204 "update or merge from occurring."
|
dongsheng@627
|
8205 msgstr ""
|
dongsheng@627
|
8206
|
dongsheng@627
|
8207 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8208 #: ../en/ch06-filenames.xml:367
|
dongsheng@627
|
8209 msgid "Fixing a case conflict"
|
dongsheng@630
|
8210 msgstr "修正大小写冲突"
|
dongsheng@627
|
8211
|
dongsheng@627
|
8212 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8213 #: ../en/ch06-filenames.xml:369
|
dongsheng@627
|
8214 msgid ""
|
dongsheng@627
|
8215 "If you are using Windows or a Mac in a mixed environment where some of your "
|
dongsheng@627
|
8216 "collaborators are using Linux or Unix, and Mercurial reports a case folding "
|
dongsheng@627
|
8217 "conflict when you try to <command role=\"hg-cmd\">hg update</command> or "
|
dongsheng@627
|
8218 "<command role=\"hg-cmd\">hg merge</command>, the procedure to fix the problem "
|
dongsheng@627
|
8219 "is simple."
|
dongsheng@627
|
8220 msgstr ""
|
dongsheng@627
|
8221
|
dongsheng@627
|
8222 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8223 #: ../en/ch06-filenames.xml:376
|
dongsheng@627
|
8224 msgid ""
|
dongsheng@627
|
8225 "Just find a nearby Linux or Unix box, clone the problem repository onto it, "
|
dongsheng@627
|
8226 "and use Mercurial's <command role=\"hg-cmd\">hg rename</command> command to "
|
dongsheng@627
|
8227 "change the names of any offending files or directories so that they will no "
|
dongsheng@627
|
8228 "longer cause case folding conflicts. Commit this change, <command role=\"hg-"
|
dongsheng@627
|
8229 "cmd\">hg pull</command> or <command role=\"hg-cmd\">hg push</command> it "
|
dongsheng@627
|
8230 "across to your Windows or MacOS system, and <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
8231 "update</command> to the revision with the non-conflicting names."
|
dongsheng@627
|
8232 msgstr ""
|
dongsheng@627
|
8233
|
dongsheng@627
|
8234 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8235 #: ../en/ch06-filenames.xml:386
|
dongsheng@627
|
8236 msgid ""
|
dongsheng@627
|
8237 "The changeset with case-conflicting names will remain in your project's "
|
dongsheng@627
|
8238 "history, and you still won't be able to <command role=\"hg-cmd\">hg update</"
|
dongsheng@627
|
8239 "command> your working directory to that changeset on a Windows or MacOS "
|
dongsheng@627
|
8240 "system, but you can continue development unimpeded."
|
dongsheng@627
|
8241 msgstr ""
|
dongsheng@627
|
8242
|
dongsheng@627
|
8243 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
8244 #: ../en/ch06-filenames.xml:393
|
dongsheng@627
|
8245 msgid ""
|
dongsheng@627
|
8246 "Prior to version 0.9.3, Mercurial did not use a case safe repository storage "
|
dongsheng@627
|
8247 "mechanism, and did not detect case folding conflicts. If you are using an "
|
dongsheng@627
|
8248 "older version of Mercurial on Windows or MacOS, I strongly recommend that you "
|
dongsheng@627
|
8249 "upgrade."
|
dongsheng@627
|
8250 msgstr ""
|
dongsheng@627
|
8251
|
dongsheng@627
|
8252 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
8253 #: ../en/ch07-branch.xml:5
|
dongsheng@627
|
8254 msgid "Managing releases and branchy development"
|
dongsheng@627
|
8255 msgstr "发布管理与分支开发"
|
dongsheng@627
|
8256
|
dongsheng@627
|
8257 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
8258 #: ../en/ch07-branch.xml:7
|
dongsheng@627
|
8259 msgid ""
|
dongsheng@627
|
8260 "Mercurial provides several mechanisms for you to manage a project that is "
|
dongsheng@627
|
8261 "making progress on multiple fronts at once. To understand these mechanisms, "
|
dongsheng@627
|
8262 "let's first take a brief look at a fairly normal software project structure."
|
dongsheng@627
|
8263 msgstr ""
|
dongsheng@627
|
8264
|
dongsheng@627
|
8265 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
8266 #: ../en/ch07-branch.xml:12
|
dongsheng@627
|
8267 msgid ""
|
dongsheng@627
|
8268 "Many software projects issue periodic <quote>major</quote> releases that "
|
dongsheng@627
|
8269 "contain substantial new features. In parallel, they may issue <quote>minor</"
|
dongsheng@627
|
8270 "quote> releases. These are usually identical to the major releases off which "
|
dongsheng@627
|
8271 "they're based, but with a few bugs fixed."
|
dongsheng@627
|
8272 msgstr ""
|
dongsheng@627
|
8273
|
dongsheng@627
|
8274 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
8275 #: ../en/ch07-branch.xml:18
|
dongsheng@627
|
8276 msgid ""
|
dongsheng@627
|
8277 "In this chapter, we'll start by talking about how to keep records of project "
|
dongsheng@627
|
8278 "milestones such as releases. We'll then continue on to talk about the flow "
|
dongsheng@627
|
8279 "of work between different phases of a project, and how Mercurial can help you "
|
dongsheng@627
|
8280 "to isolate and manage this work."
|
dongsheng@627
|
8281 msgstr ""
|
dongsheng@627
|
8282
|
dongsheng@627
|
8283 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8284 #: ../en/ch07-branch.xml:25
|
dongsheng@627
|
8285 msgid "Giving a persistent name to a revision"
|
dongsheng@635
|
8286 msgstr "给版本指定一个永久的名称"
|
dongsheng@627
|
8287
|
dongsheng@627
|
8288 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8289 #: ../en/ch07-branch.xml:27
|
dongsheng@627
|
8290 msgid ""
|
dongsheng@627
|
8291 "Once you decide that you'd like to call a particular revision a "
|
dongsheng@627
|
8292 "<quote>release</quote>, it's a good idea to record the identity of that "
|
dongsheng@627
|
8293 "revision. This will let you reproduce that release at a later date, for "
|
dongsheng@627
|
8294 "whatever purpose you might need at the time (reproducing a bug, porting to a "
|
dongsheng@627
|
8295 "new platform, etc). &interaction.tag.init;"
|
dongsheng@627
|
8296 msgstr ""
|
dongsheng@627
|
8297
|
dongsheng@627
|
8298 #
|
dongsheng@627
|
8299 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8300 #: ../en/ch07-branch.xml:34
|
dongsheng@627
|
8301 msgid ""
|
dongsheng@627
|
8302 "Mercurial lets you give a permanent name to any revision using the <command "
|
dongsheng@627
|
8303 "role=\"hg-cmd\">hg tag</command> command. Not surprisingly, these names are "
|
dongsheng@627
|
8304 "called <quote>tags</quote>."
|
dongsheng@627
|
8305 msgstr ""
|
dongsheng@627
|
8306
|
dongsheng@627
|
8307 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8308 #: ../en/ch07-branch.xml:40
|
dongsheng@627
|
8309 msgid ""
|
dongsheng@627
|
8310 "A tag is nothing more than a <quote>symbolic name</quote> for a revision. "
|
dongsheng@627
|
8311 "Tags exist purely for your convenience, so that you have a handy permanent "
|
dongsheng@627
|
8312 "way to refer to a revision; Mercurial doesn't interpret the tag names you use "
|
dongsheng@627
|
8313 "in any way. Neither does Mercurial place any restrictions on the name of a "
|
dongsheng@627
|
8314 "tag, beyond a few that are necessary to ensure that a tag can be parsed "
|
dongsheng@627
|
8315 "unambiguously. A tag name cannot contain any of the following characters:"
|
dongsheng@627
|
8316 msgstr ""
|
dongsheng@627
|
8317
|
dongsheng@627
|
8318 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8319 #: ../en/ch07-branch.xml:49
|
dongsheng@627
|
8320 msgid "Colon (ASCII 58, <quote><literal>:</literal></quote>)"
|
dongsheng@627
|
8321 msgstr ""
|
dongsheng@627
|
8322
|
dongsheng@627
|
8323 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8324 #: ../en/ch07-branch.xml:52
|
dongsheng@627
|
8325 msgid "Carriage return (ASCII 13, <quote><literal>\\r</literal></quote>)"
|
dongsheng@627
|
8326 msgstr ""
|
dongsheng@627
|
8327
|
dongsheng@627
|
8328 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8329 #: ../en/ch07-branch.xml:55
|
dongsheng@627
|
8330 msgid "Newline (ASCII 10, <quote><literal>\\n</literal></quote>)"
|
dongsheng@627
|
8331 msgstr ""
|
dongsheng@627
|
8332
|
dongsheng@627
|
8333 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8334 #: ../en/ch07-branch.xml:59
|
dongsheng@627
|
8335 msgid ""
|
dongsheng@627
|
8336 "You can use the <command role=\"hg-cmd\">hg tags</command> command to display "
|
dongsheng@627
|
8337 "the tags present in your repository. In the output, each tagged revision is "
|
dongsheng@627
|
8338 "identified first by its name, then by revision number, and finally by the "
|
dongsheng@627
|
8339 "unique hash of the revision."
|
dongsheng@627
|
8340 msgstr ""
|
dongsheng@627
|
8341
|
dongsheng@627
|
8342 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8343 #: ../en/ch07-branch.xml:67
|
dongsheng@627
|
8344 msgid ""
|
dongsheng@627
|
8345 "Notice that <literal>tip</literal> is listed in the output of <command role="
|
dongsheng@627
|
8346 "\"hg-cmd\">hg tags</command>. The <literal>tip</literal> tag is a special "
|
dongsheng@627
|
8347 "<quote>floating</quote> tag, which always identifies the newest revision in "
|
dongsheng@627
|
8348 "the repository."
|
dongsheng@627
|
8349 msgstr ""
|
dongsheng@627
|
8350
|
dongsheng@627
|
8351 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8352 #: ../en/ch07-branch.xml:73
|
dongsheng@627
|
8353 msgid ""
|
dongsheng@627
|
8354 "In the output of the <command role=\"hg-cmd\">hg tags</command> command, tags "
|
dongsheng@627
|
8355 "are listed in reverse order, by revision number. This usually means that "
|
dongsheng@627
|
8356 "recent tags are listed before older tags. It also means that <literal>tip</"
|
dongsheng@627
|
8357 "literal> is always going to be the first tag listed in the output of <command "
|
dongsheng@627
|
8358 "role=\"hg-cmd\">hg tags</command>."
|
dongsheng@627
|
8359 msgstr ""
|
dongsheng@627
|
8360
|
dongsheng@627
|
8361 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8362 #: ../en/ch07-branch.xml:80
|
dongsheng@627
|
8363 msgid ""
|
dongsheng@627
|
8364 "When you run <command role=\"hg-cmd\">hg log</command>, if it displays a "
|
dongsheng@627
|
8365 "revision that has tags associated with it, it will print those tags."
|
dongsheng@627
|
8366 msgstr ""
|
dongsheng@627
|
8367
|
dongsheng@627
|
8368 #
|
dongsheng@627
|
8369 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8370 #: ../en/ch07-branch.xml:86
|
dongsheng@627
|
8371 msgid ""
|
dongsheng@627
|
8372 "Any time you need to provide a revision ID to a Mercurial command, the "
|
dongsheng@627
|
8373 "command will accept a tag name in its place. Internally, Mercurial will "
|
dongsheng@627
|
8374 "translate your tag name into the corresponding revision ID, then use that."
|
dongsheng@627
|
8375 msgstr ""
|
dongsheng@627
|
8376
|
dongsheng@627
|
8377 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8378 #: ../en/ch07-branch.xml:93
|
dongsheng@627
|
8379 msgid ""
|
dongsheng@627
|
8380 "There's no limit on the number of tags you can have in a repository, or on "
|
dongsheng@627
|
8381 "the number of tags that a single revision can have. As a practical matter, "
|
dongsheng@627
|
8382 "it's not a great idea to have <quote>too many</quote> (a number which will "
|
dongsheng@627
|
8383 "vary from project to project), simply because tags are supposed to help you "
|
dongsheng@627
|
8384 "to find revisions. If you have lots of tags, the ease of using them to "
|
dongsheng@627
|
8385 "identify revisions diminishes rapidly."
|
dongsheng@627
|
8386 msgstr ""
|
dongsheng@627
|
8387
|
dongsheng@627
|
8388 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8389 #: ../en/ch07-branch.xml:101
|
dongsheng@627
|
8390 msgid ""
|
dongsheng@627
|
8391 "For example, if your project has milestones as frequent as every few days, "
|
dongsheng@627
|
8392 "it's perfectly reasonable to tag each one of those. But if you have a "
|
dongsheng@627
|
8393 "continuous build system that makes sure every revision can be built cleanly, "
|
dongsheng@627
|
8394 "you'd be introducing a lot of noise if you were to tag every clean build. "
|
dongsheng@627
|
8395 "Instead, you could tag failed builds (on the assumption that they're rare!), "
|
dongsheng@627
|
8396 "or simply not use tags to track buildability."
|
dongsheng@627
|
8397 msgstr ""
|
dongsheng@627
|
8398
|
dongsheng@627
|
8399 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8400 #: ../en/ch07-branch.xml:109
|
dongsheng@627
|
8401 msgid ""
|
dongsheng@627
|
8402 "If you want to remove a tag that you no longer want, use <command role=\"hg-"
|
dongsheng@627
|
8403 "cmd\">hg tag --remove</command>."
|
dongsheng@627
|
8404 msgstr ""
|
dongsheng@627
|
8405
|
dongsheng@627
|
8406 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8407 #: ../en/ch07-branch.xml:114
|
dongsheng@627
|
8408 msgid ""
|
dongsheng@627
|
8409 "You can also modify a tag at any time, so that it identifies a different "
|
dongsheng@627
|
8410 "revision, by simply issuing a new <command role=\"hg-cmd\">hg tag</command> "
|
dongsheng@627
|
8411 "command. You'll have to use the <option role=\"hg-opt-tag\">-f</option> "
|
dongsheng@627
|
8412 "option to tell Mercurial that you <emphasis>really</emphasis> want to update "
|
dongsheng@627
|
8413 "the tag."
|
dongsheng@627
|
8414 msgstr ""
|
dongsheng@627
|
8415
|
dongsheng@627
|
8416 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8417 #: ../en/ch07-branch.xml:123
|
dongsheng@627
|
8418 msgid ""
|
dongsheng@627
|
8419 "There will still be a permanent record of the previous identity of the tag, "
|
dongsheng@627
|
8420 "but Mercurial will no longer use it. There's thus no penalty to tagging the "
|
dongsheng@627
|
8421 "wrong revision; all you have to do is turn around and tag the correct "
|
dongsheng@627
|
8422 "revision once you discover your error."
|
dongsheng@627
|
8423 msgstr ""
|
dongsheng@627
|
8424
|
dongsheng@627
|
8425 #
|
dongsheng@627
|
8426 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8427 #: ../en/ch07-branch.xml:129
|
dongsheng@627
|
8428 msgid ""
|
dongsheng@627
|
8429 "Mercurial stores tags in a normal revision-controlled file in your "
|
dongsheng@627
|
8430 "repository. If you've created any tags, you'll find them in a file named "
|
dongsheng@627
|
8431 "<filename role=\"special\">.hgtags</filename>. When you run the <command "
|
dongsheng@627
|
8432 "role=\"hg-cmd\">hg tag</command> command, Mercurial modifies this file, then "
|
dongsheng@627
|
8433 "automatically commits the change to it. This means that every time you run "
|
dongsheng@627
|
8434 "<command role=\"hg-cmd\">hg tag</command>, you'll see a corresponding "
|
dongsheng@627
|
8435 "changeset in the output of <command role=\"hg-cmd\">hg log</command>."
|
dongsheng@627
|
8436 msgstr ""
|
dongsheng@627
|
8437
|
dongsheng@627
|
8438 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8439 #: ../en/ch07-branch.xml:142
|
dongsheng@627
|
8440 msgid "Handling tag conflicts during a merge"
|
dongsheng@635
|
8441 msgstr "在合并期间处理标签冲突"
|
dongsheng@627
|
8442
|
dongsheng@627
|
8443 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8444 #: ../en/ch07-branch.xml:144
|
dongsheng@627
|
8445 msgid ""
|
dongsheng@627
|
8446 "You won't often need to care about the <filename role=\"special\">.hgtags</"
|
dongsheng@627
|
8447 "filename> file, but it sometimes makes its presence known during a merge. "
|
dongsheng@627
|
8448 "The format of the file is simple: it consists of a series of lines. Each "
|
dongsheng@627
|
8449 "line starts with a changeset hash, followed by a space, followed by the name "
|
dongsheng@627
|
8450 "of a tag."
|
dongsheng@627
|
8451 msgstr ""
|
dongsheng@627
|
8452
|
dongsheng@627
|
8453 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8454 #: ../en/ch07-branch.xml:151
|
dongsheng@627
|
8455 msgid ""
|
dongsheng@627
|
8456 "If you're resolving a conflict in the <filename role=\"special\">.hgtags</"
|
dongsheng@627
|
8457 "filename> file during a merge, there's one twist to modifying the <filename "
|
dongsheng@627
|
8458 "role=\"special\">.hgtags</filename> file: when Mercurial is parsing the tags "
|
dongsheng@627
|
8459 "in a repository, it <emphasis>never</emphasis> reads the working copy of the "
|
dongsheng@627
|
8460 "<filename role=\"special\">.hgtags</filename> file. Instead, it reads the "
|
dongsheng@627
|
8461 "<emphasis>most recently committed</emphasis> revision of the file."
|
dongsheng@627
|
8462 msgstr ""
|
dongsheng@627
|
8463
|
dongsheng@627
|
8464 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8465 #: ../en/ch07-branch.xml:161
|
dongsheng@627
|
8466 msgid ""
|
dongsheng@627
|
8467 "An unfortunate consequence of this design is that you can't actually verify "
|
dongsheng@627
|
8468 "that your merged <filename role=\"special\">.hgtags</filename> file is "
|
dongsheng@627
|
8469 "correct until <emphasis>after</emphasis> you've committed a change. So if "
|
dongsheng@627
|
8470 "you find yourself resolving a conflict on <filename role=\"special\">.hgtags</"
|
dongsheng@627
|
8471 "filename> during a merge, be sure to run <command role=\"hg-cmd\">hg tags</"
|
dongsheng@627
|
8472 "command> after you commit. If it finds an error in the <filename role="
|
dongsheng@627
|
8473 "\"special\">.hgtags</filename> file, it will report the location of the "
|
dongsheng@627
|
8474 "error, which you can then fix and commit. You should then run <command role="
|
dongsheng@627
|
8475 "\"hg-cmd\">hg tags</command> again, just to be sure that your fix is correct."
|
dongsheng@627
|
8476 msgstr ""
|
dongsheng@627
|
8477
|
dongsheng@627
|
8478 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8479 #: ../en/ch07-branch.xml:176
|
dongsheng@627
|
8480 msgid "Tags and cloning"
|
dongsheng@635
|
8481 msgstr "标签与克隆"
|
dongsheng@627
|
8482
|
dongsheng@627
|
8483 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8484 #: ../en/ch07-branch.xml:178
|
dongsheng@627
|
8485 msgid ""
|
dongsheng@627
|
8486 "You may have noticed that the <command role=\"hg-cmd\">hg clone</command> "
|
dongsheng@627
|
8487 "command has a <option role=\"hg-opt-clone\">-r</option> option that lets you "
|
dongsheng@627
|
8488 "clone an exact copy of the repository as of a particular changeset. The new "
|
dongsheng@627
|
8489 "clone will not contain any project history that comes after the revision you "
|
dongsheng@627
|
8490 "specified. This has an interaction with tags that can surprise the unwary."
|
dongsheng@627
|
8491 msgstr ""
|
dongsheng@627
|
8492
|
dongsheng@627
|
8493 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8494 #: ../en/ch07-branch.xml:186
|
dongsheng@627
|
8495 msgid ""
|
dongsheng@627
|
8496 "Recall that a tag is stored as a revision to the <filename role=\"special\">."
|
dongsheng@627
|
8497 "hgtags</filename> file, so that when you create a tag, the changeset in which "
|
dongsheng@627
|
8498 "it's recorded necessarily refers to an older changeset. When you run "
|
dongsheng@627
|
8499 "<command role=\"hg-cmd\">hg clone -r foo</command> to clone a repository as "
|
dongsheng@627
|
8500 "of tag <literal>foo</literal>, the new clone <emphasis>will not contain the "
|
dongsheng@627
|
8501 "history that created the tag</emphasis> that you used to clone the "
|
dongsheng@627
|
8502 "repository. The result is that you'll get exactly the right subset of the "
|
dongsheng@627
|
8503 "project's history in the new repository, but <emphasis>not</emphasis> the tag "
|
dongsheng@627
|
8504 "you might have expected."
|
dongsheng@627
|
8505 msgstr ""
|
dongsheng@627
|
8506
|
dongsheng@627
|
8507 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8508 #: ../en/ch07-branch.xml:201
|
dongsheng@627
|
8509 msgid "When permanent tags are too much"
|
dongsheng@635
|
8510 msgstr "当永久标签太多的时候"
|
dongsheng@627
|
8511
|
dongsheng@627
|
8512 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8513 #: ../en/ch07-branch.xml:203
|
dongsheng@627
|
8514 msgid ""
|
dongsheng@627
|
8515 "Since Mercurial's tags are revision controlled and carried around with a "
|
dongsheng@627
|
8516 "project's history, everyone you work with will see the tags you create. But "
|
dongsheng@627
|
8517 "giving names to revisions has uses beyond simply noting that revision "
|
dongsheng@627
|
8518 "<literal>4237e45506ee</literal> is really <literal>v2.0.2</literal>. If "
|
dongsheng@627
|
8519 "you're trying to track down a subtle bug, you might want a tag to remind you "
|
dongsheng@627
|
8520 "of something like <quote>Anne saw the symptoms with this revision</quote>."
|
dongsheng@627
|
8521 msgstr ""
|
dongsheng@627
|
8522
|
dongsheng@627
|
8523 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8524 #: ../en/ch07-branch.xml:213
|
dongsheng@627
|
8525 msgid ""
|
dongsheng@627
|
8526 "For cases like this, what you might want to use are <emphasis>local</"
|
dongsheng@627
|
8527 "emphasis> tags. You can create a local tag with the <option role=\"hg-opt-tag"
|
dongsheng@627
|
8528 "\">-l</option> option to the <command role=\"hg-cmd\">hg tag</command> "
|
dongsheng@627
|
8529 "command. This will store the tag in a file called <filename role=\"special"
|
dongsheng@627
|
8530 "\">.hg/localtags</filename>. Unlike <filename role=\"special\">.hgtags</"
|
dongsheng@627
|
8531 "filename>, <filename role=\"special\">.hg/localtags</filename> is not "
|
dongsheng@627
|
8532 "revision controlled. Any tags you create using <option role=\"hg-opt-tag\">-"
|
dongsheng@627
|
8533 "l</option> remain strictly local to the repository you're currently working "
|
dongsheng@627
|
8534 "in."
|
dongsheng@627
|
8535 msgstr ""
|
dongsheng@627
|
8536
|
dongsheng@627
|
8537 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8538 #: ../en/ch07-branch.xml:228
|
dongsheng@627
|
8539 msgid "The flow of changes&emdash;big picture vs. little"
|
dongsheng@635
|
8540 msgstr "修改流程&emdash;宏观与微观"
|
dongsheng@627
|
8541
|
dongsheng@627
|
8542 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8543 #: ../en/ch07-branch.xml:230
|
dongsheng@627
|
8544 msgid ""
|
dongsheng@627
|
8545 "To return to the outline I sketched at the beginning of a chapter, let's "
|
dongsheng@627
|
8546 "think about a project that has multiple concurrent pieces of work under "
|
dongsheng@627
|
8547 "development at once."
|
dongsheng@627
|
8548 msgstr ""
|
dongsheng@627
|
8549
|
dongsheng@627
|
8550 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8551 #: ../en/ch07-branch.xml:234
|
dongsheng@627
|
8552 msgid ""
|
dongsheng@627
|
8553 "There might be a push for a new <quote>main</quote> release; a new minor "
|
dongsheng@627
|
8554 "bugfix release to the last main release; and an unexpected <quote>hot fix</"
|
dongsheng@627
|
8555 "quote> to an old release that is now in maintenance mode."
|
dongsheng@627
|
8556 msgstr ""
|
dongsheng@627
|
8557
|
dongsheng@627
|
8558 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8559 #: ../en/ch07-branch.xml:239
|
dongsheng@627
|
8560 msgid ""
|
dongsheng@627
|
8561 "The usual way people refer to these different concurrent directions of "
|
dongsheng@627
|
8562 "development is as <quote>branches</quote>. However, we've already seen "
|
dongsheng@627
|
8563 "numerous times that Mercurial treats <emphasis>all of history</emphasis> as a "
|
dongsheng@627
|
8564 "series of branches and merges. Really, what we have here is two ideas that "
|
dongsheng@627
|
8565 "are peripherally related, but which happen to share a name."
|
dongsheng@627
|
8566 msgstr ""
|
dongsheng@627
|
8567
|
dongsheng@627
|
8568 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8569 #: ../en/ch07-branch.xml:246
|
dongsheng@627
|
8570 msgid ""
|
dongsheng@627
|
8571 "<quote>Big picture</quote> branches represent the sweep of a project's "
|
dongsheng@627
|
8572 "evolution; people give them names, and talk about them in conversation."
|
dongsheng@627
|
8573 msgstr ""
|
dongsheng@627
|
8574
|
dongsheng@627
|
8575 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
8576 #: ../en/ch07-branch.xml:250
|
dongsheng@627
|
8577 msgid ""
|
dongsheng@627
|
8578 "<quote>Little picture</quote> branches are artefacts of the day-to-day "
|
dongsheng@627
|
8579 "activity of developing and merging changes. They expose the narrative of how "
|
dongsheng@627
|
8580 "the code was developed."
|
dongsheng@627
|
8581 msgstr ""
|
dongsheng@627
|
8582
|
dongsheng@627
|
8583 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8584 #: ../en/ch07-branch.xml:258
|
dongsheng@627
|
8585 msgid "Managing big-picture branches in repositories"
|
dongsheng@635
|
8586 msgstr "在版本库中管理分支"
|
dongsheng@627
|
8587
|
dongsheng@627
|
8588 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8589 #: ../en/ch07-branch.xml:260
|
dongsheng@627
|
8590 msgid ""
|
dongsheng@627
|
8591 "The easiest way to isolate a <quote>big picture</quote> branch in Mercurial "
|
dongsheng@627
|
8592 "is in a dedicated repository. If you have an existing shared "
|
dongsheng@627
|
8593 "repository&emdash;let's call it <literal>myproject</literal>&emdash;that "
|
dongsheng@627
|
8594 "reaches a <quote>1.0</quote> milestone, you can start to prepare for future "
|
dongsheng@627
|
8595 "maintenance releases on top of version 1.0 by tagging the revision from which "
|
dongsheng@627
|
8596 "you prepared the 1.0 release."
|
dongsheng@627
|
8597 msgstr ""
|
dongsheng@627
|
8598
|
dongsheng@627
|
8599 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8600 #: ../en/ch07-branch.xml:270
|
dongsheng@627
|
8601 msgid ""
|
dongsheng@627
|
8602 "You can then clone a new shared <literal>myproject-1.0.1</literal> repository "
|
dongsheng@627
|
8603 "as of that tag."
|
dongsheng@627
|
8604 msgstr ""
|
dongsheng@627
|
8605
|
dongsheng@627
|
8606 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8607 #: ../en/ch07-branch.xml:276
|
dongsheng@627
|
8608 msgid ""
|
dongsheng@627
|
8609 "Afterwards, if someone needs to work on a bug fix that ought to go into an "
|
dongsheng@627
|
8610 "upcoming 1.0.1 minor release, they clone the <literal>myproject-1.0.1</"
|
dongsheng@627
|
8611 "literal> repository, make their changes, and push them back."
|
dongsheng@627
|
8612 msgstr ""
|
dongsheng@627
|
8613
|
dongsheng@627
|
8614 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8615 #: ../en/ch07-branch.xml:283
|
dongsheng@627
|
8616 msgid ""
|
dongsheng@627
|
8617 "Meanwhile, development for the next major release can continue, isolated and "
|
dongsheng@627
|
8618 "unabated, in the <literal>myproject</literal> repository."
|
dongsheng@627
|
8619 msgstr ""
|
dongsheng@627
|
8620
|
dongsheng@627
|
8621 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8622 #: ../en/ch07-branch.xml:291
|
dongsheng@627
|
8623 msgid "Don't repeat yourself: merging across branches"
|
dongsheng@635
|
8624 msgstr "不要重复劳动:在分支间合并"
|
dongsheng@627
|
8625
|
dongsheng@627
|
8626 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8627 #: ../en/ch07-branch.xml:293
|
dongsheng@627
|
8628 msgid ""
|
dongsheng@627
|
8629 "In many cases, if you have a bug to fix on a maintenance branch, the chances "
|
dongsheng@627
|
8630 "are good that the bug exists on your project's main branch (and possibly "
|
dongsheng@627
|
8631 "other maintenance branches, too). It's a rare developer who wants to fix the "
|
dongsheng@627
|
8632 "same bug multiple times, so let's look at a few ways that Mercurial can help "
|
dongsheng@627
|
8633 "you to manage these bugfixes without duplicating your work."
|
dongsheng@627
|
8634 msgstr ""
|
dongsheng@627
|
8635
|
dongsheng@627
|
8636 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8637 #: ../en/ch07-branch.xml:301
|
dongsheng@627
|
8638 msgid ""
|
dongsheng@627
|
8639 "In the simplest instance, all you need to do is pull changes from your "
|
dongsheng@627
|
8640 "maintenance branch into your local clone of the target branch."
|
dongsheng@627
|
8641 msgstr ""
|
dongsheng@627
|
8642
|
dongsheng@627
|
8643 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8644 #: ../en/ch07-branch.xml:307
|
dongsheng@627
|
8645 msgid ""
|
dongsheng@627
|
8646 "You'll then need to merge the heads of the two branches, and push back to the "
|
dongsheng@627
|
8647 "main branch."
|
dongsheng@627
|
8648 msgstr ""
|
dongsheng@627
|
8649
|
dongsheng@627
|
8650 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8651 #: ../en/ch07-branch.xml:314
|
dongsheng@627
|
8652 msgid "Naming branches within one repository"
|
dongsheng@635
|
8653 msgstr "版本库中的命名分支"
|
dongsheng@627
|
8654
|
dongsheng@627
|
8655 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8656 #: ../en/ch07-branch.xml:316
|
dongsheng@627
|
8657 msgid ""
|
dongsheng@627
|
8658 "In most instances, isolating branches in repositories is the right approach. "
|
dongsheng@627
|
8659 "Its simplicity makes it easy to understand; and so it's hard to make "
|
dongsheng@627
|
8660 "mistakes. There's a one-to-one relationship between branches you're working "
|
dongsheng@627
|
8661 "in and directories on your system. This lets you use normal (non-Mercurial-"
|
dongsheng@627
|
8662 "aware) tools to work on files within a branch/repository."
|
dongsheng@627
|
8663 msgstr ""
|
dongsheng@627
|
8664
|
dongsheng@627
|
8665 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8666 #: ../en/ch07-branch.xml:323
|
dongsheng@627
|
8667 msgid ""
|
dongsheng@627
|
8668 "If you're more in the <quote>power user</quote> category (<emphasis>and</"
|
dongsheng@627
|
8669 "emphasis> your collaborators are too), there is an alternative way of "
|
dongsheng@627
|
8670 "handling branches that you can consider. I've already mentioned the human-"
|
dongsheng@627
|
8671 "level distinction between <quote>small picture</quote> and <quote>big "
|
dongsheng@627
|
8672 "picture</quote> branches. While Mercurial works with multiple <quote>small "
|
dongsheng@627
|
8673 "picture</quote> branches in a repository all the time (for example after you "
|
dongsheng@627
|
8674 "pull changes in, but before you merge them), it can <emphasis>also</emphasis> "
|
dongsheng@627
|
8675 "work with multiple <quote>big picture</quote> branches."
|
dongsheng@627
|
8676 msgstr ""
|
dongsheng@627
|
8677
|
dongsheng@627
|
8678 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8679 #: ../en/ch07-branch.xml:334
|
dongsheng@627
|
8680 msgid ""
|
dongsheng@627
|
8681 "The key to working this way is that Mercurial lets you assign a persistent "
|
dongsheng@627
|
8682 "<emphasis>name</emphasis> to a branch. There always exists a branch named "
|
dongsheng@627
|
8683 "<literal>default</literal>. Even before you start naming branches yourself, "
|
dongsheng@627
|
8684 "you can find traces of the <literal>default</literal> branch if you look for "
|
dongsheng@627
|
8685 "them."
|
dongsheng@627
|
8686 msgstr ""
|
dongsheng@627
|
8687
|
dongsheng@627
|
8688 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8689 #: ../en/ch07-branch.xml:341
|
dongsheng@627
|
8690 msgid ""
|
dongsheng@627
|
8691 "As an example, when you run the <command role=\"hg-cmd\">hg commit</command> "
|
dongsheng@627
|
8692 "command, and it pops up your editor so that you can enter a commit message, "
|
dongsheng@627
|
8693 "look for a line that contains the text <quote><literal>HG: branch default</"
|
dongsheng@627
|
8694 "literal></quote> at the bottom. This is telling you that your commit will "
|
dongsheng@627
|
8695 "occur on the branch named <literal>default</literal>."
|
dongsheng@627
|
8696 msgstr ""
|
dongsheng@627
|
8697
|
dongsheng@627
|
8698 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8699 #: ../en/ch07-branch.xml:348
|
dongsheng@627
|
8700 msgid ""
|
dongsheng@627
|
8701 "To start working with named branches, use the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
8702 "branches</command> command. This command lists the named branches already "
|
dongsheng@627
|
8703 "present in your repository, telling you which changeset is the tip of each."
|
dongsheng@627
|
8704 msgstr ""
|
dongsheng@627
|
8705
|
dongsheng@627
|
8706 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8707 #: ../en/ch07-branch.xml:355
|
dongsheng@627
|
8708 msgid ""
|
dongsheng@627
|
8709 "Since you haven't created any named branches yet, the only one that exists is "
|
dongsheng@627
|
8710 "<literal>default</literal>."
|
dongsheng@627
|
8711 msgstr ""
|
dongsheng@627
|
8712
|
dongsheng@627
|
8713 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8714 #: ../en/ch07-branch.xml:358
|
dongsheng@627
|
8715 msgid ""
|
dongsheng@627
|
8716 "To find out what the <quote>current</quote> branch is, run the <command role="
|
dongsheng@627
|
8717 "\"hg-cmd\">hg branch</command> command, giving it no arguments. This tells "
|
dongsheng@627
|
8718 "you what branch the parent of the current changeset is on."
|
dongsheng@627
|
8719 msgstr ""
|
dongsheng@627
|
8720
|
dongsheng@627
|
8721 #
|
dongsheng@627
|
8722 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8723 #: ../en/ch07-branch.xml:365
|
dongsheng@627
|
8724 msgid ""
|
dongsheng@627
|
8725 "To create a new branch, run the <command role=\"hg-cmd\">hg branch</command> "
|
dongsheng@627
|
8726 "command again. This time, give it one argument: the name of the branch you "
|
dongsheng@627
|
8727 "want to create."
|
dongsheng@627
|
8728 msgstr ""
|
dongsheng@627
|
8729
|
dongsheng@627
|
8730 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8731 #: ../en/ch07-branch.xml:371
|
dongsheng@627
|
8732 msgid ""
|
dongsheng@627
|
8733 "After you've created a branch, you might wonder what effect the <command role="
|
dongsheng@627
|
8734 "\"hg-cmd\">hg branch</command> command has had. What do the <command role="
|
dongsheng@627
|
8735 "\"hg-cmd\">hg status</command> and <command role=\"hg-cmd\">hg tip</command> "
|
dongsheng@627
|
8736 "commands report?"
|
dongsheng@627
|
8737 msgstr ""
|
dongsheng@627
|
8738
|
dongsheng@627
|
8739 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8740 #: ../en/ch07-branch.xml:378
|
dongsheng@627
|
8741 msgid ""
|
dongsheng@627
|
8742 "Nothing has changed in the working directory, and there's been no new history "
|
dongsheng@627
|
8743 "created. As this suggests, running the <command role=\"hg-cmd\">hg branch</"
|
dongsheng@627
|
8744 "command> command has no permanent effect; it only tells Mercurial what branch "
|
dongsheng@627
|
8745 "name to use the <emphasis>next</emphasis> time you commit a changeset."
|
dongsheng@627
|
8746 msgstr ""
|
dongsheng@627
|
8747
|
dongsheng@627
|
8748 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8749 #: ../en/ch07-branch.xml:385
|
dongsheng@627
|
8750 msgid ""
|
dongsheng@627
|
8751 "When you commit a change, Mercurial records the name of the branch on which "
|
dongsheng@627
|
8752 "you committed. Once you've switched from the <literal>default</literal> "
|
dongsheng@627
|
8753 "branch to another and committed, you'll see the name of the new branch show "
|
dongsheng@627
|
8754 "up in the output of <command role=\"hg-cmd\">hg log</command>, <command role="
|
dongsheng@627
|
8755 "\"hg-cmd\">hg tip</command>, and other commands that display the same kind of "
|
dongsheng@627
|
8756 "output."
|
dongsheng@627
|
8757 msgstr ""
|
dongsheng@627
|
8758
|
dongsheng@627
|
8759 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8760 #: ../en/ch07-branch.xml:395
|
dongsheng@627
|
8761 msgid ""
|
dongsheng@627
|
8762 "The <command role=\"hg-cmd\">hg log</command>-like commands will print the "
|
dongsheng@627
|
8763 "branch name of every changeset that's not on the <literal>default</literal> "
|
dongsheng@627
|
8764 "branch. As a result, if you never use named branches, you'll never see this "
|
dongsheng@627
|
8765 "information."
|
dongsheng@627
|
8766 msgstr ""
|
dongsheng@627
|
8767
|
dongsheng@627
|
8768 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8769 #: ../en/ch07-branch.xml:400
|
dongsheng@627
|
8770 msgid ""
|
dongsheng@627
|
8771 "Once you've named a branch and committed a change with that name, every "
|
dongsheng@627
|
8772 "subsequent commit that descends from that change will inherit the same branch "
|
dongsheng@627
|
8773 "name. You can change the name of a branch at any time, using the <command "
|
dongsheng@627
|
8774 "role=\"hg-cmd\">hg branch</command> command."
|
dongsheng@627
|
8775 msgstr ""
|
dongsheng@627
|
8776
|
dongsheng@627
|
8777 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8778 #: ../en/ch07-branch.xml:408
|
dongsheng@627
|
8779 msgid ""
|
dongsheng@627
|
8780 "In practice, this is something you won't do very often, as branch names tend "
|
dongsheng@627
|
8781 "to have fairly long lifetimes. (This isn't a rule, just an observation.)"
|
dongsheng@627
|
8782 msgstr ""
|
dongsheng@627
|
8783
|
dongsheng@627
|
8784 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8785 #: ../en/ch07-branch.xml:414
|
dongsheng@627
|
8786 msgid "Dealing with multiple named branches in a repository"
|
dongsheng@635
|
8787 msgstr "在版本库中处理多个命名分支"
|
dongsheng@627
|
8788
|
dongsheng@627
|
8789 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8790 #: ../en/ch07-branch.xml:417
|
dongsheng@627
|
8791 msgid ""
|
dongsheng@627
|
8792 "If you have more than one named branch in a repository, Mercurial will "
|
dongsheng@627
|
8793 "remember the branch that your working directory on when you start a command "
|
dongsheng@627
|
8794 "like <command role=\"hg-cmd\">hg update</command> or <command role=\"hg-cmd"
|
dongsheng@627
|
8795 "\">hg pull -u</command>. It will update the working directory to the tip of "
|
dongsheng@627
|
8796 "this branch, no matter what the <quote>repo-wide</quote> tip is. To update "
|
dongsheng@627
|
8797 "to a revision that's on a different named branch, you may need to use the "
|
dongsheng@627
|
8798 "<option role=\"hg-opt-update\">-C</option> option to <command role=\"hg-cmd"
|
dongsheng@627
|
8799 "\">hg update</command>."
|
dongsheng@627
|
8800 msgstr ""
|
dongsheng@627
|
8801
|
dongsheng@627
|
8802 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8803 #: ../en/ch07-branch.xml:427
|
dongsheng@627
|
8804 msgid ""
|
dongsheng@627
|
8805 "This behaviour is a little subtle, so let's see it in action. First, let's "
|
dongsheng@627
|
8806 "remind ourselves what branch we're currently on, and what branches are in our "
|
dongsheng@627
|
8807 "repository."
|
dongsheng@627
|
8808 msgstr ""
|
dongsheng@627
|
8809
|
dongsheng@627
|
8810 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8811 #: ../en/ch07-branch.xml:433
|
dongsheng@627
|
8812 msgid ""
|
dongsheng@627
|
8813 "We're on the <literal>bar</literal> branch, but there also exists an older "
|
dongsheng@627
|
8814 "<command role=\"hg-cmd\">hg foo</command> branch."
|
dongsheng@627
|
8815 msgstr ""
|
dongsheng@627
|
8816
|
dongsheng@627
|
8817 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8818 #: ../en/ch07-branch.xml:437
|
dongsheng@627
|
8819 msgid ""
|
dongsheng@627
|
8820 "We can <command role=\"hg-cmd\">hg update</command> back and forth between "
|
dongsheng@627
|
8821 "the tips of the <literal>foo</literal> and <literal>bar</literal> branches "
|
dongsheng@627
|
8822 "without needing to use the <option role=\"hg-opt-update\">-C</option> option, "
|
dongsheng@627
|
8823 "because this only involves going backwards and forwards linearly through our "
|
dongsheng@627
|
8824 "change history."
|
dongsheng@627
|
8825 msgstr ""
|
dongsheng@627
|
8826
|
dongsheng@627
|
8827 #
|
dongsheng@627
|
8828 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8829 #: ../en/ch07-branch.xml:446
|
dongsheng@627
|
8830 msgid ""
|
dongsheng@627
|
8831 "If we go back to the <literal>foo</literal> branch and then run <command role="
|
dongsheng@627
|
8832 "\"hg-cmd\">hg update</command>, it will keep us on <literal>foo</literal>, "
|
dongsheng@627
|
8833 "not move us to the tip of <literal>bar</literal>."
|
dongsheng@627
|
8834 msgstr ""
|
dongsheng@627
|
8835
|
dongsheng@627
|
8836 #
|
dongsheng@627
|
8837 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8838 #: ../en/ch07-branch.xml:453
|
dongsheng@627
|
8839 msgid ""
|
dongsheng@627
|
8840 "Committing a new change on the <literal>foo</literal> branch introduces a new "
|
dongsheng@627
|
8841 "head."
|
dongsheng@627
|
8842 msgstr ""
|
dongsheng@627
|
8843
|
dongsheng@627
|
8844 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8845 #: ../en/ch07-branch.xml:460
|
dongsheng@627
|
8846 msgid "Branch names and merging"
|
dongsheng@635
|
8847 msgstr "分支名称与合并"
|
dongsheng@627
|
8848
|
dongsheng@627
|
8849 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8850 #: ../en/ch07-branch.xml:462
|
dongsheng@627
|
8851 msgid ""
|
dongsheng@627
|
8852 "As you've probably noticed, merges in Mercurial are not symmetrical. Let's "
|
dongsheng@627
|
8853 "say our repository has two heads, 17 and 23. If I <command role=\"hg-cmd"
|
dongsheng@627
|
8854 "\">hg update</command> to 17 and then <command role=\"hg-cmd\">hg merge</"
|
dongsheng@627
|
8855 "command> with 23, Mercurial records 17 as the first parent of the merge, and "
|
dongsheng@627
|
8856 "23 as the second. Whereas if I <command role=\"hg-cmd\">hg update</command> "
|
dongsheng@627
|
8857 "to 23 and then <command role=\"hg-cmd\">hg merge</command> with 17, it "
|
dongsheng@627
|
8858 "records 23 as the first parent, and 17 as the second."
|
dongsheng@627
|
8859 msgstr ""
|
dongsheng@627
|
8860
|
dongsheng@627
|
8861 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8862 #: ../en/ch07-branch.xml:472
|
dongsheng@627
|
8863 msgid ""
|
dongsheng@627
|
8864 "This affects Mercurial's choice of branch name when you merge. After a "
|
dongsheng@627
|
8865 "merge, Mercurial will retain the branch name of the first parent when you "
|
dongsheng@627
|
8866 "commit the result of the merge. If your first parent's branch name is "
|
dongsheng@627
|
8867 "<literal>foo</literal>, and you merge with <literal>bar</literal>, the branch "
|
dongsheng@627
|
8868 "name will still be <literal>foo</literal> after you merge."
|
dongsheng@627
|
8869 msgstr ""
|
dongsheng@627
|
8870
|
dongsheng@627
|
8871 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8872 #: ../en/ch07-branch.xml:479
|
dongsheng@627
|
8873 msgid ""
|
dongsheng@627
|
8874 "It's not unusual for a repository to contain multiple heads, each with the "
|
dongsheng@627
|
8875 "same branch name. Let's say I'm working on the <literal>foo</literal> "
|
dongsheng@627
|
8876 "branch, and so are you. We commit different changes; I pull your changes; I "
|
dongsheng@627
|
8877 "now have two heads, each claiming to be on the <literal>foo</literal> "
|
dongsheng@627
|
8878 "branch. The result of a merge will be a single head on the <literal>foo</"
|
dongsheng@627
|
8879 "literal> branch, as you might hope."
|
dongsheng@627
|
8880 msgstr ""
|
dongsheng@627
|
8881
|
dongsheng@627
|
8882 #
|
dongsheng@627
|
8883 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8884 #: ../en/ch07-branch.xml:487
|
dongsheng@627
|
8885 msgid ""
|
dongsheng@627
|
8886 "But if I'm working on the <literal>bar</literal> branch, and I merge work "
|
dongsheng@627
|
8887 "from the <literal>foo</literal> branch, the result will remain on the "
|
dongsheng@627
|
8888 "<literal>bar</literal> branch."
|
dongsheng@627
|
8889 msgstr ""
|
dongsheng@627
|
8890
|
dongsheng@627
|
8891 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8892 #: ../en/ch07-branch.xml:493
|
dongsheng@627
|
8893 msgid ""
|
dongsheng@627
|
8894 "To give a more concrete example, if I'm working on the <literal>bleeding-"
|
dongsheng@627
|
8895 "edge</literal> branch, and I want to bring in the latest fixes from the "
|
dongsheng@627
|
8896 "<literal>stable</literal> branch, Mercurial will choose the <quote>right</"
|
dongsheng@627
|
8897 "quote> (<literal>bleeding-edge</literal>) branch name when I pull and merge "
|
dongsheng@627
|
8898 "from <literal>stable</literal>."
|
dongsheng@627
|
8899 msgstr ""
|
dongsheng@627
|
8900
|
dongsheng@627
|
8901 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8902 #: ../en/ch07-branch.xml:502
|
dongsheng@627
|
8903 msgid "Branch naming is generally useful"
|
dongsheng@635
|
8904 msgstr "分支名称通常都很有用"
|
dongsheng@627
|
8905
|
dongsheng@627
|
8906 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8907 #: ../en/ch07-branch.xml:504
|
dongsheng@627
|
8908 msgid ""
|
dongsheng@627
|
8909 "You shouldn't think of named branches as applicable only to situations where "
|
dongsheng@627
|
8910 "you have multiple long-lived branches cohabiting in a single repository. "
|
dongsheng@627
|
8911 "They're very useful even in the one-branch-per-repository case."
|
dongsheng@627
|
8912 msgstr ""
|
dongsheng@627
|
8913
|
dongsheng@627
|
8914 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8915 #: ../en/ch07-branch.xml:509
|
dongsheng@627
|
8916 msgid ""
|
dongsheng@627
|
8917 "In the simplest case, giving a name to each branch gives you a permanent "
|
dongsheng@627
|
8918 "record of which branch a changeset originated on. This gives you more "
|
dongsheng@627
|
8919 "context when you're trying to follow the history of a long-lived branchy "
|
dongsheng@627
|
8920 "project."
|
dongsheng@627
|
8921 msgstr ""
|
dongsheng@627
|
8922
|
dongsheng@627
|
8923 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
8924 #: ../en/ch07-branch.xml:514
|
dongsheng@627
|
8925 msgid ""
|
dongsheng@627
|
8926 "If you're working with shared repositories, you can set up a <literal role="
|
dongsheng@627
|
8927 "\"hook\">pretxnchangegroup</literal> hook on each that will block incoming "
|
dongsheng@627
|
8928 "changes that have the <quote>wrong</quote> branch name. This provides a "
|
dongsheng@627
|
8929 "simple, but effective, defence against people accidentally pushing changes "
|
dongsheng@627
|
8930 "from a <quote>bleeding edge</quote> branch to a <quote>stable</quote> "
|
dongsheng@627
|
8931 "branch. Such a hook might look like this inside the shared repo's <filename "
|
dongsheng@627
|
8932 "role=\"special\"> /.hgrc</filename>."
|
dongsheng@627
|
8933 msgstr ""
|
dongsheng@627
|
8934
|
dongsheng@627
|
8935 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
8936 #: ../en/ch08-undo.xml:5
|
dongsheng@627
|
8937 msgid "Finding and fixing mistakes"
|
dongsheng@627
|
8938 msgstr "查找和修改错误"
|
dongsheng@627
|
8939
|
dongsheng@627
|
8940 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
8941 #: ../en/ch08-undo.xml:7
|
dongsheng@627
|
8942 msgid ""
|
dongsheng@627
|
8943 "To err might be human, but to really handle the consequences well takes a top-"
|
dongsheng@627
|
8944 "notch revision control system. In this chapter, we'll discuss some of the "
|
dongsheng@627
|
8945 "techniques you can use when you find that a problem has crept into your "
|
dongsheng@627
|
8946 "project. Mercurial has some highly capable features that will help you to "
|
dongsheng@627
|
8947 "isolate the sources of problems, and to handle them appropriately."
|
dongsheng@627
|
8948 msgstr ""
|
dongsheng@627
|
8949
|
dongsheng@627
|
8950 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
8951 #: ../en/ch08-undo.xml:15
|
dongsheng@627
|
8952 msgid "Erasing local history"
|
dongsheng@635
|
8953 msgstr "销毁本地历史"
|
dongsheng@627
|
8954
|
dongsheng@627
|
8955 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8956 #: ../en/ch08-undo.xml:18
|
dongsheng@627
|
8957 msgid "The accidental commit"
|
dongsheng@635
|
8958 msgstr "意外的提交"
|
dongsheng@627
|
8959
|
dongsheng@627
|
8960 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8961 #: ../en/ch08-undo.xml:20
|
dongsheng@627
|
8962 msgid ""
|
dongsheng@627
|
8963 "I have the occasional but persistent problem of typing rather more quickly "
|
dongsheng@627
|
8964 "than I can think, which sometimes results in me committing a changeset that "
|
dongsheng@627
|
8965 "is either incomplete or plain wrong. In my case, the usual kind of "
|
dongsheng@627
|
8966 "incomplete changeset is one in which I've created a new source file, but "
|
dongsheng@627
|
8967 "forgotten to <command role=\"hg-cmd\">hg add</command> it. A <quote>plain "
|
dongsheng@627
|
8968 "wrong</quote> changeset is not as common, but no less annoying."
|
dongsheng@627
|
8969 msgstr ""
|
dongsheng@627
|
8970
|
dongsheng@627
|
8971 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
8972 #: ../en/ch08-undo.xml:31
|
dongsheng@627
|
8973 msgid "Rolling back a transaction"
|
dongsheng@635
|
8974 msgstr "回滚一个事务"
|
dongsheng@627
|
8975
|
dongsheng@627
|
8976 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8977 #: ../en/ch08-undo.xml:33
|
dongsheng@627
|
8978 msgid ""
|
dongsheng@627
|
8979 "In section <xref linkend=\"sec.concepts.txn\"/>, I mentioned that Mercurial "
|
dongsheng@627
|
8980 "treats each modification of a repository as a <emphasis>transaction</"
|
dongsheng@627
|
8981 "emphasis>. Every time you commit a changeset or pull changes from another "
|
dongsheng@627
|
8982 "repository, Mercurial remembers what you did. You can undo, or "
|
dongsheng@627
|
8983 "<emphasis>roll back</emphasis>, exactly one of these actions using the "
|
dongsheng@627
|
8984 "<command role=\"hg-cmd\">hg rollback</command> command. (See section <xref "
|
dongsheng@627
|
8985 "linkend=\"sec.undo.rollback-after-push\"/> for an important caveat about the "
|
dongsheng@627
|
8986 "use of this command.)"
|
dongsheng@627
|
8987 msgstr ""
|
dongsheng@627
|
8988
|
dongsheng@627
|
8989 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8990 #: ../en/ch08-undo.xml:43
|
dongsheng@627
|
8991 msgid ""
|
dongsheng@627
|
8992 "Here's a mistake that I often find myself making: committing a change in "
|
dongsheng@627
|
8993 "which I've created a new file, but forgotten to <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
8994 "add</command> it."
|
dongsheng@627
|
8995 msgstr ""
|
dongsheng@627
|
8996
|
dongsheng@627
|
8997 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
8998 #: ../en/ch08-undo.xml:50
|
dongsheng@627
|
8999 msgid ""
|
dongsheng@627
|
9000 "Looking at the output of <command role=\"hg-cmd\">hg status</command> after "
|
dongsheng@627
|
9001 "the commit immediately confirms the error."
|
dongsheng@627
|
9002 msgstr ""
|
dongsheng@627
|
9003
|
dongsheng@627
|
9004 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9005 #: ../en/ch08-undo.xml:56
|
dongsheng@627
|
9006 msgid ""
|
dongsheng@627
|
9007 "The commit captured the changes to the file <filename>a</filename>, but not "
|
dongsheng@627
|
9008 "the new file <filename>b</filename>. If I were to push this changeset to a "
|
dongsheng@627
|
9009 "repository that I shared with a colleague, the chances are high that "
|
dongsheng@627
|
9010 "something in <filename>a</filename> would refer to <filename>b</filename>, "
|
dongsheng@627
|
9011 "which would not be present in their repository when they pulled my changes. "
|
dongsheng@627
|
9012 "I would thus become the object of some indignation."
|
dongsheng@627
|
9013 msgstr ""
|
dongsheng@627
|
9014
|
dongsheng@627
|
9015 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9016 #: ../en/ch08-undo.xml:65
|
dongsheng@627
|
9017 msgid ""
|
dongsheng@627
|
9018 "However, luck is with me&emdash;I've caught my error before I pushed the "
|
dongsheng@627
|
9019 "changeset. I use the <command role=\"hg-cmd\">hg rollback</command> command, "
|
dongsheng@627
|
9020 "and Mercurial makes that last changeset vanish."
|
dongsheng@627
|
9021 msgstr ""
|
dongsheng@627
|
9022
|
dongsheng@627
|
9023 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9024 #: ../en/ch08-undo.xml:72
|
dongsheng@627
|
9025 msgid ""
|
dongsheng@627
|
9026 "Notice that the changeset is no longer present in the repository's history, "
|
dongsheng@627
|
9027 "and the working directory once again thinks that the file <filename>a</"
|
dongsheng@627
|
9028 "filename> is modified. The commit and rollback have left the working "
|
dongsheng@627
|
9029 "directory exactly as it was prior to the commit; the changeset has been "
|
dongsheng@627
|
9030 "completely erased. I can now safely <command role=\"hg-cmd\">hg add</"
|
dongsheng@627
|
9031 "command> the file <filename>b</filename>, and rerun my commit."
|
dongsheng@627
|
9032 msgstr ""
|
dongsheng@627
|
9033
|
dongsheng@627
|
9034 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9035 #: ../en/ch08-undo.xml:85
|
dongsheng@627
|
9036 msgid "The erroneous pull"
|
dongsheng@635
|
9037 msgstr "错误的抓取"
|
dongsheng@627
|
9038
|
dongsheng@627
|
9039 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9040 #: ../en/ch08-undo.xml:87
|
dongsheng@627
|
9041 msgid ""
|
dongsheng@627
|
9042 "It's common practice with Mercurial to maintain separate development branches "
|
dongsheng@627
|
9043 "of a project in different repositories. Your development team might have one "
|
dongsheng@627
|
9044 "shared repository for your project's <quote>0.9</quote> release, and another, "
|
dongsheng@627
|
9045 "containing different changes, for the <quote>1.0</quote> release."
|
dongsheng@627
|
9046 msgstr ""
|
dongsheng@627
|
9047
|
dongsheng@627
|
9048 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9049 #: ../en/ch08-undo.xml:94
|
dongsheng@627
|
9050 msgid ""
|
dongsheng@627
|
9051 "Given this, you can imagine that the consequences could be messy if you had a "
|
dongsheng@627
|
9052 "local <quote>0.9</quote> repository, and accidentally pulled changes from the "
|
dongsheng@627
|
9053 "shared <quote>1.0</quote> repository into it. At worst, you could be paying "
|
dongsheng@627
|
9054 "insufficient attention, and push those changes into the shared <quote>0.9</"
|
dongsheng@627
|
9055 "quote> tree, confusing your entire team (but don't worry, we'll return to "
|
dongsheng@627
|
9056 "this horror scenario later). However, it's more likely that you'll notice "
|
dongsheng@627
|
9057 "immediately, because Mercurial will display the URL it's pulling from, or you "
|
dongsheng@627
|
9058 "will see it pull a suspiciously large number of changes into the repository."
|
dongsheng@627
|
9059 msgstr ""
|
dongsheng@627
|
9060
|
dongsheng@627
|
9061 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9062 #: ../en/ch08-undo.xml:106
|
dongsheng@627
|
9063 msgid ""
|
dongsheng@627
|
9064 "The <command role=\"hg-cmd\">hg rollback</command> command will work nicely "
|
dongsheng@627
|
9065 "to expunge all of the changesets that you just pulled. Mercurial groups all "
|
dongsheng@627
|
9066 "changes from one <command role=\"hg-cmd\">hg pull</command> into a single "
|
dongsheng@627
|
9067 "transaction, so one <command role=\"hg-cmd\">hg rollback</command> is all you "
|
dongsheng@627
|
9068 "need to undo this mistake."
|
dongsheng@627
|
9069 msgstr ""
|
dongsheng@627
|
9070
|
dongsheng@627
|
9071 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9072 #: ../en/ch08-undo.xml:115
|
dongsheng@627
|
9073 msgid "Rolling back is useless once you've pushed"
|
dongsheng@635
|
9074 msgstr "当完成推送后,回滚是无效的"
|
dongsheng@627
|
9075
|
dongsheng@627
|
9076 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9077 #: ../en/ch08-undo.xml:117
|
dongsheng@627
|
9078 msgid ""
|
dongsheng@627
|
9079 "The value of the <command role=\"hg-cmd\">hg rollback</command> command drops "
|
dongsheng@627
|
9080 "to zero once you've pushed your changes to another repository. Rolling back "
|
dongsheng@627
|
9081 "a change makes it disappear entirely, but <emphasis>only</emphasis> in the "
|
dongsheng@627
|
9082 "repository in which you perform the <command role=\"hg-cmd\">hg rollback</"
|
dongsheng@627
|
9083 "command>. Because a rollback eliminates history, there's no way for the "
|
dongsheng@627
|
9084 "disappearance of a change to propagate between repositories."
|
dongsheng@627
|
9085 msgstr ""
|
dongsheng@627
|
9086
|
dongsheng@627
|
9087 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9088 #: ../en/ch08-undo.xml:126
|
dongsheng@627
|
9089 msgid ""
|
dongsheng@627
|
9090 "If you've pushed a change to another repository&emdash;particularly if it's a "
|
dongsheng@627
|
9091 "shared repository&emdash;it has essentially <quote>escaped into the wild,</"
|
dongsheng@627
|
9092 "quote> and you'll have to recover from your mistake in a different way. What "
|
dongsheng@627
|
9093 "will happen if you push a changeset somewhere, then roll it back, then pull "
|
dongsheng@627
|
9094 "from the repository you pushed to, is that the changeset will reappear in "
|
dongsheng@627
|
9095 "your repository."
|
dongsheng@627
|
9096 msgstr ""
|
dongsheng@627
|
9097
|
dongsheng@627
|
9098 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9099 #: ../en/ch08-undo.xml:135
|
dongsheng@627
|
9100 msgid ""
|
dongsheng@627
|
9101 "(If you absolutely know for sure that the change you want to roll back is the "
|
dongsheng@627
|
9102 "most recent change in the repository that you pushed to, <emphasis>and</"
|
dongsheng@627
|
9103 "emphasis> you know that nobody else could have pulled it from that "
|
dongsheng@627
|
9104 "repository, you can roll back the changeset there, too, but you really should "
|
dongsheng@627
|
9105 "really not rely on this working reliably. If you do this, sooner or later a "
|
dongsheng@627
|
9106 "change really will make it into a repository that you don't directly control "
|
dongsheng@627
|
9107 "(or have forgotten about), and come back to bite you.)"
|
dongsheng@627
|
9108 msgstr ""
|
dongsheng@627
|
9109
|
dongsheng@627
|
9110 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9111 #: ../en/ch08-undo.xml:147
|
dongsheng@627
|
9112 msgid "You can only roll back once"
|
dongsheng@635
|
9113 msgstr "你只能回滚一次"
|
dongsheng@627
|
9114
|
dongsheng@627
|
9115 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9116 #: ../en/ch08-undo.xml:149
|
dongsheng@627
|
9117 msgid ""
|
dongsheng@627
|
9118 "Mercurial stores exactly one transaction in its transaction log; that "
|
dongsheng@627
|
9119 "transaction is the most recent one that occurred in the repository. This "
|
dongsheng@627
|
9120 "means that you can only roll back one transaction. If you expect to be able "
|
dongsheng@627
|
9121 "to roll back one transaction, then its predecessor, this is not the behaviour "
|
dongsheng@627
|
9122 "you will get."
|
dongsheng@627
|
9123 msgstr ""
|
dongsheng@627
|
9124
|
dongsheng@627
|
9125 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9126 #: ../en/ch08-undo.xml:158
|
dongsheng@627
|
9127 msgid ""
|
dongsheng@627
|
9128 "Once you've rolled back one transaction in a repository, you can't roll back "
|
dongsheng@627
|
9129 "again in that repository until you perform another commit or pull."
|
dongsheng@627
|
9130 msgstr ""
|
dongsheng@627
|
9131
|
dongsheng@627
|
9132 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
9133 #: ../en/ch08-undo.xml:165
|
dongsheng@627
|
9134 msgid "Reverting the mistaken change"
|
dongsheng@635
|
9135 msgstr "撤销错误的修改"
|
dongsheng@627
|
9136
|
dongsheng@627
|
9137 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9138 #: ../en/ch08-undo.xml:167
|
dongsheng@627
|
9139 msgid ""
|
dongsheng@627
|
9140 "If you make a modification to a file, and decide that you really didn't want "
|
dongsheng@627
|
9141 "to change the file at all, and you haven't yet committed your changes, the "
|
dongsheng@627
|
9142 "<command role=\"hg-cmd\">hg revert</command> command is the one you'll need. "
|
dongsheng@627
|
9143 "It looks at the changeset that's the parent of the working directory, and "
|
dongsheng@627
|
9144 "restores the contents of the file to their state as of that changeset. "
|
dongsheng@627
|
9145 "(That's a long-winded way of saying that, in the normal case, it undoes your "
|
dongsheng@627
|
9146 "modifications.)"
|
dongsheng@627
|
9147 msgstr ""
|
dongsheng@627
|
9148
|
dongsheng@627
|
9149 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9150 #: ../en/ch08-undo.xml:176
|
dongsheng@627
|
9151 msgid ""
|
dongsheng@627
|
9152 "Let's illustrate how the <command role=\"hg-cmd\">hg revert</command> command "
|
dongsheng@627
|
9153 "works with yet another small example. We'll begin by modifying a file that "
|
dongsheng@627
|
9154 "Mercurial is already tracking."
|
dongsheng@627
|
9155 msgstr ""
|
dongsheng@627
|
9156
|
dongsheng@627
|
9157 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9158 #: ../en/ch08-undo.xml:183
|
dongsheng@627
|
9159 msgid ""
|
dongsheng@627
|
9160 "If we don't want that change, we can simply <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9161 "revert</command> the file."
|
dongsheng@627
|
9162 msgstr ""
|
dongsheng@627
|
9163
|
dongsheng@627
|
9164 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9165 #: ../en/ch08-undo.xml:189
|
dongsheng@627
|
9166 msgid ""
|
dongsheng@627
|
9167 "The <command role=\"hg-cmd\">hg revert</command> command provides us with an "
|
dongsheng@627
|
9168 "extra degree of safety by saving our modified file with a <filename>.orig</"
|
dongsheng@627
|
9169 "filename> extension."
|
dongsheng@627
|
9170 msgstr ""
|
dongsheng@627
|
9171
|
dongsheng@627
|
9172 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9173 #: ../en/ch08-undo.xml:196
|
dongsheng@627
|
9174 msgid ""
|
dongsheng@627
|
9175 "Here is a summary of the cases that the <command role=\"hg-cmd\">hg revert</"
|
dongsheng@627
|
9176 "command> command can deal with. We will describe each of these in more "
|
dongsheng@627
|
9177 "detail in the section that follows."
|
dongsheng@627
|
9178 msgstr ""
|
dongsheng@627
|
9179
|
dongsheng@627
|
9180 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9181 #: ../en/ch08-undo.xml:201
|
dongsheng@627
|
9182 msgid "If you modify a file, it will restore the file to its unmodified state."
|
dongsheng@627
|
9183 msgstr ""
|
dongsheng@627
|
9184
|
dongsheng@627
|
9185 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9186 #: ../en/ch08-undo.xml:204
|
dongsheng@627
|
9187 msgid ""
|
dongsheng@627
|
9188 "If you <command role=\"hg-cmd\">hg add</command> a file, it will undo the "
|
dongsheng@627
|
9189 "<quote>added</quote> state of the file, but leave the file itself untouched."
|
dongsheng@627
|
9190 msgstr ""
|
dongsheng@627
|
9191
|
dongsheng@627
|
9192 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9193 #: ../en/ch08-undo.xml:208
|
dongsheng@627
|
9194 msgid ""
|
dongsheng@627
|
9195 "If you delete a file without telling Mercurial, it will restore the file to "
|
dongsheng@627
|
9196 "its unmodified contents."
|
dongsheng@627
|
9197 msgstr ""
|
dongsheng@627
|
9198
|
dongsheng@627
|
9199 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9200 #: ../en/ch08-undo.xml:211
|
dongsheng@627
|
9201 msgid ""
|
dongsheng@627
|
9202 "If you use the <command role=\"hg-cmd\">hg remove</command> command to remove "
|
dongsheng@627
|
9203 "a file, it will undo the <quote>removed</quote> state of the file, and "
|
dongsheng@627
|
9204 "restore the file to its unmodified contents."
|
dongsheng@627
|
9205 msgstr ""
|
dongsheng@627
|
9206
|
dongsheng@627
|
9207 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9208 #: ../en/ch08-undo.xml:218
|
dongsheng@627
|
9209 msgid "File management errors"
|
dongsheng@635
|
9210 msgstr "文件管理错误"
|
dongsheng@627
|
9211
|
dongsheng@627
|
9212 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9213 #: ../en/ch08-undo.xml:220
|
dongsheng@627
|
9214 msgid ""
|
dongsheng@627
|
9215 "The <command role=\"hg-cmd\">hg revert</command> command is useful for more "
|
dongsheng@627
|
9216 "than just modified files. It lets you reverse the results of all of "
|
dongsheng@627
|
9217 "Mercurial's file management commands&emdash;<command role=\"hg-cmd\">hg add</"
|
dongsheng@627
|
9218 "command>, <command role=\"hg-cmd\">hg remove</command>, and so on."
|
dongsheng@627
|
9219 msgstr ""
|
dongsheng@627
|
9220
|
dongsheng@627
|
9221 #
|
dongsheng@627
|
9222 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9223 #: ../en/ch08-undo.xml:226
|
dongsheng@627
|
9224 msgid ""
|
dongsheng@627
|
9225 "If you <command role=\"hg-cmd\">hg add</command> a file, then decide that in "
|
dongsheng@627
|
9226 "fact you don't want Mercurial to track it, use <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9227 "revert</command> to undo the add. Don't worry; Mercurial will not modify the "
|
dongsheng@627
|
9228 "file in any way. It will just <quote>unmark</quote> the file."
|
dongsheng@627
|
9229 msgstr ""
|
dongsheng@627
|
9230
|
dongsheng@627
|
9231 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9232 #: ../en/ch08-undo.xml:234
|
dongsheng@627
|
9233 msgid ""
|
dongsheng@627
|
9234 "Similarly, if you ask Mercurial to <command role=\"hg-cmd\">hg remove</"
|
dongsheng@627
|
9235 "command> a file, you can use <command role=\"hg-cmd\">hg revert</command> to "
|
dongsheng@627
|
9236 "restore it to the contents it had as of the parent of the working directory. "
|
dongsheng@627
|
9237 "&interaction.daily.revert.remove; This works just as well for a file that you "
|
dongsheng@627
|
9238 "deleted by hand, without telling Mercurial (recall that in Mercurial "
|
dongsheng@627
|
9239 "terminology, this kind of file is called <quote>missing</quote>)."
|
dongsheng@627
|
9240 msgstr ""
|
dongsheng@627
|
9241
|
dongsheng@627
|
9242 #
|
dongsheng@627
|
9243 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9244 #: ../en/ch08-undo.xml:245
|
dongsheng@627
|
9245 msgid ""
|
dongsheng@627
|
9246 "If you revert a <command role=\"hg-cmd\">hg copy</command>, the copied-to "
|
dongsheng@627
|
9247 "file remains in your working directory afterwards, untracked. Since a copy "
|
dongsheng@627
|
9248 "doesn't affect the copied-from file in any way, Mercurial doesn't do anything "
|
dongsheng@627
|
9249 "with the copied-from file."
|
dongsheng@627
|
9250 msgstr ""
|
dongsheng@627
|
9251
|
dongsheng@627
|
9252 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
9253 #: ../en/ch08-undo.xml:254
|
dongsheng@627
|
9254 msgid "A slightly special case: reverting a rename"
|
dongsheng@635
|
9255 msgstr "一个稍微特别的案例:撤销改名"
|
dongsheng@627
|
9256
|
dongsheng@627
|
9257 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
9258 #: ../en/ch08-undo.xml:256
|
dongsheng@627
|
9259 msgid ""
|
dongsheng@627
|
9260 "If you <command role=\"hg-cmd\">hg rename</command> a file, there is one "
|
dongsheng@627
|
9261 "small detail that you should remember. When you <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9262 "revert</command> a rename, it's not enough to provide the name of the renamed-"
|
dongsheng@627
|
9263 "to file, as you can see here."
|
dongsheng@627
|
9264 msgstr ""
|
dongsheng@627
|
9265
|
dongsheng@627
|
9266 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
9267 #: ../en/ch08-undo.xml:264
|
dongsheng@627
|
9268 msgid ""
|
dongsheng@627
|
9269 "As you can see from the output of <command role=\"hg-cmd\">hg status</"
|
dongsheng@627
|
9270 "command>, the renamed-to file is no longer identified as added, but the "
|
dongsheng@627
|
9271 "renamed-<emphasis>from</emphasis> file is still removed! This is counter-"
|
dongsheng@627
|
9272 "intuitive (at least to me), but at least it's easy to deal with."
|
dongsheng@627
|
9273 msgstr ""
|
dongsheng@627
|
9274
|
dongsheng@627
|
9275 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
9276 #: ../en/ch08-undo.xml:273
|
dongsheng@627
|
9277 msgid ""
|
dongsheng@627
|
9278 "So remember, to revert a <command role=\"hg-cmd\">hg rename</command>, you "
|
dongsheng@627
|
9279 "must provide <emphasis>both</emphasis> the source and destination names."
|
dongsheng@627
|
9280 msgstr ""
|
dongsheng@627
|
9281
|
dongsheng@627
|
9282 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
9283 #: ../en/ch08-undo.xml:278
|
dongsheng@627
|
9284 msgid "% TODO: the output doesn't look like it will be removed!"
|
dongsheng@627
|
9285 msgstr ""
|
dongsheng@627
|
9286
|
dongsheng@627
|
9287 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
9288 #: ../en/ch08-undo.xml:281
|
dongsheng@627
|
9289 msgid ""
|
dongsheng@627
|
9290 "(By the way, if you rename a file, then modify the renamed-to file, then "
|
dongsheng@627
|
9291 "revert both components of the rename, when Mercurial restores the file that "
|
dongsheng@627
|
9292 "was removed as part of the rename, it will be unmodified. If you need the "
|
dongsheng@627
|
9293 "modifications in the renamed-to file to show up in the renamed-from file, "
|
dongsheng@627
|
9294 "don't forget to copy them over.)"
|
dongsheng@627
|
9295 msgstr ""
|
dongsheng@627
|
9296
|
dongsheng@627
|
9297 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
9298 #: ../en/ch08-undo.xml:288
|
dongsheng@627
|
9299 msgid ""
|
dongsheng@627
|
9300 "These fiddly aspects of reverting a rename arguably constitute a small bug in "
|
dongsheng@627
|
9301 "Mercurial."
|
dongsheng@627
|
9302 msgstr ""
|
dongsheng@627
|
9303
|
dongsheng@627
|
9304 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
9305 #: ../en/ch08-undo.xml:295
|
dongsheng@627
|
9306 msgid "Dealing with committed changes"
|
dongsheng@635
|
9307 msgstr "处理已经提交的修改"
|
dongsheng@627
|
9308
|
dongsheng@627
|
9309 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9310 #: ../en/ch08-undo.xml:297
|
dongsheng@627
|
9311 msgid ""
|
dongsheng@627
|
9312 "Consider a case where you have committed a change $a$, and another change $b$ "
|
dongsheng@627
|
9313 "on top of it; you then realise that change $a$ was incorrect. Mercurial lets "
|
dongsheng@627
|
9314 "you <quote>back out</quote> an entire changeset automatically, and building "
|
dongsheng@627
|
9315 "blocks that let you reverse part of a changeset by hand."
|
dongsheng@627
|
9316 msgstr ""
|
dongsheng@627
|
9317
|
dongsheng@627
|
9318 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9319 #: ../en/ch08-undo.xml:303
|
dongsheng@627
|
9320 msgid ""
|
dongsheng@627
|
9321 "Before you read this section, here's something to keep in mind: the <command "
|
dongsheng@627
|
9322 "role=\"hg-cmd\">hg backout</command> command undoes changes by "
|
dongsheng@627
|
9323 "<emphasis>adding</emphasis> history, not by modifying or erasing it. It's "
|
dongsheng@627
|
9324 "the right tool to use if you're fixing bugs, but not if you're trying to undo "
|
dongsheng@627
|
9325 "some change that has catastrophic consequences. To deal with those, see "
|
dongsheng@627
|
9326 "section <xref linkend=\"sec.undo.aaaiiieee\"/>."
|
dongsheng@627
|
9327 msgstr ""
|
dongsheng@627
|
9328
|
dongsheng@627
|
9329 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9330 #: ../en/ch08-undo.xml:312
|
dongsheng@627
|
9331 msgid "Backing out a changeset"
|
dongsheng@635
|
9332 msgstr "恢复一个修改集"
|
dongsheng@627
|
9333
|
dongsheng@627
|
9334 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9335 #: ../en/ch08-undo.xml:314
|
dongsheng@627
|
9336 msgid ""
|
dongsheng@627
|
9337 "The <command role=\"hg-cmd\">hg backout</command> command lets you "
|
dongsheng@627
|
9338 "<quote>undo</quote> the effects of an entire changeset in an automated "
|
dongsheng@627
|
9339 "fashion. Because Mercurial's history is immutable, this command "
|
dongsheng@627
|
9340 "<emphasis>does not</emphasis> get rid of the changeset you want to undo. "
|
dongsheng@627
|
9341 "Instead, it creates a new changeset that <emphasis>reverses</emphasis> the "
|
dongsheng@627
|
9342 "effect of the to-be-undone changeset."
|
dongsheng@627
|
9343 msgstr ""
|
dongsheng@627
|
9344
|
dongsheng@627
|
9345 #
|
dongsheng@627
|
9346 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9347 #: ../en/ch08-undo.xml:323
|
dongsheng@627
|
9348 msgid ""
|
dongsheng@627
|
9349 "The operation of the <command role=\"hg-cmd\">hg backout</command> command is "
|
dongsheng@627
|
9350 "a little intricate, so let's illustrate it with some examples. First, we'll "
|
dongsheng@627
|
9351 "create a repository with some simple changes."
|
dongsheng@627
|
9352 msgstr ""
|
dongsheng@627
|
9353
|
dongsheng@627
|
9354 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9355 #: ../en/ch08-undo.xml:330
|
dongsheng@627
|
9356 msgid ""
|
dongsheng@627
|
9357 "The <command role=\"hg-cmd\">hg backout</command> command takes a single "
|
dongsheng@627
|
9358 "changeset ID as its argument; this is the changeset to back out. Normally, "
|
dongsheng@627
|
9359 "<command role=\"hg-cmd\">hg backout</command> will drop you into a text "
|
dongsheng@627
|
9360 "editor to write a commit message, so you can record why you're backing the "
|
dongsheng@627
|
9361 "change out. In this example, we provide a commit message on the command line "
|
dongsheng@627
|
9362 "using the <option role=\"hg-opt-backout\">-m</option> option."
|
dongsheng@627
|
9363 msgstr ""
|
dongsheng@627
|
9364
|
dongsheng@627
|
9365 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9366 #: ../en/ch08-undo.xml:341
|
dongsheng@627
|
9367 msgid "Backing out the tip changeset"
|
dongsheng@635
|
9368 msgstr "恢复顶点修改集"
|
dongsheng@627
|
9369
|
dongsheng@627
|
9370 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9371 #: ../en/ch08-undo.xml:343
|
dongsheng@627
|
9372 msgid "We're going to start by backing out the last changeset we committed."
|
dongsheng@627
|
9373 msgstr ""
|
dongsheng@627
|
9374
|
dongsheng@627
|
9375 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9376 #: ../en/ch08-undo.xml:348
|
dongsheng@627
|
9377 msgid ""
|
dongsheng@627
|
9378 "You can see that the second line from <filename>myfile</filename> is no "
|
dongsheng@627
|
9379 "longer present. Taking a look at the output of <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9380 "log</command> gives us an idea of what the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9381 "backout</command> command has done. &interaction.backout.simple.log; Notice "
|
dongsheng@627
|
9382 "that the new changeset that <command role=\"hg-cmd\">hg backout</command> has "
|
dongsheng@627
|
9383 "created is a child of the changeset we backed out. It's easier to see this "
|
dongsheng@641
|
9384 "in figure <xref endterm=\"fig.undo.backout.caption\" linkend=\"fig.undo."
|
dongsheng@641
|
9385 "backout\"/>, which presents a graphical view of the change history. As you "
|
dongsheng@641
|
9386 "can see, the history is nice and linear."
|
dongsheng@627
|
9387 msgstr ""
|
dongsheng@627
|
9388
|
dongsheng@627
|
9389 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
9390 #: ../en/ch08-undo.xml:364
|
dongsheng@641
|
9391 msgid ""
|
dongsheng@641
|
9392 "<imageobject><imagedata fileref=\"images/undo-simple.png\"/> </imageobject>"
|
dongsheng@627
|
9393 msgstr ""
|
dongsheng@627
|
9394
|
dongsheng@627
|
9395 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
9396 #: ../en/ch08-undo.xml:367 ../en/ch08-undo.xml:486
|
dongsheng@627
|
9397 msgid ""
|
dongsheng@627
|
9398 "Backing out a change using the <command role=\"hg-cmd\">hg backout</command> "
|
dongsheng@627
|
9399 "command"
|
dongsheng@627
|
9400 msgstr ""
|
dongsheng@627
|
9401
|
dongsheng@627
|
9402 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9403 #: ../en/ch08-undo.xml:376
|
dongsheng@627
|
9404 msgid "Backing out a non-tip change"
|
dongsheng@635
|
9405 msgstr "恢复非顶点的修改"
|
dongsheng@627
|
9406
|
dongsheng@627
|
9407 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9408 #: ../en/ch08-undo.xml:378
|
dongsheng@627
|
9409 msgid ""
|
dongsheng@627
|
9410 "If you want to back out a change other than the last one you committed, pass "
|
dongsheng@627
|
9411 "the <option role=\"hg-opt-backout\">--merge</option> option to the <command "
|
dongsheng@627
|
9412 "role=\"hg-cmd\">hg backout</command> command."
|
dongsheng@627
|
9413 msgstr ""
|
dongsheng@627
|
9414
|
dongsheng@627
|
9415 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9416 #: ../en/ch08-undo.xml:385
|
dongsheng@627
|
9417 msgid ""
|
dongsheng@627
|
9418 "This makes backing out any changeset a <quote>one-shot</quote> operation "
|
dongsheng@627
|
9419 "that's usually simple and fast."
|
dongsheng@627
|
9420 msgstr ""
|
dongsheng@627
|
9421
|
dongsheng@627
|
9422 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9423 #: ../en/ch08-undo.xml:391
|
dongsheng@627
|
9424 msgid ""
|
dongsheng@627
|
9425 "If you take a look at the contents of <filename>myfile</filename> after the "
|
dongsheng@627
|
9426 "backout finishes, you'll see that the first and third changes are present, "
|
dongsheng@627
|
9427 "but not the second."
|
dongsheng@627
|
9428 msgstr ""
|
dongsheng@627
|
9429
|
dongsheng@627
|
9430 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9431 #: ../en/ch08-undo.xml:398
|
dongsheng@641
|
9432 msgid ""
|
dongsheng@641
|
9433 "As the graphical history in figure <xref endterm=\"fig.undo.backout-non-tip."
|
dongsheng@641
|
9434 "caption\" linkend=\"fig.undo.backout-non-tip\"/> illustrates, Mercurial "
|
dongsheng@641
|
9435 "actually commits <emphasis>two</emphasis> changes in this kind of situation "
|
dongsheng@641
|
9436 "(the box-shaped nodes are the ones that Mercurial commits automatically). "
|
dongsheng@641
|
9437 "Before Mercurial begins the backout process, it first remembers what the "
|
dongsheng@641
|
9438 "current parent of the working directory is. It then backs out the target "
|
dongsheng@641
|
9439 "changeset, and commits that as a changeset. Finally, it merges back to the "
|
dongsheng@641
|
9440 "previous parent of the working directory, and commits the result of the merge."
|
dongsheng@641
|
9441 msgstr ""
|
dongsheng@641
|
9442
|
dongsheng@641
|
9443 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9444 #: ../en/ch08-undo.xml:410
|
dongsheng@627
|
9445 msgid ""
|
dongsheng@627
|
9446 "% TODO: to me it looks like mercurial doesn't commit the second merge "
|
dongsheng@627
|
9447 "automatically!"
|
dongsheng@627
|
9448 msgstr ""
|
dongsheng@627
|
9449
|
dongsheng@627
|
9450 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
9451 #: ../en/ch08-undo.xml:415
|
dongsheng@641
|
9452 msgid ""
|
dongsheng@641
|
9453 "<imageobject><imagedata fileref=\"images/undo-non-tip.png\"/> </imageobject>"
|
dongsheng@627
|
9454 msgstr ""
|
dongsheng@627
|
9455
|
dongsheng@627
|
9456 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
9457 #: ../en/ch08-undo.xml:418
|
dongsheng@627
|
9458 msgid ""
|
dongsheng@627
|
9459 "Automated backout of a non-tip change using the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9460 "backout</command> command"
|
dongsheng@627
|
9461 msgstr ""
|
dongsheng@627
|
9462
|
dongsheng@627
|
9463 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9464 #: ../en/ch08-undo.xml:424
|
dongsheng@627
|
9465 msgid ""
|
dongsheng@627
|
9466 "The result is that you end up <quote>back where you were</quote>, only with "
|
dongsheng@627
|
9467 "some extra history that undoes the effect of the changeset you wanted to back "
|
dongsheng@627
|
9468 "out."
|
dongsheng@627
|
9469 msgstr ""
|
dongsheng@627
|
9470
|
dongsheng@627
|
9471 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
9472 #: ../en/ch08-undo.xml:429
|
dongsheng@627
|
9473 msgid "Always use the <option role=\"hg-opt-backout\">--merge</option> option"
|
dongsheng@635
|
9474 msgstr "始终使用选项 <option role=\"hg-opt-backout\">--merge</option>"
|
dongsheng@627
|
9475
|
dongsheng@627
|
9476 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
9477 #: ../en/ch08-undo.xml:432
|
dongsheng@627
|
9478 msgid ""
|
dongsheng@627
|
9479 "In fact, since the <option role=\"hg-opt-backout\">--merge</option> option "
|
dongsheng@627
|
9480 "will do the <quote>right thing</quote> whether or not the changeset you're "
|
dongsheng@627
|
9481 "backing out is the tip (i.e. it won't try to merge if it's backing out the "
|
dongsheng@627
|
9482 "tip, since there's no need), you should <emphasis>always</emphasis> use this "
|
dongsheng@627
|
9483 "option when you run the <command role=\"hg-cmd\">hg backout</command> command."
|
dongsheng@627
|
9484 msgstr ""
|
dongsheng@627
|
9485
|
dongsheng@627
|
9486 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9487 #: ../en/ch08-undo.xml:443
|
dongsheng@627
|
9488 msgid "Gaining more control of the backout process"
|
dongsheng@635
|
9489 msgstr "在恢复处理中获得更多控制"
|
dongsheng@627
|
9490
|
dongsheng@627
|
9491 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9492 #: ../en/ch08-undo.xml:445
|
dongsheng@627
|
9493 msgid ""
|
dongsheng@627
|
9494 "While I've recommended that you always use the <option role=\"hg-opt-backout"
|
dongsheng@627
|
9495 "\">--merge</option> option when backing out a change, the <command role=\"hg-"
|
dongsheng@627
|
9496 "cmd\">hg backout</command> command lets you decide how to merge a backout "
|
dongsheng@627
|
9497 "changeset. Taking control of the backout process by hand is something you "
|
dongsheng@627
|
9498 "will rarely need to do, but it can be useful to understand what the <command "
|
dongsheng@627
|
9499 "role=\"hg-cmd\">hg backout</command> command is doing for you automatically. "
|
dongsheng@627
|
9500 "To illustrate this, let's clone our first repository, but omit the backout "
|
dongsheng@627
|
9501 "change that it contains."
|
dongsheng@627
|
9502 msgstr ""
|
dongsheng@627
|
9503
|
dongsheng@627
|
9504 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9505 #: ../en/ch08-undo.xml:458
|
dongsheng@627
|
9506 msgid ""
|
dongsheng@627
|
9507 "As with our earlier example, We'll commit a third changeset, then back out "
|
dongsheng@627
|
9508 "its parent, and see what happens."
|
dongsheng@627
|
9509 msgstr ""
|
dongsheng@627
|
9510
|
dongsheng@627
|
9511 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9512 #: ../en/ch08-undo.xml:464
|
dongsheng@627
|
9513 msgid ""
|
dongsheng@627
|
9514 "Our new changeset is again a descendant of the changeset we backout out; it's "
|
dongsheng@627
|
9515 "thus a new head, <emphasis>not</emphasis> a descendant of the changeset that "
|
dongsheng@627
|
9516 "was the tip. The <command role=\"hg-cmd\">hg backout</command> command was "
|
dongsheng@627
|
9517 "quite explicit in telling us this."
|
dongsheng@627
|
9518 msgstr ""
|
dongsheng@627
|
9519
|
dongsheng@627
|
9520 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9521 #: ../en/ch08-undo.xml:472
|
dongsheng@627
|
9522 msgid ""
|
dongsheng@627
|
9523 "Again, it's easier to see what has happened by looking at a graph of the "
|
dongsheng@641
|
9524 "revision history, in figure <xref endterm=\"fig.undo.backout-manual.caption\" "
|
dongsheng@641
|
9525 "linkend=\"fig.undo.backout-manual\"/>. This makes it clear that when we use "
|
dongsheng@641
|
9526 "<command role=\"hg-cmd\">hg backout</command> to back out a change other than "
|
dongsheng@641
|
9527 "the tip, Mercurial adds a new head to the repository (the change it committed "
|
dongsheng@641
|
9528 "is box-shaped)."
|
dongsheng@627
|
9529 msgstr ""
|
dongsheng@627
|
9530
|
dongsheng@627
|
9531 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
9532 #: ../en/ch08-undo.xml:483
|
dongsheng@641
|
9533 msgid ""
|
dongsheng@641
|
9534 "<imageobject><imagedata fileref=\"images/undo-manual.png\"/> </imageobject>"
|
dongsheng@641
|
9535 msgstr ""
|
dongsheng@641
|
9536
|
dongsheng@641
|
9537 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9538 #: ../en/ch08-undo.xml:492
|
dongsheng@627
|
9539 msgid ""
|
dongsheng@627
|
9540 "After the <command role=\"hg-cmd\">hg backout</command> command has "
|
dongsheng@627
|
9541 "completed, it leaves the new <quote>backout</quote> changeset as the parent "
|
dongsheng@627
|
9542 "of the working directory."
|
dongsheng@627
|
9543 msgstr ""
|
dongsheng@627
|
9544
|
dongsheng@627
|
9545 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9546 #: ../en/ch08-undo.xml:499
|
dongsheng@627
|
9547 msgid "Now we have two isolated sets of changes."
|
dongsheng@627
|
9548 msgstr ""
|
dongsheng@627
|
9549
|
dongsheng@627
|
9550 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9551 #: ../en/ch08-undo.xml:503
|
dongsheng@627
|
9552 msgid ""
|
dongsheng@627
|
9553 "Let's think about what we expect to see as the contents of <filename>myfile</"
|
dongsheng@627
|
9554 "filename> now. The first change should be present, because we've never "
|
dongsheng@627
|
9555 "backed it out. The second change should be missing, as that's the change we "
|
dongsheng@627
|
9556 "backed out. Since the history graph shows the third change as a separate "
|
dongsheng@627
|
9557 "head, we <emphasis>don't</emphasis> expect to see the third change present in "
|
dongsheng@627
|
9558 "<filename>myfile</filename>."
|
dongsheng@627
|
9559 msgstr ""
|
dongsheng@627
|
9560
|
dongsheng@627
|
9561 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9562 #: ../en/ch08-undo.xml:513
|
dongsheng@627
|
9563 msgid ""
|
dongsheng@627
|
9564 "To get the third change back into the file, we just do a normal merge of our "
|
dongsheng@627
|
9565 "two heads."
|
dongsheng@627
|
9566 msgstr ""
|
dongsheng@627
|
9567
|
dongsheng@627
|
9568 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9569 #: ../en/ch08-undo.xml:518
|
dongsheng@627
|
9570 msgid ""
|
dongsheng@627
|
9571 "Afterwards, the graphical history of our repository looks like figure <xref "
|
dongsheng@641
|
9572 "endterm=\"fig.undo.backout-manual-merge.caption\" linkend=\"fig.undo.backout-"
|
dongsheng@641
|
9573 "manual-merge\"/>."
|
dongsheng@627
|
9574 msgstr ""
|
dongsheng@627
|
9575
|
dongsheng@627
|
9576 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
9577 #: ../en/ch08-undo.xml:525
|
dongsheng@641
|
9578 msgid ""
|
dongsheng@641
|
9579 "<imageobject><imagedata fileref=\"images/undo-manual-merge.png\"/> </"
|
dongsheng@627
|
9580 "imageobject>"
|
dongsheng@627
|
9581 msgstr ""
|
dongsheng@627
|
9582
|
dongsheng@627
|
9583 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
9584 #: ../en/ch08-undo.xml:528
|
dongsheng@627
|
9585 msgid "Manually merging a backout change"
|
dongsheng@627
|
9586 msgstr ""
|
dongsheng@627
|
9587
|
dongsheng@627
|
9588 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9589 #: ../en/ch08-undo.xml:535
|
dongsheng@627
|
9590 msgid "Why <command role=\"hg-cmd\">hg backout</command> works as it does"
|
dongsheng@635
|
9591 msgstr "<command role=\"hg-cmd\">hg backout</command> 的内幕"
|
dongsheng@627
|
9592
|
dongsheng@627
|
9593 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9594 #: ../en/ch08-undo.xml:538
|
dongsheng@627
|
9595 msgid ""
|
dongsheng@627
|
9596 "Here's a brief description of how the <command role=\"hg-cmd\">hg backout</"
|
dongsheng@627
|
9597 "command> command works."
|
dongsheng@627
|
9598 msgstr ""
|
dongsheng@627
|
9599
|
dongsheng@627
|
9600 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9601 #: ../en/ch08-undo.xml:541
|
dongsheng@627
|
9602 msgid ""
|
dongsheng@627
|
9603 "It ensures that the working directory is <quote>clean</quote>, i.e. that the "
|
dongsheng@627
|
9604 "output of <command role=\"hg-cmd\">hg status</command> would be empty."
|
dongsheng@627
|
9605 msgstr ""
|
dongsheng@627
|
9606
|
dongsheng@627
|
9607 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9608 #: ../en/ch08-undo.xml:545
|
dongsheng@627
|
9609 msgid ""
|
dongsheng@627
|
9610 "It remembers the current parent of the working directory. Let's call this "
|
dongsheng@627
|
9611 "changeset <literal>orig</literal>"
|
dongsheng@627
|
9612 msgstr ""
|
dongsheng@627
|
9613
|
dongsheng@627
|
9614 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9615 #: ../en/ch08-undo.xml:549
|
dongsheng@627
|
9616 msgid ""
|
dongsheng@627
|
9617 "It does the equivalent of a <command role=\"hg-cmd\">hg update</command> to "
|
dongsheng@627
|
9618 "sync the working directory to the changeset you want to back out. Let's call "
|
dongsheng@627
|
9619 "this changeset <literal>backout</literal>"
|
dongsheng@627
|
9620 msgstr ""
|
dongsheng@627
|
9621
|
dongsheng@627
|
9622 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9623 #: ../en/ch08-undo.xml:554
|
dongsheng@627
|
9624 msgid ""
|
dongsheng@627
|
9625 "It finds the parent of that changeset. Let's call that changeset "
|
dongsheng@627
|
9626 "<literal>parent</literal>."
|
dongsheng@627
|
9627 msgstr ""
|
dongsheng@627
|
9628
|
dongsheng@627
|
9629 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9630 #: ../en/ch08-undo.xml:557
|
dongsheng@627
|
9631 msgid ""
|
dongsheng@627
|
9632 "For each file that the <literal>backout</literal> changeset affected, it does "
|
dongsheng@627
|
9633 "the equivalent of a <command role=\"hg-cmd\">hg revert -r parent</command> on "
|
dongsheng@627
|
9634 "that file, to restore it to the contents it had before that changeset was "
|
dongsheng@627
|
9635 "committed."
|
dongsheng@627
|
9636 msgstr ""
|
dongsheng@627
|
9637
|
dongsheng@627
|
9638 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9639 #: ../en/ch08-undo.xml:564
|
dongsheng@627
|
9640 msgid ""
|
dongsheng@627
|
9641 "It commits the result as a new changeset. This changeset has "
|
dongsheng@627
|
9642 "<literal>backout</literal> as its parent."
|
dongsheng@627
|
9643 msgstr ""
|
dongsheng@627
|
9644
|
dongsheng@627
|
9645 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9646 #: ../en/ch08-undo.xml:568
|
dongsheng@627
|
9647 msgid ""
|
dongsheng@627
|
9648 "If you specify <option role=\"hg-opt-backout\">--merge</option> on the "
|
dongsheng@627
|
9649 "command line, it merges with <literal>orig</literal>, and commits the result "
|
dongsheng@627
|
9650 "of the merge."
|
dongsheng@627
|
9651 msgstr ""
|
dongsheng@627
|
9652
|
dongsheng@627
|
9653 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9654 #: ../en/ch08-undo.xml:574
|
dongsheng@627
|
9655 msgid ""
|
dongsheng@627
|
9656 "An alternative way to implement the <command role=\"hg-cmd\">hg backout</"
|
dongsheng@627
|
9657 "command> command would be to <command role=\"hg-cmd\">hg export</command> the "
|
dongsheng@627
|
9658 "to-be-backed-out changeset as a diff, then use the <option role=\"cmd-opt-"
|
dongsheng@627
|
9659 "patch\">--reverse</option> option to the <command>patch</command> command to "
|
dongsheng@627
|
9660 "reverse the effect of the change without fiddling with the working "
|
dongsheng@627
|
9661 "directory. This sounds much simpler, but it would not work nearly as well."
|
dongsheng@627
|
9662 msgstr ""
|
dongsheng@627
|
9663
|
dongsheng@627
|
9664 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9665 #: ../en/ch08-undo.xml:584
|
dongsheng@627
|
9666 msgid ""
|
dongsheng@627
|
9667 "The reason that <command role=\"hg-cmd\">hg backout</command> does an update, "
|
dongsheng@627
|
9668 "a commit, a merge, and another commit is to give the merge machinery the best "
|
dongsheng@627
|
9669 "chance to do a good job when dealing with all the changes <emphasis>between</"
|
dongsheng@627
|
9670 "emphasis> the change you're backing out and the current tip."
|
dongsheng@627
|
9671 msgstr ""
|
dongsheng@627
|
9672
|
dongsheng@627
|
9673 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9674 #: ../en/ch08-undo.xml:591
|
dongsheng@627
|
9675 msgid ""
|
dongsheng@627
|
9676 "If you're backing out a changeset that's 100 revisions back in your project's "
|
dongsheng@627
|
9677 "history, the chances that the <command>patch</command> command will be able "
|
dongsheng@627
|
9678 "to apply a reverse diff cleanly are not good, because intervening changes are "
|
dongsheng@627
|
9679 "likely to have <quote>broken the context</quote> that <command>patch</"
|
dongsheng@627
|
9680 "command> uses to determine whether it can apply a patch (if this sounds like "
|
dongsheng@627
|
9681 "gibberish, see <xref linkend=\"sec.mq.patch\"/> for a discussion of the "
|
dongsheng@627
|
9682 "<command>patch</command> command). Also, Mercurial's merge machinery will "
|
dongsheng@627
|
9683 "handle files and directories being renamed, permission changes, and "
|
dongsheng@627
|
9684 "modifications to binary files, none of which <command>patch</command> can "
|
dongsheng@627
|
9685 "deal with."
|
dongsheng@627
|
9686 msgstr ""
|
dongsheng@627
|
9687
|
dongsheng@627
|
9688 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
9689 #: ../en/ch08-undo.xml:608
|
dongsheng@627
|
9690 msgid "Changes that should never have been"
|
dongsheng@635
|
9691 msgstr "不该发生的修改"
|
dongsheng@627
|
9692
|
dongsheng@627
|
9693 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9694 #: ../en/ch08-undo.xml:610
|
dongsheng@627
|
9695 msgid ""
|
dongsheng@627
|
9696 "Most of the time, the <command role=\"hg-cmd\">hg backout</command> command "
|
dongsheng@627
|
9697 "is exactly what you need if you want to undo the effects of a change. It "
|
dongsheng@627
|
9698 "leaves a permanent record of exactly what you did, both when committing the "
|
dongsheng@627
|
9699 "original changeset and when you cleaned up after it."
|
dongsheng@627
|
9700 msgstr ""
|
dongsheng@627
|
9701
|
dongsheng@627
|
9702 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9703 #: ../en/ch08-undo.xml:616
|
dongsheng@627
|
9704 msgid ""
|
dongsheng@627
|
9705 "On rare occasions, though, you may find that you've committed a change that "
|
dongsheng@627
|
9706 "really should not be present in the repository at all. For example, it would "
|
dongsheng@627
|
9707 "be very unusual, and usually considered a mistake, to commit a software "
|
dongsheng@627
|
9708 "project's object files as well as its source files. Object files have almost "
|
dongsheng@627
|
9709 "no intrinsic value, and they're <emphasis>big</emphasis>, so they increase "
|
dongsheng@627
|
9710 "the size of the repository and the amount of time it takes to clone or pull "
|
dongsheng@627
|
9711 "changes."
|
dongsheng@627
|
9712 msgstr ""
|
dongsheng@627
|
9713
|
dongsheng@627
|
9714 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9715 #: ../en/ch08-undo.xml:625
|
dongsheng@627
|
9716 msgid ""
|
dongsheng@627
|
9717 "Before I discuss the options that you have if you commit a <quote>brown paper "
|
dongsheng@627
|
9718 "bag</quote> change (the kind that's so bad that you want to pull a brown "
|
dongsheng@627
|
9719 "paper bag over your head), let me first discuss some approaches that probably "
|
dongsheng@627
|
9720 "won't work."
|
dongsheng@627
|
9721 msgstr ""
|
dongsheng@627
|
9722
|
dongsheng@627
|
9723 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9724 #: ../en/ch08-undo.xml:630
|
dongsheng@627
|
9725 msgid ""
|
dongsheng@627
|
9726 "Since Mercurial treats history as accumulative&emdash;every change builds on "
|
dongsheng@627
|
9727 "top of all changes that preceded it&emdash;you generally can't just make "
|
dongsheng@627
|
9728 "disastrous changes disappear. The one exception is when you've just "
|
dongsheng@627
|
9729 "committed a change, and it hasn't been pushed or pulled into another "
|
dongsheng@627
|
9730 "repository. That's when you can safely use the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9731 "rollback</command> command, as I detailed in section <xref linkend=\"sec.undo."
|
dongsheng@627
|
9732 "rollback\"/>."
|
dongsheng@627
|
9733 msgstr ""
|
dongsheng@627
|
9734
|
dongsheng@627
|
9735 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9736 #: ../en/ch08-undo.xml:639
|
dongsheng@627
|
9737 msgid ""
|
dongsheng@627
|
9738 "After you've pushed a bad change to another repository, you <emphasis>could</"
|
dongsheng@627
|
9739 "emphasis> still use <command role=\"hg-cmd\">hg rollback</command> to make "
|
dongsheng@627
|
9740 "your local copy of the change disappear, but it won't have the consequences "
|
dongsheng@627
|
9741 "you want. The change will still be present in the remote repository, so it "
|
dongsheng@627
|
9742 "will reappear in your local repository the next time you pull."
|
dongsheng@627
|
9743 msgstr ""
|
dongsheng@627
|
9744
|
dongsheng@627
|
9745 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9746 #: ../en/ch08-undo.xml:647
|
dongsheng@627
|
9747 msgid ""
|
dongsheng@627
|
9748 "If a situation like this arises, and you know which repositories your bad "
|
dongsheng@627
|
9749 "change has propagated into, you can <emphasis>try</emphasis> to get rid of "
|
dongsheng@627
|
9750 "the changeefrom <emphasis>every</emphasis> one of those repositories. This "
|
dongsheng@627
|
9751 "is, of course, not a satisfactory solution: if you miss even a single "
|
dongsheng@627
|
9752 "repository while you're expunging, the change is still <quote>in the wild</"
|
dongsheng@627
|
9753 "quote>, and could propagate further."
|
dongsheng@627
|
9754 msgstr ""
|
dongsheng@627
|
9755
|
dongsheng@627
|
9756 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9757 #: ../en/ch08-undo.xml:655
|
dongsheng@627
|
9758 msgid ""
|
dongsheng@627
|
9759 "If you've committed one or more changes <emphasis>after</emphasis> the change "
|
dongsheng@627
|
9760 "that you'd like to see disappear, your options are further reduced. Mercurial "
|
dongsheng@627
|
9761 "doesn't provide a way to <quote>punch a hole</quote> in history, leaving "
|
dongsheng@627
|
9762 "changesets intact."
|
dongsheng@627
|
9763 msgstr ""
|
dongsheng@627
|
9764
|
dongsheng@627
|
9765 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9766 #: ../en/ch08-undo.xml:661
|
dongsheng@627
|
9767 msgid ""
|
dongsheng@627
|
9768 "XXX This needs filling out. The <literal>hg-replay</literal> script in the "
|
dongsheng@627
|
9769 "<literal>examples</literal> directory works, but doesn't handle merge "
|
dongsheng@627
|
9770 "changesets. Kind of an important omission."
|
dongsheng@627
|
9771 msgstr ""
|
dongsheng@627
|
9772
|
dongsheng@627
|
9773 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9774 #: ../en/ch08-undo.xml:667
|
dongsheng@627
|
9775 msgid "Protect yourself from <quote>escaped</quote> changes"
|
dongsheng@635
|
9776 msgstr "使用<quote>校验</quote>修改来保护你自己"
|
dongsheng@627
|
9777
|
dongsheng@627
|
9778 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9779 #: ../en/ch08-undo.xml:670
|
dongsheng@627
|
9780 msgid ""
|
dongsheng@627
|
9781 "If you've committed some changes to your local repository and they've been "
|
dongsheng@627
|
9782 "pushed or pulled somewhere else, this isn't necessarily a disaster. You can "
|
dongsheng@627
|
9783 "protect yourself ahead of time against some classes of bad changeset. This "
|
dongsheng@627
|
9784 "is particularly easy if your team usually pulls changes from a central "
|
dongsheng@627
|
9785 "repository."
|
dongsheng@627
|
9786 msgstr ""
|
dongsheng@627
|
9787
|
dongsheng@627
|
9788 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9789 #: ../en/ch08-undo.xml:677
|
dongsheng@627
|
9790 msgid ""
|
dongsheng@627
|
9791 "By configuring some hooks on that repository to validate incoming changesets "
|
dongsheng@627
|
9792 "(see chapter <xref linkend=\"chap.hook\"/>), you can automatically prevent "
|
dongsheng@627
|
9793 "some kinds of bad changeset from being pushed to the central repository at "
|
dongsheng@627
|
9794 "all. With such a configuration in place, some kinds of bad changeset will "
|
dongsheng@627
|
9795 "naturally tend to <quote>die out</quote> because they can't propagate into "
|
dongsheng@627
|
9796 "the central repository. Better yet, this happens without any need for "
|
dongsheng@627
|
9797 "explicit intervention."
|
dongsheng@627
|
9798 msgstr ""
|
dongsheng@627
|
9799
|
dongsheng@627
|
9800 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9801 #: ../en/ch08-undo.xml:687
|
dongsheng@627
|
9802 msgid ""
|
dongsheng@627
|
9803 "For instance, an incoming change hook that verifies that a changeset will "
|
dongsheng@627
|
9804 "actually compile can prevent people from inadvertantly <quote>breaking the "
|
dongsheng@627
|
9805 "build</quote>."
|
dongsheng@627
|
9806 msgstr ""
|
dongsheng@627
|
9807
|
dongsheng@627
|
9808 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
9809 #: ../en/ch08-undo.xml:694
|
dongsheng@627
|
9810 msgid "Finding the source of a bug"
|
dongsheng@635
|
9811 msgstr "查找问题的根源"
|
dongsheng@627
|
9812
|
dongsheng@627
|
9813 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9814 #: ../en/ch08-undo.xml:696
|
dongsheng@627
|
9815 msgid ""
|
dongsheng@627
|
9816 "While it's all very well to be able to back out a changeset that introduced a "
|
dongsheng@627
|
9817 "bug, this requires that you know which changeset to back out. Mercurial "
|
dongsheng@627
|
9818 "provides an invaluable command, called <command role=\"hg-cmd\">hg bisect</"
|
dongsheng@627
|
9819 "command>, that helps you to automate this process and accomplish it very "
|
dongsheng@627
|
9820 "efficiently."
|
dongsheng@627
|
9821 msgstr ""
|
dongsheng@627
|
9822
|
dongsheng@627
|
9823 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9824 #: ../en/ch08-undo.xml:703
|
dongsheng@627
|
9825 msgid ""
|
dongsheng@627
|
9826 "The idea behind the <command role=\"hg-cmd\">hg bisect</command> command is "
|
dongsheng@627
|
9827 "that a changeset has introduced some change of behaviour that you can "
|
dongsheng@627
|
9828 "identify with a simple binary test. You don't know which piece of code "
|
dongsheng@627
|
9829 "introduced the change, but you know how to test for the presence of the bug. "
|
dongsheng@627
|
9830 "The <command role=\"hg-cmd\">hg bisect</command> command uses your test to "
|
dongsheng@627
|
9831 "direct its search for the changeset that introduced the code that caused the "
|
dongsheng@627
|
9832 "bug."
|
dongsheng@627
|
9833 msgstr ""
|
dongsheng@627
|
9834
|
dongsheng@627
|
9835 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9836 #: ../en/ch08-undo.xml:712
|
dongsheng@627
|
9837 msgid ""
|
dongsheng@627
|
9838 "Here are a few scenarios to help you understand how you might apply this "
|
dongsheng@627
|
9839 "command."
|
dongsheng@627
|
9840 msgstr ""
|
dongsheng@627
|
9841
|
dongsheng@627
|
9842 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9843 #: ../en/ch08-undo.xml:715
|
dongsheng@627
|
9844 msgid ""
|
dongsheng@627
|
9845 "The most recent version of your software has a bug that you remember wasn't "
|
dongsheng@627
|
9846 "present a few weeks ago, but you don't know when it was introduced. Here, "
|
dongsheng@627
|
9847 "your binary test checks for the presence of that bug."
|
dongsheng@627
|
9848 msgstr ""
|
dongsheng@627
|
9849
|
dongsheng@627
|
9850 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9851 #: ../en/ch08-undo.xml:720
|
dongsheng@627
|
9852 msgid ""
|
dongsheng@627
|
9853 "You fixed a bug in a rush, and now it's time to close the entry in your "
|
dongsheng@627
|
9854 "team's bug database. The bug database requires a changeset ID when you close "
|
dongsheng@627
|
9855 "an entry, but you don't remember which changeset you fixed the bug in. Once "
|
dongsheng@627
|
9856 "again, your binary test checks for the presence of the bug."
|
dongsheng@627
|
9857 msgstr ""
|
dongsheng@627
|
9858
|
dongsheng@627
|
9859 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9860 #: ../en/ch08-undo.xml:727
|
dongsheng@627
|
9861 msgid ""
|
dongsheng@627
|
9862 "Your software works correctly, but runs 15% slower than the last time you "
|
dongsheng@627
|
9863 "measured it. You want to know which changeset introduced the performance "
|
dongsheng@627
|
9864 "regression. In this case, your binary test measures the performance of your "
|
dongsheng@627
|
9865 "software, to see whether it's <quote>fast</quote> or <quote>slow</quote>."
|
dongsheng@627
|
9866 msgstr ""
|
dongsheng@627
|
9867
|
dongsheng@627
|
9868 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
9869 #: ../en/ch08-undo.xml:734
|
dongsheng@627
|
9870 msgid ""
|
dongsheng@627
|
9871 "The sizes of the components of your project that you ship exploded recently, "
|
dongsheng@627
|
9872 "and you suspect that something changed in the way you build your project."
|
dongsheng@627
|
9873 msgstr ""
|
dongsheng@627
|
9874
|
dongsheng@627
|
9875 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9876 #: ../en/ch08-undo.xml:739
|
dongsheng@627
|
9877 msgid ""
|
dongsheng@627
|
9878 "From these examples, it should be clear that the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9879 "bisect</command> command is not useful only for finding the sources of bugs. "
|
dongsheng@627
|
9880 "You can use it to find any <quote>emergent property</quote> of a repository "
|
dongsheng@627
|
9881 "(anything that you can't find from a simple text search of the files in the "
|
dongsheng@627
|
9882 "tree) for which you can write a binary test."
|
dongsheng@627
|
9883 msgstr ""
|
dongsheng@627
|
9884
|
dongsheng@627
|
9885 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9886 #: ../en/ch08-undo.xml:746
|
dongsheng@627
|
9887 msgid ""
|
dongsheng@627
|
9888 "We'll introduce a little bit of terminology here, just to make it clear which "
|
dongsheng@627
|
9889 "parts of the search process are your responsibility, and which are "
|
dongsheng@627
|
9890 "Mercurial's. A <emphasis>test</emphasis> is something that <emphasis>you</"
|
dongsheng@627
|
9891 "emphasis> run when <command role=\"hg-cmd\">hg bisect</command> chooses a "
|
dongsheng@627
|
9892 "changeset. A <emphasis>probe</emphasis> is what <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9893 "bisect</command> runs to tell whether a revision is good. Finally, we'll use "
|
dongsheng@627
|
9894 "the word <quote>bisect</quote>, as both a noun and a verb, to stand in for "
|
dongsheng@627
|
9895 "the phrase <quote>search using the <command role=\"hg-cmd\">hg bisect</"
|
dongsheng@627
|
9896 "command> command</quote>."
|
dongsheng@627
|
9897 msgstr ""
|
dongsheng@627
|
9898
|
dongsheng@627
|
9899 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9900 #: ../en/ch08-undo.xml:759
|
dongsheng@627
|
9901 msgid ""
|
dongsheng@627
|
9902 "One simple way to automate the searching process would be simply to probe "
|
dongsheng@627
|
9903 "every changeset. However, this scales poorly. If it took ten minutes to "
|
dongsheng@627
|
9904 "test a single changeset, and you had 10,000 changesets in your repository, "
|
dongsheng@627
|
9905 "the exhaustive approach would take on average 35 <emphasis>days</emphasis> to "
|
dongsheng@627
|
9906 "find the changeset that introduced a bug. Even if you knew that the bug was "
|
dongsheng@627
|
9907 "introduced by one of the last 500 changesets, and limited your search to "
|
dongsheng@627
|
9908 "those, you'd still be looking at over 40 hours to find the changeset that "
|
dongsheng@627
|
9909 "introduced your bug."
|
dongsheng@627
|
9910 msgstr ""
|
dongsheng@627
|
9911
|
dongsheng@627
|
9912 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9913 #: ../en/ch08-undo.xml:769
|
dongsheng@627
|
9914 msgid ""
|
dongsheng@627
|
9915 "What the <command role=\"hg-cmd\">hg bisect</command> command does is use its "
|
dongsheng@627
|
9916 "knowledge of the <quote>shape</quote> of your project's revision history to "
|
dongsheng@627
|
9917 "perform a search in time proportional to the <emphasis>logarithm</emphasis> "
|
dongsheng@627
|
9918 "of the number of changesets to check (the kind of search it performs is "
|
dongsheng@627
|
9919 "called a dichotomic search). With this approach, searching through 10,000 "
|
dongsheng@627
|
9920 "changesets will take less than three hours, even at ten minutes per test (the "
|
dongsheng@627
|
9921 "search will require about 14 tests). Limit your search to the last hundred "
|
dongsheng@627
|
9922 "changesets, and it will take only about an hour (roughly seven tests)."
|
dongsheng@627
|
9923 msgstr ""
|
dongsheng@627
|
9924
|
dongsheng@627
|
9925 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
9926 #: ../en/ch08-undo.xml:780
|
dongsheng@627
|
9927 msgid ""
|
dongsheng@627
|
9928 "The <command role=\"hg-cmd\">hg bisect</command> command is aware of the "
|
dongsheng@627
|
9929 "<quote>branchy</quote> nature of a Mercurial project's revision history, so "
|
dongsheng@627
|
9930 "it has no problems dealing with branches, merges, or multiple heads in a "
|
dongsheng@627
|
9931 "repository. It can prune entire branches of history with a single probe, "
|
dongsheng@627
|
9932 "which is how it operates so efficiently."
|
dongsheng@627
|
9933 msgstr ""
|
dongsheng@627
|
9934
|
dongsheng@627
|
9935 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
9936 #: ../en/ch08-undo.xml:788
|
dongsheng@627
|
9937 msgid "Using the <command role=\"hg-cmd\">hg bisect</command> command"
|
dongsheng@635
|
9938 msgstr "使用命令 <command role=\"hg-cmd\">hg bisect</command>"
|
dongsheng@627
|
9939
|
dongsheng@627
|
9940 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9941 #: ../en/ch08-undo.xml:791
|
dongsheng@627
|
9942 msgid ""
|
dongsheng@627
|
9943 "Here's an example of <command role=\"hg-cmd\">hg bisect</command> in action."
|
dongsheng@627
|
9944 msgstr ""
|
dongsheng@627
|
9945
|
dongsheng@627
|
9946 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
9947 #: ../en/ch08-undo.xml:795
|
dongsheng@627
|
9948 msgid ""
|
dongsheng@627
|
9949 "In versions 0.9.5 and earlier of Mercurial, <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
9950 "bisect</command> was not a core command: it was distributed with Mercurial as "
|
dongsheng@627
|
9951 "an extension. This section describes the built-in command, not the old "
|
dongsheng@627
|
9952 "extension."
|
dongsheng@627
|
9953 msgstr ""
|
dongsheng@627
|
9954
|
dongsheng@627
|
9955 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9956 #: ../en/ch08-undo.xml:802
|
dongsheng@627
|
9957 msgid ""
|
dongsheng@627
|
9958 "Now let's create a repository, so that we can try out the <command role=\"hg-"
|
dongsheng@627
|
9959 "cmd\">hg bisect</command> command in isolation."
|
dongsheng@627
|
9960 msgstr ""
|
dongsheng@627
|
9961
|
dongsheng@627
|
9962 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9963 #: ../en/ch08-undo.xml:808
|
dongsheng@627
|
9964 msgid ""
|
dongsheng@627
|
9965 "We'll simulate a project that has a bug in it in a simple-minded way: create "
|
dongsheng@627
|
9966 "trivial changes in a loop, and nominate one specific change that will have "
|
dongsheng@627
|
9967 "the <quote>bug</quote>. This loop creates 35 changesets, each adding a "
|
dongsheng@627
|
9968 "single file to the repository. We'll represent our <quote>bug</quote> with a "
|
dongsheng@627
|
9969 "file that contains the text <quote>i have a gub</quote>."
|
dongsheng@627
|
9970 msgstr ""
|
dongsheng@627
|
9971
|
dongsheng@627
|
9972 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9973 #: ../en/ch08-undo.xml:818
|
dongsheng@627
|
9974 msgid ""
|
dongsheng@627
|
9975 "The next thing that we'd like to do is figure out how to use the <command "
|
dongsheng@627
|
9976 "role=\"hg-cmd\">hg bisect</command> command. We can use Mercurial's normal "
|
dongsheng@627
|
9977 "built-in help mechanism for this."
|
dongsheng@627
|
9978 msgstr ""
|
dongsheng@627
|
9979
|
dongsheng@627
|
9980 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
9981 #: ../en/ch08-undo.xml:825
|
dongsheng@627
|
9982 msgid ""
|
dongsheng@627
|
9983 "The <command role=\"hg-cmd\">hg bisect</command> command works in steps. "
|
dongsheng@627
|
9984 "Each step proceeds as follows."
|
dongsheng@627
|
9985 msgstr ""
|
dongsheng@627
|
9986
|
dongsheng@627
|
9987 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
9988 #: ../en/ch08-undo.xml:828
|
dongsheng@627
|
9989 msgid "You run your binary test."
|
dongsheng@627
|
9990 msgstr ""
|
dongsheng@627
|
9991
|
dongsheng@627
|
9992 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><itemizedlist><listitem><para>
|
dongsheng@650
|
9993 #: ../en/ch08-undo.xml:830
|
dongsheng@627
|
9994 msgid ""
|
dongsheng@627
|
9995 "If the test succeeded, you tell <command role=\"hg-cmd\">hg bisect</command> "
|
dongsheng@627
|
9996 "by running the <command role=\"hg-cmd\">hg bisect good</command> command."
|
dongsheng@627
|
9997 msgstr ""
|
dongsheng@627
|
9998
|
dongsheng@627
|
9999 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><itemizedlist><listitem><para>
|
dongsheng@650
|
10000 #: ../en/ch08-undo.xml:835
|
dongsheng@627
|
10001 msgid ""
|
dongsheng@627
|
10002 "If it failed, run the <command role=\"hg-cmd\">hg bisect bad</command> "
|
dongsheng@627
|
10003 "command."
|
dongsheng@627
|
10004 msgstr ""
|
dongsheng@627
|
10005
|
dongsheng@627
|
10006 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
10007 #: ../en/ch08-undo.xml:839
|
dongsheng@627
|
10008 msgid ""
|
dongsheng@627
|
10009 "The command uses your information to decide which changeset to test next."
|
dongsheng@627
|
10010 msgstr ""
|
dongsheng@627
|
10011
|
dongsheng@627
|
10012 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
|
dongsheng@650
|
10013 #: ../en/ch08-undo.xml:842
|
dongsheng@627
|
10014 msgid ""
|
dongsheng@627
|
10015 "It updates the working directory to that changeset, and the process begins "
|
dongsheng@627
|
10016 "again."
|
dongsheng@627
|
10017 msgstr ""
|
dongsheng@627
|
10018
|
dongsheng@627
|
10019 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10020 #: ../en/ch08-undo.xml:845
|
dongsheng@627
|
10021 msgid ""
|
dongsheng@627
|
10022 "The process ends when <command role=\"hg-cmd\">hg bisect</command> identifies "
|
dongsheng@627
|
10023 "a unique changeset that marks the point where your test transitioned from "
|
dongsheng@627
|
10024 "<quote>succeeding</quote> to <quote>failing</quote>."
|
dongsheng@627
|
10025 msgstr ""
|
dongsheng@627
|
10026
|
dongsheng@627
|
10027 #
|
dongsheng@627
|
10028 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10029 #: ../en/ch08-undo.xml:850
|
dongsheng@627
|
10030 msgid ""
|
dongsheng@627
|
10031 "To start the search, we must run the <command role=\"hg-cmd\">hg bisect --"
|
dongsheng@627
|
10032 "reset</command> command."
|
dongsheng@627
|
10033 msgstr ""
|
dongsheng@627
|
10034
|
dongsheng@627
|
10035 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10036 #: ../en/ch08-undo.xml:855
|
dongsheng@627
|
10037 msgid ""
|
dongsheng@627
|
10038 "In our case, the binary test we use is simple: we check to see if any file in "
|
dongsheng@627
|
10039 "the repository contains the string <quote>i have a gub</quote>. If it does, "
|
dongsheng@627
|
10040 "this changeset contains the change that <quote>caused the bug</quote>. By "
|
dongsheng@627
|
10041 "convention, a changeset that has the property we're searching for is "
|
dongsheng@627
|
10042 "<quote>bad</quote>, while one that doesn't is <quote>good</quote>."
|
dongsheng@627
|
10043 msgstr ""
|
dongsheng@627
|
10044
|
dongsheng@627
|
10045 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10046 #: ../en/ch08-undo.xml:863
|
dongsheng@627
|
10047 msgid ""
|
dongsheng@627
|
10048 "Most of the time, the revision to which the working directory is synced "
|
dongsheng@627
|
10049 "(usually the tip) already exhibits the problem introduced by the buggy "
|
dongsheng@627
|
10050 "change, so we'll mark it as <quote>bad</quote>."
|
dongsheng@627
|
10051 msgstr ""
|
dongsheng@627
|
10052
|
dongsheng@627
|
10053 #
|
dongsheng@627
|
10054 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10055 #: ../en/ch08-undo.xml:870
|
dongsheng@627
|
10056 msgid ""
|
dongsheng@627
|
10057 "Our next task is to nominate a changeset that we know <emphasis>doesn't</"
|
dongsheng@627
|
10058 "emphasis> have the bug; the <command role=\"hg-cmd\">hg bisect</command> "
|
dongsheng@627
|
10059 "command will <quote>bracket</quote> its search between the first pair of good "
|
dongsheng@627
|
10060 "and bad changesets. In our case, we know that revision 10 didn't have the "
|
dongsheng@627
|
10061 "bug. (I'll have more words about choosing the first <quote>good</quote> "
|
dongsheng@627
|
10062 "changeset later.)"
|
dongsheng@627
|
10063 msgstr ""
|
dongsheng@627
|
10064
|
dongsheng@627
|
10065 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10066 #: ../en/ch08-undo.xml:880
|
dongsheng@627
|
10067 msgid "Notice that this command printed some output."
|
dongsheng@627
|
10068 msgstr ""
|
dongsheng@627
|
10069
|
dongsheng@627
|
10070 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
10071 #: ../en/ch08-undo.xml:882
|
dongsheng@627
|
10072 msgid ""
|
dongsheng@627
|
10073 "It told us how many changesets it must consider before it can identify the "
|
dongsheng@627
|
10074 "one that introduced the bug, and how many tests that will require."
|
dongsheng@627
|
10075 msgstr ""
|
dongsheng@627
|
10076
|
dongsheng@627
|
10077 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
10078 #: ../en/ch08-undo.xml:886
|
dongsheng@627
|
10079 msgid ""
|
dongsheng@627
|
10080 "It updated the working directory to the next changeset to test, and told us "
|
dongsheng@627
|
10081 "which changeset it's testing."
|
dongsheng@627
|
10082 msgstr ""
|
dongsheng@627
|
10083
|
dongsheng@627
|
10084 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10085 #: ../en/ch08-undo.xml:891
|
dongsheng@627
|
10086 msgid ""
|
dongsheng@627
|
10087 "We now run our test in the working directory. We use the <command>grep</"
|
dongsheng@627
|
10088 "command> command to see if our <quote>bad</quote> file is present in the "
|
dongsheng@627
|
10089 "working directory. If it is, this revision is bad; if not, this revision is "
|
dongsheng@627
|
10090 "good. &interaction.bisect.search.step1;"
|
dongsheng@627
|
10091 msgstr ""
|
dongsheng@627
|
10092
|
dongsheng@627
|
10093 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10094 #: ../en/ch08-undo.xml:897
|
dongsheng@627
|
10095 msgid ""
|
dongsheng@627
|
10096 "This test looks like a perfect candidate for automation, so let's turn it "
|
dongsheng@627
|
10097 "into a shell function."
|
dongsheng@627
|
10098 msgstr ""
|
dongsheng@627
|
10099
|
dongsheng@627
|
10100 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10101 #: ../en/ch08-undo.xml:901
|
dongsheng@627
|
10102 msgid ""
|
dongsheng@627
|
10103 "We can now run an entire test step with a single command, <literal>mytest</"
|
dongsheng@627
|
10104 "literal>."
|
dongsheng@627
|
10105 msgstr ""
|
dongsheng@627
|
10106
|
dongsheng@627
|
10107 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10108 #: ../en/ch08-undo.xml:906
|
dongsheng@627
|
10109 msgid "A few more invocations of our canned test step command, and we're done."
|
dongsheng@627
|
10110 msgstr ""
|
dongsheng@627
|
10111
|
dongsheng@627
|
10112 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10113 #: ../en/ch08-undo.xml:911
|
dongsheng@627
|
10114 msgid ""
|
dongsheng@627
|
10115 "Even though we had 40 changesets to search through, the <command role=\"hg-cmd"
|
dongsheng@627
|
10116 "\">hg bisect</command> command let us find the changeset that introduced our "
|
dongsheng@627
|
10117 "<quote>bug</quote> with only five tests. Because the number of tests that "
|
dongsheng@627
|
10118 "the <command role=\"hg-cmd\">hg bisect</command> command performs grows "
|
dongsheng@627
|
10119 "logarithmically with the number of changesets to search, the advantage that "
|
dongsheng@627
|
10120 "it has over the <quote>brute force</quote> search approach increases with "
|
dongsheng@627
|
10121 "every changeset you add."
|
dongsheng@627
|
10122 msgstr ""
|
dongsheng@627
|
10123
|
dongsheng@627
|
10124 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10125 #: ../en/ch08-undo.xml:922
|
dongsheng@627
|
10126 msgid "Cleaning up after your search"
|
dongsheng@635
|
10127 msgstr "搜索后的清理"
|
dongsheng@627
|
10128
|
dongsheng@627
|
10129 #
|
dongsheng@627
|
10130 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10131 #: ../en/ch08-undo.xml:924
|
dongsheng@627
|
10132 msgid ""
|
dongsheng@627
|
10133 "When you're finished using the <command role=\"hg-cmd\">hg bisect</command> "
|
dongsheng@627
|
10134 "command in a repository, you can use the <command role=\"hg-cmd\">hg bisect "
|
dongsheng@627
|
10135 "reset</command> command to drop the information it was using to drive your "
|
dongsheng@627
|
10136 "search. The command doesn't use much space, so it doesn't matter if you "
|
dongsheng@627
|
10137 "forget to run this command. However, <command role=\"hg-cmd\">hg bisect</"
|
dongsheng@627
|
10138 "command> won't let you start a new search in that repository until you do a "
|
dongsheng@627
|
10139 "<command role=\"hg-cmd\">hg bisect reset</command>."
|
dongsheng@627
|
10140 msgstr ""
|
dongsheng@627
|
10141
|
dongsheng@627
|
10142 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
10143 #: ../en/ch08-undo.xml:939
|
dongsheng@627
|
10144 msgid "Tips for finding bugs effectively"
|
dongsheng@635
|
10145 msgstr "有效查找问题的技巧"
|
dongsheng@627
|
10146
|
dongsheng@627
|
10147 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10148 #: ../en/ch08-undo.xml:942
|
dongsheng@627
|
10149 msgid "Give consistent input"
|
dongsheng@635
|
10150 msgstr "给出一致的输入"
|
dongsheng@627
|
10151
|
dongsheng@627
|
10152 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10153 #: ../en/ch08-undo.xml:944
|
dongsheng@627
|
10154 msgid ""
|
dongsheng@627
|
10155 "The <command role=\"hg-cmd\">hg bisect</command> command requires that you "
|
dongsheng@627
|
10156 "correctly report the result of every test you perform. If you tell it that a "
|
dongsheng@627
|
10157 "test failed when it really succeeded, it <emphasis>might</emphasis> be able "
|
dongsheng@627
|
10158 "to detect the inconsistency. If it can identify an inconsistency in your "
|
dongsheng@627
|
10159 "reports, it will tell you that a particular changeset is both good and bad. "
|
dongsheng@627
|
10160 "However, it can't do this perfectly; it's about as likely to report the wrong "
|
dongsheng@627
|
10161 "changeset as the source of the bug."
|
dongsheng@627
|
10162 msgstr ""
|
dongsheng@627
|
10163
|
dongsheng@627
|
10164 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10165 #: ../en/ch08-undo.xml:956
|
dongsheng@627
|
10166 msgid "Automate as much as possible"
|
dongsheng@635
|
10167 msgstr "尽量自动"
|
dongsheng@627
|
10168
|
dongsheng@627
|
10169 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10170 #: ../en/ch08-undo.xml:958
|
dongsheng@627
|
10171 msgid ""
|
dongsheng@627
|
10172 "When I started using the <command role=\"hg-cmd\">hg bisect</command> "
|
dongsheng@627
|
10173 "command, I tried a few times to run my tests by hand, on the command line. "
|
dongsheng@627
|
10174 "This is an approach that I, at least, am not suited to. After a few tries, I "
|
dongsheng@627
|
10175 "found that I was making enough mistakes that I was having to restart my "
|
dongsheng@627
|
10176 "searches several times before finally getting correct results."
|
dongsheng@627
|
10177 msgstr ""
|
dongsheng@627
|
10178
|
dongsheng@627
|
10179 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10180 #: ../en/ch08-undo.xml:966
|
dongsheng@627
|
10181 msgid ""
|
dongsheng@627
|
10182 "My initial problems with driving the <command role=\"hg-cmd\">hg bisect</"
|
dongsheng@627
|
10183 "command> command by hand occurred even with simple searches on small "
|
dongsheng@627
|
10184 "repositories; if the problem you're looking for is more subtle, or the number "
|
dongsheng@627
|
10185 "of tests that <command role=\"hg-cmd\">hg bisect</command> must perform "
|
dongsheng@627
|
10186 "increases, the likelihood of operator error ruining the search is much "
|
dongsheng@627
|
10187 "higher. Once I started automating my tests, I had much better results."
|
dongsheng@627
|
10188 msgstr ""
|
dongsheng@627
|
10189
|
dongsheng@627
|
10190 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10191 #: ../en/ch08-undo.xml:975
|
dongsheng@627
|
10192 msgid "The key to automated testing is twofold:"
|
dongsheng@627
|
10193 msgstr ""
|
dongsheng@627
|
10194
|
dongsheng@627
|
10195 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
10196 #: ../en/ch08-undo.xml:977
|
dongsheng@627
|
10197 msgid "always test for the same symptom, and"
|
dongsheng@627
|
10198 msgstr ""
|
dongsheng@627
|
10199
|
dongsheng@627
|
10200 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
10201 #: ../en/ch08-undo.xml:979
|
dongsheng@627
|
10202 msgid ""
|
dongsheng@627
|
10203 "always feed consistent input to the <command role=\"hg-cmd\">hg bisect</"
|
dongsheng@627
|
10204 "command> command."
|
dongsheng@627
|
10205 msgstr ""
|
dongsheng@627
|
10206
|
dongsheng@627
|
10207 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10208 #: ../en/ch08-undo.xml:982
|
dongsheng@627
|
10209 msgid ""
|
dongsheng@627
|
10210 "In my tutorial example above, the <command>grep</command> command tests for "
|
dongsheng@627
|
10211 "the symptom, and the <literal>if</literal> statement takes the result of this "
|
dongsheng@627
|
10212 "check and ensures that we always feed the same input to the <command role="
|
dongsheng@627
|
10213 "\"hg-cmd\">hg bisect</command> command. The <literal>mytest</literal> "
|
dongsheng@627
|
10214 "function marries these together in a reproducible way, so that every test is "
|
dongsheng@627
|
10215 "uniform and consistent."
|
dongsheng@627
|
10216 msgstr ""
|
dongsheng@627
|
10217
|
dongsheng@627
|
10218 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10219 #: ../en/ch08-undo.xml:992
|
dongsheng@627
|
10220 msgid "Check your results"
|
dongsheng@635
|
10221 msgstr "检查你的结果"
|
dongsheng@627
|
10222
|
dongsheng@627
|
10223 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10224 #: ../en/ch08-undo.xml:994
|
dongsheng@627
|
10225 msgid ""
|
dongsheng@627
|
10226 "Because the output of a <command role=\"hg-cmd\">hg bisect</command> search "
|
dongsheng@627
|
10227 "is only as good as the input you give it, don't take the changeset it reports "
|
dongsheng@627
|
10228 "as the absolute truth. A simple way to cross-check its report is to manually "
|
dongsheng@627
|
10229 "run your test at each of the following changesets:"
|
dongsheng@627
|
10230 msgstr ""
|
dongsheng@627
|
10231
|
dongsheng@627
|
10232 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
10233 #: ../en/ch08-undo.xml:1000
|
dongsheng@627
|
10234 msgid ""
|
dongsheng@627
|
10235 "The changeset that it reports as the first bad revision. Your test should "
|
dongsheng@627
|
10236 "still report this as bad."
|
dongsheng@627
|
10237 msgstr ""
|
dongsheng@627
|
10238
|
dongsheng@627
|
10239 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
10240 #: ../en/ch08-undo.xml:1004
|
dongsheng@627
|
10241 msgid ""
|
dongsheng@627
|
10242 "The parent of that changeset (either parent, if it's a merge). Your test "
|
dongsheng@627
|
10243 "should report this changeset as good."
|
dongsheng@627
|
10244 msgstr ""
|
dongsheng@627
|
10245
|
dongsheng@627
|
10246 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
10247 #: ../en/ch08-undo.xml:1008
|
dongsheng@627
|
10248 msgid ""
|
dongsheng@627
|
10249 "A child of that changeset. Your test should report this changeset as bad."
|
dongsheng@627
|
10250 msgstr ""
|
dongsheng@627
|
10251
|
dongsheng@627
|
10252 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10253 #: ../en/ch08-undo.xml:1014
|
dongsheng@627
|
10254 msgid "Beware interference between bugs"
|
dongsheng@635
|
10255 msgstr "谨防问题之间的冲突"
|
dongsheng@627
|
10256
|
dongsheng@627
|
10257 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10258 #: ../en/ch08-undo.xml:1016
|
dongsheng@627
|
10259 msgid ""
|
dongsheng@627
|
10260 "It's possible that your search for one bug could be disrupted by the presence "
|
dongsheng@627
|
10261 "of another. For example, let's say your software crashes at revision 100, "
|
dongsheng@627
|
10262 "and worked correctly at revision 50. Unknown to you, someone else introduced "
|
dongsheng@627
|
10263 "a different crashing bug at revision 60, and fixed it at revision 80. This "
|
dongsheng@627
|
10264 "could distort your results in one of several ways."
|
dongsheng@627
|
10265 msgstr ""
|
dongsheng@627
|
10266
|
dongsheng@627
|
10267 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10268 #: ../en/ch08-undo.xml:1024
|
dongsheng@627
|
10269 msgid ""
|
dongsheng@627
|
10270 "It is possible that this other bug completely <quote>masks</quote> yours, "
|
dongsheng@627
|
10271 "which is to say that it occurs before your bug has a chance to manifest "
|
dongsheng@627
|
10272 "itself. If you can't avoid that other bug (for example, it prevents your "
|
dongsheng@627
|
10273 "project from building), and so can't tell whether your bug is present in a "
|
dongsheng@627
|
10274 "particular changeset, the <command role=\"hg-cmd\">hg bisect</command> "
|
dongsheng@627
|
10275 "command cannot help you directly. Instead, you can mark a changeset as "
|
dongsheng@627
|
10276 "untested by running <command role=\"hg-cmd\">hg bisect --skip</command>."
|
dongsheng@627
|
10277 msgstr ""
|
dongsheng@627
|
10278
|
dongsheng@627
|
10279 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10280 #: ../en/ch08-undo.xml:1034
|
dongsheng@627
|
10281 msgid ""
|
dongsheng@627
|
10282 "A different problem could arise if your test for a bug's presence is not "
|
dongsheng@627
|
10283 "specific enough. If you check for <quote>my program crashes</quote>, then "
|
dongsheng@627
|
10284 "both your crashing bug and an unrelated crashing bug that masks it will look "
|
dongsheng@627
|
10285 "like the same thing, and mislead <command role=\"hg-cmd\">hg bisect</command>."
|
dongsheng@627
|
10286 msgstr ""
|
dongsheng@627
|
10287
|
dongsheng@627
|
10288 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10289 #: ../en/ch08-undo.xml:1041
|
dongsheng@627
|
10290 msgid ""
|
dongsheng@627
|
10291 "Another useful situation in which to use <command role=\"hg-cmd\">hg bisect --"
|
dongsheng@627
|
10292 "skip</command> is if you can't test a revision because your project was in a "
|
dongsheng@627
|
10293 "broken and hence untestable state at that revision, perhaps because someone "
|
dongsheng@627
|
10294 "checked in a change that prevented the project from building."
|
dongsheng@627
|
10295 msgstr ""
|
dongsheng@627
|
10296
|
dongsheng@627
|
10297 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10298 #: ../en/ch08-undo.xml:1050
|
dongsheng@627
|
10299 msgid "Bracket your search lazily"
|
dongsheng@635
|
10300 msgstr "减少你的查找工作"
|
dongsheng@627
|
10301
|
dongsheng@627
|
10302 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10303 #: ../en/ch08-undo.xml:1052
|
dongsheng@627
|
10304 msgid ""
|
dongsheng@627
|
10305 "Choosing the first <quote>good</quote> and <quote>bad</quote> changesets that "
|
dongsheng@627
|
10306 "will mark the end points of your search is often easy, but it bears a little "
|
dongsheng@627
|
10307 "discussion nevertheless. From the perspective of <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
10308 "bisect</command>, the <quote>newest</quote> changeset is conventionally "
|
dongsheng@627
|
10309 "<quote>bad</quote>, and the older changeset is <quote>good</quote>."
|
dongsheng@627
|
10310 msgstr ""
|
dongsheng@627
|
10311
|
dongsheng@627
|
10312 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10313 #: ../en/ch08-undo.xml:1060
|
dongsheng@627
|
10314 msgid ""
|
dongsheng@627
|
10315 "If you're having trouble remembering when a suitable <quote>good</quote> "
|
dongsheng@627
|
10316 "change was, so that you can tell <command role=\"hg-cmd\">hg bisect</"
|
dongsheng@627
|
10317 "command>, you could do worse than testing changesets at random. Just "
|
dongsheng@627
|
10318 "remember to eliminate contenders that can't possibly exhibit the bug (perhaps "
|
dongsheng@627
|
10319 "because the feature with the bug isn't present yet) and those where another "
|
dongsheng@627
|
10320 "problem masks the bug (as I discussed above)."
|
dongsheng@627
|
10321 msgstr ""
|
dongsheng@627
|
10322
|
dongsheng@627
|
10323 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10324 #: ../en/ch08-undo.xml:1069
|
dongsheng@627
|
10325 msgid ""
|
dongsheng@627
|
10326 "Even if you end up <quote>early</quote> by thousands of changesets or months "
|
dongsheng@627
|
10327 "of history, you will only add a handful of tests to the total number that "
|
dongsheng@627
|
10328 "<command role=\"hg-cmd\">hg bisect</command> must perform, thanks to its "
|
dongsheng@627
|
10329 "logarithmic behaviour."
|
dongsheng@627
|
10330 msgstr ""
|
dongsheng@627
|
10331
|
dongsheng@627
|
10332 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
10333 #: ../en/ch09-hook.xml:5
|
dongsheng@627
|
10334 msgid "Handling repository events with hooks"
|
dongsheng@627
|
10335 msgstr "使用钩子处理版本库事件"
|
dongsheng@627
|
10336
|
dongsheng@627
|
10337 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
10338 #: ../en/ch09-hook.xml:7
|
dongsheng@627
|
10339 msgid ""
|
dongsheng@627
|
10340 "Mercurial offers a powerful mechanism to let you perform automated actions in "
|
dongsheng@627
|
10341 "response to events that occur in a repository. In some cases, you can even "
|
dongsheng@627
|
10342 "control Mercurial's response to those events."
|
dongsheng@627
|
10343 msgstr ""
|
dongsheng@627
|
10344
|
dongsheng@627
|
10345 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
10346 #: ../en/ch09-hook.xml:12
|
dongsheng@627
|
10347 msgid ""
|
dongsheng@627
|
10348 "The name Mercurial uses for one of these actions is a <emphasis>hook</"
|
dongsheng@627
|
10349 "emphasis>. Hooks are called <quote>triggers</quote> in some revision control "
|
dongsheng@627
|
10350 "systems, but the two names refer to the same idea."
|
dongsheng@627
|
10351 msgstr ""
|
dongsheng@627
|
10352
|
dongsheng@627
|
10353 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
10354 #: ../en/ch09-hook.xml:18
|
dongsheng@627
|
10355 msgid "An overview of hooks in Mercurial"
|
dongsheng@635
|
10356 msgstr "Mercurial 钩子概述"
|
dongsheng@627
|
10357
|
dongsheng@627
|
10358 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10359 #: ../en/ch09-hook.xml:20
|
dongsheng@627
|
10360 msgid ""
|
dongsheng@627
|
10361 "Here is a brief list of the hooks that Mercurial supports. We will revisit "
|
dongsheng@627
|
10362 "each of these hooks in more detail later, in section <xref linkend=\"sec.hook."
|
dongsheng@627
|
10363 "ref\"/>."
|
dongsheng@627
|
10364 msgstr ""
|
dongsheng@627
|
10365
|
dongsheng@627
|
10366 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10367 #: ../en/ch09-hook.xml:25
|
dongsheng@627
|
10368 msgid ""
|
dongsheng@627
|
10369 "<literal role=\"hook\">changegroup</literal>: This is run after a group of "
|
dongsheng@627
|
10370 "changesets has been brought into the repository from elsewhere."
|
dongsheng@627
|
10371 msgstr ""
|
dongsheng@627
|
10372
|
dongsheng@627
|
10373 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10374 #: ../en/ch09-hook.xml:29
|
dongsheng@627
|
10375 msgid ""
|
dongsheng@627
|
10376 "<literal role=\"hook\">commit</literal>: This is run after a new changeset "
|
dongsheng@627
|
10377 "has been created in the local repository."
|
dongsheng@627
|
10378 msgstr ""
|
dongsheng@627
|
10379
|
dongsheng@627
|
10380 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10381 #: ../en/ch09-hook.xml:33
|
dongsheng@627
|
10382 msgid ""
|
dongsheng@627
|
10383 "<literal role=\"hook\">incoming</literal>: This is run once for each new "
|
dongsheng@627
|
10384 "changeset that is brought into the repository from elsewhere. Notice the "
|
dongsheng@627
|
10385 "difference from <literal role=\"hook\">changegroup</literal>, which is run "
|
dongsheng@627
|
10386 "once per <emphasis>group</emphasis> of changesets brought in."
|
dongsheng@627
|
10387 msgstr ""
|
dongsheng@627
|
10388
|
dongsheng@627
|
10389 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10390 #: ../en/ch09-hook.xml:40
|
dongsheng@627
|
10391 msgid ""
|
dongsheng@627
|
10392 "<literal role=\"hook\">outgoing</literal>: This is run after a group of "
|
dongsheng@627
|
10393 "changesets has been transmitted from this repository."
|
dongsheng@627
|
10394 msgstr ""
|
dongsheng@627
|
10395
|
dongsheng@627
|
10396 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10397 #: ../en/ch09-hook.xml:44
|
dongsheng@627
|
10398 msgid ""
|
dongsheng@627
|
10399 "<literal role=\"hook\">prechangegroup</literal>: This is run before starting "
|
dongsheng@627
|
10400 "to bring a group of changesets into the repository."
|
dongsheng@627
|
10401 msgstr ""
|
dongsheng@627
|
10402
|
dongsheng@627
|
10403 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10404 #: ../en/ch09-hook.xml:49
|
dongsheng@627
|
10405 msgid ""
|
dongsheng@627
|
10406 "<literal role=\"hook\">precommit</literal>: Controlling. This is run before "
|
dongsheng@627
|
10407 "starting a commit."
|
dongsheng@627
|
10408 msgstr ""
|
dongsheng@627
|
10409
|
dongsheng@627
|
10410 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10411 #: ../en/ch09-hook.xml:53
|
dongsheng@627
|
10412 msgid ""
|
dongsheng@627
|
10413 "<literal role=\"hook\">preoutgoing</literal>: Controlling. This is run before "
|
dongsheng@627
|
10414 "starting to transmit a group of changesets from this repository."
|
dongsheng@627
|
10415 msgstr ""
|
dongsheng@627
|
10416
|
dongsheng@627
|
10417 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10418 #: ../en/ch09-hook.xml:58
|
dongsheng@627
|
10419 msgid ""
|
dongsheng@627
|
10420 "<literal role=\"hook\">pretag</literal>: Controlling. This is run before "
|
dongsheng@627
|
10421 "creating a tag."
|
dongsheng@627
|
10422 msgstr ""
|
dongsheng@627
|
10423
|
dongsheng@627
|
10424 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10425 #: ../en/ch09-hook.xml:62
|
dongsheng@627
|
10426 msgid ""
|
dongsheng@627
|
10427 "<literal role=\"hook\">pretxnchangegroup</literal>: Controlling. This is run "
|
dongsheng@627
|
10428 "after a group of changesets has been brought into the local repository from "
|
dongsheng@627
|
10429 "another, but before the transaction completes that will make the changes "
|
dongsheng@627
|
10430 "permanent in the repository."
|
dongsheng@627
|
10431 msgstr ""
|
dongsheng@627
|
10432
|
dongsheng@627
|
10433 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10434 #: ../en/ch09-hook.xml:70
|
dongsheng@627
|
10435 msgid ""
|
dongsheng@627
|
10436 "<literal role=\"hook\">pretxncommit</literal>: Controlling. This is run after "
|
dongsheng@627
|
10437 "a new changeset has been created in the local repository, but before the "
|
dongsheng@627
|
10438 "transaction completes that will make it permanent."
|
dongsheng@627
|
10439 msgstr ""
|
dongsheng@627
|
10440
|
dongsheng@627
|
10441 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10442 #: ../en/ch09-hook.xml:76
|
dongsheng@627
|
10443 msgid ""
|
dongsheng@627
|
10444 "<literal role=\"hook\">preupdate</literal>: Controlling. This is run before "
|
dongsheng@627
|
10445 "starting an update or merge of the working directory."
|
dongsheng@627
|
10446 msgstr ""
|
dongsheng@627
|
10447
|
dongsheng@627
|
10448 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10449 #: ../en/ch09-hook.xml:81
|
dongsheng@627
|
10450 msgid ""
|
dongsheng@627
|
10451 "<literal role=\"hook\">tag</literal>: This is run after a tag is created."
|
dongsheng@627
|
10452 msgstr ""
|
dongsheng@627
|
10453
|
dongsheng@627
|
10454 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
10455 #: ../en/ch09-hook.xml:85
|
dongsheng@627
|
10456 msgid ""
|
dongsheng@627
|
10457 "<literal role=\"hook\">update</literal>: This is run after an update or merge "
|
dongsheng@627
|
10458 "of the working directory has finished."
|
dongsheng@627
|
10459 msgstr ""
|
dongsheng@627
|
10460
|
dongsheng@627
|
10461 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10462 #: ../en/ch09-hook.xml:90
|
dongsheng@627
|
10463 msgid ""
|
dongsheng@627
|
10464 "Each of the hooks whose description begins with the word <quote>Controlling</"
|
dongsheng@627
|
10465 "quote> has the ability to determine whether an activity can proceed. If the "
|
dongsheng@627
|
10466 "hook succeeds, the activity may proceed; if it fails, the activity is either "
|
dongsheng@627
|
10467 "not permitted or undone, depending on the hook."
|
dongsheng@627
|
10468 msgstr ""
|
dongsheng@627
|
10469
|
dongsheng@627
|
10470 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
10471 #: ../en/ch09-hook.xml:99
|
dongsheng@627
|
10472 msgid "Hooks and security"
|
dongsheng@635
|
10473 msgstr "钩子与安全性"
|
dongsheng@627
|
10474
|
dongsheng@627
|
10475 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10476 #: ../en/ch09-hook.xml:102
|
dongsheng@627
|
10477 msgid "Hooks are run with your privileges"
|
dongsheng@635
|
10478 msgstr "钩子以你的特权执行"
|
dongsheng@627
|
10479
|
dongsheng@627
|
10480 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10481 #: ../en/ch09-hook.xml:104
|
dongsheng@627
|
10482 msgid ""
|
dongsheng@627
|
10483 "When you run a Mercurial command in a repository, and the command causes a "
|
dongsheng@627
|
10484 "hook to run, that hook runs on <emphasis>your</emphasis> system, under "
|
dongsheng@627
|
10485 "<emphasis>your</emphasis> user account, with <emphasis>your</emphasis> "
|
dongsheng@627
|
10486 "privilege level. Since hooks are arbitrary pieces of executable code, you "
|
dongsheng@627
|
10487 "should treat them with an appropriate level of suspicion. Do not install a "
|
dongsheng@627
|
10488 "hook unless you are confident that you know who created it and what it does."
|
dongsheng@627
|
10489 msgstr ""
|
dongsheng@627
|
10490
|
dongsheng@627
|
10491 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10492 #: ../en/ch09-hook.xml:115
|
dongsheng@627
|
10493 msgid ""
|
dongsheng@627
|
10494 "In some cases, you may be exposed to hooks that you did not install "
|
dongsheng@627
|
10495 "yourself. If you work with Mercurial on an unfamiliar system, Mercurial will "
|
dongsheng@650
|
10496 "run hooks defined in that system's global <filename role=\"special\">~/.hgrc</"
|
dongsheng@650
|
10497 "filename> file."
|
dongsheng@650
|
10498 msgstr ""
|
dongsheng@650
|
10499
|
dongsheng@650
|
10500 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10501 #: ../en/ch09-hook.xml:122
|
dongsheng@627
|
10502 msgid ""
|
dongsheng@627
|
10503 "If you are working with a repository owned by another user, Mercurial can run "
|
dongsheng@627
|
10504 "hooks defined in that user's repository, but it will still run them as "
|
dongsheng@627
|
10505 "<quote>you</quote>. For example, if you <command role=\"hg-cmd\">hg pull</"
|
dongsheng@627
|
10506 "command> from that repository, and its <filename role=\"special\">.hg/hgrc</"
|
dongsheng@627
|
10507 "filename> defines a local <literal role=\"hook\">outgoing</literal> hook, "
|
dongsheng@627
|
10508 "that hook will run under your user account, even though you don't own that "
|
dongsheng@627
|
10509 "repository."
|
dongsheng@627
|
10510 msgstr ""
|
dongsheng@627
|
10511
|
dongsheng@627
|
10512 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
10513 #: ../en/ch09-hook.xml:134
|
dongsheng@627
|
10514 msgid ""
|
dongsheng@627
|
10515 "This only applies if you are pulling from a repository on a local or network "
|
dongsheng@627
|
10516 "filesystem. If you're pulling over http or ssh, any <literal role=\"hook"
|
dongsheng@627
|
10517 "\">outgoing</literal> hook will run under whatever account is executing the "
|
dongsheng@627
|
10518 "server process, on the server."
|
dongsheng@627
|
10519 msgstr ""
|
dongsheng@627
|
10520
|
dongsheng@627
|
10521 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10522 #: ../en/ch09-hook.xml:142
|
dongsheng@627
|
10523 msgid ""
|
dongsheng@627
|
10524 "XXX To see what hooks are defined in a repository, use the <command role=\"hg-"
|
dongsheng@627
|
10525 "cmd\">hg config hooks</command> command. If you are working in one "
|
dongsheng@627
|
10526 "repository, but talking to another that you do not own (e.g. using <command "
|
dongsheng@627
|
10527 "role=\"hg-cmd\">hg pull</command> or <command role=\"hg-cmd\">hg incoming</"
|
dongsheng@627
|
10528 "command>), remember that it is the other repository's hooks you should be "
|
dongsheng@627
|
10529 "checking, not your own."
|
dongsheng@627
|
10530 msgstr ""
|
dongsheng@627
|
10531
|
dongsheng@627
|
10532 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10533 #: ../en/ch09-hook.xml:153
|
dongsheng@627
|
10534 msgid "Hooks do not propagate"
|
dongsheng@635
|
10535 msgstr "钩子不会传播"
|
dongsheng@627
|
10536
|
dongsheng@627
|
10537 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10538 #: ../en/ch09-hook.xml:155
|
dongsheng@627
|
10539 msgid ""
|
dongsheng@627
|
10540 "In Mercurial, hooks are not revision controlled, and do not propagate when "
|
dongsheng@627
|
10541 "you clone, or pull from, a repository. The reason for this is simple: a hook "
|
dongsheng@627
|
10542 "is a completely arbitrary piece of executable code. It runs under your user "
|
dongsheng@627
|
10543 "identity, with your privilege level, on your machine."
|
dongsheng@627
|
10544 msgstr ""
|
dongsheng@627
|
10545
|
dongsheng@627
|
10546 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10547 #: ../en/ch09-hook.xml:162
|
dongsheng@627
|
10548 msgid ""
|
dongsheng@627
|
10549 "It would be extremely reckless for any distributed revision control system to "
|
dongsheng@627
|
10550 "implement revision-controlled hooks, as this would offer an easily "
|
dongsheng@627
|
10551 "exploitable way to subvert the accounts of users of the revision control "
|
dongsheng@627
|
10552 "system."
|
dongsheng@627
|
10553 msgstr ""
|
dongsheng@627
|
10554
|
dongsheng@627
|
10555 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10556 #: ../en/ch09-hook.xml:168
|
dongsheng@627
|
10557 msgid ""
|
dongsheng@627
|
10558 "Since Mercurial does not propagate hooks, if you are collaborating with other "
|
dongsheng@627
|
10559 "people on a common project, you should not assume that they are using the "
|
dongsheng@627
|
10560 "same Mercurial hooks as you are, or that theirs are correctly configured. "
|
dongsheng@627
|
10561 "You should document the hooks you expect people to use."
|
dongsheng@627
|
10562 msgstr ""
|
dongsheng@627
|
10563
|
dongsheng@627
|
10564 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10565 #: ../en/ch09-hook.xml:175
|
dongsheng@627
|
10566 msgid ""
|
dongsheng@627
|
10567 "In a corporate intranet, this is somewhat easier to control, as you can for "
|
dongsheng@627
|
10568 "example provide a <quote>standard</quote> installation of Mercurial on an NFS "
|
dongsheng@650
|
10569 "filesystem, and use a site-wide <filename role=\"special\">~/.hgrc</filename> "
|
dongsheng@650
|
10570 "file to define hooks that all users will see. However, this too has its "
|
dongsheng@627
|
10571 "limits; see below."
|
dongsheng@627
|
10572 msgstr ""
|
dongsheng@627
|
10573
|
dongsheng@627
|
10574 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10575 #: ../en/ch09-hook.xml:184
|
dongsheng@627
|
10576 msgid "Hooks can be overridden"
|
dongsheng@635
|
10577 msgstr "钩子可以被覆盖"
|
dongsheng@627
|
10578
|
dongsheng@627
|
10579 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10580 #: ../en/ch09-hook.xml:186
|
dongsheng@627
|
10581 msgid ""
|
dongsheng@627
|
10582 "Mercurial allows you to override a hook definition by redefining the hook. "
|
dongsheng@627
|
10583 "You can disable it by setting its value to the empty string, or change its "
|
dongsheng@627
|
10584 "behaviour as you wish."
|
dongsheng@627
|
10585 msgstr ""
|
dongsheng@627
|
10586
|
dongsheng@627
|
10587 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10588 #: ../en/ch09-hook.xml:191
|
dongsheng@650
|
10589 msgid ""
|
dongsheng@650
|
10590 "If you deploy a system- or site-wide <filename role=\"special\">~/.hgrc</"
|
dongsheng@650
|
10591 "filename> file that defines some hooks, you should thus understand that your "
|
dongsheng@650
|
10592 "users can disable or override those hooks."
|
dongsheng@650
|
10593 msgstr ""
|
dongsheng@650
|
10594
|
dongsheng@650
|
10595 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10596 #: ../en/ch09-hook.xml:199
|
dongsheng@627
|
10597 msgid "Ensuring that critical hooks are run"
|
dongsheng@635
|
10598 msgstr "确保关键钩子的执行"
|
dongsheng@627
|
10599
|
dongsheng@627
|
10600 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10601 #: ../en/ch09-hook.xml:201
|
dongsheng@627
|
10602 msgid ""
|
dongsheng@627
|
10603 "Sometimes you may want to enforce a policy that you do not want others to be "
|
dongsheng@627
|
10604 "able to work around. For example, you may have a requirement that every "
|
dongsheng@627
|
10605 "changeset must pass a rigorous set of tests. Defining this requirement via a "
|
dongsheng@650
|
10606 "hook in a site-wide <filename role=\"special\">~/.hgrc</filename> won't work "
|
dongsheng@650
|
10607 "for remote users on laptops, and of course local users can subvert it at will "
|
dongsheng@650
|
10608 "by overriding the hook."
|
dongsheng@650
|
10609 msgstr ""
|
dongsheng@650
|
10610
|
dongsheng@650
|
10611 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10612 #: ../en/ch09-hook.xml:210
|
dongsheng@627
|
10613 msgid ""
|
dongsheng@627
|
10614 "Instead, you can set up your policies for use of Mercurial so that people are "
|
dongsheng@627
|
10615 "expected to propagate changes through a well-known <quote>canonical</quote> "
|
dongsheng@627
|
10616 "server that you have locked down and configured appropriately."
|
dongsheng@627
|
10617 msgstr ""
|
dongsheng@627
|
10618
|
dongsheng@627
|
10619 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10620 #: ../en/ch09-hook.xml:216
|
dongsheng@627
|
10621 msgid ""
|
dongsheng@627
|
10622 "One way to do this is via a combination of social engineering and "
|
dongsheng@627
|
10623 "technology. Set up a restricted-access account; users can push changes over "
|
dongsheng@627
|
10624 "the network to repositories managed by this account, but they cannot log into "
|
dongsheng@627
|
10625 "the account and run normal shell commands. In this scenario, a user can "
|
dongsheng@627
|
10626 "commit a changeset that contains any old garbage they want."
|
dongsheng@627
|
10627 msgstr ""
|
dongsheng@627
|
10628
|
dongsheng@627
|
10629 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10630 #: ../en/ch09-hook.xml:225
|
dongsheng@627
|
10631 msgid ""
|
dongsheng@627
|
10632 "When someone pushes a changeset to the server that everyone pulls from, the "
|
dongsheng@627
|
10633 "server will test the changeset before it accepts it as permanent, and reject "
|
dongsheng@627
|
10634 "it if it fails to pass the test suite. If people only pull changes from this "
|
dongsheng@627
|
10635 "filtering server, it will serve to ensure that all changes that people pull "
|
dongsheng@627
|
10636 "have been automatically vetted."
|
dongsheng@627
|
10637 msgstr ""
|
dongsheng@627
|
10638
|
dongsheng@627
|
10639 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
10640 #: ../en/ch09-hook.xml:236
|
dongsheng@627
|
10641 msgid "Care with <literal>pretxn</literal> hooks in a shared-access repository"
|
dongsheng@635
|
10642 msgstr "在共享版本库中注意 <literal>pretxn</literal> 钩子"
|
dongsheng@627
|
10643
|
dongsheng@627
|
10644 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10645 #: ../en/ch09-hook.xml:239
|
dongsheng@627
|
10646 msgid ""
|
dongsheng@627
|
10647 "If you want to use hooks to do some automated work in a repository that a "
|
dongsheng@627
|
10648 "number of people have shared access to, you need to be careful in how you do "
|
dongsheng@627
|
10649 "this."
|
dongsheng@627
|
10650 msgstr ""
|
dongsheng@627
|
10651
|
dongsheng@627
|
10652 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10653 #: ../en/ch09-hook.xml:244
|
dongsheng@627
|
10654 msgid ""
|
dongsheng@627
|
10655 "Mercurial only locks a repository when it is writing to the repository, and "
|
dongsheng@627
|
10656 "only the parts of Mercurial that write to the repository pay attention to "
|
dongsheng@627
|
10657 "locks. Write locks are necessary to prevent multiple simultaneous writers "
|
dongsheng@627
|
10658 "from scribbling on each other's work, corrupting the repository."
|
dongsheng@627
|
10659 msgstr ""
|
dongsheng@627
|
10660
|
dongsheng@627
|
10661 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10662 #: ../en/ch09-hook.xml:251
|
dongsheng@627
|
10663 msgid ""
|
dongsheng@627
|
10664 "Because Mercurial is careful with the order in which it reads and writes "
|
dongsheng@627
|
10665 "data, it does not need to acquire a lock when it wants to read data from the "
|
dongsheng@627
|
10666 "repository. The parts of Mercurial that read from the repository never pay "
|
dongsheng@627
|
10667 "attention to locks. This lockless reading scheme greatly increases "
|
dongsheng@627
|
10668 "performance and concurrency."
|
dongsheng@627
|
10669 msgstr ""
|
dongsheng@627
|
10670
|
dongsheng@627
|
10671 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10672 #: ../en/ch09-hook.xml:259
|
dongsheng@627
|
10673 msgid ""
|
dongsheng@627
|
10674 "With great performance comes a trade-off, though, one which has the potential "
|
dongsheng@627
|
10675 "to cause you trouble unless you're aware of it. To describe this requires a "
|
dongsheng@627
|
10676 "little detail about how Mercurial adds changesets to a repository and reads "
|
dongsheng@627
|
10677 "those changes."
|
dongsheng@627
|
10678 msgstr ""
|
dongsheng@627
|
10679
|
dongsheng@627
|
10680 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10681 #: ../en/ch09-hook.xml:266
|
dongsheng@627
|
10682 msgid ""
|
dongsheng@627
|
10683 "When Mercurial <emphasis>writes</emphasis> metadata, it writes it straight "
|
dongsheng@627
|
10684 "into the destination file. It writes file data first, then manifest data "
|
dongsheng@627
|
10685 "(which contains pointers to the new file data), then changelog data (which "
|
dongsheng@627
|
10686 "contains pointers to the new manifest data). Before the first write to each "
|
dongsheng@627
|
10687 "file, it stores a record of where the end of the file was in its transaction "
|
dongsheng@627
|
10688 "log. If the transaction must be rolled back, Mercurial simply truncates each "
|
dongsheng@627
|
10689 "file back to the size it was before the transaction began."
|
dongsheng@627
|
10690 msgstr ""
|
dongsheng@627
|
10691
|
dongsheng@627
|
10692 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10693 #: ../en/ch09-hook.xml:277
|
dongsheng@627
|
10694 msgid ""
|
dongsheng@627
|
10695 "When Mercurial <emphasis>reads</emphasis> metadata, it reads the changelog "
|
dongsheng@627
|
10696 "first, then everything else. Since a reader will only access parts of the "
|
dongsheng@627
|
10697 "manifest or file metadata that it can see in the changelog, it can never see "
|
dongsheng@627
|
10698 "partially written data."
|
dongsheng@627
|
10699 msgstr ""
|
dongsheng@627
|
10700
|
dongsheng@627
|
10701 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10702 #: ../en/ch09-hook.xml:283
|
dongsheng@627
|
10703 msgid ""
|
dongsheng@627
|
10704 "Some controlling hooks (<literal role=\"hook\">pretxncommit</literal> and "
|
dongsheng@627
|
10705 "<literal role=\"hook\">pretxnchangegroup</literal>) run when a transaction is "
|
dongsheng@627
|
10706 "almost complete. All of the metadata has been written, but Mercurial can "
|
dongsheng@627
|
10707 "still roll the transaction back and cause the newly-written data to disappear."
|
dongsheng@627
|
10708 msgstr ""
|
dongsheng@627
|
10709
|
dongsheng@627
|
10710 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10711 #: ../en/ch09-hook.xml:291
|
dongsheng@627
|
10712 msgid ""
|
dongsheng@627
|
10713 "If one of these hooks runs for long, it opens a window of time during which a "
|
dongsheng@627
|
10714 "reader can see the metadata for changesets that are not yet permanent, and "
|
dongsheng@627
|
10715 "should not be thought of as <quote>really there</quote>. The longer the hook "
|
dongsheng@627
|
10716 "runs, the longer that window is open."
|
dongsheng@627
|
10717 msgstr ""
|
dongsheng@627
|
10718
|
dongsheng@627
|
10719 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10720 #: ../en/ch09-hook.xml:299
|
dongsheng@627
|
10721 msgid "The problem illustrated"
|
dongsheng@635
|
10722 msgstr "问题的演示"
|
dongsheng@627
|
10723
|
dongsheng@627
|
10724 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10725 #: ../en/ch09-hook.xml:301
|
dongsheng@627
|
10726 msgid ""
|
dongsheng@627
|
10727 "In principle, a good use for the <literal role=\"hook\">pretxnchangegroup</"
|
dongsheng@627
|
10728 "literal> hook would be to automatically build and test incoming changes "
|
dongsheng@627
|
10729 "before they are accepted into a central repository. This could let you "
|
dongsheng@627
|
10730 "guarantee that nobody can push changes to this repository that <quote>break "
|
dongsheng@627
|
10731 "the build</quote>. But if a client can pull changes while they're being "
|
dongsheng@627
|
10732 "tested, the usefulness of the test is zero; an unsuspecting someone can pull "
|
dongsheng@627
|
10733 "untested changes, potentially breaking their build."
|
dongsheng@627
|
10734 msgstr ""
|
dongsheng@627
|
10735
|
dongsheng@627
|
10736 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10737 #: ../en/ch09-hook.xml:312
|
dongsheng@627
|
10738 msgid ""
|
dongsheng@627
|
10739 "The safest technological answer to this challenge is to set up such a "
|
dongsheng@627
|
10740 "<quote>gatekeeper</quote> repository as <emphasis>unidirectional</emphasis>. "
|
dongsheng@627
|
10741 "Let it take changes pushed in from the outside, but do not allow anyone to "
|
dongsheng@627
|
10742 "pull changes from it (use the <literal role=\"hook\">preoutgoing</literal> "
|
dongsheng@627
|
10743 "hook to lock it down). Configure a <literal role=\"hook\">changegroup</"
|
dongsheng@627
|
10744 "literal> hook so that if a build or test succeeds, the hook will push the new "
|
dongsheng@627
|
10745 "changes out to another repository that people <emphasis>can</emphasis> pull "
|
dongsheng@627
|
10746 "from."
|
dongsheng@627
|
10747 msgstr ""
|
dongsheng@627
|
10748
|
dongsheng@627
|
10749 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10750 #: ../en/ch09-hook.xml:324
|
dongsheng@627
|
10751 msgid ""
|
dongsheng@627
|
10752 "In practice, putting a centralised bottleneck like this in place is not often "
|
dongsheng@627
|
10753 "a good idea, and transaction visibility has nothing to do with the problem. "
|
dongsheng@627
|
10754 "As the size of a project&emdash;and the time it takes to build and "
|
dongsheng@627
|
10755 "test&emdash;grows, you rapidly run into a wall with this <quote>try before "
|
dongsheng@627
|
10756 "you buy</quote> approach, where you have more changesets to test than time in "
|
dongsheng@627
|
10757 "which to deal with them. The inevitable result is frustration on the part of "
|
dongsheng@627
|
10758 "all involved."
|
dongsheng@627
|
10759 msgstr ""
|
dongsheng@627
|
10760
|
dongsheng@627
|
10761 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10762 #: ../en/ch09-hook.xml:335
|
dongsheng@627
|
10763 msgid ""
|
dongsheng@627
|
10764 "An approach that scales better is to get people to build and test before they "
|
dongsheng@627
|
10765 "push, then run automated builds and tests centrally <emphasis>after</"
|
dongsheng@627
|
10766 "emphasis> a push, to be sure all is well. The advantage of this approach is "
|
dongsheng@627
|
10767 "that it does not impose a limit on the rate at which the repository can "
|
dongsheng@627
|
10768 "accept changes."
|
dongsheng@627
|
10769 msgstr ""
|
dongsheng@627
|
10770
|
dongsheng@627
|
10771 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
10772 #: ../en/ch09-hook.xml:346
|
dongsheng@627
|
10773 msgid "A short tutorial on using hooks"
|
dongsheng@635
|
10774 msgstr "使用钩子的简短指南"
|
dongsheng@627
|
10775
|
dongsheng@627
|
10776 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10777 #: ../en/ch09-hook.xml:348
|
dongsheng@627
|
10778 msgid ""
|
dongsheng@627
|
10779 "It is easy to write a Mercurial hook. Let's start with a hook that runs when "
|
dongsheng@627
|
10780 "you finish a <command role=\"hg-cmd\">hg commit</command>, and simply prints "
|
dongsheng@627
|
10781 "the hash of the changeset you just created. The hook is called <literal role="
|
dongsheng@627
|
10782 "\"hook\">commit</literal>."
|
dongsheng@627
|
10783 msgstr ""
|
dongsheng@627
|
10784
|
dongsheng@627
|
10785 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10786 #: ../en/ch09-hook.xml:355
|
dongsheng@627
|
10787 msgid "All hooks follow the pattern in this example."
|
dongsheng@627
|
10788 msgstr ""
|
dongsheng@627
|
10789
|
dongsheng@627
|
10790 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10791 #: ../en/ch09-hook.xml:359
|
dongsheng@627
|
10792 msgid ""
|
dongsheng@627
|
10793 "You add an entry to the <literal role=\"rc-hooks\">hooks</literal> section of "
|
dongsheng@650
|
10794 "your <filename role=\"special\">~/.hgrc</filename>. On the left is the name "
|
dongsheng@627
|
10795 "of the event to trigger on; on the right is the action to take. As you can "
|
dongsheng@627
|
10796 "see, you can run an arbitrary shell command in a hook. Mercurial passes "
|
dongsheng@627
|
10797 "extra information to the hook using environment variables (look for "
|
dongsheng@627
|
10798 "<envar>HG_NODE</envar> in the example)."
|
dongsheng@627
|
10799 msgstr ""
|
dongsheng@627
|
10800
|
dongsheng@627
|
10801 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10802 #: ../en/ch09-hook.xml:369
|
dongsheng@627
|
10803 msgid "Performing multiple actions per event"
|
dongsheng@635
|
10804 msgstr "每个事件执行多个操作"
|
dongsheng@627
|
10805
|
dongsheng@627
|
10806 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10807 #: ../en/ch09-hook.xml:371
|
dongsheng@627
|
10808 msgid ""
|
dongsheng@627
|
10809 "Quite often, you will want to define more than one hook for a particular kind "
|
dongsheng@627
|
10810 "of event, as shown below."
|
dongsheng@627
|
10811 msgstr ""
|
dongsheng@627
|
10812
|
dongsheng@627
|
10813 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10814 #: ../en/ch09-hook.xml:376
|
dongsheng@627
|
10815 msgid ""
|
dongsheng@627
|
10816 "Mercurial lets you do this by adding an <emphasis>extension</emphasis> to the "
|
dongsheng@627
|
10817 "end of a hook's name. You extend a hook's name by giving the name of the "
|
dongsheng@627
|
10818 "hook, followed by a full stop (the <quote><literal>.</literal></quote> "
|
dongsheng@627
|
10819 "character), followed by some more text of your choosing. For example, "
|
dongsheng@627
|
10820 "Mercurial will run both <literal>commit.foo</literal> and <literal>commit."
|
dongsheng@627
|
10821 "bar</literal> when the <literal>commit</literal> event occurs."
|
dongsheng@627
|
10822 msgstr ""
|
dongsheng@627
|
10823
|
dongsheng@627
|
10824 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10825 #: ../en/ch09-hook.xml:387
|
dongsheng@627
|
10826 msgid ""
|
dongsheng@627
|
10827 "To give a well-defined order of execution when there are multiple hooks "
|
dongsheng@627
|
10828 "defined for an event, Mercurial sorts hooks by extension, and executes the "
|
dongsheng@627
|
10829 "hook commands in this sorted order. In the above example, it will execute "
|
dongsheng@627
|
10830 "<literal>commit.bar</literal> before <literal>commit.foo</literal>, and "
|
dongsheng@627
|
10831 "<literal>commit</literal> before both."
|
dongsheng@627
|
10832 msgstr ""
|
dongsheng@627
|
10833
|
dongsheng@627
|
10834 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10835 #: ../en/ch09-hook.xml:396
|
dongsheng@627
|
10836 msgid ""
|
dongsheng@627
|
10837 "It is a good idea to use a somewhat descriptive extension when you define a "
|
dongsheng@627
|
10838 "new hook. This will help you to remember what the hook was for. If the hook "
|
dongsheng@627
|
10839 "fails, you'll get an error message that contains the hook name and extension, "
|
dongsheng@627
|
10840 "so using a descriptive extension could give you an immediate hint as to why "
|
dongsheng@627
|
10841 "the hook failed (see section <xref linkend=\"sec.hook.perm\"/> for an "
|
dongsheng@627
|
10842 "example)."
|
dongsheng@627
|
10843 msgstr ""
|
dongsheng@627
|
10844
|
dongsheng@627
|
10845 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10846 #: ../en/ch09-hook.xml:407
|
dongsheng@627
|
10847 msgid "Controlling whether an activity can proceed"
|
dongsheng@635
|
10848 msgstr "控制处理的活动"
|
dongsheng@627
|
10849
|
dongsheng@627
|
10850 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10851 #: ../en/ch09-hook.xml:409
|
dongsheng@627
|
10852 msgid ""
|
dongsheng@627
|
10853 "In our earlier examples, we used the <literal role=\"hook\">commit</literal> "
|
dongsheng@627
|
10854 "hook, which is run after a commit has completed. This is one of several "
|
dongsheng@627
|
10855 "Mercurial hooks that run after an activity finishes. Such hooks have no way "
|
dongsheng@627
|
10856 "of influencing the activity itself."
|
dongsheng@627
|
10857 msgstr ""
|
dongsheng@627
|
10858
|
dongsheng@627
|
10859 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10860 #: ../en/ch09-hook.xml:416
|
dongsheng@627
|
10861 msgid ""
|
dongsheng@627
|
10862 "Mercurial defines a number of events that occur before an activity starts; or "
|
dongsheng@627
|
10863 "after it starts, but before it finishes. Hooks that trigger on these events "
|
dongsheng@627
|
10864 "have the added ability to choose whether the activity can continue, or will "
|
dongsheng@627
|
10865 "abort."
|
dongsheng@627
|
10866 msgstr ""
|
dongsheng@627
|
10867
|
dongsheng@627
|
10868 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10869 #: ../en/ch09-hook.xml:422
|
dongsheng@627
|
10870 msgid ""
|
dongsheng@627
|
10871 "The <literal role=\"hook\">pretxncommit</literal> hook runs after a commit "
|
dongsheng@627
|
10872 "has all but completed. In other words, the metadata representing the "
|
dongsheng@627
|
10873 "changeset has been written out to disk, but the transaction has not yet been "
|
dongsheng@627
|
10874 "allowed to complete. The <literal role=\"hook\">pretxncommit</literal> hook "
|
dongsheng@627
|
10875 "has the ability to decide whether the transaction can complete, or must be "
|
dongsheng@627
|
10876 "rolled back."
|
dongsheng@627
|
10877 msgstr ""
|
dongsheng@627
|
10878
|
dongsheng@627
|
10879 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10880 #: ../en/ch09-hook.xml:431
|
dongsheng@627
|
10881 msgid ""
|
dongsheng@627
|
10882 "If the <literal role=\"hook\">pretxncommit</literal> hook exits with a status "
|
dongsheng@627
|
10883 "code of zero, the transaction is allowed to complete; the commit finishes; "
|
dongsheng@627
|
10884 "and the <literal role=\"hook\">commit</literal> hook is run. If the <literal "
|
dongsheng@627
|
10885 "role=\"hook\">pretxncommit</literal> hook exits with a non-zero status code, "
|
dongsheng@627
|
10886 "the transaction is rolled back; the metadata representing the changeset is "
|
dongsheng@627
|
10887 "erased; and the <literal role=\"hook\">commit</literal> hook is not run."
|
dongsheng@627
|
10888 msgstr ""
|
dongsheng@627
|
10889
|
dongsheng@627
|
10890 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10891 #: ../en/ch09-hook.xml:443
|
dongsheng@627
|
10892 msgid ""
|
dongsheng@627
|
10893 "The hook in the example above checks that a commit comment contains a bug "
|
dongsheng@627
|
10894 "ID. If it does, the commit can complete. If not, the commit is rolled back."
|
dongsheng@627
|
10895 msgstr ""
|
dongsheng@627
|
10896
|
dongsheng@627
|
10897 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
10898 #: ../en/ch09-hook.xml:451
|
dongsheng@627
|
10899 msgid "Writing your own hooks"
|
dongsheng@635
|
10900 msgstr "编写钩子"
|
dongsheng@627
|
10901
|
dongsheng@627
|
10902 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
10903 #: ../en/ch09-hook.xml:453
|
dongsheng@627
|
10904 msgid ""
|
dongsheng@627
|
10905 "When you are writing a hook, you might find it useful to run Mercurial either "
|
dongsheng@627
|
10906 "with the <option role=\"hg-opt-global\">-v</option> option, or the <envar "
|
dongsheng@627
|
10907 "role=\"rc-item-ui\">verbose</envar> config item set to <quote>true</quote>. "
|
dongsheng@627
|
10908 "When you do so, Mercurial will print a message before it calls each hook."
|
dongsheng@627
|
10909 msgstr ""
|
dongsheng@627
|
10910
|
dongsheng@627
|
10911 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10912 #: ../en/ch09-hook.xml:462
|
dongsheng@627
|
10913 msgid "Choosing how your hook should run"
|
dongsheng@635
|
10914 msgstr "选择钩子的执行方式"
|
dongsheng@627
|
10915
|
dongsheng@627
|
10916 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10917 #: ../en/ch09-hook.xml:464
|
dongsheng@627
|
10918 msgid ""
|
dongsheng@627
|
10919 "You can write a hook either as a normal program&emdash;typically a shell "
|
dongsheng@627
|
10920 "script&emdash;or as a Python function that is executed within the Mercurial "
|
dongsheng@627
|
10921 "process."
|
dongsheng@627
|
10922 msgstr ""
|
dongsheng@627
|
10923
|
dongsheng@627
|
10924 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10925 #: ../en/ch09-hook.xml:469
|
dongsheng@627
|
10926 msgid ""
|
dongsheng@627
|
10927 "Writing a hook as an external program has the advantage that it requires no "
|
dongsheng@627
|
10928 "knowledge of Mercurial's internals. You can call normal Mercurial commands "
|
dongsheng@627
|
10929 "to get any added information you need. The trade-off is that external hooks "
|
dongsheng@627
|
10930 "are slower than in-process hooks."
|
dongsheng@627
|
10931 msgstr ""
|
dongsheng@627
|
10932
|
dongsheng@627
|
10933 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10934 #: ../en/ch09-hook.xml:476
|
dongsheng@627
|
10935 msgid ""
|
dongsheng@627
|
10936 "An in-process Python hook has complete access to the Mercurial API, and does "
|
dongsheng@627
|
10937 "not <quote>shell out</quote> to another process, so it is inherently faster "
|
dongsheng@627
|
10938 "than an external hook. It is also easier to obtain much of the information "
|
dongsheng@627
|
10939 "that a hook requires by using the Mercurial API than by running Mercurial "
|
dongsheng@627
|
10940 "commands."
|
dongsheng@627
|
10941 msgstr ""
|
dongsheng@627
|
10942
|
dongsheng@627
|
10943 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10944 #: ../en/ch09-hook.xml:484
|
dongsheng@627
|
10945 msgid ""
|
dongsheng@627
|
10946 "If you are comfortable with Python, or require high performance, writing your "
|
dongsheng@627
|
10947 "hooks in Python may be a good choice. However, when you have a "
|
dongsheng@627
|
10948 "straightforward hook to write and you don't need to care about performance "
|
dongsheng@627
|
10949 "(probably the majority of hooks), a shell script is perfectly fine."
|
dongsheng@627
|
10950 msgstr ""
|
dongsheng@627
|
10951
|
dongsheng@627
|
10952 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10953 #: ../en/ch09-hook.xml:493
|
dongsheng@627
|
10954 msgid "Hook parameters"
|
dongsheng@635
|
10955 msgstr "钩子的参数"
|
dongsheng@627
|
10956
|
dongsheng@627
|
10957 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10958 #: ../en/ch09-hook.xml:495
|
dongsheng@627
|
10959 msgid ""
|
dongsheng@627
|
10960 "Mercurial calls each hook with a set of well-defined parameters. In Python, "
|
dongsheng@627
|
10961 "a parameter is passed as a keyword argument to your hook function. For an "
|
dongsheng@627
|
10962 "external program, a parameter is passed as an environment variable."
|
dongsheng@627
|
10963 msgstr ""
|
dongsheng@627
|
10964
|
dongsheng@627
|
10965 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10966 #: ../en/ch09-hook.xml:501
|
dongsheng@627
|
10967 msgid ""
|
dongsheng@627
|
10968 "Whether your hook is written in Python or as a shell script, the hook-"
|
dongsheng@627
|
10969 "specific parameter names and values will be the same. A boolean parameter "
|
dongsheng@627
|
10970 "will be represented as a boolean value in Python, but as the number 1 (for "
|
dongsheng@627
|
10971 "<quote>true</quote>) or 0 (for <quote>false</quote>) as an environment "
|
dongsheng@627
|
10972 "variable for an external hook. If a hook parameter is named <literal>foo</"
|
dongsheng@627
|
10973 "literal>, the keyword argument for a Python hook will also be named "
|
dongsheng@627
|
10974 "<literal>foo</literal>, while the environment variable for an external hook "
|
dongsheng@627
|
10975 "will be named <literal>HG_FOO</literal>."
|
dongsheng@627
|
10976 msgstr ""
|
dongsheng@627
|
10977
|
dongsheng@627
|
10978 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
10979 #: ../en/ch09-hook.xml:515
|
dongsheng@627
|
10980 msgid "Hook return values and activity control"
|
dongsheng@635
|
10981 msgstr "钩子的返回值与活动控制"
|
dongsheng@627
|
10982
|
dongsheng@627
|
10983 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10984 #: ../en/ch09-hook.xml:517
|
dongsheng@627
|
10985 msgid ""
|
dongsheng@627
|
10986 "A hook that executes successfully must exit with a status of zero if "
|
dongsheng@627
|
10987 "external, or return boolean <quote>false</quote> if in-process. Failure is "
|
dongsheng@627
|
10988 "indicated with a non-zero exit status from an external hook, or an in-process "
|
dongsheng@627
|
10989 "hook returning boolean <quote>true</quote>. If an in-process hook raises an "
|
dongsheng@627
|
10990 "exception, the hook is considered to have failed."
|
dongsheng@627
|
10991 msgstr ""
|
dongsheng@627
|
10992
|
dongsheng@627
|
10993 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
10994 #: ../en/ch09-hook.xml:525
|
dongsheng@627
|
10995 msgid ""
|
dongsheng@627
|
10996 "For a hook that controls whether an activity can proceed, zero/false means "
|
dongsheng@627
|
10997 "<quote>allow</quote>, while non-zero/true/exception means <quote>deny</quote>."
|
dongsheng@627
|
10998 msgstr ""
|
dongsheng@627
|
10999
|
dongsheng@627
|
11000 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11001 #: ../en/ch09-hook.xml:532
|
dongsheng@627
|
11002 msgid "Writing an external hook"
|
dongsheng@635
|
11003 msgstr "编写外部钩子"
|
dongsheng@627
|
11004
|
dongsheng@627
|
11005 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11006 #: ../en/ch09-hook.xml:534
|
dongsheng@650
|
11007 msgid ""
|
dongsheng@650
|
11008 "When you define an external hook in your <filename role=\"special\">~/.hgrc</"
|
dongsheng@650
|
11009 "filename> and the hook is run, its value is passed to your shell, which "
|
dongsheng@627
|
11010 "interprets it. This means that you can use normal shell constructs in the "
|
dongsheng@627
|
11011 "body of the hook."
|
dongsheng@627
|
11012 msgstr ""
|
dongsheng@627
|
11013
|
dongsheng@627
|
11014 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11015 #: ../en/ch09-hook.xml:541
|
dongsheng@627
|
11016 msgid ""
|
dongsheng@627
|
11017 "An executable hook is always run with its current directory set to a "
|
dongsheng@627
|
11018 "repository's root directory."
|
dongsheng@627
|
11019 msgstr ""
|
dongsheng@627
|
11020
|
dongsheng@627
|
11021 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11022 #: ../en/ch09-hook.xml:545
|
dongsheng@627
|
11023 msgid ""
|
dongsheng@627
|
11024 "Each hook parameter is passed in as an environment variable; the name is "
|
dongsheng@627
|
11025 "upper-cased, and prefixed with the string <quote><literal>HG_</literal></"
|
dongsheng@627
|
11026 "quote>."
|
dongsheng@627
|
11027 msgstr ""
|
dongsheng@627
|
11028
|
dongsheng@627
|
11029 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11030 #: ../en/ch09-hook.xml:550
|
dongsheng@627
|
11031 msgid ""
|
dongsheng@627
|
11032 "With the exception of hook parameters, Mercurial does not set or modify any "
|
dongsheng@627
|
11033 "environment variables when running a hook. This is useful to remember if you "
|
dongsheng@627
|
11034 "are writing a site-wide hook that may be run by a number of different users "
|
dongsheng@627
|
11035 "with differing environment variables set. In multi-user situations, you "
|
dongsheng@627
|
11036 "should not rely on environment variables being set to the values you have in "
|
dongsheng@627
|
11037 "your environment when testing the hook."
|
dongsheng@627
|
11038 msgstr ""
|
dongsheng@627
|
11039
|
dongsheng@627
|
11040 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11041 #: ../en/ch09-hook.xml:561
|
dongsheng@627
|
11042 msgid "Telling Mercurial to use an in-process hook"
|
dongsheng@642
|
11043 msgstr "让 Mercurial 使用进程内钩子"
|
dongsheng@627
|
11044
|
dongsheng@627
|
11045 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11046 #: ../en/ch09-hook.xml:563
|
dongsheng@650
|
11047 msgid ""
|
dongsheng@650
|
11048 "The <filename role=\"special\">~/.hgrc</filename> syntax for defining an in-"
|
dongsheng@627
|
11049 "process hook is slightly different than for an executable hook. The value of "
|
dongsheng@627
|
11050 "the hook must start with the text <quote><literal>python:</literal></quote>, "
|
dongsheng@627
|
11051 "and continue with the fully-qualified name of a callable object to use as the "
|
dongsheng@627
|
11052 "hook's value."
|
dongsheng@627
|
11053 msgstr ""
|
dongsheng@627
|
11054
|
dongsheng@627
|
11055 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11056 #: ../en/ch09-hook.xml:571
|
dongsheng@627
|
11057 msgid ""
|
dongsheng@627
|
11058 "The module in which a hook lives is automatically imported when a hook is "
|
dongsheng@627
|
11059 "run. So long as you have the module name and <envar>PYTHONPATH</envar> "
|
dongsheng@627
|
11060 "right, it should <quote>just work</quote>."
|
dongsheng@627
|
11061 msgstr ""
|
dongsheng@627
|
11062
|
dongsheng@627
|
11063 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11064 #: ../en/ch09-hook.xml:577
|
dongsheng@650
|
11065 msgid ""
|
dongsheng@650
|
11066 "The following <filename role=\"special\">~/.hgrc</filename> example snippet "
|
dongsheng@627
|
11067 "illustrates the syntax and meaning of the notions we just described."
|
dongsheng@627
|
11068 msgstr ""
|
dongsheng@627
|
11069
|
dongsheng@627
|
11070 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11071 #: ../en/ch09-hook.xml:583
|
dongsheng@627
|
11072 msgid ""
|
dongsheng@627
|
11073 "When Mercurial runs the <literal>commit.example</literal> hook, it imports "
|
dongsheng@627
|
11074 "<literal>mymodule.submodule</literal>, looks for the callable object named "
|
dongsheng@627
|
11075 "<literal>myhook</literal>, and calls it."
|
dongsheng@627
|
11076 msgstr ""
|
dongsheng@627
|
11077
|
dongsheng@627
|
11078 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11079 #: ../en/ch09-hook.xml:591
|
dongsheng@627
|
11080 msgid "Writing an in-process hook"
|
dongsheng@635
|
11081 msgstr "编写进程内钩子"
|
dongsheng@627
|
11082
|
dongsheng@627
|
11083 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11084 #: ../en/ch09-hook.xml:593
|
dongsheng@627
|
11085 msgid ""
|
dongsheng@627
|
11086 "The simplest in-process hook does nothing, but illustrates the basic shape of "
|
dongsheng@627
|
11087 "the hook API:"
|
dongsheng@627
|
11088 msgstr ""
|
dongsheng@627
|
11089
|
dongsheng@627
|
11090 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11091 #: ../en/ch09-hook.xml:598
|
dongsheng@627
|
11092 msgid ""
|
dongsheng@627
|
11093 "The first argument to a Python hook is always a <literal role=\"py-mod-"
|
dongsheng@627
|
11094 "mercurial.ui\">ui</literal> object. The second is a repository object; at "
|
dongsheng@627
|
11095 "the moment, it is always an instance of <literal role=\"py-mod-mercurial."
|
dongsheng@627
|
11096 "localrepo\">localrepository</literal>. Following these two arguments are "
|
dongsheng@627
|
11097 "other keyword arguments. Which ones are passed in depends on the hook being "
|
dongsheng@627
|
11098 "called, but a hook can ignore arguments it doesn't care about by dropping "
|
dongsheng@627
|
11099 "them into a keyword argument dict, as with <literal>**kwargs</literal> above."
|
dongsheng@627
|
11100 msgstr ""
|
dongsheng@627
|
11101
|
dongsheng@627
|
11102 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
11103 #: ../en/ch09-hook.xml:613
|
dongsheng@627
|
11104 msgid "Some hook examples"
|
dongsheng@635
|
11105 msgstr "钩子样例"
|
dongsheng@627
|
11106
|
dongsheng@627
|
11107 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11108 #: ../en/ch09-hook.xml:616
|
dongsheng@627
|
11109 msgid "Writing meaningful commit messages"
|
dongsheng@635
|
11110 msgstr "编写有意义的提交日志"
|
dongsheng@627
|
11111
|
dongsheng@627
|
11112 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11113 #: ../en/ch09-hook.xml:618
|
dongsheng@627
|
11114 msgid ""
|
dongsheng@627
|
11115 "It's hard to imagine a useful commit message being very short. The simple "
|
dongsheng@627
|
11116 "<literal role=\"hook\">pretxncommit</literal> hook of the example below will "
|
dongsheng@627
|
11117 "prevent you from committing a changeset with a message that is less than ten "
|
dongsheng@627
|
11118 "bytes long."
|
dongsheng@627
|
11119 msgstr ""
|
dongsheng@627
|
11120
|
dongsheng@627
|
11121 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11122 #: ../en/ch09-hook.xml:628
|
dongsheng@627
|
11123 msgid "Checking for trailing whitespace"
|
dongsheng@635
|
11124 msgstr "检查行尾空格"
|
dongsheng@627
|
11125
|
dongsheng@627
|
11126 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11127 #: ../en/ch09-hook.xml:630
|
dongsheng@627
|
11128 msgid ""
|
dongsheng@627
|
11129 "An interesting use of a commit-related hook is to help you to write cleaner "
|
dongsheng@627
|
11130 "code. A simple example of <quote>cleaner code</quote> is the dictum that a "
|
dongsheng@627
|
11131 "change should not add any new lines of text that contain <quote>trailing "
|
dongsheng@627
|
11132 "whitespace</quote>. Trailing whitespace is a series of space and tab "
|
dongsheng@627
|
11133 "characters at the end of a line of text. In most cases, trailing whitespace "
|
dongsheng@627
|
11134 "is unnecessary, invisible noise, but it is occasionally problematic, and "
|
dongsheng@627
|
11135 "people often prefer to get rid of it."
|
dongsheng@627
|
11136 msgstr ""
|
dongsheng@627
|
11137
|
dongsheng@627
|
11138 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11139 #: ../en/ch09-hook.xml:641
|
dongsheng@627
|
11140 msgid ""
|
dongsheng@627
|
11141 "You can use either the <literal role=\"hook\">precommit</literal> or <literal "
|
dongsheng@627
|
11142 "role=\"hook\">pretxncommit</literal> hook to tell whether you have a trailing "
|
dongsheng@627
|
11143 "whitespace problem. If you use the <literal role=\"hook\">precommit</"
|
dongsheng@627
|
11144 "literal> hook, the hook will not know which files you are committing, so it "
|
dongsheng@627
|
11145 "will have to check every modified file in the repository for trailing white "
|
dongsheng@627
|
11146 "space. If you want to commit a change to just the file <filename>foo</"
|
dongsheng@627
|
11147 "filename>, but the file <filename>bar</filename> contains trailing "
|
dongsheng@627
|
11148 "whitespace, doing a check in the <literal role=\"hook\">precommit</literal> "
|
dongsheng@627
|
11149 "hook will prevent you from committing <filename>foo</filename> due to the "
|
dongsheng@627
|
11150 "problem with <filename>bar</filename>. This doesn't seem right."
|
dongsheng@627
|
11151 msgstr ""
|
dongsheng@627
|
11152
|
dongsheng@627
|
11153 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11154 #: ../en/ch09-hook.xml:657
|
dongsheng@627
|
11155 msgid ""
|
dongsheng@627
|
11156 "Should you choose the <literal role=\"hook\">pretxncommit</literal> hook, the "
|
dongsheng@627
|
11157 "check won't occur until just before the transaction for the commit "
|
dongsheng@627
|
11158 "completes. This will allow you to check for problems only the exact files "
|
dongsheng@627
|
11159 "that are being committed. However, if you entered the commit message "
|
dongsheng@627
|
11160 "interactively and the hook fails, the transaction will roll back; you'll have "
|
dongsheng@627
|
11161 "to re-enter the commit message after you fix the trailing whitespace and run "
|
dongsheng@627
|
11162 "<command role=\"hg-cmd\">hg commit</command> again."
|
dongsheng@627
|
11163 msgstr ""
|
dongsheng@627
|
11164
|
dongsheng@627
|
11165 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11166 #: ../en/ch09-hook.xml:670
|
dongsheng@627
|
11167 msgid ""
|
dongsheng@627
|
11168 "In this example, we introduce a simple <literal role=\"hook\">pretxncommit</"
|
dongsheng@627
|
11169 "literal> hook that checks for trailing whitespace. This hook is short, but "
|
dongsheng@627
|
11170 "not very helpful. It exits with an error status if a change adds a line with "
|
dongsheng@627
|
11171 "trailing whitespace to any file, but does not print any information that "
|
dongsheng@627
|
11172 "might help us to identify the offending file or line. It also has the nice "
|
dongsheng@627
|
11173 "property of not paying attention to unmodified lines; only lines that "
|
dongsheng@627
|
11174 "introduce new trailing whitespace cause problems."
|
dongsheng@627
|
11175 msgstr ""
|
dongsheng@627
|
11176
|
dongsheng@627
|
11177 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11178 #: ../en/ch09-hook.xml:681
|
dongsheng@627
|
11179 msgid ""
|
dongsheng@627
|
11180 "The above version is much more complex, but also more useful. It parses a "
|
dongsheng@627
|
11181 "unified diff to see if any lines add trailing whitespace, and prints the name "
|
dongsheng@627
|
11182 "of the file and the line number of each such occurrence. Even better, if the "
|
dongsheng@627
|
11183 "change adds trailing whitespace, this hook saves the commit comment and "
|
dongsheng@627
|
11184 "prints the name of the save file before exiting and telling Mercurial to roll "
|
dongsheng@627
|
11185 "the transaction back, so you can use the <option role=\"hg-opt-commit\">-l "
|
dongsheng@627
|
11186 "filename</option> option to <command role=\"hg-cmd\">hg commit</command> to "
|
dongsheng@627
|
11187 "reuse the saved commit message once you've corrected the problem."
|
dongsheng@627
|
11188 msgstr ""
|
dongsheng@627
|
11189
|
dongsheng@627
|
11190 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11191 #: ../en/ch09-hook.xml:695
|
dongsheng@627
|
11192 msgid ""
|
dongsheng@627
|
11193 "As a final aside, note in the example above the use of <command>perl</"
|
dongsheng@627
|
11194 "command>'s in-place editing feature to get rid of trailing whitespace from a "
|
dongsheng@627
|
11195 "file. This is concise and useful enough that I will reproduce it here."
|
dongsheng@627
|
11196 msgstr ""
|
dongsheng@627
|
11197
|
dongsheng@627
|
11198 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
11199 #: ../en/ch09-hook.xml:705
|
dongsheng@627
|
11200 msgid "Bundled hooks"
|
dongsheng@635
|
11201 msgstr "内置的钩子"
|
dongsheng@627
|
11202
|
dongsheng@627
|
11203 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
11204 #: ../en/ch09-hook.xml:707
|
dongsheng@627
|
11205 msgid ""
|
dongsheng@627
|
11206 "Mercurial ships with several bundled hooks. You can find them in the "
|
dongsheng@627
|
11207 "<filename class=\"directory\">hgext</filename> directory of a Mercurial "
|
dongsheng@627
|
11208 "source tree. If you are using a Mercurial binary package, the hooks will be "
|
dongsheng@627
|
11209 "located in the <filename class=\"directory\">hgext</filename> directory of "
|
dongsheng@627
|
11210 "wherever your package installer put Mercurial."
|
dongsheng@627
|
11211 msgstr ""
|
dongsheng@627
|
11212
|
dongsheng@627
|
11213 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11214 #: ../en/ch09-hook.xml:716
|
dongsheng@627
|
11215 msgid ""
|
dongsheng@627
|
11216 "<literal role=\"hg-ext\">acl</literal>&emdash;access control for parts of a "
|
dongsheng@627
|
11217 "repository"
|
dongsheng@635
|
11218 msgstr "<literal role=\"hg-ext\">acl</literal>&emdash;版本库的访问控制"
|
dongsheng@627
|
11219
|
dongsheng@627
|
11220 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11221 #: ../en/ch09-hook.xml:719
|
dongsheng@627
|
11222 msgid ""
|
dongsheng@627
|
11223 "The <literal role=\"hg-ext\">acl</literal> extension lets you control which "
|
dongsheng@627
|
11224 "remote users are allowed to push changesets to a networked server. You can "
|
dongsheng@627
|
11225 "protect any portion of a repository (including the entire repo), so that a "
|
dongsheng@627
|
11226 "specific remote user can push changes that do not affect the protected "
|
dongsheng@627
|
11227 "portion."
|
dongsheng@627
|
11228 msgstr ""
|
dongsheng@627
|
11229
|
dongsheng@627
|
11230 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11231 #: ../en/ch09-hook.xml:727
|
dongsheng@627
|
11232 msgid ""
|
dongsheng@627
|
11233 "This extension implements access control based on the identity of the user "
|
dongsheng@627
|
11234 "performing a push, <emphasis>not</emphasis> on who committed the changesets "
|
dongsheng@627
|
11235 "they're pushing. It makes sense to use this hook only if you have a locked-"
|
dongsheng@627
|
11236 "down server environment that authenticates remote users, and you want to be "
|
dongsheng@627
|
11237 "sure that only specific users are allowed to push changes to that server."
|
dongsheng@627
|
11238 msgstr ""
|
dongsheng@627
|
11239
|
dongsheng@627
|
11240 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
11241 #: ../en/ch09-hook.xml:737
|
dongsheng@627
|
11242 msgid "Configuring the <literal role=\"hook\">acl</literal> hook"
|
dongsheng@635
|
11243 msgstr "配置 <literal role=\"hook\">acl</literal> 钩子"
|
dongsheng@627
|
11244
|
dongsheng@627
|
11245 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11246 #: ../en/ch09-hook.xml:740
|
dongsheng@627
|
11247 msgid ""
|
dongsheng@627
|
11248 "In order to manage incoming changesets, the <literal role=\"hg-ext\">acl</"
|
dongsheng@627
|
11249 "literal> hook must be used as a <literal role=\"hook\">pretxnchangegroup</"
|
dongsheng@627
|
11250 "literal> hook. This lets it see which files are modified by each incoming "
|
dongsheng@627
|
11251 "changeset, and roll back a group of changesets if they modify "
|
dongsheng@627
|
11252 "<quote>forbidden</quote> files. Example:"
|
dongsheng@627
|
11253 msgstr ""
|
dongsheng@627
|
11254
|
dongsheng@627
|
11255 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11256 #: ../en/ch09-hook.xml:750
|
dongsheng@627
|
11257 msgid ""
|
dongsheng@627
|
11258 "The <literal role=\"hg-ext\">acl</literal> extension is configured using "
|
dongsheng@627
|
11259 "three sections."
|
dongsheng@627
|
11260 msgstr ""
|
dongsheng@627
|
11261
|
dongsheng@627
|
11262 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11263 #: ../en/ch09-hook.xml:754
|
dongsheng@627
|
11264 msgid ""
|
dongsheng@627
|
11265 "The <literal role=\"rc-acl\">acl</literal> section has only one entry, <envar "
|
dongsheng@627
|
11266 "role=\"rc-item-acl\">sources</envar>, which lists the sources of incoming "
|
dongsheng@627
|
11267 "changesets that the hook should pay attention to. You don't normally need to "
|
dongsheng@627
|
11268 "configure this section."
|
dongsheng@627
|
11269 msgstr ""
|
dongsheng@627
|
11270
|
dongsheng@627
|
11271 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11272 #: ../en/ch09-hook.xml:761
|
dongsheng@627
|
11273 msgid ""
|
dongsheng@627
|
11274 "<envar role=\"rc-item-acl\">serve</envar>: Control incoming changesets that "
|
dongsheng@627
|
11275 "are arriving from a remote repository over http or ssh. This is the default "
|
dongsheng@627
|
11276 "value of <envar role=\"rc-item-acl\">sources</envar>, and usually the only "
|
dongsheng@627
|
11277 "setting you'll need for this configuration item."
|
dongsheng@627
|
11278 msgstr ""
|
dongsheng@627
|
11279
|
dongsheng@627
|
11280 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11281 #: ../en/ch09-hook.xml:769
|
dongsheng@627
|
11282 msgid ""
|
dongsheng@627
|
11283 "<envar role=\"rc-item-acl\">pull</envar>: Control incoming changesets that "
|
dongsheng@627
|
11284 "are arriving via a pull from a local repository."
|
dongsheng@627
|
11285 msgstr ""
|
dongsheng@627
|
11286
|
dongsheng@627
|
11287 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11288 #: ../en/ch09-hook.xml:774
|
dongsheng@627
|
11289 msgid ""
|
dongsheng@627
|
11290 "<envar role=\"rc-item-acl\">push</envar>: Control incoming changesets that "
|
dongsheng@627
|
11291 "are arriving via a push from a local repository."
|
dongsheng@627
|
11292 msgstr ""
|
dongsheng@627
|
11293
|
dongsheng@627
|
11294 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11295 #: ../en/ch09-hook.xml:779
|
dongsheng@627
|
11296 msgid ""
|
dongsheng@627
|
11297 "<envar role=\"rc-item-acl\">bundle</envar>: Control incoming changesets that "
|
dongsheng@627
|
11298 "are arriving from another repository via a bundle."
|
dongsheng@627
|
11299 msgstr ""
|
dongsheng@627
|
11300
|
dongsheng@627
|
11301 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11302 #: ../en/ch09-hook.xml:785
|
dongsheng@627
|
11303 msgid ""
|
dongsheng@627
|
11304 "The <literal role=\"rc-acl.allow\">acl.allow</literal> section controls the "
|
dongsheng@627
|
11305 "users that are allowed to add changesets to the repository. If this section "
|
dongsheng@627
|
11306 "is not present, all users that are not explicitly denied are allowed. If "
|
dongsheng@627
|
11307 "this section is present, all users that are not explicitly allowed are denied "
|
dongsheng@627
|
11308 "(so an empty section means that all users are denied)."
|
dongsheng@627
|
11309 msgstr ""
|
dongsheng@627
|
11310
|
dongsheng@627
|
11311 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11312 #: ../en/ch09-hook.xml:794
|
dongsheng@627
|
11313 msgid ""
|
dongsheng@627
|
11314 "The <literal role=\"rc-acl.deny\">acl.deny</literal> section determines which "
|
dongsheng@627
|
11315 "users are denied from adding changesets to the repository. If this section "
|
dongsheng@627
|
11316 "is not present or is empty, no users are denied."
|
dongsheng@627
|
11317 msgstr ""
|
dongsheng@627
|
11318
|
dongsheng@627
|
11319 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11320 #: ../en/ch09-hook.xml:800
|
dongsheng@627
|
11321 msgid ""
|
dongsheng@627
|
11322 "The syntaxes for the <literal role=\"rc-acl.allow\">acl.allow</literal> and "
|
dongsheng@627
|
11323 "<literal role=\"rc-acl.deny\">acl.deny</literal> sections are identical. On "
|
dongsheng@627
|
11324 "the left of each entry is a glob pattern that matches files or directories, "
|
dongsheng@627
|
11325 "relative to the root of the repository; on the right, a user name."
|
dongsheng@627
|
11326 msgstr ""
|
dongsheng@627
|
11327
|
dongsheng@627
|
11328 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11329 #: ../en/ch09-hook.xml:808
|
dongsheng@627
|
11330 msgid ""
|
dongsheng@627
|
11331 "In the following example, the user <literal>docwriter</literal> can only push "
|
dongsheng@627
|
11332 "changes to the <filename class=\"directory\">docs</filename> subtree of the "
|
dongsheng@627
|
11333 "repository, while <literal>intern</literal> can push changes to any file or "
|
dongsheng@627
|
11334 "directory except <filename class=\"directory\">source/sensitive</filename>."
|
dongsheng@627
|
11335 msgstr ""
|
dongsheng@627
|
11336
|
dongsheng@627
|
11337 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
11338 #: ../en/ch09-hook.xml:822 ../en/ch09-hook.xml:1089 ../en/ch09-hook.xml:1280
|
dongsheng@627
|
11339 msgid "Testing and troubleshooting"
|
dongsheng@635
|
11340 msgstr "测试与问题处理"
|
dongsheng@627
|
11341
|
dongsheng@627
|
11342 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11343 #: ../en/ch09-hook.xml:824
|
dongsheng@627
|
11344 msgid ""
|
dongsheng@627
|
11345 "If you want to test the <literal role=\"hg-ext\">acl</literal> hook, run it "
|
dongsheng@627
|
11346 "with Mercurial's debugging output enabled. Since you'll probably be running "
|
dongsheng@627
|
11347 "it on a server where it's not convenient (or sometimes possible) to pass in "
|
dongsheng@627
|
11348 "the <option role=\"hg-opt-global\">--debug</option> option, don't forget that "
|
dongsheng@650
|
11349 "you can enable debugging output in your <filename role=\"special\">~/.hgrc</"
|
dongsheng@627
|
11350 "filename>:"
|
dongsheng@627
|
11351 msgstr ""
|
dongsheng@627
|
11352
|
dongsheng@627
|
11353 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11354 #: ../en/ch09-hook.xml:835
|
dongsheng@627
|
11355 msgid ""
|
dongsheng@627
|
11356 "With this enabled, the <literal role=\"hg-ext\">acl</literal> hook will print "
|
dongsheng@627
|
11357 "enough information to let you figure out why it is allowing or forbidding "
|
dongsheng@627
|
11358 "pushes from specific users."
|
dongsheng@627
|
11359 msgstr ""
|
dongsheng@627
|
11360
|
dongsheng@627
|
11361 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11362 #: ../en/ch09-hook.xml:844
|
dongsheng@627
|
11363 msgid ""
|
dongsheng@627
|
11364 "<literal role=\"hg-ext\">bugzilla</literal>&emdash;integration with Bugzilla"
|
dongsheng@635
|
11365 msgstr "<literal role=\"hg-ext\">bugzilla</literal>&emdash;与 Bugzilla 的集成"
|
dongsheng@627
|
11366
|
dongsheng@627
|
11367 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11368 #: ../en/ch09-hook.xml:848
|
dongsheng@627
|
11369 msgid ""
|
dongsheng@627
|
11370 "The <literal role=\"hg-ext\">bugzilla</literal> extension adds a comment to a "
|
dongsheng@627
|
11371 "Bugzilla bug whenever it finds a reference to that bug ID in a commit "
|
dongsheng@627
|
11372 "comment. You can install this hook on a shared server, so that any time a "
|
dongsheng@627
|
11373 "remote user pushes changes to this server, the hook gets run."
|
dongsheng@627
|
11374 msgstr ""
|
dongsheng@627
|
11375
|
dongsheng@627
|
11376 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11377 #: ../en/ch09-hook.xml:855
|
dongsheng@627
|
11378 msgid ""
|
dongsheng@627
|
11379 "It adds a comment to the bug that looks like this (you can configure the "
|
dongsheng@627
|
11380 "contents of the comment&emdash;see below):"
|
dongsheng@627
|
11381 msgstr ""
|
dongsheng@627
|
11382
|
dongsheng@627
|
11383 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11384 #: ../en/ch09-hook.xml:864
|
dongsheng@627
|
11385 msgid ""
|
dongsheng@627
|
11386 "The value of this hook is that it automates the process of updating a bug any "
|
dongsheng@627
|
11387 "time a changeset refers to it. If you configure the hook properly, it makes "
|
dongsheng@627
|
11388 "it easy for people to browse straight from a Bugzilla bug to a changeset that "
|
dongsheng@627
|
11389 "refers to that bug."
|
dongsheng@627
|
11390 msgstr ""
|
dongsheng@627
|
11391
|
dongsheng@627
|
11392 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11393 #: ../en/ch09-hook.xml:871
|
dongsheng@627
|
11394 msgid ""
|
dongsheng@627
|
11395 "You can use the code in this hook as a starting point for some more exotic "
|
dongsheng@627
|
11396 "Bugzilla integration recipes. Here are a few possibilities:"
|
dongsheng@627
|
11397 msgstr ""
|
dongsheng@627
|
11398
|
dongsheng@627
|
11399 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
11400 #: ../en/ch09-hook.xml:876
|
dongsheng@627
|
11401 msgid ""
|
dongsheng@627
|
11402 "Require that every changeset pushed to the server have a valid bug ID in its "
|
dongsheng@627
|
11403 "commit comment. In this case, you'd want to configure the hook as a <literal "
|
dongsheng@627
|
11404 "role=\"hook\">pretxncommit</literal> hook. This would allow the hook to "
|
dongsheng@627
|
11405 "reject changes that didn't contain bug IDs."
|
dongsheng@627
|
11406 msgstr ""
|
dongsheng@627
|
11407
|
dongsheng@627
|
11408 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
11409 #: ../en/ch09-hook.xml:884
|
dongsheng@627
|
11410 msgid ""
|
dongsheng@627
|
11411 "Allow incoming changesets to automatically modify the <emphasis>state</"
|
dongsheng@627
|
11412 "emphasis> of a bug, as well as simply adding a comment. For example, the "
|
dongsheng@627
|
11413 "hook could recognise the string <quote>fixed bug 31337</quote> as indicating "
|
dongsheng@627
|
11414 "that it should update the state of bug 31337 to <quote>requires testing</"
|
dongsheng@627
|
11415 "quote>."
|
dongsheng@627
|
11416 msgstr ""
|
dongsheng@627
|
11417
|
dongsheng@627
|
11418 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
11419 #: ../en/ch09-hook.xml:894
|
dongsheng@627
|
11420 msgid "Configuring the <literal role=\"hook\">bugzilla</literal> hook"
|
dongsheng@635
|
11421 msgstr "配置 <literal role=\"hook\">bugzilla</literal> 钩子"
|
dongsheng@627
|
11422
|
dongsheng@627
|
11423 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11424 #: ../en/ch09-hook.xml:897
|
dongsheng@650
|
11425 msgid ""
|
dongsheng@650
|
11426 "You should configure this hook in your server's <filename role=\"special\">~/."
|
dongsheng@650
|
11427 "hgrc</filename> as an <literal role=\"hook\">incoming</literal> hook, for "
|
dongsheng@627
|
11428 "example as follows:"
|
dongsheng@627
|
11429 msgstr ""
|
dongsheng@627
|
11430
|
dongsheng@627
|
11431 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11432 #: ../en/ch09-hook.xml:905
|
dongsheng@627
|
11433 msgid ""
|
dongsheng@627
|
11434 "Because of the specialised nature of this hook, and because Bugzilla was not "
|
dongsheng@627
|
11435 "written with this kind of integration in mind, configuring this hook is a "
|
dongsheng@627
|
11436 "somewhat involved process."
|
dongsheng@627
|
11437 msgstr ""
|
dongsheng@627
|
11438
|
dongsheng@627
|
11439 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11440 #: ../en/ch09-hook.xml:911
|
dongsheng@627
|
11441 msgid ""
|
dongsheng@627
|
11442 "Before you begin, you must install the MySQL bindings for Python on the host"
|
dongsheng@627
|
11443 "(s) where you'll be running the hook. If this is not available as a binary "
|
dongsheng@627
|
11444 "package for your system, you can download it from <citation>web:mysql-python</"
|
dongsheng@627
|
11445 "citation>."
|
dongsheng@627
|
11446 msgstr ""
|
dongsheng@627
|
11447
|
dongsheng@627
|
11448 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11449 #: ../en/ch09-hook.xml:918
|
dongsheng@627
|
11450 msgid ""
|
dongsheng@627
|
11451 "Configuration information for this hook lives in the <literal role=\"rc-"
|
dongsheng@650
|
11452 "bugzilla\">bugzilla</literal> section of your <filename role=\"special\">~/."
|
dongsheng@627
|
11453 "hgrc</filename>."
|
dongsheng@627
|
11454 msgstr ""
|
dongsheng@627
|
11455
|
dongsheng@627
|
11456 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11457 #: ../en/ch09-hook.xml:923
|
dongsheng@627
|
11458 msgid ""
|
dongsheng@627
|
11459 "<envar role=\"rc-item-bugzilla\">version</envar>: The version of Bugzilla "
|
dongsheng@627
|
11460 "installed on the server. The database schema that Bugzilla uses changes "
|
dongsheng@627
|
11461 "occasionally, so this hook has to know exactly which schema to use. At the "
|
dongsheng@627
|
11462 "moment, the only version supported is <literal>2.16</literal>."
|
dongsheng@627
|
11463 msgstr ""
|
dongsheng@627
|
11464
|
dongsheng@627
|
11465 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11466 #: ../en/ch09-hook.xml:932
|
dongsheng@627
|
11467 msgid ""
|
dongsheng@627
|
11468 "<envar role=\"rc-item-bugzilla\">host</envar>: The hostname of the MySQL "
|
dongsheng@627
|
11469 "server that stores your Bugzilla data. The database must be configured to "
|
dongsheng@627
|
11470 "allow connections from whatever host you are running the <literal role=\"hook"
|
dongsheng@627
|
11471 "\">bugzilla</literal> hook on."
|
dongsheng@627
|
11472 msgstr ""
|
dongsheng@627
|
11473
|
dongsheng@627
|
11474 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11475 #: ../en/ch09-hook.xml:939
|
dongsheng@627
|
11476 msgid ""
|
dongsheng@627
|
11477 "<envar role=\"rc-item-bugzilla\">user</envar>: The username with which to "
|
dongsheng@627
|
11478 "connect to the MySQL server. The database must be configured to allow this "
|
dongsheng@627
|
11479 "user to connect from whatever host you are running the <literal role=\"hook"
|
dongsheng@627
|
11480 "\">bugzilla</literal> hook on. This user must be able to access and modify "
|
dongsheng@627
|
11481 "Bugzilla tables. The default value of this item is <literal>bugs</literal>, "
|
dongsheng@627
|
11482 "which is the standard name of the Bugzilla user in a MySQL database."
|
dongsheng@627
|
11483 msgstr ""
|
dongsheng@627
|
11484
|
dongsheng@627
|
11485 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11486 #: ../en/ch09-hook.xml:950
|
dongsheng@627
|
11487 msgid ""
|
dongsheng@627
|
11488 "<envar role=\"rc-item-bugzilla\">password</envar>: The MySQL password for the "
|
dongsheng@627
|
11489 "user you configured above. This is stored as plain text, so you should make "
|
dongsheng@650
|
11490 "sure that unauthorised users cannot read the <filename role=\"special\">~/."
|
dongsheng@650
|
11491 "hgrc</filename> file where you store this information."
|
dongsheng@627
|
11492 msgstr ""
|
dongsheng@627
|
11493
|
dongsheng@627
|
11494 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11495 #: ../en/ch09-hook.xml:959
|
dongsheng@627
|
11496 msgid ""
|
dongsheng@627
|
11497 "<envar role=\"rc-item-bugzilla\">db</envar>: The name of the Bugzilla "
|
dongsheng@627
|
11498 "database on the MySQL server. The default value of this item is "
|
dongsheng@627
|
11499 "<literal>bugs</literal>, which is the standard name of the MySQL database "
|
dongsheng@627
|
11500 "where Bugzilla stores its data."
|
dongsheng@627
|
11501 msgstr ""
|
dongsheng@627
|
11502
|
dongsheng@627
|
11503 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11504 #: ../en/ch09-hook.xml:966
|
dongsheng@627
|
11505 msgid ""
|
dongsheng@627
|
11506 "<envar role=\"rc-item-bugzilla\">notify</envar>: If you want Bugzilla to send "
|
dongsheng@627
|
11507 "out a notification email to subscribers after this hook has added a comment "
|
dongsheng@627
|
11508 "to a bug, you will need this hook to run a command whenever it updates the "
|
dongsheng@627
|
11509 "database. The command to run depends on where you have installed Bugzilla, "
|
dongsheng@627
|
11510 "but it will typically look something like this, if you have Bugzilla "
|
dongsheng@627
|
11511 "installed in <filename class=\"directory\">/var/www/html/bugzilla</filename>:"
|
dongsheng@627
|
11512 msgstr ""
|
dongsheng@627
|
11513
|
dongsheng@627
|
11514 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11515 #: ../en/ch09-hook.xml:979
|
dongsheng@627
|
11516 msgid ""
|
dongsheng@627
|
11517 "The Bugzilla <literal>processmail</literal> program expects to be given a bug "
|
dongsheng@627
|
11518 "ID (the hook replaces <quote><literal>%s</literal></quote> with the bug ID) "
|
dongsheng@627
|
11519 "and an email address. It also expects to be able to write to some files in "
|
dongsheng@627
|
11520 "the directory that it runs in. If Bugzilla and this hook are not installed "
|
dongsheng@627
|
11521 "on the same machine, you will need to find a way to run <literal>processmail</"
|
dongsheng@627
|
11522 "literal> on the server where Bugzilla is installed."
|
dongsheng@627
|
11523 msgstr ""
|
dongsheng@627
|
11524
|
dongsheng@627
|
11525 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
11526 #: ../en/ch09-hook.xml:994
|
dongsheng@627
|
11527 msgid "Mapping committer names to Bugzilla user names"
|
dongsheng@635
|
11528 msgstr "提交者的名称与 Bugzilla 用户名称的映射"
|
dongsheng@627
|
11529
|
dongsheng@627
|
11530 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11531 #: ../en/ch09-hook.xml:996
|
dongsheng@627
|
11532 msgid ""
|
dongsheng@627
|
11533 "By default, the <literal role=\"hg-ext\">bugzilla</literal> hook tries to use "
|
dongsheng@627
|
11534 "the email address of a changeset's committer as the Bugzilla user name with "
|
dongsheng@627
|
11535 "which to update a bug. If this does not suit your needs, you can map "
|
dongsheng@627
|
11536 "committer email addresses to Bugzilla user names using a <literal role=\"rc-"
|
dongsheng@627
|
11537 "usermap\">usermap</literal> section."
|
dongsheng@627
|
11538 msgstr ""
|
dongsheng@627
|
11539
|
dongsheng@627
|
11540 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11541 #: ../en/ch09-hook.xml:1005
|
dongsheng@627
|
11542 msgid ""
|
dongsheng@627
|
11543 "Each item in the <literal role=\"rc-usermap\">usermap</literal> section "
|
dongsheng@627
|
11544 "contains an email address on the left, and a Bugzilla user name on the right."
|
dongsheng@627
|
11545 msgstr ""
|
dongsheng@627
|
11546
|
dongsheng@627
|
11547 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11548 #: ../en/ch09-hook.xml:1012
|
dongsheng@627
|
11549 msgid ""
|
dongsheng@627
|
11550 "You can either keep the <literal role=\"rc-usermap\">usermap</literal> data "
|
dongsheng@627
|
11551 "in a normal <filename role=\"special\">~/.hgrc</filename>, or tell the "
|
dongsheng@627
|
11552 "<literal role=\"hg-ext\">bugzilla</literal> hook to read the information from "
|
dongsheng@627
|
11553 "an external <filename>usermap</filename> file. In the latter case, you can "
|
dongsheng@627
|
11554 "store <filename>usermap</filename> data by itself in (for example) a user-"
|
dongsheng@627
|
11555 "modifiable repository. This makes it possible to let your users maintain "
|
dongsheng@627
|
11556 "their own <envar role=\"rc-item-bugzilla\">usermap</envar> entries. The main "
|
dongsheng@650
|
11557 "<filename role=\"special\">~/.hgrc</filename> file might look like this:"
|
dongsheng@627
|
11558 msgstr ""
|
dongsheng@627
|
11559
|
dongsheng@627
|
11560 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11561 #: ../en/ch09-hook.xml:1028
|
dongsheng@627
|
11562 msgid ""
|
dongsheng@627
|
11563 "While the <filename>usermap</filename> file that it refers to might look like "
|
dongsheng@627
|
11564 "this:"
|
dongsheng@627
|
11565 msgstr ""
|
dongsheng@627
|
11566
|
dongsheng@627
|
11567 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
11568 #: ../en/ch09-hook.xml:1036
|
dongsheng@627
|
11569 msgid "Configuring the text that gets added to a bug"
|
dongsheng@635
|
11570 msgstr "配置增加到问题中的正文"
|
dongsheng@627
|
11571
|
dongsheng@627
|
11572 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11573 #: ../en/ch09-hook.xml:1038
|
dongsheng@627
|
11574 msgid ""
|
dongsheng@627
|
11575 "You can configure the text that this hook adds as a comment; you specify it "
|
dongsheng@650
|
11576 "in the form of a Mercurial template. Several <filename role=\"special\">~/."
|
dongsheng@650
|
11577 "hgrc</filename> entries (still in the <literal role=\"rc-bugzilla\">bugzilla</"
|
dongsheng@650
|
11578 "literal> section) control this behaviour."
|
dongsheng@627
|
11579 msgstr ""
|
dongsheng@627
|
11580
|
dongsheng@627
|
11581 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11582 #: ../en/ch09-hook.xml:1045
|
dongsheng@627
|
11583 msgid ""
|
dongsheng@627
|
11584 "<literal>strip</literal>: The number of leading path elements to strip from a "
|
dongsheng@627
|
11585 "repository's path name to construct a partial path for a URL. For example, if "
|
dongsheng@627
|
11586 "the repositories on your server live under <filename class=\"directory\">/"
|
dongsheng@627
|
11587 "home/hg/repos</filename>, and you have a repository whose path is <filename "
|
dongsheng@627
|
11588 "class=\"directory\">/home/hg/repos/app/tests</filename>, then setting "
|
dongsheng@627
|
11589 "<literal>strip</literal> to <literal>4</literal> will give a partial path of "
|
dongsheng@627
|
11590 "<filename class=\"directory\">app/tests</filename>. The hook will make this "
|
dongsheng@627
|
11591 "partial path available when expanding a template, as <literal>webroot</"
|
dongsheng@627
|
11592 "literal>."
|
dongsheng@627
|
11593 msgstr ""
|
dongsheng@627
|
11594
|
dongsheng@627
|
11595 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11596 #: ../en/ch09-hook.xml:1059
|
dongsheng@627
|
11597 msgid ""
|
dongsheng@627
|
11598 "<literal>template</literal>: The text of the template to use. In addition to "
|
dongsheng@627
|
11599 "the usual changeset-related variables, this template can use <literal>hgweb</"
|
dongsheng@627
|
11600 "literal> (the value of the <literal>hgweb</literal> configuration item above) "
|
dongsheng@627
|
11601 "and <literal>webroot</literal> (the path constructed using <literal>strip</"
|
dongsheng@627
|
11602 "literal> above)."
|
dongsheng@627
|
11603 msgstr ""
|
dongsheng@627
|
11604
|
dongsheng@627
|
11605 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11606 #: ../en/ch09-hook.xml:1069
|
dongsheng@627
|
11607 msgid ""
|
dongsheng@627
|
11608 "In addition, you can add a <envar role=\"rc-item-web\">baseurl</envar> item "
|
dongsheng@627
|
11609 "to the <literal role=\"rc-web\">web</literal> section of your <filename role="
|
dongsheng@650
|
11610 "\"special\">~/.hgrc</filename>. The <literal role=\"hg-ext\">bugzilla</"
|
dongsheng@627
|
11611 "literal> hook will make this available when expanding a template, as the base "
|
dongsheng@627
|
11612 "string to use when constructing a URL that will let users browse from a "
|
dongsheng@627
|
11613 "Bugzilla comment to view a changeset. Example:"
|
dongsheng@627
|
11614 msgstr ""
|
dongsheng@627
|
11615
|
dongsheng@627
|
11616 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11617 #: ../en/ch09-hook.xml:1081
|
dongsheng@627
|
11618 msgid ""
|
dongsheng@627
|
11619 "Here is an example set of <literal role=\"hg-ext\">bugzilla</literal> hook "
|
dongsheng@627
|
11620 "config information."
|
dongsheng@627
|
11621 msgstr ""
|
dongsheng@627
|
11622
|
dongsheng@627
|
11623 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11624 #: ../en/ch09-hook.xml:1091
|
dongsheng@627
|
11625 msgid ""
|
dongsheng@627
|
11626 "The most common problems with configuring the <literal role=\"hg-ext"
|
dongsheng@627
|
11627 "\">bugzilla</literal> hook relate to running Bugzilla's "
|
dongsheng@627
|
11628 "<filename>processmail</filename> script and mapping committer names to user "
|
dongsheng@627
|
11629 "names."
|
dongsheng@627
|
11630 msgstr ""
|
dongsheng@627
|
11631
|
dongsheng@627
|
11632 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11633 #: ../en/ch09-hook.xml:1097
|
dongsheng@627
|
11634 msgid ""
|
dongsheng@627
|
11635 "Recall from section <xref linkend=\"sec.hook.bugzilla.config\"/> above that "
|
dongsheng@627
|
11636 "the user that runs the Mercurial process on the server is also the one that "
|
dongsheng@627
|
11637 "will run the <filename>processmail</filename> script. The "
|
dongsheng@627
|
11638 "<filename>processmail</filename> script sometimes causes Bugzilla to write to "
|
dongsheng@627
|
11639 "files in its configuration directory, and Bugzilla's configuration files are "
|
dongsheng@627
|
11640 "usually owned by the user that your web server runs under."
|
dongsheng@627
|
11641 msgstr ""
|
dongsheng@627
|
11642
|
dongsheng@627
|
11643 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11644 #: ../en/ch09-hook.xml:1108
|
dongsheng@627
|
11645 msgid ""
|
dongsheng@627
|
11646 "You can cause <filename>processmail</filename> to be run with the suitable "
|
dongsheng@627
|
11647 "user's identity using the <command>sudo</command> command. Here is an "
|
dongsheng@627
|
11648 "example entry for a <filename>sudoers</filename> file."
|
dongsheng@627
|
11649 msgstr ""
|
dongsheng@627
|
11650
|
dongsheng@627
|
11651 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11652 #: ../en/ch09-hook.xml:1115
|
dongsheng@627
|
11653 msgid ""
|
dongsheng@627
|
11654 "This allows the <literal>hg_user</literal> user to run a "
|
dongsheng@627
|
11655 "<filename>processmail-wrapper</filename> program under the identity of "
|
dongsheng@627
|
11656 "<literal>httpd_user</literal>."
|
dongsheng@627
|
11657 msgstr ""
|
dongsheng@627
|
11658
|
dongsheng@627
|
11659 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11660 #: ../en/ch09-hook.xml:1120
|
dongsheng@627
|
11661 msgid ""
|
dongsheng@627
|
11662 "This indirection through a wrapper script is necessary, because "
|
dongsheng@627
|
11663 "<filename>processmail</filename> expects to be run with its current directory "
|
dongsheng@627
|
11664 "set to wherever you installed Bugzilla; you can't specify that kind of "
|
dongsheng@627
|
11665 "constraint in a <filename>sudoers</filename> file. The contents of the "
|
dongsheng@627
|
11666 "wrapper script are simple:"
|
dongsheng@627
|
11667 msgstr ""
|
dongsheng@627
|
11668
|
dongsheng@627
|
11669 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11670 #: ../en/ch09-hook.xml:1129
|
dongsheng@627
|
11671 msgid ""
|
dongsheng@627
|
11672 "It doesn't seem to matter what email address you pass to "
|
dongsheng@627
|
11673 "<filename>processmail</filename>."
|
dongsheng@627
|
11674 msgstr ""
|
dongsheng@627
|
11675
|
dongsheng@627
|
11676 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11677 #: ../en/ch09-hook.xml:1133
|
dongsheng@627
|
11678 msgid ""
|
dongsheng@627
|
11679 "If your <literal role=\"rc-usermap\">usermap</literal> is not set up "
|
dongsheng@627
|
11680 "correctly, users will see an error message from the <literal role=\"hg-ext"
|
dongsheng@627
|
11681 "\">bugzilla</literal> hook when they push changes to the server. The error "
|
dongsheng@627
|
11682 "message will look like this:"
|
dongsheng@627
|
11683 msgstr ""
|
dongsheng@627
|
11684
|
dongsheng@627
|
11685 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11686 #: ../en/ch09-hook.xml:1140
|
dongsheng@627
|
11687 msgid ""
|
dongsheng@627
|
11688 "What this means is that the committer's address, <literal>john.q."
|
dongsheng@627
|
11689 "public@example.com</literal>, is not a valid Bugzilla user name, nor does it "
|
dongsheng@627
|
11690 "have an entry in your <literal role=\"rc-usermap\">usermap</literal> that "
|
dongsheng@627
|
11691 "maps it to a valid Bugzilla user name."
|
dongsheng@627
|
11692 msgstr ""
|
dongsheng@627
|
11693
|
dongsheng@627
|
11694 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11695 #: ../en/ch09-hook.xml:1150
|
dongsheng@627
|
11696 msgid ""
|
dongsheng@627
|
11697 "<literal role=\"hg-ext\">notify</literal>&emdash;send email notifications"
|
dongsheng@635
|
11698 msgstr "<literal role=\"hg-ext\">notify</literal>&emdash;邮件通知"
|
dongsheng@627
|
11699
|
dongsheng@627
|
11700 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11701 #: ../en/ch09-hook.xml:1153
|
dongsheng@627
|
11702 msgid ""
|
dongsheng@627
|
11703 "Although Mercurial's built-in web server provides RSS feeds of changes in "
|
dongsheng@627
|
11704 "every repository, many people prefer to receive change notifications via "
|
dongsheng@627
|
11705 "email. The <literal role=\"hg-ext\">notify</literal> hook lets you send out "
|
dongsheng@627
|
11706 "notifications to a set of email addresses whenever changesets arrive that "
|
dongsheng@627
|
11707 "those subscribers are interested in."
|
dongsheng@627
|
11708 msgstr ""
|
dongsheng@627
|
11709
|
dongsheng@627
|
11710 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11711 #: ../en/ch09-hook.xml:1161
|
dongsheng@627
|
11712 msgid ""
|
dongsheng@627
|
11713 "As with the <literal role=\"hg-ext\">bugzilla</literal> hook, the <literal "
|
dongsheng@627
|
11714 "role=\"hg-ext\">notify</literal> hook is template-driven, so you can "
|
dongsheng@627
|
11715 "customise the contents of the notification messages that it sends."
|
dongsheng@627
|
11716 msgstr ""
|
dongsheng@627
|
11717
|
dongsheng@627
|
11718 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11719 #: ../en/ch09-hook.xml:1167
|
dongsheng@627
|
11720 msgid ""
|
dongsheng@627
|
11721 "By default, the <literal role=\"hg-ext\">notify</literal> hook includes a "
|
dongsheng@627
|
11722 "diff of every changeset that it sends out; you can limit the size of the "
|
dongsheng@627
|
11723 "diff, or turn this feature off entirely. It is useful for letting "
|
dongsheng@627
|
11724 "subscribers review changes immediately, rather than clicking to follow a URL."
|
dongsheng@627
|
11725 msgstr ""
|
dongsheng@627
|
11726
|
dongsheng@627
|
11727 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
11728 #: ../en/ch09-hook.xml:1175
|
dongsheng@627
|
11729 msgid "Configuring the <literal role=\"hg-ext\">notify</literal> hook"
|
dongsheng@635
|
11730 msgstr "配置 <literal role=\"hg-ext\">notify</literal> 钩子"
|
dongsheng@627
|
11731
|
dongsheng@627
|
11732 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11733 #: ../en/ch09-hook.xml:1178
|
dongsheng@627
|
11734 msgid ""
|
dongsheng@627
|
11735 "You can set up the <literal role=\"hg-ext\">notify</literal> hook to send one "
|
dongsheng@627
|
11736 "email message per incoming changeset, or one per incoming group of changesets "
|
dongsheng@627
|
11737 "(all those that arrived in a single pull or push)."
|
dongsheng@627
|
11738 msgstr ""
|
dongsheng@627
|
11739
|
dongsheng@627
|
11740 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11741 #: ../en/ch09-hook.xml:1190
|
dongsheng@627
|
11742 msgid ""
|
dongsheng@627
|
11743 "Configuration information for this hook lives in the <literal role=\"rc-notify"
|
dongsheng@650
|
11744 "\">notify</literal> section of a <filename role=\"special\">~/.hgrc</"
|
dongsheng@650
|
11745 "filename> file."
|
dongsheng@627
|
11746 msgstr ""
|
dongsheng@627
|
11747
|
dongsheng@627
|
11748 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11749 #: ../en/ch09-hook.xml:1195
|
dongsheng@627
|
11750 msgid ""
|
dongsheng@627
|
11751 "<envar role=\"rc-item-notify\">test</envar>: By default, this hook does not "
|
dongsheng@627
|
11752 "send out email at all; instead, it prints the message that it "
|
dongsheng@627
|
11753 "<emphasis>would</emphasis> send. Set this item to <literal>false</literal> "
|
dongsheng@627
|
11754 "to allow email to be sent. The reason that sending of email is turned off by "
|
dongsheng@627
|
11755 "default is that it takes several tries to configure this extension exactly as "
|
dongsheng@627
|
11756 "you would like, and it would be bad form to spam subscribers with a number of "
|
dongsheng@627
|
11757 "<quote>broken</quote> notifications while you debug your configuration."
|
dongsheng@627
|
11758 msgstr ""
|
dongsheng@627
|
11759
|
dongsheng@627
|
11760 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11761 #: ../en/ch09-hook.xml:1207
|
dongsheng@627
|
11762 msgid ""
|
dongsheng@627
|
11763 "<envar role=\"rc-item-notify\">config</envar>: The path to a configuration "
|
dongsheng@627
|
11764 "file that contains subscription information. This is kept separate from the "
|
dongsheng@650
|
11765 "main <filename role=\"special\">~/.hgrc</filename> so that you can maintain "
|
dongsheng@627
|
11766 "it in a repository of its own. People can then clone that repository, update "
|
dongsheng@627
|
11767 "their subscriptions, and push the changes back to your server."
|
dongsheng@627
|
11768 msgstr ""
|
dongsheng@627
|
11769
|
dongsheng@627
|
11770 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11771 #: ../en/ch09-hook.xml:1216
|
dongsheng@627
|
11772 msgid ""
|
dongsheng@627
|
11773 "<envar role=\"rc-item-notify\">strip</envar>: The number of leading path "
|
dongsheng@627
|
11774 "separator characters to strip from a repository's path, when deciding whether "
|
dongsheng@627
|
11775 "a repository has subscribers. For example, if the repositories on your "
|
dongsheng@627
|
11776 "server live in <filename class=\"directory\">/home/hg/repos</filename>, and "
|
dongsheng@627
|
11777 "<literal role=\"hg-ext\">notify</literal> is considering a repository named "
|
dongsheng@627
|
11778 "<filename class=\"directory\">/home/hg/repos/shared/test</filename>, setting "
|
dongsheng@627
|
11779 "<envar role=\"rc-item-notify\">strip</envar> to <literal>4</literal> will "
|
dongsheng@627
|
11780 "cause <literal role=\"hg-ext\">notify</literal> to trim the path it considers "
|
dongsheng@627
|
11781 "down to <filename class=\"directory\">shared/test</filename>, and it will "
|
dongsheng@627
|
11782 "match subscribers against that."
|
dongsheng@627
|
11783 msgstr ""
|
dongsheng@627
|
11784
|
dongsheng@627
|
11785 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11786 #: ../en/ch09-hook.xml:1233
|
dongsheng@627
|
11787 msgid ""
|
dongsheng@627
|
11788 "<envar role=\"rc-item-notify\">template</envar>: The template text to use "
|
dongsheng@627
|
11789 "when sending messages. This specifies both the contents of the message "
|
dongsheng@627
|
11790 "header and its body."
|
dongsheng@627
|
11791 msgstr ""
|
dongsheng@627
|
11792
|
dongsheng@627
|
11793 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11794 #: ../en/ch09-hook.xml:1239
|
dongsheng@627
|
11795 msgid ""
|
dongsheng@627
|
11796 "<envar role=\"rc-item-notify\">maxdiff</envar>: The maximum number of lines "
|
dongsheng@627
|
11797 "of diff data to append to the end of a message. If a diff is longer than "
|
dongsheng@627
|
11798 "this, it is truncated. By default, this is set to 300. Set this to "
|
dongsheng@627
|
11799 "<literal>0</literal> to omit diffs from notification emails."
|
dongsheng@627
|
11800 msgstr ""
|
dongsheng@627
|
11801
|
dongsheng@627
|
11802 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11803 #: ../en/ch09-hook.xml:1248
|
dongsheng@627
|
11804 msgid ""
|
dongsheng@627
|
11805 "<envar role=\"rc-item-notify\">sources</envar>: A list of sources of "
|
dongsheng@627
|
11806 "changesets to consider. This lets you limit <literal role=\"hg-ext\">notify</"
|
dongsheng@627
|
11807 "literal> to only sending out email about changes that remote users pushed "
|
dongsheng@627
|
11808 "into this repository via a server, for example. See section <xref linkend="
|
dongsheng@627
|
11809 "\"sec.hook.sources\"/> for the sources you can specify here."
|
dongsheng@627
|
11810 msgstr ""
|
dongsheng@627
|
11811
|
dongsheng@627
|
11812 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11813 #: ../en/ch09-hook.xml:1260
|
dongsheng@627
|
11814 msgid ""
|
dongsheng@627
|
11815 "If you set the <envar role=\"rc-item-web\">baseurl</envar> item in the "
|
dongsheng@627
|
11816 "<literal role=\"rc-web\">web</literal> section, you can use it in a template; "
|
dongsheng@627
|
11817 "it will be available as <literal>webroot</literal>."
|
dongsheng@627
|
11818 msgstr ""
|
dongsheng@627
|
11819
|
dongsheng@627
|
11820 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11821 #: ../en/ch09-hook.xml:1266
|
dongsheng@627
|
11822 msgid ""
|
dongsheng@627
|
11823 "Here is an example set of <literal role=\"hg-ext\">notify</literal> "
|
dongsheng@627
|
11824 "configuration information."
|
dongsheng@627
|
11825 msgstr ""
|
dongsheng@627
|
11826
|
dongsheng@627
|
11827 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11828 #: ../en/ch09-hook.xml:1272
|
dongsheng@627
|
11829 msgid "This will produce a message that looks like the following:"
|
dongsheng@627
|
11830 msgstr ""
|
dongsheng@627
|
11831
|
dongsheng@627
|
11832 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11833 #: ../en/ch09-hook.xml:1282
|
dongsheng@627
|
11834 msgid ""
|
dongsheng@627
|
11835 "Do not forget that by default, the <literal role=\"hg-ext\">notify</literal> "
|
dongsheng@627
|
11836 "extension <emphasis>will not send any mail</emphasis> until you explicitly "
|
dongsheng@627
|
11837 "configure it to do so, by setting <envar role=\"rc-item-notify\">test</envar> "
|
dongsheng@627
|
11838 "to <literal>false</literal>. Until you do that, it simply prints the message "
|
dongsheng@627
|
11839 "it <emphasis>would</emphasis> send."
|
dongsheng@627
|
11840 msgstr ""
|
dongsheng@627
|
11841
|
dongsheng@627
|
11842 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
11843 #: ../en/ch09-hook.xml:1294
|
dongsheng@627
|
11844 msgid "Information for writers of hooks"
|
dongsheng@635
|
11845 msgstr "编写钩子的信息"
|
dongsheng@627
|
11846
|
dongsheng@627
|
11847 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11848 #: ../en/ch09-hook.xml:1297
|
dongsheng@627
|
11849 msgid "In-process hook execution"
|
dongsheng@635
|
11850 msgstr "进程内钩子的执行"
|
dongsheng@627
|
11851
|
dongsheng@627
|
11852 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11853 #: ../en/ch09-hook.xml:1299
|
dongsheng@627
|
11854 msgid "An in-process hook is called with arguments of the following form:"
|
dongsheng@627
|
11855 msgstr ""
|
dongsheng@627
|
11856
|
dongsheng@627
|
11857 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11858 #: ../en/ch09-hook.xml:1303
|
dongsheng@627
|
11859 msgid ""
|
dongsheng@627
|
11860 "The <literal>ui</literal> parameter is a <literal role=\"py-mod-mercurial.ui"
|
dongsheng@627
|
11861 "\">ui</literal> object. The <literal>repo</literal> parameter is a <literal "
|
dongsheng@627
|
11862 "role=\"py-mod-mercurial.localrepo\">localrepository</literal> object. The "
|
dongsheng@627
|
11863 "names and values of the <literal>**kwargs</literal> parameters depend on the "
|
dongsheng@627
|
11864 "hook being invoked, with the following common features:"
|
dongsheng@627
|
11865 msgstr ""
|
dongsheng@627
|
11866
|
dongsheng@627
|
11867 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
11868 #: ../en/ch09-hook.xml:1312
|
dongsheng@627
|
11869 msgid ""
|
dongsheng@627
|
11870 "If a parameter is named <literal>node</literal> or <literal>parentN</"
|
dongsheng@627
|
11871 "literal>, it will contain a hexadecimal changeset ID. The empty string is "
|
dongsheng@627
|
11872 "used to represent <quote>null changeset ID</quote> instead of a string of "
|
dongsheng@627
|
11873 "zeroes."
|
dongsheng@627
|
11874 msgstr ""
|
dongsheng@627
|
11875
|
dongsheng@627
|
11876 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
11877 #: ../en/ch09-hook.xml:1319
|
dongsheng@627
|
11878 msgid ""
|
dongsheng@627
|
11879 "If a parameter is named <literal>url</literal>, it will contain the URL of a "
|
dongsheng@627
|
11880 "remote repository, if that can be determined."
|
dongsheng@627
|
11881 msgstr ""
|
dongsheng@627
|
11882
|
dongsheng@627
|
11883 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
11884 #: ../en/ch09-hook.xml:1324
|
dongsheng@627
|
11885 msgid ""
|
dongsheng@627
|
11886 "Boolean-valued parameters are represented as Python <literal>bool</literal> "
|
dongsheng@627
|
11887 "objects."
|
dongsheng@627
|
11888 msgstr ""
|
dongsheng@627
|
11889
|
dongsheng@627
|
11890 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11891 #: ../en/ch09-hook.xml:1329
|
dongsheng@627
|
11892 msgid ""
|
dongsheng@627
|
11893 "An in-process hook is called without a change to the process's working "
|
dongsheng@627
|
11894 "directory (unlike external hooks, which are run in the root of the "
|
dongsheng@627
|
11895 "repository). It must not change the process's working directory, or it will "
|
dongsheng@627
|
11896 "cause any calls it makes into the Mercurial API to fail."
|
dongsheng@627
|
11897 msgstr ""
|
dongsheng@627
|
11898
|
dongsheng@627
|
11899 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11900 #: ../en/ch09-hook.xml:1336
|
dongsheng@627
|
11901 msgid ""
|
dongsheng@627
|
11902 "If a hook returns a boolean <quote>false</quote> value, it is considered to "
|
dongsheng@627
|
11903 "have succeeded. If it returns a boolean <quote>true</quote> value or raises "
|
dongsheng@627
|
11904 "an exception, it is considered to have failed. A useful way to think of the "
|
dongsheng@627
|
11905 "calling convention is <quote>tell me if you fail</quote>."
|
dongsheng@627
|
11906 msgstr ""
|
dongsheng@627
|
11907
|
dongsheng@627
|
11908 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11909 #: ../en/ch09-hook.xml:1343
|
dongsheng@627
|
11910 msgid ""
|
dongsheng@627
|
11911 "Note that changeset IDs are passed into Python hooks as hexadecimal strings, "
|
dongsheng@627
|
11912 "not the binary hashes that Mercurial's APIs normally use. To convert a hash "
|
dongsheng@650
|
11913 "from hex to binary, use the <literal>bin</literal> function."
|
dongsheng@650
|
11914 msgstr ""
|
dongsheng@650
|
11915
|
dongsheng@650
|
11916 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11917 #: ../en/ch09-hook.xml:1351
|
dongsheng@627
|
11918 msgid "External hook execution"
|
dongsheng@635
|
11919 msgstr "外部钩子的执行"
|
dongsheng@627
|
11920
|
dongsheng@627
|
11921 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11922 #: ../en/ch09-hook.xml:1353
|
dongsheng@627
|
11923 msgid ""
|
dongsheng@627
|
11924 "An external hook is passed to the shell of the user running Mercurial. "
|
dongsheng@627
|
11925 "Features of that shell, such as variable substitution and command "
|
dongsheng@627
|
11926 "redirection, are available. The hook is run in the root directory of the "
|
dongsheng@627
|
11927 "repository (unlike in-process hooks, which are run in the same directory that "
|
dongsheng@627
|
11928 "Mercurial was run in)."
|
dongsheng@627
|
11929 msgstr ""
|
dongsheng@627
|
11930
|
dongsheng@627
|
11931 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11932 #: ../en/ch09-hook.xml:1361
|
dongsheng@627
|
11933 msgid ""
|
dongsheng@627
|
11934 "Hook parameters are passed to the hook as environment variables. Each "
|
dongsheng@627
|
11935 "environment variable's name is converted in upper case and prefixed with the "
|
dongsheng@627
|
11936 "string <quote><literal>HG_</literal></quote>. For example, if the name of a "
|
dongsheng@627
|
11937 "parameter is <quote><literal>node</literal></quote>, the name of the "
|
dongsheng@627
|
11938 "environment variable representing that parameter will be "
|
dongsheng@627
|
11939 "<quote><literal>HG_NODE</literal></quote>."
|
dongsheng@627
|
11940 msgstr ""
|
dongsheng@627
|
11941
|
dongsheng@627
|
11942 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11943 #: ../en/ch09-hook.xml:1370
|
dongsheng@627
|
11944 msgid ""
|
dongsheng@627
|
11945 "A boolean parameter is represented as the string <quote><literal>1</literal></"
|
dongsheng@627
|
11946 "quote> for <quote>true</quote>, <quote><literal>0</literal></quote> for "
|
dongsheng@627
|
11947 "<quote>false</quote>. If an environment variable is named <envar>HG_NODE</"
|
dongsheng@627
|
11948 "envar>, <envar>HG_PARENT1</envar> or <envar>HG_PARENT2</envar>, it contains a "
|
dongsheng@627
|
11949 "changeset ID represented as a hexadecimal string. The empty string is used "
|
dongsheng@627
|
11950 "to represent <quote>null changeset ID</quote> instead of a string of zeroes. "
|
dongsheng@627
|
11951 "If an environment variable is named <envar>HG_URL</envar>, it will contain "
|
dongsheng@627
|
11952 "the URL of a remote repository, if that can be determined."
|
dongsheng@627
|
11953 msgstr ""
|
dongsheng@627
|
11954
|
dongsheng@627
|
11955 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11956 #: ../en/ch09-hook.xml:1382
|
dongsheng@627
|
11957 msgid ""
|
dongsheng@627
|
11958 "If a hook exits with a status of zero, it is considered to have succeeded. "
|
dongsheng@627
|
11959 "If it exits with a non-zero status, it is considered to have failed."
|
dongsheng@627
|
11960 msgstr ""
|
dongsheng@627
|
11961
|
dongsheng@627
|
11962 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
11963 #: ../en/ch09-hook.xml:1389
|
dongsheng@627
|
11964 msgid "Finding out where changesets come from"
|
dongsheng@635
|
11965 msgstr "检查修改集来自何处"
|
dongsheng@627
|
11966
|
dongsheng@627
|
11967 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
11968 #: ../en/ch09-hook.xml:1391
|
dongsheng@627
|
11969 msgid ""
|
dongsheng@627
|
11970 "A hook that involves the transfer of changesets between a local repository "
|
dongsheng@627
|
11971 "and another may be able to find out information about the <quote>far side</"
|
dongsheng@627
|
11972 "quote>. Mercurial knows <emphasis>how</emphasis> changes are being "
|
dongsheng@627
|
11973 "transferred, and in many cases <emphasis>where</emphasis> they are being "
|
dongsheng@627
|
11974 "transferred to or from."
|
dongsheng@627
|
11975 msgstr ""
|
dongsheng@627
|
11976
|
dongsheng@627
|
11977 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
11978 #: ../en/ch09-hook.xml:1400
|
dongsheng@627
|
11979 msgid "Sources of changesets"
|
dongsheng@635
|
11980 msgstr "修改集的来源"
|
dongsheng@627
|
11981
|
dongsheng@627
|
11982 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
11983 #: ../en/ch09-hook.xml:1402
|
dongsheng@627
|
11984 msgid ""
|
dongsheng@627
|
11985 "Mercurial will tell a hook what means are, or were, used to transfer "
|
dongsheng@627
|
11986 "changesets between repositories. This is provided by Mercurial in a Python "
|
dongsheng@627
|
11987 "parameter named <literal>source</literal>, or an environment variable named "
|
dongsheng@627
|
11988 "<envar>HG_SOURCE</envar>."
|
dongsheng@627
|
11989 msgstr ""
|
dongsheng@627
|
11990
|
dongsheng@627
|
11991 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11992 #: ../en/ch09-hook.xml:1410
|
dongsheng@627
|
11993 msgid ""
|
dongsheng@627
|
11994 "<literal>serve</literal>: Changesets are transferred to or from a remote "
|
dongsheng@627
|
11995 "repository over http or ssh."
|
dongsheng@627
|
11996 msgstr ""
|
dongsheng@627
|
11997
|
dongsheng@627
|
11998 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
11999 #: ../en/ch09-hook.xml:1415
|
dongsheng@627
|
12000 msgid ""
|
dongsheng@627
|
12001 "<literal>pull</literal>: Changesets are being transferred via a pull from one "
|
dongsheng@627
|
12002 "repository into another."
|
dongsheng@627
|
12003 msgstr ""
|
dongsheng@627
|
12004
|
dongsheng@627
|
12005 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
12006 #: ../en/ch09-hook.xml:1420
|
dongsheng@627
|
12007 msgid ""
|
dongsheng@627
|
12008 "<literal>push</literal>: Changesets are being transferred via a push from one "
|
dongsheng@627
|
12009 "repository into another."
|
dongsheng@627
|
12010 msgstr ""
|
dongsheng@627
|
12011
|
dongsheng@627
|
12012 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
12013 #: ../en/ch09-hook.xml:1425
|
dongsheng@627
|
12014 msgid ""
|
dongsheng@627
|
12015 "<literal>bundle</literal>: Changesets are being transferred to or from a "
|
dongsheng@627
|
12016 "bundle."
|
dongsheng@627
|
12017 msgstr ""
|
dongsheng@627
|
12018
|
dongsheng@627
|
12019 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
|
dongsheng@650
|
12020 #: ../en/ch09-hook.xml:1432
|
dongsheng@627
|
12021 msgid "Where changes are going&emdash;remote repository URLs"
|
dongsheng@635
|
12022 msgstr "修改集要到哪里&emdash;远程版本库的地址"
|
dongsheng@627
|
12023
|
dongsheng@627
|
12024 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
12025 #: ../en/ch09-hook.xml:1435
|
dongsheng@627
|
12026 msgid ""
|
dongsheng@627
|
12027 "When possible, Mercurial will tell a hook the location of the <quote>far "
|
dongsheng@627
|
12028 "side</quote> of an activity that transfers changeset data between "
|
dongsheng@627
|
12029 "repositories. This is provided by Mercurial in a Python parameter named "
|
dongsheng@627
|
12030 "<literal>url</literal>, or an environment variable named <envar>HG_URL</"
|
dongsheng@627
|
12031 "envar>."
|
dongsheng@627
|
12032 msgstr ""
|
dongsheng@627
|
12033
|
dongsheng@627
|
12034 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
|
dongsheng@650
|
12035 #: ../en/ch09-hook.xml:1443
|
dongsheng@627
|
12036 msgid ""
|
dongsheng@627
|
12037 "This information is not always known. If a hook is invoked in a repository "
|
dongsheng@627
|
12038 "that is being served via http or ssh, Mercurial cannot tell where the remote "
|
dongsheng@627
|
12039 "repository is, but it may know where the client is connecting from. In such "
|
dongsheng@627
|
12040 "cases, the URL will take one of the following forms:"
|
dongsheng@627
|
12041 msgstr ""
|
dongsheng@627
|
12042
|
dongsheng@627
|
12043 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
12044 #: ../en/ch09-hook.xml:1450
|
dongsheng@627
|
12045 msgid ""
|
dongsheng@627
|
12046 "<literal>remote:ssh:1.2.3.4</literal>&emdash;remote ssh client, at the IP "
|
dongsheng@627
|
12047 "address <literal>1.2.3.4</literal>."
|
dongsheng@627
|
12048 msgstr ""
|
dongsheng@627
|
12049
|
dongsheng@627
|
12050 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
12051 #: ../en/ch09-hook.xml:1455
|
dongsheng@627
|
12052 msgid ""
|
dongsheng@627
|
12053 "<literal>remote:http:1.2.3.4</literal>&emdash;remote http client, at the IP "
|
dongsheng@627
|
12054 "address <literal>1.2.3.4</literal>. If the client is using SSL, this will be "
|
dongsheng@627
|
12055 "of the form <literal>remote:https:1.2.3.4</literal>."
|
dongsheng@627
|
12056 msgstr ""
|
dongsheng@627
|
12057
|
dongsheng@627
|
12058 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
|
dongsheng@650
|
12059 #: ../en/ch09-hook.xml:1462
|
dongsheng@627
|
12060 msgid "Empty&emdash;no information could be discovered about the remote client."
|
dongsheng@627
|
12061 msgstr ""
|
dongsheng@627
|
12062
|
dongsheng@627
|
12063 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
12064 #: ../en/ch09-hook.xml:1471
|
dongsheng@627
|
12065 msgid "Hook reference"
|
dongsheng@635
|
12066 msgstr "钩子参考"
|
dongsheng@627
|
12067
|
dongsheng@627
|
12068 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12069 #: ../en/ch09-hook.xml:1474
|
dongsheng@627
|
12070 msgid ""
|
dongsheng@627
|
12071 "<literal role=\"hook\">changegroup</literal>&emdash;after remote changesets "
|
dongsheng@627
|
12072 "added"
|
dongsheng@635
|
12073 msgstr "<literal role=\"hook\">changegroup</literal>&emdash;增加远程修改集之后"
|
dongsheng@627
|
12074
|
dongsheng@627
|
12075 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12076 #: ../en/ch09-hook.xml:1477
|
dongsheng@627
|
12077 msgid ""
|
dongsheng@627
|
12078 "This hook is run after a group of pre-existing changesets has been added to "
|
dongsheng@627
|
12079 "the repository, for example via a <command role=\"hg-cmd\">hg pull</command> "
|
dongsheng@627
|
12080 "or <command role=\"hg-cmd\">hg unbundle</command>. This hook is run once per "
|
dongsheng@627
|
12081 "operation that added one or more changesets. This is in contrast to the "
|
dongsheng@627
|
12082 "<literal role=\"hook\">incoming</literal> hook, which is run once per "
|
dongsheng@627
|
12083 "changeset, regardless of whether the changesets arrive in a group."
|
dongsheng@627
|
12084 msgstr ""
|
dongsheng@627
|
12085
|
dongsheng@627
|
12086 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12087 #: ../en/ch09-hook.xml:1487
|
dongsheng@627
|
12088 msgid ""
|
dongsheng@627
|
12089 "Some possible uses for this hook include kicking off an automated build or "
|
dongsheng@627
|
12090 "test of the added changesets, updating a bug database, or notifying "
|
dongsheng@627
|
12091 "subscribers that a repository contains new changes."
|
dongsheng@627
|
12092 msgstr ""
|
dongsheng@627
|
12093
|
dongsheng@627
|
12094 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12095 #: ../en/ch09-hook.xml:1493 ../en/ch09-hook.xml:1533 ../en/ch09-hook.xml:1576
|
dongsheng@650
|
12096 #: ../en/ch09-hook.xml:1618 ../en/ch09-hook.xml:1673 ../en/ch09-hook.xml:1713
|
dongsheng@650
|
12097 #: ../en/ch09-hook.xml:1749 ../en/ch09-hook.xml:1784 ../en/ch09-hook.xml:1846
|
dongsheng@650
|
12098 #: ../en/ch09-hook.xml:1904 ../en/ch09-hook.xml:1938 ../en/ch09-hook.xml:1966
|
dongsheng@627
|
12099 msgid "Parameters to this hook:"
|
dongsheng@627
|
12100 msgstr ""
|
dongsheng@627
|
12101
|
dongsheng@627
|
12102 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12103 #: ../en/ch09-hook.xml:1496 ../en/ch09-hook.xml:1849
|
dongsheng@627
|
12104 msgid ""
|
dongsheng@627
|
12105 "<literal>node</literal>: A changeset ID. The changeset ID of the first "
|
dongsheng@627
|
12106 "changeset in the group that was added. All changesets between this and "
|
dongsheng@650
|
12107 "<literal role=\"tag\">tip</literal>, inclusive, were added by a single "
|
dongsheng@650
|
12108 "<command role=\"hg-cmd\">hg pull</command>, <command role=\"hg-cmd\">hg push</"
|
dongsheng@650
|
12109 "command> or <command role=\"hg-cmd\">hg unbundle</command>."
|
dongsheng@627
|
12110 msgstr ""
|
dongsheng@627
|
12111
|
dongsheng@627
|
12112 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12113 #: ../en/ch09-hook.xml:1505 ../en/ch09-hook.xml:1583 ../en/ch09-hook.xml:1676
|
dongsheng@650
|
12114 #: ../en/ch09-hook.xml:1859
|
dongsheng@627
|
12115 msgid ""
|
dongsheng@627
|
12116 "<literal>source</literal>: A string. The source of these changes. See "
|
dongsheng@627
|
12117 "section <xref linkend=\"sec.hook.sources\"/> for details."
|
dongsheng@627
|
12118 msgstr ""
|
dongsheng@627
|
12119
|
dongsheng@627
|
12120 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12121 #: ../en/ch09-hook.xml:1510 ../en/ch09-hook.xml:1588 ../en/ch09-hook.xml:1639
|
dongsheng@650
|
12122 #: ../en/ch09-hook.xml:1681 ../en/ch09-hook.xml:1763 ../en/ch09-hook.xml:1864
|
dongsheng@627
|
12123 msgid ""
|
dongsheng@627
|
12124 "<literal>url</literal>: A URL. The location of the remote repository, if "
|
dongsheng@627
|
12125 "known. See section <xref linkend=\"sec.hook.url\"/> for more information."
|
dongsheng@627
|
12126 msgstr ""
|
dongsheng@627
|
12127
|
dongsheng@627
|
12128 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12129 #: ../en/ch09-hook.xml:1517
|
dongsheng@627
|
12130 msgid ""
|
dongsheng@627
|
12131 "See also: <literal role=\"hook\">incoming</literal> (section <xref linkend="
|
dongsheng@627
|
12132 "\"sec.hook.incoming\"/>), <literal role=\"hook\">prechangegroup</literal> "
|
dongsheng@627
|
12133 "(section <xref linkend=\"sec.hook.prechangegroup\"/>), <literal role=\"hook"
|
dongsheng@627
|
12134 "\">pretxnchangegroup</literal> (section <xref linkend=\"sec.hook."
|
dongsheng@627
|
12135 "pretxnchangegroup\"/>)"
|
dongsheng@627
|
12136 msgstr ""
|
dongsheng@627
|
12137
|
dongsheng@627
|
12138 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12139 #: ../en/ch09-hook.xml:1527
|
dongsheng@627
|
12140 msgid ""
|
dongsheng@627
|
12141 "<literal role=\"hook\">commit</literal>&emdash;after a new changeset is "
|
dongsheng@627
|
12142 "created"
|
dongsheng@635
|
12143 msgstr "<literal role=\"hook\">commit</literal>&emdash;创建新修改集之后"
|
dongsheng@627
|
12144
|
dongsheng@627
|
12145 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12146 #: ../en/ch09-hook.xml:1530
|
dongsheng@627
|
12147 msgid "This hook is run after a new changeset has been created."
|
dongsheng@627
|
12148 msgstr ""
|
dongsheng@627
|
12149
|
dongsheng@627
|
12150 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12151 #: ../en/ch09-hook.xml:1536 ../en/ch09-hook.xml:1907
|
dongsheng@627
|
12152 msgid ""
|
dongsheng@627
|
12153 "<literal>node</literal>: A changeset ID. The changeset ID of the newly "
|
dongsheng@627
|
12154 "committed changeset."
|
dongsheng@627
|
12155 msgstr ""
|
dongsheng@627
|
12156
|
dongsheng@627
|
12157 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12158 #: ../en/ch09-hook.xml:1540 ../en/ch09-hook.xml:1911
|
dongsheng@627
|
12159 msgid ""
|
dongsheng@627
|
12160 "<literal>parent1</literal>: A changeset ID. The changeset ID of the first "
|
dongsheng@627
|
12161 "parent of the newly committed changeset."
|
dongsheng@627
|
12162 msgstr ""
|
dongsheng@627
|
12163
|
dongsheng@627
|
12164 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12165 #: ../en/ch09-hook.xml:1545 ../en/ch09-hook.xml:1916
|
dongsheng@627
|
12166 msgid ""
|
dongsheng@627
|
12167 "<literal>parent2</literal>: A changeset ID. The changeset ID of the second "
|
dongsheng@627
|
12168 "parent of the newly committed changeset."
|
dongsheng@627
|
12169 msgstr ""
|
dongsheng@627
|
12170
|
dongsheng@627
|
12171 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12172 #: ../en/ch09-hook.xml:1551
|
dongsheng@627
|
12173 msgid ""
|
dongsheng@627
|
12174 "See also: <literal role=\"hook\">precommit</literal> (section <xref linkend="
|
dongsheng@627
|
12175 "\"sec.hook.precommit\"/>), <literal role=\"hook\">pretxncommit</literal> "
|
dongsheng@627
|
12176 "(section <xref linkend=\"sec.hook.pretxncommit\"/>)"
|
dongsheng@627
|
12177 msgstr ""
|
dongsheng@627
|
12178
|
dongsheng@627
|
12179 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12180 #: ../en/ch09-hook.xml:1559
|
dongsheng@627
|
12181 msgid ""
|
dongsheng@627
|
12182 "<literal role=\"hook\">incoming</literal>&emdash;after one remote changeset "
|
dongsheng@627
|
12183 "is added"
|
dongsheng@635
|
12184 msgstr "<literal role=\"hook\">incoming</literal>&emdash;增加远程修改集之后"
|
dongsheng@627
|
12185
|
dongsheng@627
|
12186 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12187 #: ../en/ch09-hook.xml:1562
|
dongsheng@627
|
12188 msgid ""
|
dongsheng@627
|
12189 "This hook is run after a pre-existing changeset has been added to the "
|
dongsheng@627
|
12190 "repository, for example via a <command role=\"hg-cmd\">hg push</command>. If "
|
dongsheng@627
|
12191 "a group of changesets was added in a single operation, this hook is called "
|
dongsheng@627
|
12192 "once for each added changeset."
|
dongsheng@627
|
12193 msgstr ""
|
dongsheng@627
|
12194
|
dongsheng@627
|
12195 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12196 #: ../en/ch09-hook.xml:1569
|
dongsheng@627
|
12197 msgid ""
|
dongsheng@627
|
12198 "You can use this hook for the same purposes as the <literal role=\"hook"
|
dongsheng@627
|
12199 "\">changegroup</literal> hook (section <xref linkend=\"sec.hook.changegroup\"/"
|
dongsheng@627
|
12200 ">); it's simply more convenient sometimes to run a hook once per group of "
|
dongsheng@627
|
12201 "changesets, while other times it's handier once per changeset."
|
dongsheng@627
|
12202 msgstr ""
|
dongsheng@627
|
12203
|
dongsheng@627
|
12204 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12205 #: ../en/ch09-hook.xml:1579
|
dongsheng@627
|
12206 msgid ""
|
dongsheng@627
|
12207 "<literal>node</literal>: A changeset ID. The ID of the newly added changeset."
|
dongsheng@627
|
12208 msgstr ""
|
dongsheng@627
|
12209
|
dongsheng@627
|
12210 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12211 #: ../en/ch09-hook.xml:1595
|
dongsheng@627
|
12212 msgid ""
|
dongsheng@627
|
12213 "See also: <literal role=\"hook\">changegroup</literal> (section <xref linkend="
|
dongsheng@627
|
12214 "\"sec.hook.changegroup\"/>) <literal role=\"hook\">prechangegroup</literal> "
|
dongsheng@627
|
12215 "(section <xref linkend=\"sec.hook.prechangegroup\"/>), <literal role=\"hook"
|
dongsheng@627
|
12216 "\">pretxnchangegroup</literal> (section <xref linkend=\"sec.hook."
|
dongsheng@627
|
12217 "pretxnchangegroup\"/>)"
|
dongsheng@627
|
12218 msgstr ""
|
dongsheng@627
|
12219
|
dongsheng@627
|
12220 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12221 #: ../en/ch09-hook.xml:1605
|
dongsheng@627
|
12222 msgid ""
|
dongsheng@627
|
12223 "<literal role=\"hook\">outgoing</literal>&emdash;after changesets are "
|
dongsheng@627
|
12224 "propagated"
|
dongsheng@635
|
12225 msgstr "<literal role=\"hook\">outgoing</literal>&emdash;传播修改集之后"
|
dongsheng@627
|
12226
|
dongsheng@627
|
12227 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12228 #: ../en/ch09-hook.xml:1608
|
dongsheng@627
|
12229 msgid ""
|
dongsheng@627
|
12230 "This hook is run after a group of changesets has been propagated out of this "
|
dongsheng@627
|
12231 "repository, for example by a <command role=\"hg-cmd\">hg push</command> or "
|
dongsheng@627
|
12232 "<command role=\"hg-cmd\">hg bundle</command> command."
|
dongsheng@627
|
12233 msgstr ""
|
dongsheng@627
|
12234
|
dongsheng@627
|
12235 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12236 #: ../en/ch09-hook.xml:1614
|
dongsheng@627
|
12237 msgid ""
|
dongsheng@627
|
12238 "One possible use for this hook is to notify administrators that changes have "
|
dongsheng@627
|
12239 "been pulled."
|
dongsheng@627
|
12240 msgstr ""
|
dongsheng@627
|
12241
|
dongsheng@627
|
12242 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12243 #: ../en/ch09-hook.xml:1621
|
dongsheng@627
|
12244 msgid ""
|
dongsheng@627
|
12245 "<literal>node</literal>: A changeset ID. The changeset ID of the first "
|
dongsheng@627
|
12246 "changeset of the group that was sent."
|
dongsheng@627
|
12247 msgstr ""
|
dongsheng@627
|
12248
|
dongsheng@627
|
12249 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12250 #: ../en/ch09-hook.xml:1626
|
dongsheng@627
|
12251 msgid ""
|
dongsheng@627
|
12252 "<literal>source</literal>: A string. The source of the of the operation (see "
|
dongsheng@627
|
12253 "section <xref linkend=\"sec.hook.sources\"/>). If a remote client pulled "
|
dongsheng@627
|
12254 "changes from this repository, <literal>source</literal> will be "
|
dongsheng@627
|
12255 "<literal>serve</literal>. If the client that obtained changes from this "
|
dongsheng@627
|
12256 "repository was local, <literal>source</literal> will be <literal>bundle</"
|
dongsheng@627
|
12257 "literal>, <literal>pull</literal>, or <literal>push</literal>, depending on "
|
dongsheng@627
|
12258 "the operation the client performed."
|
dongsheng@627
|
12259 msgstr ""
|
dongsheng@627
|
12260
|
dongsheng@627
|
12261 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12262 #: ../en/ch09-hook.xml:1646
|
dongsheng@627
|
12263 msgid ""
|
dongsheng@627
|
12264 "See also: <literal role=\"hook\">preoutgoing</literal> (section <xref linkend="
|
dongsheng@627
|
12265 "\"sec.hook.preoutgoing\"/>)"
|
dongsheng@627
|
12266 msgstr ""
|
dongsheng@627
|
12267
|
dongsheng@627
|
12268 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12269 #: ../en/ch09-hook.xml:1652
|
dongsheng@627
|
12270 msgid ""
|
dongsheng@627
|
12271 "<literal role=\"hook\">prechangegroup</literal>&emdash;before starting to add "
|
dongsheng@627
|
12272 "remote changesets"
|
dongsheng@627
|
12273 msgstr ""
|
dongsheng@635
|
12274 "<literal role=\"hook\">prechangegroup</literal>&emdash;增加远程修改集之前"
|
dongsheng@627
|
12275
|
dongsheng@627
|
12276 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12277 #: ../en/ch09-hook.xml:1656
|
dongsheng@627
|
12278 msgid ""
|
dongsheng@627
|
12279 "This controlling hook is run before Mercurial begins to add a group of "
|
dongsheng@627
|
12280 "changesets from another repository."
|
dongsheng@627
|
12281 msgstr ""
|
dongsheng@627
|
12282
|
dongsheng@627
|
12283 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12284 #: ../en/ch09-hook.xml:1660
|
dongsheng@627
|
12285 msgid ""
|
dongsheng@627
|
12286 "This hook does not have any information about the changesets to be added, "
|
dongsheng@627
|
12287 "because it is run before transmission of those changesets is allowed to "
|
dongsheng@627
|
12288 "begin. If this hook fails, the changesets will not be transmitted."
|
dongsheng@627
|
12289 msgstr ""
|
dongsheng@627
|
12290
|
dongsheng@627
|
12291 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12292 #: ../en/ch09-hook.xml:1666
|
dongsheng@627
|
12293 msgid ""
|
dongsheng@627
|
12294 "One use for this hook is to prevent external changes from being added to a "
|
dongsheng@627
|
12295 "repository. For example, you could use this to <quote>freeze</quote> a "
|
dongsheng@627
|
12296 "server-hosted branch temporarily or permanently so that users cannot push to "
|
dongsheng@627
|
12297 "it, while still allowing a local administrator to modify the repository."
|
dongsheng@627
|
12298 msgstr ""
|
dongsheng@627
|
12299
|
dongsheng@627
|
12300 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12301 #: ../en/ch09-hook.xml:1688
|
dongsheng@627
|
12302 msgid ""
|
dongsheng@627
|
12303 "See also: <literal role=\"hook\">changegroup</literal> (section <xref linkend="
|
dongsheng@627
|
12304 "\"sec.hook.changegroup\"/>), <literal role=\"hook\">incoming</literal> "
|
dongsheng@627
|
12305 "(section <xref linkend=\"sec.hook.incoming\"/>), , <literal role=\"hook"
|
dongsheng@627
|
12306 "\">pretxnchangegroup</literal> (section <xref linkend=\"sec.hook."
|
dongsheng@627
|
12307 "pretxnchangegroup\"/>)"
|
dongsheng@627
|
12308 msgstr ""
|
dongsheng@627
|
12309
|
dongsheng@627
|
12310 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12311 #: ../en/ch09-hook.xml:1698
|
dongsheng@627
|
12312 msgid ""
|
dongsheng@627
|
12313 "<literal role=\"hook\">precommit</literal>&emdash;before starting to commit a "
|
dongsheng@627
|
12314 "changeset"
|
dongsheng@635
|
12315 msgstr "<literal role=\"hook\">precommit</literal>&emdash;提交修改集之前"
|
dongsheng@627
|
12316
|
dongsheng@627
|
12317 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12318 #: ../en/ch09-hook.xml:1701
|
dongsheng@627
|
12319 msgid ""
|
dongsheng@627
|
12320 "This hook is run before Mercurial begins to commit a new changeset. It is run "
|
dongsheng@627
|
12321 "before Mercurial has any of the metadata for the commit, such as the files to "
|
dongsheng@627
|
12322 "be committed, the commit message, or the commit date."
|
dongsheng@627
|
12323 msgstr ""
|
dongsheng@627
|
12324
|
dongsheng@627
|
12325 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12326 #: ../en/ch09-hook.xml:1707
|
dongsheng@627
|
12327 msgid ""
|
dongsheng@627
|
12328 "One use for this hook is to disable the ability to commit new changesets, "
|
dongsheng@627
|
12329 "while still allowing incoming changesets. Another is to run a build or test, "
|
dongsheng@627
|
12330 "and only allow the commit to begin if the build or test succeeds."
|
dongsheng@627
|
12331 msgstr ""
|
dongsheng@627
|
12332
|
dongsheng@627
|
12333 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12334 #: ../en/ch09-hook.xml:1716
|
dongsheng@627
|
12335 msgid ""
|
dongsheng@627
|
12336 "<literal>parent1</literal>: A changeset ID. The changeset ID of the first "
|
dongsheng@627
|
12337 "parent of the working directory."
|
dongsheng@627
|
12338 msgstr ""
|
dongsheng@627
|
12339
|
dongsheng@627
|
12340 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12341 #: ../en/ch09-hook.xml:1721
|
dongsheng@627
|
12342 msgid ""
|
dongsheng@627
|
12343 "<literal>parent2</literal>: A changeset ID. The changeset ID of the second "
|
dongsheng@627
|
12344 "parent of the working directory."
|
dongsheng@627
|
12345 msgstr ""
|
dongsheng@627
|
12346
|
dongsheng@627
|
12347 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12348 #: ../en/ch09-hook.xml:1726
|
dongsheng@627
|
12349 msgid ""
|
dongsheng@627
|
12350 "If the commit proceeds, the parents of the working directory will become the "
|
dongsheng@627
|
12351 "parents of the new changeset."
|
dongsheng@627
|
12352 msgstr ""
|
dongsheng@627
|
12353
|
dongsheng@627
|
12354 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12355 #: ../en/ch09-hook.xml:1730
|
dongsheng@627
|
12356 msgid ""
|
dongsheng@627
|
12357 "See also: <literal role=\"hook\">commit</literal> (section <xref linkend="
|
dongsheng@627
|
12358 "\"sec.hook.commit\"/>), <literal role=\"hook\">pretxncommit</literal> "
|
dongsheng@627
|
12359 "(section <xref linkend=\"sec.hook.pretxncommit\"/>)"
|
dongsheng@627
|
12360 msgstr ""
|
dongsheng@627
|
12361
|
dongsheng@627
|
12362 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12363 #: ../en/ch09-hook.xml:1738
|
dongsheng@627
|
12364 msgid ""
|
dongsheng@627
|
12365 "<literal role=\"hook\">preoutgoing</literal>&emdash;before starting to "
|
dongsheng@627
|
12366 "propagate changesets"
|
dongsheng@635
|
12367 msgstr "<literal role=\"hook\">preoutgoing</literal>&emdash;传播修改集之前"
|
dongsheng@627
|
12368
|
dongsheng@627
|
12369 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12370 #: ../en/ch09-hook.xml:1741
|
dongsheng@627
|
12371 msgid ""
|
dongsheng@627
|
12372 "This hook is invoked before Mercurial knows the identities of the changesets "
|
dongsheng@627
|
12373 "to be transmitted."
|
dongsheng@627
|
12374 msgstr ""
|
dongsheng@627
|
12375
|
dongsheng@627
|
12376 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12377 #: ../en/ch09-hook.xml:1745
|
dongsheng@627
|
12378 msgid ""
|
dongsheng@627
|
12379 "One use for this hook is to prevent changes from being transmitted to another "
|
dongsheng@627
|
12380 "repository."
|
dongsheng@627
|
12381 msgstr ""
|
dongsheng@627
|
12382
|
dongsheng@627
|
12383 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12384 #: ../en/ch09-hook.xml:1752
|
dongsheng@627
|
12385 msgid ""
|
dongsheng@627
|
12386 "<literal>source</literal>: A string. The source of the operation that is "
|
dongsheng@627
|
12387 "attempting to obtain changes from this repository (see section <xref linkend="
|
dongsheng@627
|
12388 "\"sec.hook.sources\"/>). See the documentation for the <literal>source</"
|
dongsheng@627
|
12389 "literal> parameter to the <literal role=\"hook\">outgoing</literal> hook, in "
|
dongsheng@627
|
12390 "section <xref linkend=\"sec.hook.outgoing\"/>, for possible values of this "
|
dongsheng@627
|
12391 "parameter."
|
dongsheng@627
|
12392 msgstr ""
|
dongsheng@627
|
12393
|
dongsheng@627
|
12394 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12395 #: ../en/ch09-hook.xml:1770
|
dongsheng@627
|
12396 msgid ""
|
dongsheng@627
|
12397 "See also: <literal role=\"hook\">outgoing</literal> (section <xref linkend="
|
dongsheng@627
|
12398 "\"sec.hook.outgoing\"/>)"
|
dongsheng@627
|
12399 msgstr ""
|
dongsheng@627
|
12400
|
dongsheng@627
|
12401 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12402 #: ../en/ch09-hook.xml:1776
|
dongsheng@627
|
12403 msgid ""
|
dongsheng@627
|
12404 "<literal role=\"hook\">pretag</literal>&emdash;before tagging a changeset"
|
dongsheng@635
|
12405 msgstr "<literal role=\"hook\">pretag</literal>&emdash;创建标签之前"
|
dongsheng@627
|
12406
|
dongsheng@627
|
12407 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12408 #: ../en/ch09-hook.xml:1779
|
dongsheng@627
|
12409 msgid ""
|
dongsheng@627
|
12410 "This controlling hook is run before a tag is created. If the hook succeeds, "
|
dongsheng@627
|
12411 "creation of the tag proceeds. If the hook fails, the tag is not created."
|
dongsheng@627
|
12412 msgstr ""
|
dongsheng@627
|
12413
|
dongsheng@627
|
12414 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12415 #: ../en/ch09-hook.xml:1787
|
dongsheng@627
|
12416 msgid ""
|
dongsheng@627
|
12417 "<literal>local</literal>: A boolean. Whether the tag is local to this "
|
dongsheng@627
|
12418 "repository instance (i.e. stored in <filename role=\"special\">.hg/localtags</"
|
dongsheng@627
|
12419 "filename>) or managed by Mercurial (stored in <filename role=\"special\">."
|
dongsheng@627
|
12420 "hgtags</filename>)."
|
dongsheng@627
|
12421 msgstr ""
|
dongsheng@627
|
12422
|
dongsheng@627
|
12423 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12424 #: ../en/ch09-hook.xml:1794
|
dongsheng@627
|
12425 msgid ""
|
dongsheng@627
|
12426 "<literal>node</literal>: A changeset ID. The ID of the changeset to be "
|
dongsheng@627
|
12427 "tagged."
|
dongsheng@627
|
12428 msgstr ""
|
dongsheng@627
|
12429
|
dongsheng@627
|
12430 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12431 #: ../en/ch09-hook.xml:1798
|
dongsheng@627
|
12432 msgid "<literal>tag</literal>: A string. The name of the tag to be created."
|
dongsheng@627
|
12433 msgstr ""
|
dongsheng@627
|
12434
|
dongsheng@627
|
12435 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12436 #: ../en/ch09-hook.xml:1803
|
dongsheng@627
|
12437 msgid ""
|
dongsheng@627
|
12438 "If the tag to be created is revision-controlled, the <literal role=\"hook"
|
dongsheng@627
|
12439 "\">precommit</literal> and <literal role=\"hook\">pretxncommit</literal> "
|
dongsheng@627
|
12440 "hooks (sections <xref linkend=\"sec.hook.commit\"/> and <xref linkend=\"sec."
|
dongsheng@627
|
12441 "hook.pretxncommit\"/>) will also be run."
|
dongsheng@627
|
12442 msgstr ""
|
dongsheng@627
|
12443
|
dongsheng@627
|
12444 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12445 #: ../en/ch09-hook.xml:1810
|
dongsheng@627
|
12446 msgid ""
|
dongsheng@627
|
12447 "See also: <literal role=\"hook\">tag</literal> (section <xref linkend=\"sec."
|
dongsheng@627
|
12448 "hook.tag\"/>)"
|
dongsheng@627
|
12449 msgstr ""
|
dongsheng@627
|
12450
|
dongsheng@627
|
12451 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12452 #: ../en/ch09-hook.xml:1815
|
dongsheng@627
|
12453 msgid ""
|
dongsheng@627
|
12454 "<literal role=\"hook\">pretxnchangegroup</literal>&emdash;before completing "
|
dongsheng@627
|
12455 "addition of remote changesets"
|
dongsheng@627
|
12456 msgstr ""
|
dongsheng@635
|
12457 "<literal role=\"hook\">pretxnchangegroup</literal>&emdash;完成增加远程修改集之"
|
dongsheng@635
|
12458 "前"
|
dongsheng@627
|
12459
|
dongsheng@627
|
12460 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12461 #: ../en/ch09-hook.xml:1819
|
dongsheng@627
|
12462 msgid ""
|
dongsheng@627
|
12463 "This controlling hook is run before a transaction&emdash;that manages the "
|
dongsheng@627
|
12464 "addition of a group of new changesets from outside the repository&emdash;"
|
dongsheng@627
|
12465 "completes. If the hook succeeds, the transaction completes, and all of the "
|
dongsheng@627
|
12466 "changesets become permanent within this repository. If the hook fails, the "
|
dongsheng@627
|
12467 "transaction is rolled back, and the data for the changesets is erased."
|
dongsheng@627
|
12468 msgstr ""
|
dongsheng@627
|
12469
|
dongsheng@627
|
12470 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12471 #: ../en/ch09-hook.xml:1828
|
dongsheng@627
|
12472 msgid ""
|
dongsheng@627
|
12473 "This hook can access the metadata associated with the almost-added "
|
dongsheng@627
|
12474 "changesets, but it should not do anything permanent with this data. It must "
|
dongsheng@627
|
12475 "also not modify the working directory."
|
dongsheng@627
|
12476 msgstr ""
|
dongsheng@627
|
12477
|
dongsheng@627
|
12478 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12479 #: ../en/ch09-hook.xml:1834
|
dongsheng@627
|
12480 msgid ""
|
dongsheng@627
|
12481 "While this hook is running, if other Mercurial processes access this "
|
dongsheng@627
|
12482 "repository, they will be able to see the almost-added changesets as if they "
|
dongsheng@627
|
12483 "are permanent. This may lead to race conditions if you do not take steps to "
|
dongsheng@627
|
12484 "avoid them."
|
dongsheng@627
|
12485 msgstr ""
|
dongsheng@627
|
12486
|
dongsheng@627
|
12487 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12488 #: ../en/ch09-hook.xml:1841
|
dongsheng@627
|
12489 msgid ""
|
dongsheng@627
|
12490 "This hook can be used to automatically vet a group of changesets. If the "
|
dongsheng@627
|
12491 "hook fails, all of the changesets are <quote>rejected</quote> when the "
|
dongsheng@627
|
12492 "transaction rolls back."
|
dongsheng@627
|
12493 msgstr ""
|
dongsheng@627
|
12494
|
dongsheng@627
|
12495 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12496 #: ../en/ch09-hook.xml:1871
|
dongsheng@627
|
12497 msgid ""
|
dongsheng@627
|
12498 "See also: <literal role=\"hook\">changegroup</literal> (section <xref linkend="
|
dongsheng@627
|
12499 "\"sec.hook.changegroup\"/>), <literal role=\"hook\">incoming</literal> "
|
dongsheng@627
|
12500 "(section <xref linkend=\"sec.hook.incoming\"/>), <literal role=\"hook"
|
dongsheng@627
|
12501 "\">prechangegroup</literal> (section <xref linkend=\"sec.hook.prechangegroup"
|
dongsheng@627
|
12502 "\"/>)"
|
dongsheng@627
|
12503 msgstr ""
|
dongsheng@627
|
12504
|
dongsheng@627
|
12505 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12506 #: ../en/ch09-hook.xml:1881
|
dongsheng@627
|
12507 msgid ""
|
dongsheng@627
|
12508 "<literal role=\"hook\">pretxncommit</literal>&emdash;before completing commit "
|
dongsheng@627
|
12509 "of new changeset"
|
dongsheng@635
|
12510 msgstr "<literal role=\"hook\">pretxncommit</literal>&emdash;完成提交之前"
|
dongsheng@627
|
12511
|
dongsheng@627
|
12512 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12513 #: ../en/ch09-hook.xml:1884
|
dongsheng@627
|
12514 msgid ""
|
dongsheng@627
|
12515 "This controlling hook is run before a transaction&emdash;that manages a new "
|
dongsheng@627
|
12516 "commit&emdash;completes. If the hook succeeds, the transaction completes and "
|
dongsheng@627
|
12517 "the changeset becomes permanent within this repository. If the hook fails, "
|
dongsheng@627
|
12518 "the transaction is rolled back, and the commit data is erased."
|
dongsheng@627
|
12519 msgstr ""
|
dongsheng@627
|
12520
|
dongsheng@627
|
12521 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12522 #: ../en/ch09-hook.xml:1892
|
dongsheng@627
|
12523 msgid ""
|
dongsheng@627
|
12524 "This hook can access the metadata associated with the almost-new changeset, "
|
dongsheng@627
|
12525 "but it should not do anything permanent with this data. It must also not "
|
dongsheng@627
|
12526 "modify the working directory."
|
dongsheng@627
|
12527 msgstr ""
|
dongsheng@627
|
12528
|
dongsheng@627
|
12529 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12530 #: ../en/ch09-hook.xml:1898
|
dongsheng@627
|
12531 msgid ""
|
dongsheng@627
|
12532 "While this hook is running, if other Mercurial processes access this "
|
dongsheng@627
|
12533 "repository, they will be able to see the almost-new changeset as if it is "
|
dongsheng@627
|
12534 "permanent. This may lead to race conditions if you do not take steps to "
|
dongsheng@627
|
12535 "avoid them."
|
dongsheng@627
|
12536 msgstr ""
|
dongsheng@627
|
12537
|
dongsheng@627
|
12538 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12539 #: ../en/ch09-hook.xml:1922
|
dongsheng@627
|
12540 msgid ""
|
dongsheng@627
|
12541 "See also: <literal role=\"hook\">precommit</literal> (section <xref linkend="
|
dongsheng@627
|
12542 "\"sec.hook.precommit\"/>)"
|
dongsheng@627
|
12543 msgstr ""
|
dongsheng@627
|
12544
|
dongsheng@627
|
12545 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12546 #: ../en/ch09-hook.xml:1928
|
dongsheng@627
|
12547 msgid ""
|
dongsheng@627
|
12548 "<literal role=\"hook\">preupdate</literal>&emdash;before updating or merging "
|
dongsheng@627
|
12549 "working directory"
|
dongsheng@627
|
12550 msgstr ""
|
dongsheng@635
|
12551 "<literal role=\"hook\">preupdate</literal>&emdash;更新或合并工作目录之前"
|
dongsheng@627
|
12552
|
dongsheng@627
|
12553 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12554 #: ../en/ch09-hook.xml:1931
|
dongsheng@627
|
12555 msgid ""
|
dongsheng@627
|
12556 "This controlling hook is run before an update or merge of the working "
|
dongsheng@627
|
12557 "directory begins. It is run only if Mercurial's normal pre-update checks "
|
dongsheng@627
|
12558 "determine that the update or merge can proceed. If the hook succeeds, the "
|
dongsheng@627
|
12559 "update or merge may proceed; if it fails, the update or merge does not start."
|
dongsheng@627
|
12560 msgstr ""
|
dongsheng@627
|
12561
|
dongsheng@627
|
12562 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12563 #: ../en/ch09-hook.xml:1941
|
dongsheng@627
|
12564 msgid ""
|
dongsheng@627
|
12565 "<literal>parent1</literal>: A changeset ID. The ID of the parent that the "
|
dongsheng@627
|
12566 "working directory is to be updated to. If the working directory is being "
|
dongsheng@627
|
12567 "merged, it will not change this parent."
|
dongsheng@627
|
12568 msgstr ""
|
dongsheng@627
|
12569
|
dongsheng@627
|
12570 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12571 #: ../en/ch09-hook.xml:1947
|
dongsheng@627
|
12572 msgid ""
|
dongsheng@627
|
12573 "<literal>parent2</literal>: A changeset ID. Only set if the working "
|
dongsheng@627
|
12574 "directory is being merged. The ID of the revision that the working directory "
|
dongsheng@627
|
12575 "is being merged with."
|
dongsheng@627
|
12576 msgstr ""
|
dongsheng@627
|
12577
|
dongsheng@627
|
12578 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12579 #: ../en/ch09-hook.xml:1954
|
dongsheng@627
|
12580 msgid ""
|
dongsheng@627
|
12581 "See also: <literal role=\"hook\">update</literal> (section <xref linkend="
|
dongsheng@627
|
12582 "\"sec.hook.update\"/>)"
|
dongsheng@627
|
12583 msgstr ""
|
dongsheng@627
|
12584
|
dongsheng@627
|
12585 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12586 #: ../en/ch09-hook.xml:1960
|
dongsheng@627
|
12587 msgid "<literal role=\"hook\">tag</literal>&emdash;after tagging a changeset"
|
dongsheng@635
|
12588 msgstr "<literal role=\"hook\">tag</literal>&emdash;创建标签之后"
|
dongsheng@627
|
12589
|
dongsheng@627
|
12590 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12591 #: ../en/ch09-hook.xml:1963
|
dongsheng@627
|
12592 msgid "This hook is run after a tag has been created."
|
dongsheng@627
|
12593 msgstr ""
|
dongsheng@627
|
12594
|
dongsheng@627
|
12595 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12596 #: ../en/ch09-hook.xml:1969
|
dongsheng@627
|
12597 msgid ""
|
dongsheng@627
|
12598 "<literal>local</literal>: A boolean. Whether the new tag is local to this "
|
dongsheng@627
|
12599 "repository instance (i.e. stored in <filename role=\"special\">.hg/"
|
dongsheng@627
|
12600 "localtags</filename>) or managed by Mercurial (stored in <filename role="
|
dongsheng@627
|
12601 "\"special\">.hgtags</filename>)."
|
dongsheng@627
|
12602 msgstr ""
|
dongsheng@627
|
12603
|
dongsheng@627
|
12604 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12605 #: ../en/ch09-hook.xml:1977
|
dongsheng@627
|
12606 msgid ""
|
dongsheng@627
|
12607 "<literal>node</literal>: A changeset ID. The ID of the changeset that was "
|
dongsheng@627
|
12608 "tagged."
|
dongsheng@627
|
12609 msgstr ""
|
dongsheng@627
|
12610
|
dongsheng@627
|
12611 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12612 #: ../en/ch09-hook.xml:1981
|
dongsheng@627
|
12613 msgid "<literal>tag</literal>: A string. The name of the tag that was created."
|
dongsheng@627
|
12614 msgstr ""
|
dongsheng@627
|
12615
|
dongsheng@627
|
12616 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12617 #: ../en/ch09-hook.xml:1986
|
dongsheng@627
|
12618 msgid ""
|
dongsheng@627
|
12619 "If the created tag is revision-controlled, the <literal role=\"hook\">commit</"
|
dongsheng@627
|
12620 "literal> hook (section <xref linkend=\"sec.hook.commit\"/>) is run before "
|
dongsheng@627
|
12621 "this hook."
|
dongsheng@627
|
12622 msgstr ""
|
dongsheng@627
|
12623
|
dongsheng@627
|
12624 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12625 #: ../en/ch09-hook.xml:1991
|
dongsheng@627
|
12626 msgid ""
|
dongsheng@627
|
12627 "See also: <literal role=\"hook\">pretag</literal> (section <xref linkend="
|
dongsheng@627
|
12628 "\"sec.hook.pretag\"/>)"
|
dongsheng@627
|
12629 msgstr ""
|
dongsheng@627
|
12630
|
dongsheng@627
|
12631 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12632 #: ../en/ch09-hook.xml:1997
|
dongsheng@627
|
12633 msgid ""
|
dongsheng@627
|
12634 "<literal role=\"hook\">update</literal>&emdash;after updating or merging "
|
dongsheng@627
|
12635 "working directory"
|
dongsheng@635
|
12636 msgstr "<literal role=\"hook\">update</literal>&emdash;更新或合并工作目录之后"
|
dongsheng@627
|
12637
|
dongsheng@627
|
12638 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12639 #: ../en/ch09-hook.xml:2000
|
dongsheng@627
|
12640 msgid ""
|
dongsheng@627
|
12641 "This hook is run after an update or merge of the working directory "
|
dongsheng@627
|
12642 "completes. Since a merge can fail (if the external <command>hgmerge</"
|
dongsheng@627
|
12643 "command> command fails to resolve conflicts in a file), this hook "
|
dongsheng@627
|
12644 "communicates whether the update or merge completed cleanly."
|
dongsheng@627
|
12645 msgstr ""
|
dongsheng@627
|
12646
|
dongsheng@627
|
12647 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12648 #: ../en/ch09-hook.xml:2008
|
dongsheng@627
|
12649 msgid ""
|
dongsheng@627
|
12650 "<literal>error</literal>: A boolean. Indicates whether the update or merge "
|
dongsheng@627
|
12651 "completed successfully."
|
dongsheng@627
|
12652 msgstr ""
|
dongsheng@627
|
12653
|
dongsheng@627
|
12654 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12655 #: ../en/ch09-hook.xml:2013
|
dongsheng@627
|
12656 msgid ""
|
dongsheng@627
|
12657 "<literal>parent1</literal>: A changeset ID. The ID of the parent that the "
|
dongsheng@627
|
12658 "working directory was updated to. If the working directory was merged, it "
|
dongsheng@627
|
12659 "will not have changed this parent."
|
dongsheng@627
|
12660 msgstr ""
|
dongsheng@627
|
12661
|
dongsheng@627
|
12662 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
12663 #: ../en/ch09-hook.xml:2019
|
dongsheng@627
|
12664 msgid ""
|
dongsheng@627
|
12665 "<literal>parent2</literal>: A changeset ID. Only set if the working "
|
dongsheng@627
|
12666 "directory was merged. The ID of the revision that the working directory was "
|
dongsheng@627
|
12667 "merged with."
|
dongsheng@627
|
12668 msgstr ""
|
dongsheng@627
|
12669
|
dongsheng@627
|
12670 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12671 #: ../en/ch09-hook.xml:2025
|
dongsheng@627
|
12672 msgid ""
|
dongsheng@627
|
12673 "See also: <literal role=\"hook\">preupdate</literal> (section <xref linkend="
|
dongsheng@627
|
12674 "\"sec.hook.preupdate\"/>)"
|
dongsheng@627
|
12675 msgstr ""
|
dongsheng@627
|
12676
|
dongsheng@627
|
12677 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
12678 #: ../en/ch10-template.xml:5
|
dongsheng@627
|
12679 msgid "Customising the output of Mercurial"
|
dongsheng@627
|
12680 msgstr "定制 Mercurial 的输出"
|
dongsheng@627
|
12681
|
dongsheng@627
|
12682 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
12683 #: ../en/ch10-template.xml:7
|
dongsheng@627
|
12684 msgid ""
|
dongsheng@627
|
12685 "Mercurial provides a powerful mechanism to let you control how it displays "
|
dongsheng@627
|
12686 "information. The mechanism is based on templates. You can use templates to "
|
dongsheng@627
|
12687 "generate specific output for a single command, or to customise the entire "
|
dongsheng@627
|
12688 "appearance of the built-in web interface."
|
dongsheng@627
|
12689 msgstr ""
|
dongsheng@627
|
12690
|
dongsheng@627
|
12691 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
12692 #: ../en/ch10-template.xml:14
|
dongsheng@627
|
12693 msgid "Using precanned output styles"
|
dongsheng@636
|
12694 msgstr "使用预定义的输出样式"
|
dongsheng@627
|
12695
|
dongsheng@627
|
12696 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12697 #: ../en/ch10-template.xml:16
|
dongsheng@627
|
12698 msgid ""
|
dongsheng@627
|
12699 "Packaged with Mercurial are some output styles that you can use immediately. "
|
dongsheng@627
|
12700 "A style is simply a precanned template that someone wrote and installed "
|
dongsheng@627
|
12701 "somewhere that Mercurial can find."
|
dongsheng@627
|
12702 msgstr ""
|
dongsheng@627
|
12703
|
dongsheng@627
|
12704 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12705 #: ../en/ch10-template.xml:21
|
dongsheng@627
|
12706 msgid ""
|
dongsheng@627
|
12707 "Before we take a look at Mercurial's bundled styles, let's review its normal "
|
dongsheng@627
|
12708 "output."
|
dongsheng@627
|
12709 msgstr ""
|
dongsheng@627
|
12710
|
dongsheng@627
|
12711 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12712 #: ../en/ch10-template.xml:26
|
dongsheng@627
|
12713 msgid ""
|
dongsheng@627
|
12714 "This is somewhat informative, but it takes up a lot of space&emdash;five "
|
dongsheng@627
|
12715 "lines of output per changeset. The <literal>compact</literal> style reduces "
|
dongsheng@627
|
12716 "this to three lines, presented in a sparse manner."
|
dongsheng@627
|
12717 msgstr ""
|
dongsheng@627
|
12718
|
dongsheng@627
|
12719 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12720 #: ../en/ch10-template.xml:33
|
dongsheng@627
|
12721 msgid ""
|
dongsheng@627
|
12722 "The <literal>changelog</literal> style hints at the expressive power of "
|
dongsheng@627
|
12723 "Mercurial's templating engine. This style attempts to follow the GNU "
|
dongsheng@627
|
12724 "Project's changelog guidelines<citation>web:changelog</citation>."
|
dongsheng@627
|
12725 msgstr ""
|
dongsheng@627
|
12726
|
dongsheng@627
|
12727 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12728 #: ../en/ch10-template.xml:40
|
dongsheng@627
|
12729 msgid ""
|
dongsheng@627
|
12730 "You will not be shocked to learn that Mercurial's default output style is "
|
dongsheng@627
|
12731 "named <literal>default</literal>."
|
dongsheng@627
|
12732 msgstr ""
|
dongsheng@627
|
12733
|
dongsheng@627
|
12734 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
12735 #: ../en/ch10-template.xml:44
|
dongsheng@627
|
12736 msgid "Setting a default style"
|
dongsheng@636
|
12737 msgstr "设置默认样式"
|
dongsheng@627
|
12738
|
dongsheng@627
|
12739 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12740 #: ../en/ch10-template.xml:46
|
dongsheng@627
|
12741 msgid ""
|
dongsheng@627
|
12742 "You can modify the output style that Mercurial will use for every command by "
|
dongsheng@650
|
12743 "editing your <filename role=\"special\">~/.hgrc</filename> file, naming the "
|
dongsheng@627
|
12744 "style you would prefer to use."
|
dongsheng@627
|
12745 msgstr ""
|
dongsheng@627
|
12746
|
dongsheng@627
|
12747 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
12748 #: ../en/ch10-template.xml:54
|
dongsheng@627
|
12749 msgid ""
|
dongsheng@627
|
12750 "If you write a style of your own, you can use it by either providing the path "
|
dongsheng@627
|
12751 "to your style file, or copying your style file into a location where "
|
dongsheng@627
|
12752 "Mercurial can find it (typically the <literal>templates</literal> "
|
dongsheng@627
|
12753 "subdirectory of your Mercurial install directory)."
|
dongsheng@627
|
12754 msgstr ""
|
dongsheng@627
|
12755
|
dongsheng@627
|
12756 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
12757 #: ../en/ch10-template.xml:63
|
dongsheng@627
|
12758 msgid "Commands that support styles and templates"
|
dongsheng@636
|
12759 msgstr "支持样式和模版的命令"
|
dongsheng@627
|
12760
|
dongsheng@627
|
12761 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12762 #: ../en/ch10-template.xml:65
|
dongsheng@627
|
12763 msgid ""
|
dongsheng@627
|
12764 "All of Mercurial's <quote><literal>log</literal>-like</quote> commands let "
|
dongsheng@627
|
12765 "you use styles and templates: <command role=\"hg-cmd\">hg incoming</command>, "
|
dongsheng@627
|
12766 "<command role=\"hg-cmd\">hg log</command>, <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
12767 "outgoing</command>, and <command role=\"hg-cmd\">hg tip</command>."
|
dongsheng@627
|
12768 msgstr ""
|
dongsheng@627
|
12769
|
dongsheng@627
|
12770 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12771 #: ../en/ch10-template.xml:72
|
dongsheng@627
|
12772 msgid ""
|
dongsheng@627
|
12773 "As I write this manual, these are so far the only commands that support "
|
dongsheng@627
|
12774 "styles and templates. Since these are the most important commands that need "
|
dongsheng@627
|
12775 "customisable output, there has been little pressure from the Mercurial user "
|
dongsheng@627
|
12776 "community to add style and template support to other commands."
|
dongsheng@627
|
12777 msgstr ""
|
dongsheng@627
|
12778
|
dongsheng@627
|
12779 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
12780 #: ../en/ch10-template.xml:80
|
dongsheng@627
|
12781 msgid "The basics of templating"
|
dongsheng@636
|
12782 msgstr "模版基础"
|
dongsheng@627
|
12783
|
dongsheng@627
|
12784 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12785 #: ../en/ch10-template.xml:82
|
dongsheng@627
|
12786 msgid ""
|
dongsheng@627
|
12787 "At its simplest, a Mercurial template is a piece of text. Some of the text "
|
dongsheng@627
|
12788 "never changes, while other parts are <emphasis>expanded</emphasis>, or "
|
dongsheng@627
|
12789 "replaced with new text, when necessary."
|
dongsheng@627
|
12790 msgstr ""
|
dongsheng@627
|
12791
|
dongsheng@627
|
12792 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12793 #: ../en/ch10-template.xml:87
|
dongsheng@627
|
12794 msgid ""
|
dongsheng@627
|
12795 "Before we continue, let's look again at a simple example of Mercurial's "
|
dongsheng@627
|
12796 "normal output."
|
dongsheng@627
|
12797 msgstr ""
|
dongsheng@627
|
12798
|
dongsheng@627
|
12799 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12800 #: ../en/ch10-template.xml:92
|
dongsheng@627
|
12801 msgid ""
|
dongsheng@627
|
12802 "Now, let's run the same command, but using a template to change its output."
|
dongsheng@627
|
12803 msgstr ""
|
dongsheng@627
|
12804
|
dongsheng@627
|
12805 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12806 #: ../en/ch10-template.xml:97
|
dongsheng@627
|
12807 msgid ""
|
dongsheng@627
|
12808 "The example above illustrates the simplest possible template; it's just a "
|
dongsheng@627
|
12809 "piece of static text, printed once for each changeset. The <option role=\"hg-"
|
dongsheng@627
|
12810 "opt-log\">--template</option> option to the <command role=\"hg-cmd\">hg log</"
|
dongsheng@627
|
12811 "command> command tells Mercurial to use the given text as the template when "
|
dongsheng@627
|
12812 "printing each changeset."
|
dongsheng@627
|
12813 msgstr ""
|
dongsheng@627
|
12814
|
dongsheng@627
|
12815 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12816 #: ../en/ch10-template.xml:105
|
dongsheng@627
|
12817 msgid ""
|
dongsheng@627
|
12818 "Notice that the template string above ends with the text <quote><literal>\\n</"
|
dongsheng@627
|
12819 "literal></quote>. This is an <emphasis>escape sequence</emphasis>, telling "
|
dongsheng@627
|
12820 "Mercurial to print a newline at the end of each template item. If you omit "
|
dongsheng@627
|
12821 "this newline, Mercurial will run each piece of output together. See section "
|
dongsheng@627
|
12822 "<xref linkend=\"sec.template.escape\"/> for more details of escape sequences."
|
dongsheng@627
|
12823 msgstr ""
|
dongsheng@627
|
12824
|
dongsheng@627
|
12825 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12826 #: ../en/ch10-template.xml:113
|
dongsheng@627
|
12827 msgid ""
|
dongsheng@627
|
12828 "A template that prints a fixed string of text all the time isn't very useful; "
|
dongsheng@627
|
12829 "let's try something a bit more complex."
|
dongsheng@627
|
12830 msgstr ""
|
dongsheng@627
|
12831
|
dongsheng@627
|
12832 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12833 #: ../en/ch10-template.xml:119
|
dongsheng@627
|
12834 msgid ""
|
dongsheng@627
|
12835 "As you can see, the string <quote><literal>{desc}</literal></quote> in the "
|
dongsheng@627
|
12836 "template has been replaced in the output with the description of each "
|
dongsheng@627
|
12837 "changeset. Every time Mercurial finds text enclosed in curly braces "
|
dongsheng@627
|
12838 "(<quote><literal>{</literal></quote> and <quote><literal>}</literal></"
|
dongsheng@627
|
12839 "quote>), it will try to replace the braces and text with the expansion of "
|
dongsheng@627
|
12840 "whatever is inside. To print a literal curly brace, you must escape it, as "
|
dongsheng@627
|
12841 "described in section <xref linkend=\"sec.template.escape\"/>."
|
dongsheng@627
|
12842 msgstr ""
|
dongsheng@627
|
12843
|
dongsheng@627
|
12844 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
12845 #: ../en/ch10-template.xml:132
|
dongsheng@627
|
12846 msgid "Common template keywords"
|
dongsheng@636
|
12847 msgstr "模版关键字"
|
dongsheng@627
|
12848
|
dongsheng@627
|
12849 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12850 #: ../en/ch10-template.xml:134
|
dongsheng@627
|
12851 msgid ""
|
dongsheng@627
|
12852 "You can start writing simple templates immediately using the keywords below."
|
dongsheng@627
|
12853 msgstr ""
|
dongsheng@627
|
12854
|
dongsheng@627
|
12855 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12856 #: ../en/ch10-template.xml:138
|
dongsheng@627
|
12857 msgid ""
|
dongsheng@627
|
12858 "<literal role=\"template-keyword\">author</literal>: String. The unmodified "
|
dongsheng@627
|
12859 "author of the changeset."
|
dongsheng@627
|
12860 msgstr ""
|
dongsheng@627
|
12861
|
dongsheng@627
|
12862 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12863 #: ../en/ch10-template.xml:142
|
dongsheng@627
|
12864 msgid ""
|
dongsheng@627
|
12865 "<literal role=\"template-keyword\">branches</literal>: String. The name of "
|
dongsheng@627
|
12866 "the branch on which the changeset was committed. Will be empty if the branch "
|
dongsheng@627
|
12867 "name was <literal>default</literal>."
|
dongsheng@627
|
12868 msgstr ""
|
dongsheng@627
|
12869
|
dongsheng@627
|
12870 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12871 #: ../en/ch10-template.xml:148
|
dongsheng@627
|
12872 msgid ""
|
dongsheng@627
|
12873 "<literal role=\"template-keyword\">date</literal>: Date information. The "
|
dongsheng@627
|
12874 "date when the changeset was committed. This is <emphasis>not</emphasis> "
|
dongsheng@627
|
12875 "human-readable; you must pass it through a filter that will render it "
|
dongsheng@627
|
12876 "appropriately. See section <xref linkend=\"sec.template.filter\"/> for more "
|
dongsheng@627
|
12877 "information on filters. The date is expressed as a pair of numbers. The "
|
dongsheng@627
|
12878 "first number is a Unix UTC timestamp (seconds since January 1, 1970); the "
|
dongsheng@627
|
12879 "second is the offset of the committer's timezone from UTC, in seconds."
|
dongsheng@627
|
12880 msgstr ""
|
dongsheng@627
|
12881
|
dongsheng@627
|
12882 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12883 #: ../en/ch10-template.xml:159
|
dongsheng@627
|
12884 msgid ""
|
dongsheng@627
|
12885 "<literal role=\"template-keyword\">desc</literal>: String. The text of the "
|
dongsheng@627
|
12886 "changeset description."
|
dongsheng@627
|
12887 msgstr ""
|
dongsheng@627
|
12888
|
dongsheng@627
|
12889 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12890 #: ../en/ch10-template.xml:162
|
dongsheng@627
|
12891 msgid ""
|
dongsheng@627
|
12892 "<literal role=\"template-keyword\">files</literal>: List of strings. All "
|
dongsheng@627
|
12893 "files modified, added, or removed by this changeset."
|
dongsheng@627
|
12894 msgstr ""
|
dongsheng@627
|
12895
|
dongsheng@627
|
12896 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12897 #: ../en/ch10-template.xml:167
|
dongsheng@627
|
12898 msgid ""
|
dongsheng@627
|
12899 "<literal role=\"template-keyword\">file_adds</literal>: List of strings. "
|
dongsheng@627
|
12900 "Files added by this changeset."
|
dongsheng@627
|
12901 msgstr ""
|
dongsheng@627
|
12902
|
dongsheng@627
|
12903 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12904 #: ../en/ch10-template.xml:171
|
dongsheng@627
|
12905 msgid ""
|
dongsheng@627
|
12906 "<literal role=\"template-keyword\">file_dels</literal>: List of strings. "
|
dongsheng@627
|
12907 "Files removed by this changeset."
|
dongsheng@627
|
12908 msgstr ""
|
dongsheng@627
|
12909
|
dongsheng@627
|
12910 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12911 #: ../en/ch10-template.xml:175
|
dongsheng@627
|
12912 msgid ""
|
dongsheng@627
|
12913 "<literal role=\"template-keyword\">node</literal>: String. The changeset "
|
dongsheng@627
|
12914 "identification hash, as a 40-character hexadecimal string."
|
dongsheng@627
|
12915 msgstr ""
|
dongsheng@627
|
12916
|
dongsheng@627
|
12917 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12918 #: ../en/ch10-template.xml:179
|
dongsheng@627
|
12919 msgid ""
|
dongsheng@627
|
12920 "<literal role=\"template-keyword\">parents</literal>: List of strings. The "
|
dongsheng@627
|
12921 "parents of the changeset."
|
dongsheng@627
|
12922 msgstr ""
|
dongsheng@627
|
12923
|
dongsheng@627
|
12924 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12925 #: ../en/ch10-template.xml:183
|
dongsheng@627
|
12926 msgid ""
|
dongsheng@627
|
12927 "<literal role=\"template-keyword\">rev</literal>: Integer. The repository-"
|
dongsheng@627
|
12928 "local changeset revision number."
|
dongsheng@627
|
12929 msgstr ""
|
dongsheng@627
|
12930
|
dongsheng@627
|
12931 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12932 #: ../en/ch10-template.xml:187
|
dongsheng@627
|
12933 msgid ""
|
dongsheng@627
|
12934 "<literal role=\"template-keyword\">tags</literal>: List of strings. Any tags "
|
dongsheng@627
|
12935 "associated with the changeset."
|
dongsheng@627
|
12936 msgstr ""
|
dongsheng@627
|
12937
|
dongsheng@627
|
12938 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12939 #: ../en/ch10-template.xml:192
|
dongsheng@627
|
12940 msgid ""
|
dongsheng@627
|
12941 "A few simple experiments will show us what to expect when we use these "
|
dongsheng@627
|
12942 "keywords; you can see the results below."
|
dongsheng@627
|
12943 msgstr ""
|
dongsheng@627
|
12944
|
dongsheng@627
|
12945 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12946 #: ../en/ch10-template.xml:197
|
dongsheng@627
|
12947 msgid ""
|
dongsheng@627
|
12948 "As we noted above, the date keyword does not produce human-readable output, "
|
dongsheng@627
|
12949 "so we must treat it specially. This involves using a <emphasis>filter</"
|
dongsheng@627
|
12950 "emphasis>, about which more in section <xref linkend=\"sec.template.filter\"/"
|
dongsheng@627
|
12951 ">."
|
dongsheng@627
|
12952 msgstr ""
|
dongsheng@627
|
12953
|
dongsheng@627
|
12954 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
12955 #: ../en/ch10-template.xml:207
|
dongsheng@627
|
12956 msgid "Escape sequences"
|
dongsheng@636
|
12957 msgstr "转义序列"
|
dongsheng@627
|
12958
|
dongsheng@627
|
12959 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
12960 #: ../en/ch10-template.xml:209
|
dongsheng@627
|
12961 msgid ""
|
dongsheng@627
|
12962 "Mercurial's templating engine recognises the most commonly used escape "
|
dongsheng@627
|
12963 "sequences in strings. When it sees a backslash (<quote><literal>\\</"
|
dongsheng@627
|
12964 "literal></quote>) character, it looks at the following character and "
|
dongsheng@627
|
12965 "substitutes the two characters with a single replacement, as described below."
|
dongsheng@627
|
12966 msgstr ""
|
dongsheng@627
|
12967
|
dongsheng@627
|
12968 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12969 #: ../en/ch10-template.xml:216
|
dongsheng@650
|
12970 msgid ""
|
dongsheng@650
|
12971 "<literal>\\</literal>: Backslash, <quote><literal>\\</literal></quote>, ASCII "
|
dongsheng@650
|
12972 "134."
|
dongsheng@627
|
12973 msgstr ""
|
dongsheng@627
|
12974
|
dongsheng@627
|
12975 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12976 #: ../en/ch10-template.xml:220
|
dongsheng@650
|
12977 msgid "<literal>\\n</literal>: Newline, ASCII 12."
|
dongsheng@627
|
12978 msgstr ""
|
dongsheng@627
|
12979
|
dongsheng@627
|
12980 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12981 #: ../en/ch10-template.xml:223
|
dongsheng@650
|
12982 msgid "<literal>\\r</literal>: Carriage return, ASCII 15."
|
dongsheng@627
|
12983 msgstr ""
|
dongsheng@627
|
12984
|
dongsheng@627
|
12985 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12986 #: ../en/ch10-template.xml:226
|
dongsheng@650
|
12987 msgid "<literal>\\t</literal>: Tab, ASCII 11."
|
dongsheng@627
|
12988 msgstr ""
|
dongsheng@627
|
12989
|
dongsheng@627
|
12990 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12991 #: ../en/ch10-template.xml:229
|
dongsheng@650
|
12992 msgid "<literal>\\v</literal>: Vertical tab, ASCII 13."
|
dongsheng@627
|
12993 msgstr ""
|
dongsheng@627
|
12994
|
dongsheng@627
|
12995 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
12996 #: ../en/ch10-template.xml:232
|
dongsheng@650
|
12997 msgid ""
|
dongsheng@650
|
12998 "<literal>{</literal>: Open curly brace, <quote><literal>{</literal></quote>, "
|
dongsheng@650
|
12999 "ASCII 173."
|
dongsheng@627
|
13000 msgstr ""
|
dongsheng@627
|
13001
|
dongsheng@627
|
13002 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13003 #: ../en/ch10-template.xml:236
|
dongsheng@650
|
13004 msgid ""
|
dongsheng@650
|
13005 "<literal>}</literal>: Close curly brace, <quote><literal>}</literal></quote>, "
|
dongsheng@650
|
13006 "ASCII 175."
|
dongsheng@650
|
13007 msgstr ""
|
dongsheng@650
|
13008
|
dongsheng@650
|
13009 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13010 #: ../en/ch10-template.xml:241
|
dongsheng@627
|
13011 msgid ""
|
dongsheng@627
|
13012 "As indicated above, if you want the expansion of a template to contain a "
|
dongsheng@627
|
13013 "literal <quote><literal>\\</literal></quote>, <quote><literal>{</literal></"
|
dongsheng@627
|
13014 "quote>, or <quote><literal>{</literal></quote> character, you must escape it."
|
dongsheng@627
|
13015 msgstr ""
|
dongsheng@627
|
13016
|
dongsheng@627
|
13017 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13018 #: ../en/ch10-template.xml:249
|
dongsheng@627
|
13019 msgid "Filtering keywords to change their results"
|
dongsheng@636
|
13020 msgstr "通过过滤关键字来修改输出结果"
|
dongsheng@627
|
13021
|
dongsheng@627
|
13022 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13023 #: ../en/ch10-template.xml:251
|
dongsheng@627
|
13024 msgid ""
|
dongsheng@627
|
13025 "Some of the results of template expansion are not immediately easy to use. "
|
dongsheng@627
|
13026 "Mercurial lets you specify an optional chain of <emphasis>filters</emphasis> "
|
dongsheng@627
|
13027 "to modify the result of expanding a keyword. You have already seen a common "
|
dongsheng@627
|
13028 "filter, <literal role=\"template-kw-filt-date\">isodate</literal>, in action "
|
dongsheng@627
|
13029 "above, to make a date readable."
|
dongsheng@627
|
13030 msgstr ""
|
dongsheng@627
|
13031
|
dongsheng@627
|
13032 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13033 #: ../en/ch10-template.xml:258
|
dongsheng@627
|
13034 msgid ""
|
dongsheng@627
|
13035 "Below is a list of the most commonly used filters that Mercurial supports. "
|
dongsheng@627
|
13036 "While some filters can be applied to any text, others can only be used in "
|
dongsheng@627
|
13037 "specific circumstances. The name of each filter is followed first by an "
|
dongsheng@627
|
13038 "indication of where it can be used, then a description of its effect."
|
dongsheng@627
|
13039 msgstr ""
|
dongsheng@627
|
13040
|
dongsheng@627
|
13041 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13042 #: ../en/ch10-template.xml:265
|
dongsheng@627
|
13043 msgid ""
|
dongsheng@627
|
13044 "<literal role=\"template-filter\">addbreaks</literal>: Any text. Add an XHTML "
|
dongsheng@627
|
13045 "<quote><literal><br/></literal></quote> tag before the end of every "
|
dongsheng@627
|
13046 "line except the last. For example, <quote><literal>foo\\nbar</literal></"
|
dongsheng@627
|
13047 "quote> becomes <quote><literal>foo<br/>\\nbar</literal></quote>."
|
dongsheng@627
|
13048 msgstr ""
|
dongsheng@627
|
13049
|
dongsheng@627
|
13050 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13051 #: ../en/ch10-template.xml:272
|
dongsheng@627
|
13052 msgid ""
|
dongsheng@627
|
13053 "<literal role=\"template-kw-filt-date\">age</literal>: <literal role="
|
dongsheng@627
|
13054 "\"template-keyword\">date</literal> keyword. Render the age of the date, "
|
dongsheng@627
|
13055 "relative to the current time. Yields a string like <quote><literal>10 "
|
dongsheng@627
|
13056 "minutes</literal></quote>."
|
dongsheng@627
|
13057 msgstr ""
|
dongsheng@627
|
13058
|
dongsheng@627
|
13059 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13060 #: ../en/ch10-template.xml:279
|
dongsheng@627
|
13061 msgid ""
|
dongsheng@627
|
13062 "<literal role=\"template-filter\">basename</literal>: Any text, but most "
|
dongsheng@627
|
13063 "useful for the <literal role=\"template-keyword\">files</literal> keyword and "
|
dongsheng@627
|
13064 "its relatives. Treat the text as a path, and return the basename. For "
|
dongsheng@627
|
13065 "example, <quote><literal>foo/bar/baz</literal></quote> becomes "
|
dongsheng@627
|
13066 "<quote><literal>baz</literal></quote>."
|
dongsheng@627
|
13067 msgstr ""
|
dongsheng@627
|
13068
|
dongsheng@627
|
13069 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13070 #: ../en/ch10-template.xml:288
|
dongsheng@627
|
13071 msgid ""
|
dongsheng@627
|
13072 "<literal role=\"template-kw-filt-date\">date</literal>: <literal role="
|
dongsheng@627
|
13073 "\"template-keyword\">date</literal> keyword. Render a date in a similar "
|
dongsheng@627
|
13074 "format to the Unix <literal role=\"template-keyword\">date</literal> command, "
|
dongsheng@627
|
13075 "but with timezone included. Yields a string like <quote><literal>Mon Sep 04 "
|
dongsheng@627
|
13076 "15:13:13 2006 -0700</literal></quote>."
|
dongsheng@627
|
13077 msgstr ""
|
dongsheng@627
|
13078
|
dongsheng@627
|
13079 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13080 #: ../en/ch10-template.xml:296
|
dongsheng@627
|
13081 msgid ""
|
dongsheng@627
|
13082 "<literal role=\"template-kw-filt-author\">domain</literal>: Any text, but "
|
dongsheng@627
|
13083 "most useful for the <literal role=\"template-keyword\">author</literal> "
|
dongsheng@627
|
13084 "keyword. Finds the first string that looks like an email address, and "
|
dongsheng@627
|
13085 "extract just the domain component. For example, <quote><literal>Bryan "
|
dongsheng@627
|
13086 "O'Sullivan <bos@serpentine.com></literal></quote> becomes "
|
dongsheng@627
|
13087 "<quote><literal>serpentine.com</literal></quote>."
|
dongsheng@627
|
13088 msgstr ""
|
dongsheng@627
|
13089
|
dongsheng@627
|
13090 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13091 #: ../en/ch10-template.xml:306
|
dongsheng@627
|
13092 msgid ""
|
dongsheng@627
|
13093 "<literal role=\"template-kw-filt-author\">email</literal>: Any text, but most "
|
dongsheng@627
|
13094 "useful for the <literal role=\"template-keyword\">author</literal> keyword. "
|
dongsheng@627
|
13095 "Extract the first string that looks like an email address. For example, "
|
dongsheng@627
|
13096 "<quote><literal>Bryan O'Sullivan <bos@serpentine.com></literal></quote> "
|
dongsheng@627
|
13097 "becomes <quote><literal>bos@serpentine.com</literal></quote>."
|
dongsheng@627
|
13098 msgstr ""
|
dongsheng@627
|
13099
|
dongsheng@627
|
13100 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13101 #: ../en/ch10-template.xml:315
|
dongsheng@627
|
13102 msgid ""
|
dongsheng@627
|
13103 "<literal role=\"template-filter\">escape</literal>: Any text. Replace the "
|
dongsheng@627
|
13104 "special XML/XHTML characters <quote><literal>&</literal></quote>, "
|
dongsheng@627
|
13105 "<quote><literal><</literal></quote> and <quote><literal>></literal></"
|
dongsheng@627
|
13106 "quote> with XML entities."
|
dongsheng@627
|
13107 msgstr ""
|
dongsheng@627
|
13108
|
dongsheng@627
|
13109 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13110 #: ../en/ch10-template.xml:323
|
dongsheng@627
|
13111 msgid ""
|
dongsheng@627
|
13112 "<literal role=\"template-filter\">fill68</literal>: Any text. Wrap the text "
|
dongsheng@627
|
13113 "to fit in 68 columns. This is useful before you pass text through the "
|
dongsheng@627
|
13114 "<literal role=\"template-filter\">tabindent</literal> filter, and still want "
|
dongsheng@627
|
13115 "it to fit in an 80-column fixed-font window."
|
dongsheng@627
|
13116 msgstr ""
|
dongsheng@627
|
13117
|
dongsheng@627
|
13118 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13119 #: ../en/ch10-template.xml:331
|
dongsheng@627
|
13120 msgid ""
|
dongsheng@627
|
13121 "<literal role=\"template-filter\">fill76</literal>: Any text. Wrap the text "
|
dongsheng@627
|
13122 "to fit in 76 columns."
|
dongsheng@627
|
13123 msgstr ""
|
dongsheng@627
|
13124
|
dongsheng@627
|
13125 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13126 #: ../en/ch10-template.xml:335
|
dongsheng@627
|
13127 msgid ""
|
dongsheng@627
|
13128 "<literal role=\"template-filter\">firstline</literal>: Any text. Yield the "
|
dongsheng@627
|
13129 "first line of text, without any trailing newlines."
|
dongsheng@627
|
13130 msgstr ""
|
dongsheng@627
|
13131
|
dongsheng@627
|
13132 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13133 #: ../en/ch10-template.xml:340
|
dongsheng@627
|
13134 msgid ""
|
dongsheng@627
|
13135 "<literal role=\"template-kw-filt-date\">hgdate</literal>: <literal role="
|
dongsheng@627
|
13136 "\"template-keyword\">date</literal> keyword. Render the date as a pair of "
|
dongsheng@627
|
13137 "readable numbers. Yields a string like <quote><literal>1157407993 25200</"
|
dongsheng@627
|
13138 "literal></quote>."
|
dongsheng@627
|
13139 msgstr ""
|
dongsheng@627
|
13140
|
dongsheng@627
|
13141 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13142 #: ../en/ch10-template.xml:347
|
dongsheng@627
|
13143 msgid ""
|
dongsheng@627
|
13144 "<literal role=\"template-kw-filt-date\">isodate</literal>: <literal role="
|
dongsheng@627
|
13145 "\"template-keyword\">date</literal> keyword. Render the date as a text "
|
dongsheng@627
|
13146 "string in ISO 8601 format. Yields a string like <quote><literal>2006-09-04 "
|
dongsheng@627
|
13147 "15:13:13 -0700</literal></quote>."
|
dongsheng@627
|
13148 msgstr ""
|
dongsheng@627
|
13149
|
dongsheng@627
|
13150 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13151 #: ../en/ch10-template.xml:354
|
dongsheng@627
|
13152 msgid ""
|
dongsheng@627
|
13153 "<literal role=\"template-filter\">obfuscate</literal>: Any text, but most "
|
dongsheng@627
|
13154 "useful for the <literal role=\"template-keyword\">author</literal> keyword. "
|
dongsheng@627
|
13155 "Yield the input text rendered as a sequence of XML entities. This helps to "
|
dongsheng@627
|
13156 "defeat some particularly stupid screen-scraping email harvesting spambots."
|
dongsheng@627
|
13157 msgstr ""
|
dongsheng@627
|
13158
|
dongsheng@627
|
13159 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13160 #: ../en/ch10-template.xml:362
|
dongsheng@627
|
13161 msgid ""
|
dongsheng@627
|
13162 "<literal role=\"template-kw-filt-author\">person</literal>: Any text, but "
|
dongsheng@627
|
13163 "most useful for the <literal role=\"template-keyword\">author</literal> "
|
dongsheng@627
|
13164 "keyword. Yield the text before an email address. For example, "
|
dongsheng@627
|
13165 "<quote><literal>Bryan O'Sullivan <bos@serpentine.com></literal></quote> "
|
dongsheng@627
|
13166 "becomes <quote><literal>Bryan O'Sullivan</literal></quote>."
|
dongsheng@627
|
13167 msgstr ""
|
dongsheng@627
|
13168
|
dongsheng@627
|
13169 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13170 #: ../en/ch10-template.xml:371
|
dongsheng@627
|
13171 msgid ""
|
dongsheng@627
|
13172 "<literal role=\"template-kw-filt-date\">rfc822date</literal>: <literal role="
|
dongsheng@627
|
13173 "\"template-keyword\">date</literal> keyword. Render a date using the same "
|
dongsheng@627
|
13174 "format used in email headers. Yields a string like <quote><literal>Mon, 04 "
|
dongsheng@627
|
13175 "Sep 2006 15:13:13 -0700</literal></quote>."
|
dongsheng@627
|
13176 msgstr ""
|
dongsheng@627
|
13177
|
dongsheng@627
|
13178 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13179 #: ../en/ch10-template.xml:378
|
dongsheng@627
|
13180 msgid ""
|
dongsheng@627
|
13181 "<literal role=\"template-kw-filt-node\">short</literal>: Changeset hash. "
|
dongsheng@627
|
13182 "Yield the short form of a changeset hash, i.e. a 12-character hexadecimal "
|
dongsheng@627
|
13183 "string."
|
dongsheng@627
|
13184 msgstr ""
|
dongsheng@627
|
13185
|
dongsheng@627
|
13186 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13187 #: ../en/ch10-template.xml:383
|
dongsheng@627
|
13188 msgid ""
|
dongsheng@627
|
13189 "<literal role=\"template-kw-filt-date\">shortdate</literal>: <literal role="
|
dongsheng@627
|
13190 "\"template-keyword\">date</literal> keyword. Render the year, month, and day "
|
dongsheng@627
|
13191 "of the date. Yields a string like <quote><literal>2006-09-04</literal></"
|
dongsheng@627
|
13192 "quote>."
|
dongsheng@627
|
13193 msgstr ""
|
dongsheng@627
|
13194
|
dongsheng@627
|
13195 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13196 #: ../en/ch10-template.xml:389
|
dongsheng@627
|
13197 msgid ""
|
dongsheng@627
|
13198 "<literal role=\"template-filter\">strip</literal>: Any text. Strip all "
|
dongsheng@627
|
13199 "leading and trailing whitespace from the string."
|
dongsheng@627
|
13200 msgstr ""
|
dongsheng@627
|
13201
|
dongsheng@627
|
13202 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13203 #: ../en/ch10-template.xml:393
|
dongsheng@627
|
13204 msgid ""
|
dongsheng@627
|
13205 "<literal role=\"template-filter\">tabindent</literal>: Any text. Yield the "
|
dongsheng@627
|
13206 "text, with every line except the first starting with a tab character."
|
dongsheng@627
|
13207 msgstr ""
|
dongsheng@627
|
13208
|
dongsheng@627
|
13209 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13210 #: ../en/ch10-template.xml:398
|
dongsheng@627
|
13211 msgid ""
|
dongsheng@627
|
13212 "<literal role=\"template-filter\">urlescape</literal>: Any text. Escape all "
|
dongsheng@627
|
13213 "characters that are considered <quote>special</quote> by URL parsers. For "
|
dongsheng@627
|
13214 "example, <literal>foo bar</literal> becomes <literal>foo%20bar</literal>."
|
dongsheng@627
|
13215 msgstr ""
|
dongsheng@627
|
13216
|
dongsheng@627
|
13217 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
13218 #: ../en/ch10-template.xml:405
|
dongsheng@627
|
13219 msgid ""
|
dongsheng@627
|
13220 "<literal role=\"template-kw-filt-author\">user</literal>: Any text, but most "
|
dongsheng@627
|
13221 "useful for the <literal role=\"template-keyword\">author</literal> keyword. "
|
dongsheng@627
|
13222 "Return the <quote>user</quote> portion of an email address. For example, "
|
dongsheng@627
|
13223 "<quote><literal>Bryan O'Sullivan <bos@serpentine.com></literal></quote> "
|
dongsheng@627
|
13224 "becomes <quote><literal>bos</literal></quote>."
|
dongsheng@627
|
13225 msgstr ""
|
dongsheng@627
|
13226
|
dongsheng@627
|
13227 #. type: Content of: <book><chapter><sect1><note><para>
|
dongsheng@650
|
13228 #: ../en/ch10-template.xml:418
|
dongsheng@627
|
13229 msgid ""
|
dongsheng@627
|
13230 "If you try to apply a filter to a piece of data that it cannot process, "
|
dongsheng@627
|
13231 "Mercurial will fail and print a Python exception. For example, trying to run "
|
dongsheng@627
|
13232 "the output of the <literal role=\"template-keyword\">desc</literal> keyword "
|
dongsheng@627
|
13233 "into the <literal role=\"template-kw-filt-date\">isodate</literal> filter is "
|
dongsheng@627
|
13234 "not a good idea."
|
dongsheng@627
|
13235 msgstr ""
|
dongsheng@627
|
13236
|
dongsheng@627
|
13237 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13238 #: ../en/ch10-template.xml:427
|
dongsheng@627
|
13239 msgid "Combining filters"
|
dongsheng@636
|
13240 msgstr "组合过滤器"
|
dongsheng@627
|
13241
|
dongsheng@627
|
13242 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13243 #: ../en/ch10-template.xml:429
|
dongsheng@627
|
13244 msgid ""
|
dongsheng@627
|
13245 "It is easy to combine filters to yield output in the form you would like. "
|
dongsheng@627
|
13246 "The following chain of filters tidies up a description, then makes sure that "
|
dongsheng@627
|
13247 "it fits cleanly into 68 columns, then indents it by a further 8 characters "
|
dongsheng@627
|
13248 "(at least on Unix-like systems, where a tab is conventionally 8 characters "
|
dongsheng@627
|
13249 "wide)."
|
dongsheng@627
|
13250 msgstr ""
|
dongsheng@627
|
13251
|
dongsheng@627
|
13252 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13253 #: ../en/ch10-template.xml:438
|
dongsheng@627
|
13254 msgid ""
|
dongsheng@627
|
13255 "Note the use of <quote><literal>\\t</literal></quote> (a tab character) in "
|
dongsheng@627
|
13256 "the template to force the first line to be indented; this is necessary since "
|
dongsheng@627
|
13257 "<literal role=\"template-keyword\">tabindent</literal> indents all lines "
|
dongsheng@627
|
13258 "<emphasis>except</emphasis> the first."
|
dongsheng@627
|
13259 msgstr ""
|
dongsheng@627
|
13260
|
dongsheng@627
|
13261 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13262 #: ../en/ch10-template.xml:444
|
dongsheng@627
|
13263 msgid ""
|
dongsheng@627
|
13264 "Keep in mind that the order of filters in a chain is significant. The first "
|
dongsheng@627
|
13265 "filter is applied to the result of the keyword; the second to the result of "
|
dongsheng@627
|
13266 "the first filter; and so on. For example, using <literal>fill68|tabindent</"
|
dongsheng@627
|
13267 "literal> gives very different results from <literal>tabindent|fill68</"
|
dongsheng@627
|
13268 "literal>."
|
dongsheng@627
|
13269 msgstr ""
|
dongsheng@627
|
13270
|
dongsheng@627
|
13271 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13272 #: ../en/ch10-template.xml:455
|
dongsheng@627
|
13273 msgid "From templates to styles"
|
dongsheng@636
|
13274 msgstr "从模版到样式"
|
dongsheng@627
|
13275
|
dongsheng@627
|
13276 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13277 #: ../en/ch10-template.xml:457
|
dongsheng@627
|
13278 msgid ""
|
dongsheng@627
|
13279 "A command line template provides a quick and simple way to format some "
|
dongsheng@627
|
13280 "output. Templates can become verbose, though, and it's useful to be able to "
|
dongsheng@627
|
13281 "give a template a name. A style file is a template with a name, stored in a "
|
dongsheng@627
|
13282 "file."
|
dongsheng@627
|
13283 msgstr ""
|
dongsheng@627
|
13284
|
dongsheng@627
|
13285 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13286 #: ../en/ch10-template.xml:462
|
dongsheng@627
|
13287 msgid ""
|
dongsheng@627
|
13288 "More than that, using a style file unlocks the power of Mercurial's "
|
dongsheng@627
|
13289 "templating engine in ways that are not possible using the command line "
|
dongsheng@627
|
13290 "<option role=\"hg-opt-log\">--template</option> option."
|
dongsheng@627
|
13291 msgstr ""
|
dongsheng@627
|
13292
|
dongsheng@627
|
13293 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13294 #: ../en/ch10-template.xml:468
|
dongsheng@627
|
13295 msgid "The simplest of style files"
|
dongsheng@636
|
13296 msgstr "最简单的样式文件"
|
dongsheng@627
|
13297
|
dongsheng@627
|
13298 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13299 #: ../en/ch10-template.xml:470
|
dongsheng@627
|
13300 msgid "Our simple style file contains just one line:"
|
dongsheng@627
|
13301 msgstr ""
|
dongsheng@627
|
13302
|
dongsheng@627
|
13303 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13304 #: ../en/ch10-template.xml:474
|
dongsheng@627
|
13305 msgid ""
|
dongsheng@627
|
13306 "This tells Mercurial, <quote>if you're printing a changeset, use the text on "
|
dongsheng@627
|
13307 "the right as the template</quote>."
|
dongsheng@627
|
13308 msgstr ""
|
dongsheng@627
|
13309
|
dongsheng@627
|
13310 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13311 #: ../en/ch10-template.xml:480
|
dongsheng@627
|
13312 msgid "Style file syntax"
|
dongsheng@636
|
13313 msgstr "样式文件语法"
|
dongsheng@627
|
13314
|
dongsheng@627
|
13315 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13316 #: ../en/ch10-template.xml:482
|
dongsheng@627
|
13317 msgid "The syntax rules for a style file are simple."
|
dongsheng@627
|
13318 msgstr ""
|
dongsheng@627
|
13319
|
dongsheng@627
|
13320 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13321 #: ../en/ch10-template.xml:485
|
dongsheng@627
|
13322 msgid "The file is processed one line at a time."
|
dongsheng@627
|
13323 msgstr ""
|
dongsheng@627
|
13324
|
dongsheng@627
|
13325 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13326 #: ../en/ch10-template.xml:488
|
dongsheng@627
|
13327 msgid "Leading and trailing white space are ignored."
|
dongsheng@627
|
13328 msgstr ""
|
dongsheng@627
|
13329
|
dongsheng@627
|
13330 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13331 #: ../en/ch10-template.xml:491
|
dongsheng@627
|
13332 msgid "Empty lines are skipped."
|
dongsheng@627
|
13333 msgstr ""
|
dongsheng@627
|
13334
|
dongsheng@627
|
13335 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13336 #: ../en/ch10-template.xml:493
|
dongsheng@627
|
13337 msgid ""
|
dongsheng@627
|
13338 "If a line starts with either of the characters <quote><literal>#</literal></"
|
dongsheng@627
|
13339 "quote> or <quote><literal>;</literal></quote>, the entire line is treated as "
|
dongsheng@627
|
13340 "a comment, and skipped as if empty."
|
dongsheng@627
|
13341 msgstr ""
|
dongsheng@627
|
13342
|
dongsheng@627
|
13343 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13344 #: ../en/ch10-template.xml:498
|
dongsheng@627
|
13345 msgid ""
|
dongsheng@627
|
13346 "A line starts with a keyword. This must start with an alphabetic character "
|
dongsheng@627
|
13347 "or underscore, and can subsequently contain any alphanumeric character or "
|
dongsheng@627
|
13348 "underscore. (In regexp notation, a keyword must match <literal>[A-Za-z_][A-"
|
dongsheng@627
|
13349 "Za-z0-9_]*</literal>.)"
|
dongsheng@627
|
13350 msgstr ""
|
dongsheng@627
|
13351
|
dongsheng@627
|
13352 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13353 #: ../en/ch10-template.xml:504
|
dongsheng@627
|
13354 msgid ""
|
dongsheng@627
|
13355 "The next element must be an <quote><literal>=</literal></quote> character, "
|
dongsheng@627
|
13356 "which can be preceded or followed by an arbitrary amount of white space."
|
dongsheng@627
|
13357 msgstr ""
|
dongsheng@627
|
13358
|
dongsheng@627
|
13359 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13360 #: ../en/ch10-template.xml:509
|
dongsheng@627
|
13361 msgid ""
|
dongsheng@627
|
13362 "If the rest of the line starts and ends with matching quote characters "
|
dongsheng@627
|
13363 "(either single or double quote), it is treated as a template body."
|
dongsheng@627
|
13364 msgstr ""
|
dongsheng@627
|
13365
|
dongsheng@627
|
13366 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13367 #: ../en/ch10-template.xml:513
|
dongsheng@627
|
13368 msgid ""
|
dongsheng@627
|
13369 "If the rest of the line <emphasis>does not</emphasis> start with a quote "
|
dongsheng@627
|
13370 "character, it is treated as the name of a file; the contents of this file "
|
dongsheng@627
|
13371 "will be read and used as a template body."
|
dongsheng@627
|
13372 msgstr ""
|
dongsheng@627
|
13373
|
dongsheng@627
|
13374 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13375 #: ../en/ch10-template.xml:522
|
dongsheng@627
|
13376 msgid "Style files by example"
|
dongsheng@636
|
13377 msgstr "样式文件例子"
|
dongsheng@627
|
13378
|
dongsheng@627
|
13379 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13380 #: ../en/ch10-template.xml:524
|
dongsheng@627
|
13381 msgid ""
|
dongsheng@627
|
13382 "To illustrate how to write a style file, we will construct a few by example. "
|
dongsheng@627
|
13383 "Rather than provide a complete style file and walk through it, we'll mirror "
|
dongsheng@627
|
13384 "the usual process of developing a style file by starting with something very "
|
dongsheng@627
|
13385 "simple, and walking through a series of successively more complete examples."
|
dongsheng@627
|
13386 msgstr ""
|
dongsheng@627
|
13387
|
dongsheng@627
|
13388 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13389 #: ../en/ch10-template.xml:531
|
dongsheng@627
|
13390 msgid "Identifying mistakes in style files"
|
dongsheng@636
|
13391 msgstr "在样式文件中定位错误"
|
dongsheng@627
|
13392
|
dongsheng@627
|
13393 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13394 #: ../en/ch10-template.xml:533
|
dongsheng@627
|
13395 msgid ""
|
dongsheng@627
|
13396 "If Mercurial encounters a problem in a style file you are working on, it "
|
dongsheng@627
|
13397 "prints a terse error message that, once you figure out what it means, is "
|
dongsheng@627
|
13398 "actually quite useful."
|
dongsheng@627
|
13399 msgstr ""
|
dongsheng@627
|
13400
|
dongsheng@627
|
13401 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13402 #: ../en/ch10-template.xml:539
|
dongsheng@627
|
13403 msgid ""
|
dongsheng@627
|
13404 "Notice that <filename>broken.style</filename> attempts to define a "
|
dongsheng@627
|
13405 "<literal>changeset</literal> keyword, but forgets to give any content for it. "
|
dongsheng@627
|
13406 "When instructed to use this style file, Mercurial promptly complains."
|
dongsheng@627
|
13407 msgstr ""
|
dongsheng@627
|
13408
|
dongsheng@627
|
13409 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13410 #: ../en/ch10-template.xml:546
|
dongsheng@627
|
13411 msgid "This error message looks intimidating, but it is not too hard to follow."
|
dongsheng@627
|
13412 msgstr ""
|
dongsheng@627
|
13413
|
dongsheng@627
|
13414 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13415 #: ../en/ch10-template.xml:550
|
dongsheng@627
|
13416 msgid ""
|
dongsheng@627
|
13417 "The first component is simply Mercurial's way of saying <quote>I am giving "
|
dongsheng@627
|
13418 "up</quote>."
|
dongsheng@627
|
13419 msgstr ""
|
dongsheng@627
|
13420
|
dongsheng@627
|
13421 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13422 #: ../en/ch10-template.xml:554
|
dongsheng@627
|
13423 msgid "Next comes the name of the style file that contains the error."
|
dongsheng@627
|
13424 msgstr ""
|
dongsheng@627
|
13425
|
dongsheng@627
|
13426 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13427 #: ../en/ch10-template.xml:558
|
dongsheng@627
|
13428 msgid ""
|
dongsheng@627
|
13429 "Following the file name is the line number where the error was encountered."
|
dongsheng@627
|
13430 msgstr ""
|
dongsheng@627
|
13431
|
dongsheng@627
|
13432 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13433 #: ../en/ch10-template.xml:562
|
dongsheng@627
|
13434 msgid "Finally, a description of what went wrong."
|
dongsheng@627
|
13435 msgstr ""
|
dongsheng@627
|
13436
|
dongsheng@627
|
13437 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13438 #: ../en/ch10-template.xml:566
|
dongsheng@627
|
13439 msgid ""
|
dongsheng@627
|
13440 "The description of the problem is not always clear (as in this case), but "
|
dongsheng@627
|
13441 "even when it is cryptic, it is almost always trivial to visually inspect the "
|
dongsheng@627
|
13442 "offending line in the style file and see what is wrong."
|
dongsheng@627
|
13443 msgstr ""
|
dongsheng@627
|
13444
|
dongsheng@627
|
13445 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13446 #: ../en/ch10-template.xml:574
|
dongsheng@627
|
13447 msgid "Uniquely identifying a repository"
|
dongsheng@636
|
13448 msgstr "版本库的唯一标识"
|
dongsheng@627
|
13449
|
dongsheng@627
|
13450 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13451 #: ../en/ch10-template.xml:576
|
dongsheng@627
|
13452 msgid ""
|
dongsheng@627
|
13453 "If you would like to be able to identify a Mercurial repository <quote>fairly "
|
dongsheng@627
|
13454 "uniquely</quote> using a short string as an identifier, you can use the first "
|
dongsheng@627
|
13455 "revision in the repository."
|
dongsheng@627
|
13456 msgstr ""
|
dongsheng@627
|
13457
|
dongsheng@627
|
13458 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13459 #: ../en/ch10-template.xml:583
|
dongsheng@627
|
13460 msgid ""
|
dongsheng@627
|
13461 "This is not guaranteed to be unique, but it is nevertheless useful in many "
|
dongsheng@627
|
13462 "cases."
|
dongsheng@627
|
13463 msgstr ""
|
dongsheng@627
|
13464
|
dongsheng@627
|
13465 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13466 #: ../en/ch10-template.xml:586
|
dongsheng@627
|
13467 msgid ""
|
dongsheng@627
|
13468 "It will not work in a completely empty repository, because such a repository "
|
dongsheng@627
|
13469 "does not have a revision zero."
|
dongsheng@627
|
13470 msgstr ""
|
dongsheng@627
|
13471
|
dongsheng@627
|
13472 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13473 #: ../en/ch10-template.xml:590
|
dongsheng@627
|
13474 msgid ""
|
dongsheng@627
|
13475 "Neither will it work in the (extremely rare) case where a repository is a "
|
dongsheng@627
|
13476 "merge of two or more formerly independent repositories, and you still have "
|
dongsheng@627
|
13477 "those repositories around."
|
dongsheng@627
|
13478 msgstr ""
|
dongsheng@627
|
13479
|
dongsheng@627
|
13480 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13481 #: ../en/ch10-template.xml:595
|
dongsheng@627
|
13482 msgid "Here are some uses to which you could put this identifier:"
|
dongsheng@627
|
13483 msgstr ""
|
dongsheng@627
|
13484
|
dongsheng@627
|
13485 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13486 #: ../en/ch10-template.xml:598
|
dongsheng@627
|
13487 msgid ""
|
dongsheng@627
|
13488 "As a key into a table for a database that manages repositories on a server."
|
dongsheng@627
|
13489 msgstr ""
|
dongsheng@627
|
13490
|
dongsheng@627
|
13491 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13492 #: ../en/ch10-template.xml:601
|
dongsheng@627
|
13493 msgid ""
|
dongsheng@627
|
13494 "As half of a {<emphasis>repository ID</emphasis>, <emphasis>revision ID</"
|
dongsheng@627
|
13495 "emphasis>} tuple. Save this information away when you run an automated build "
|
dongsheng@627
|
13496 "or other activity, so that you can <quote>replay</quote> the build later if "
|
dongsheng@627
|
13497 "necessary."
|
dongsheng@627
|
13498 msgstr ""
|
dongsheng@627
|
13499
|
dongsheng@627
|
13500 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13501 #: ../en/ch10-template.xml:610
|
dongsheng@627
|
13502 msgid "Mimicking Subversion's output"
|
dongsheng@636
|
13503 msgstr "模仿 Subversion 的输出"
|
dongsheng@627
|
13504
|
dongsheng@627
|
13505 #
|
dongsheng@627
|
13506 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13507 #: ../en/ch10-template.xml:612
|
dongsheng@627
|
13508 msgid ""
|
dongsheng@627
|
13509 "Let's try to emulate the default output format used by another revision "
|
dongsheng@627
|
13510 "control tool, Subversion."
|
dongsheng@627
|
13511 msgstr ""
|
dongsheng@627
|
13512
|
dongsheng@627
|
13513 #
|
dongsheng@627
|
13514 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13515 #: ../en/ch10-template.xml:617
|
dongsheng@627
|
13516 msgid ""
|
dongsheng@627
|
13517 "Since Subversion's output style is fairly simple, it is easy to copy-and-"
|
dongsheng@627
|
13518 "paste a hunk of its output into a file, and replace the text produced above "
|
dongsheng@627
|
13519 "by Subversion with the template values we'd like to see expanded."
|
dongsheng@627
|
13520 msgstr ""
|
dongsheng@627
|
13521
|
dongsheng@627
|
13522 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13523 #: ../en/ch10-template.xml:624
|
dongsheng@627
|
13524 msgid ""
|
dongsheng@627
|
13525 "There are a few small ways in which this template deviates from the output "
|
dongsheng@627
|
13526 "produced by Subversion."
|
dongsheng@627
|
13527 msgstr ""
|
dongsheng@627
|
13528
|
dongsheng@627
|
13529 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13530 #: ../en/ch10-template.xml:627
|
dongsheng@627
|
13531 msgid ""
|
dongsheng@627
|
13532 "Subversion prints a <quote>readable</quote> date (the <quote><literal>Wed, 27 "
|
dongsheng@627
|
13533 "Sep 2006</literal></quote> in the example output above) in parentheses. "
|
dongsheng@627
|
13534 "Mercurial's templating engine does not provide a way to display a date in "
|
dongsheng@627
|
13535 "this format without also printing the time and time zone."
|
dongsheng@627
|
13536 msgstr ""
|
dongsheng@627
|
13537
|
dongsheng@627
|
13538 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13539 #: ../en/ch10-template.xml:634
|
dongsheng@627
|
13540 msgid ""
|
dongsheng@627
|
13541 "We emulate Subversion's printing of <quote>separator</quote> lines full of "
|
dongsheng@627
|
13542 "<quote><literal>-</literal></quote> characters by ending the template with "
|
dongsheng@627
|
13543 "such a line. We use the templating engine's <literal role=\"template-keyword"
|
dongsheng@627
|
13544 "\">header</literal> keyword to print a separator line as the first line of "
|
dongsheng@627
|
13545 "output (see below), thus achieving similar output to Subversion."
|
dongsheng@627
|
13546 msgstr ""
|
dongsheng@627
|
13547
|
dongsheng@627
|
13548 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
13549 #: ../en/ch10-template.xml:643
|
dongsheng@627
|
13550 msgid ""
|
dongsheng@627
|
13551 "Subversion's output includes a count in the header of the number of lines in "
|
dongsheng@627
|
13552 "the commit message. We cannot replicate this in Mercurial; the templating "
|
dongsheng@627
|
13553 "engine does not currently provide a filter that counts the number of lines "
|
dongsheng@627
|
13554 "the template generates."
|
dongsheng@627
|
13555 msgstr ""
|
dongsheng@627
|
13556
|
dongsheng@627
|
13557 #
|
dongsheng@627
|
13558 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13559 #: ../en/ch10-template.xml:649
|
dongsheng@627
|
13560 msgid ""
|
dongsheng@627
|
13561 "It took me no more than a minute or two of work to replace literal text from "
|
dongsheng@627
|
13562 "an example of Subversion's output with some keywords and filters to give the "
|
dongsheng@627
|
13563 "template above. The style file simply refers to the template."
|
dongsheng@627
|
13564 msgstr ""
|
dongsheng@627
|
13565
|
dongsheng@627
|
13566 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13567 #: ../en/ch10-template.xml:656
|
dongsheng@627
|
13568 msgid ""
|
dongsheng@627
|
13569 "We could have included the text of the template file directly in the style "
|
dongsheng@627
|
13570 "file by enclosing it in quotes and replacing the newlines with "
|
dongsheng@627
|
13571 "<quote><literal>\\n</literal></quote> sequences, but it would have made the "
|
dongsheng@627
|
13572 "style file too difficult to read. Readability is a good guide when you're "
|
dongsheng@627
|
13573 "trying to decide whether some text belongs in a style file, or in a template "
|
dongsheng@627
|
13574 "file that the style file points to. If the style file will look too big or "
|
dongsheng@627
|
13575 "cluttered if you insert a literal piece of text, drop it into a template "
|
dongsheng@627
|
13576 "instead."
|
dongsheng@627
|
13577 msgstr ""
|
dongsheng@627
|
13578
|
dongsheng@627
|
13579 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
13580 #: ../en/ch11-mq.xml:5
|
dongsheng@627
|
13581 msgid "Managing change with Mercurial Queues"
|
dongsheng@627
|
13582 msgstr "使用 MQ 管理修改"
|
dongsheng@627
|
13583
|
dongsheng@627
|
13584 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13585 #: ../en/ch11-mq.xml:8
|
dongsheng@627
|
13586 msgid "The patch management problem"
|
dongsheng@636
|
13587 msgstr "补丁的管理问题"
|
dongsheng@627
|
13588
|
dongsheng@627
|
13589 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13590 #: ../en/ch11-mq.xml:10
|
dongsheng@627
|
13591 msgid ""
|
dongsheng@627
|
13592 "Here is a common scenario: you need to install a software package from "
|
dongsheng@627
|
13593 "source, but you find a bug that you must fix in the source before you can "
|
dongsheng@627
|
13594 "start using the package. You make your changes, forget about the package for "
|
dongsheng@627
|
13595 "a while, and a few months later you need to upgrade to a newer version of the "
|
dongsheng@627
|
13596 "package. If the newer version of the package still has the bug, you must "
|
dongsheng@627
|
13597 "extract your fix from the older source tree and apply it against the newer "
|
dongsheng@627
|
13598 "version. This is a tedious task, and it's easy to make mistakes."
|
dongsheng@627
|
13599 msgstr ""
|
dongsheng@627
|
13600
|
dongsheng@627
|
13601 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13602 #: ../en/ch11-mq.xml:20
|
dongsheng@627
|
13603 msgid ""
|
dongsheng@627
|
13604 "This is a simple case of the <quote>patch management</quote> problem. You "
|
dongsheng@627
|
13605 "have an <quote>upstream</quote> source tree that you can't change; you need "
|
dongsheng@627
|
13606 "to make some local changes on top of the upstream tree; and you'd like to be "
|
dongsheng@627
|
13607 "able to keep those changes separate, so that you can apply them to newer "
|
dongsheng@627
|
13608 "versions of the upstream source."
|
dongsheng@627
|
13609 msgstr ""
|
dongsheng@627
|
13610
|
dongsheng@627
|
13611 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13612 #: ../en/ch11-mq.xml:27
|
dongsheng@627
|
13613 msgid ""
|
dongsheng@627
|
13614 "The patch management problem arises in many situations. Probably the most "
|
dongsheng@627
|
13615 "visible is that a user of an open source software project will contribute a "
|
dongsheng@627
|
13616 "bug fix or new feature to the project's maintainers in the form of a patch."
|
dongsheng@627
|
13617 msgstr ""
|
dongsheng@627
|
13618
|
dongsheng@627
|
13619 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13620 #: ../en/ch11-mq.xml:32
|
dongsheng@627
|
13621 msgid ""
|
dongsheng@627
|
13622 "Distributors of operating systems that include open source software often "
|
dongsheng@627
|
13623 "need to make changes to the packages they distribute so that they will build "
|
dongsheng@627
|
13624 "properly in their environments."
|
dongsheng@627
|
13625 msgstr ""
|
dongsheng@627
|
13626
|
dongsheng@627
|
13627 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13628 #: ../en/ch11-mq.xml:37
|
dongsheng@627
|
13629 msgid ""
|
dongsheng@627
|
13630 "When you have few changes to maintain, it is easy to manage a single patch "
|
dongsheng@627
|
13631 "using the standard <command>diff</command> and <command>patch</command> "
|
dongsheng@627
|
13632 "programs (see section <xref linkend=\"sec.mq.patch\"/> for a discussion of "
|
dongsheng@627
|
13633 "these tools). Once the number of changes grows, it starts to make sense to "
|
dongsheng@627
|
13634 "maintain patches as discrete <quote>chunks of work,</quote> so that for "
|
dongsheng@627
|
13635 "example a single patch will contain only one bug fix (the patch might modify "
|
dongsheng@627
|
13636 "several files, but it's doing <quote>only one thing</quote>), and you may "
|
dongsheng@627
|
13637 "have a number of such patches for different bugs you need fixed and local "
|
dongsheng@627
|
13638 "changes you require. In this situation, if you submit a bug fix patch to the "
|
dongsheng@627
|
13639 "upstream maintainers of a package and they include your fix in a subsequent "
|
dongsheng@627
|
13640 "release, you can simply drop that single patch when you're updating to the "
|
dongsheng@627
|
13641 "newer release."
|
dongsheng@627
|
13642 msgstr ""
|
dongsheng@627
|
13643
|
dongsheng@627
|
13644 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13645 #: ../en/ch11-mq.xml:52
|
dongsheng@627
|
13646 msgid ""
|
dongsheng@627
|
13647 "Maintaining a single patch against an upstream tree is a little tedious and "
|
dongsheng@627
|
13648 "error-prone, but not difficult. However, the complexity of the problem grows "
|
dongsheng@627
|
13649 "rapidly as the number of patches you have to maintain increases. With more "
|
dongsheng@627
|
13650 "than a tiny number of patches in hand, understanding which ones you have "
|
dongsheng@627
|
13651 "applied and maintaining them moves from messy to overwhelming."
|
dongsheng@627
|
13652 msgstr ""
|
dongsheng@627
|
13653
|
dongsheng@627
|
13654 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13655 #: ../en/ch11-mq.xml:59
|
dongsheng@627
|
13656 msgid ""
|
dongsheng@627
|
13657 "Fortunately, Mercurial includes a powerful extension, Mercurial Queues (or "
|
dongsheng@627
|
13658 "simply <quote>MQ</quote>), that massively simplifies the patch management "
|
dongsheng@627
|
13659 "problem."
|
dongsheng@627
|
13660 msgstr ""
|
dongsheng@627
|
13661
|
dongsheng@627
|
13662 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13663 #: ../en/ch11-mq.xml:65
|
dongsheng@627
|
13664 msgid "The prehistory of Mercurial Queues"
|
dongsheng@636
|
13665 msgstr "MQ 的历史"
|
dongsheng@627
|
13666
|
dongsheng@627
|
13667 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13668 #: ../en/ch11-mq.xml:67
|
dongsheng@627
|
13669 msgid ""
|
dongsheng@627
|
13670 "During the late 1990s, several Linux kernel developers started to maintain "
|
dongsheng@627
|
13671 "<quote>patch series</quote> that modified the behaviour of the Linux kernel. "
|
dongsheng@627
|
13672 "Some of these series were focused on stability, some on feature coverage, and "
|
dongsheng@627
|
13673 "others were more speculative."
|
dongsheng@627
|
13674 msgstr ""
|
dongsheng@627
|
13675
|
dongsheng@627
|
13676 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13677 #: ../en/ch11-mq.xml:73
|
dongsheng@627
|
13678 msgid ""
|
dongsheng@627
|
13679 "The sizes of these patch series grew rapidly. In 2002, Andrew Morton "
|
dongsheng@627
|
13680 "published some shell scripts he had been using to automate the task of "
|
dongsheng@627
|
13681 "managing his patch queues. Andrew was successfully using these scripts to "
|
dongsheng@627
|
13682 "manage hundreds (sometimes thousands) of patches on top of the Linux kernel."
|
dongsheng@627
|
13683 msgstr ""
|
dongsheng@627
|
13684
|
dongsheng@627
|
13685 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13686 #: ../en/ch11-mq.xml:80
|
dongsheng@627
|
13687 msgid "A patchwork quilt"
|
dongsheng@627
|
13688 msgstr ""
|
dongsheng@627
|
13689
|
dongsheng@627
|
13690 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13691 #: ../en/ch11-mq.xml:82
|
dongsheng@627
|
13692 msgid ""
|
dongsheng@627
|
13693 "In early 2003, Andreas Gruenbacher and Martin Quinson borrowed the approach "
|
dongsheng@627
|
13694 "of Andrew's scripts and published a tool called <quote>patchwork quilt</"
|
dongsheng@627
|
13695 "quote> <citation>web:quilt</citation>, or simply <quote>quilt</quote> (see "
|
dongsheng@627
|
13696 "<citation>gruenbacher:2005</citation> for a paper describing it). Because "
|
dongsheng@627
|
13697 "quilt substantially automated patch management, it rapidly gained a large "
|
dongsheng@627
|
13698 "following among open source software developers."
|
dongsheng@627
|
13699 msgstr ""
|
dongsheng@627
|
13700
|
dongsheng@627
|
13701 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13702 #: ../en/ch11-mq.xml:91
|
dongsheng@627
|
13703 msgid ""
|
dongsheng@627
|
13704 "Quilt manages a <emphasis>stack of patches</emphasis> on top of a directory "
|
dongsheng@627
|
13705 "tree. To begin, you tell quilt to manage a directory tree, and tell it which "
|
dongsheng@627
|
13706 "files you want to manage; it stores away the names and contents of those "
|
dongsheng@627
|
13707 "files. To fix a bug, you create a new patch (using a single command), edit "
|
dongsheng@627
|
13708 "the files you need to fix, then <quote>refresh</quote> the patch."
|
dongsheng@627
|
13709 msgstr ""
|
dongsheng@627
|
13710
|
dongsheng@627
|
13711 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13712 #: ../en/ch11-mq.xml:99
|
dongsheng@627
|
13713 msgid ""
|
dongsheng@627
|
13714 "The refresh step causes quilt to scan the directory tree; it updates the "
|
dongsheng@627
|
13715 "patch with all of the changes you have made. You can create another patch on "
|
dongsheng@627
|
13716 "top of the first, which will track the changes required to modify the tree "
|
dongsheng@627
|
13717 "from <quote>tree with one patch applied</quote> to <quote>tree with two "
|
dongsheng@627
|
13718 "patches applied</quote>."
|
dongsheng@627
|
13719 msgstr ""
|
dongsheng@627
|
13720
|
dongsheng@627
|
13721 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13722 #: ../en/ch11-mq.xml:106
|
dongsheng@627
|
13723 msgid ""
|
dongsheng@627
|
13724 "You can <emphasis>change</emphasis> which patches are applied to the tree. "
|
dongsheng@627
|
13725 "If you <quote>pop</quote> a patch, the changes made by that patch will vanish "
|
dongsheng@627
|
13726 "from the directory tree. Quilt remembers which patches you have popped, "
|
dongsheng@627
|
13727 "though, so you can <quote>push</quote> a popped patch again, and the "
|
dongsheng@627
|
13728 "directory tree will be restored to contain the modifications in the patch. "
|
dongsheng@627
|
13729 "Most importantly, you can run the <quote>refresh</quote> command at any time, "
|
dongsheng@627
|
13730 "and the topmost applied patch will be updated. This means that you can, at "
|
dongsheng@627
|
13731 "any time, change both which patches are applied and what modifications those "
|
dongsheng@627
|
13732 "patches make."
|
dongsheng@627
|
13733 msgstr ""
|
dongsheng@627
|
13734
|
dongsheng@627
|
13735 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13736 #: ../en/ch11-mq.xml:118
|
dongsheng@627
|
13737 msgid ""
|
dongsheng@627
|
13738 "Quilt knows nothing about revision control tools, so it works equally well on "
|
dongsheng@627
|
13739 "top of an unpacked tarball or a Subversion working copy."
|
dongsheng@627
|
13740 msgstr ""
|
dongsheng@627
|
13741
|
dongsheng@627
|
13742 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13743 #: ../en/ch11-mq.xml:124
|
dongsheng@627
|
13744 msgid "From patchwork quilt to Mercurial Queues"
|
dongsheng@636
|
13745 msgstr "从 patchwork quilt 到 MQ"
|
dongsheng@627
|
13746
|
dongsheng@627
|
13747 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13748 #: ../en/ch11-mq.xml:126
|
dongsheng@627
|
13749 msgid ""
|
dongsheng@627
|
13750 "In mid-2005, Chris Mason took the features of quilt and wrote an extension "
|
dongsheng@627
|
13751 "that he called Mercurial Queues, which added quilt-like behaviour to "
|
dongsheng@627
|
13752 "Mercurial."
|
dongsheng@627
|
13753 msgstr ""
|
dongsheng@627
|
13754
|
dongsheng@627
|
13755 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13756 #: ../en/ch11-mq.xml:130
|
dongsheng@627
|
13757 msgid ""
|
dongsheng@627
|
13758 "The key difference between quilt and MQ is that quilt knows nothing about "
|
dongsheng@627
|
13759 "revision control systems, while MQ is <emphasis>integrated</emphasis> into "
|
dongsheng@627
|
13760 "Mercurial. Each patch that you push is represented as a Mercurial "
|
dongsheng@627
|
13761 "changeset. Pop a patch, and the changeset goes away."
|
dongsheng@627
|
13762 msgstr ""
|
dongsheng@627
|
13763
|
dongsheng@627
|
13764 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13765 #: ../en/ch11-mq.xml:136
|
dongsheng@627
|
13766 msgid ""
|
dongsheng@627
|
13767 "Because quilt does not care about revision control tools, it is still a "
|
dongsheng@627
|
13768 "tremendously useful piece of software to know about for situations where you "
|
dongsheng@627
|
13769 "cannot use Mercurial and MQ."
|
dongsheng@627
|
13770 msgstr ""
|
dongsheng@627
|
13771
|
dongsheng@627
|
13772 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13773 #: ../en/ch11-mq.xml:144
|
dongsheng@627
|
13774 msgid "The huge advantage of MQ"
|
dongsheng@636
|
13775 msgstr "MQ 的巨大优势"
|
dongsheng@627
|
13776
|
dongsheng@627
|
13777 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13778 #: ../en/ch11-mq.xml:146
|
dongsheng@627
|
13779 msgid ""
|
dongsheng@627
|
13780 "I cannot overstate the value that MQ offers through the unification of "
|
dongsheng@627
|
13781 "patches and revision control."
|
dongsheng@627
|
13782 msgstr ""
|
dongsheng@627
|
13783
|
dongsheng@627
|
13784 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13785 #: ../en/ch11-mq.xml:149
|
dongsheng@627
|
13786 msgid ""
|
dongsheng@627
|
13787 "A major reason that patches have persisted in the free software and open "
|
dongsheng@627
|
13788 "source world&emdash;in spite of the availability of increasingly capable "
|
dongsheng@627
|
13789 "revision control tools over the years&emdash;is the <emphasis>agility</"
|
dongsheng@627
|
13790 "emphasis> they offer."
|
dongsheng@627
|
13791 msgstr ""
|
dongsheng@627
|
13792
|
dongsheng@627
|
13793 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13794 #: ../en/ch11-mq.xml:155
|
dongsheng@627
|
13795 msgid ""
|
dongsheng@627
|
13796 "Traditional revision control tools make a permanent, irreversible record of "
|
dongsheng@627
|
13797 "everything that you do. While this has great value, it's also somewhat "
|
dongsheng@627
|
13798 "stifling. If you want to perform a wild-eyed experiment, you have to be "
|
dongsheng@627
|
13799 "careful in how you go about it, or you risk leaving unneeded&emdash;or worse, "
|
dongsheng@627
|
13800 "misleading or destabilising&emdash;traces of your missteps and errors in the "
|
dongsheng@627
|
13801 "permanent revision record."
|
dongsheng@627
|
13802 msgstr ""
|
dongsheng@627
|
13803
|
dongsheng@627
|
13804 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13805 #: ../en/ch11-mq.xml:163
|
dongsheng@627
|
13806 msgid ""
|
dongsheng@627
|
13807 "By contrast, MQ's marriage of distributed revision control with patches makes "
|
dongsheng@627
|
13808 "it much easier to isolate your work. Your patches live on top of normal "
|
dongsheng@627
|
13809 "revision history, and you can make them disappear or reappear at will. If "
|
dongsheng@627
|
13810 "you don't like a patch, you can drop it. If a patch isn't quite as you want "
|
dongsheng@627
|
13811 "it to be, simply fix it&emdash;as many times as you need to, until you have "
|
dongsheng@627
|
13812 "refined it into the form you desire."
|
dongsheng@627
|
13813 msgstr ""
|
dongsheng@627
|
13814
|
dongsheng@627
|
13815 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13816 #: ../en/ch11-mq.xml:171
|
dongsheng@627
|
13817 msgid ""
|
dongsheng@627
|
13818 "As an example, the integration of patches with revision control makes "
|
dongsheng@627
|
13819 "understanding patches and debugging their effects&emdash;and their interplay "
|
dongsheng@627
|
13820 "with the code they're based on&emdash;<emphasis>enormously</emphasis> easier. "
|
dongsheng@627
|
13821 "Since every applied patch has an associated changeset, you can give <command "
|
dongsheng@627
|
13822 "role=\"hg-cmd\">hg log</command> a file name to see which changesets and "
|
dongsheng@627
|
13823 "patches affected the file. You can use the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
13824 "bisect</command> command to binary-search through all changesets and applied "
|
dongsheng@627
|
13825 "patches to see where a bug got introduced or fixed. You can use the <command "
|
dongsheng@627
|
13826 "role=\"hg-cmd\">hg annotate</command> command to see which changeset or patch "
|
dongsheng@627
|
13827 "modified a particular line of a source file. And so on."
|
dongsheng@627
|
13828 msgstr ""
|
dongsheng@627
|
13829
|
dongsheng@627
|
13830 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13831 #: ../en/ch11-mq.xml:187
|
dongsheng@627
|
13832 msgid "Understanding patches"
|
dongsheng@636
|
13833 msgstr "理解补丁"
|
dongsheng@627
|
13834
|
dongsheng@627
|
13835 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13836 #: ../en/ch11-mq.xml:189
|
dongsheng@627
|
13837 msgid ""
|
dongsheng@627
|
13838 "Because MQ doesn't hide its patch-oriented nature, it is helpful to "
|
dongsheng@627
|
13839 "understand what patches are, and a little about the tools that work with them."
|
dongsheng@627
|
13840 msgstr ""
|
dongsheng@627
|
13841
|
dongsheng@627
|
13842 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13843 #: ../en/ch11-mq.xml:193
|
dongsheng@627
|
13844 msgid ""
|
dongsheng@627
|
13845 "The traditional Unix <command>diff</command> command compares two files, and "
|
dongsheng@627
|
13846 "prints a list of differences between them. The <command>patch</command> "
|
dongsheng@627
|
13847 "command understands these differences as <emphasis>modifications</emphasis> "
|
dongsheng@627
|
13848 "to make to a file. Take a look below for a simple example of these commands "
|
dongsheng@627
|
13849 "in action."
|
dongsheng@627
|
13850 msgstr ""
|
dongsheng@627
|
13851
|
dongsheng@627
|
13852 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13853 #: ../en/ch11-mq.xml:202
|
dongsheng@627
|
13854 msgid ""
|
dongsheng@627
|
13855 "The type of file that <command>diff</command> generates (and <command>patch</"
|
dongsheng@627
|
13856 "command> takes as input) is called a <quote>patch</quote> or a <quote>diff</"
|
dongsheng@627
|
13857 "quote>; there is no difference between a patch and a diff. (We'll use the "
|
dongsheng@627
|
13858 "term <quote>patch</quote>, since it's more commonly used.)"
|
dongsheng@627
|
13859 msgstr ""
|
dongsheng@627
|
13860
|
dongsheng@627
|
13861 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13862 #: ../en/ch11-mq.xml:208
|
dongsheng@627
|
13863 msgid ""
|
dongsheng@627
|
13864 "A patch file can start with arbitrary text; the <command>patch</command> "
|
dongsheng@627
|
13865 "command ignores this text, but MQ uses it as the commit message when creating "
|
dongsheng@627
|
13866 "changesets. To find the beginning of the patch content, <command>patch</"
|
dongsheng@627
|
13867 "command> searches for the first line that starts with the string "
|
dongsheng@627
|
13868 "<quote><literal>diff -</literal></quote>."
|
dongsheng@627
|
13869 msgstr ""
|
dongsheng@627
|
13870
|
dongsheng@627
|
13871 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13872 #: ../en/ch11-mq.xml:215
|
dongsheng@627
|
13873 msgid ""
|
dongsheng@627
|
13874 "MQ works with <emphasis>unified</emphasis> diffs (<command>patch</command> "
|
dongsheng@627
|
13875 "can accept several other diff formats, but MQ doesn't). A unified diff "
|
dongsheng@627
|
13876 "contains two kinds of header. The <emphasis>file header</emphasis> describes "
|
dongsheng@627
|
13877 "the file being modified; it contains the name of the file to modify. When "
|
dongsheng@627
|
13878 "<command>patch</command> sees a new file header, it looks for a file with "
|
dongsheng@627
|
13879 "that name to start modifying."
|
dongsheng@627
|
13880 msgstr ""
|
dongsheng@627
|
13881
|
dongsheng@627
|
13882 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13883 #: ../en/ch11-mq.xml:223
|
dongsheng@627
|
13884 msgid ""
|
dongsheng@627
|
13885 "After the file header comes a series of <emphasis>hunks</emphasis>. Each "
|
dongsheng@627
|
13886 "hunk starts with a header; this identifies the range of line numbers within "
|
dongsheng@627
|
13887 "the file that the hunk should modify. Following the header, a hunk starts "
|
dongsheng@627
|
13888 "and ends with a few (usually three) lines of text from the unmodified file; "
|
dongsheng@627
|
13889 "these are called the <emphasis>context</emphasis> for the hunk. If there's "
|
dongsheng@627
|
13890 "only a small amount of context between successive hunks, <command>diff</"
|
dongsheng@627
|
13891 "command> doesn't print a new hunk header; it just runs the hunks together, "
|
dongsheng@627
|
13892 "with a few lines of context between modifications."
|
dongsheng@627
|
13893 msgstr ""
|
dongsheng@627
|
13894
|
dongsheng@627
|
13895 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13896 #: ../en/ch11-mq.xml:235
|
dongsheng@627
|
13897 msgid ""
|
dongsheng@627
|
13898 "Each line of context begins with a space character. Within the hunk, a line "
|
dongsheng@627
|
13899 "that begins with <quote><literal>-</literal></quote> means <quote>remove this "
|
dongsheng@627
|
13900 "line,</quote> while a line that begins with <quote><literal>+</literal></"
|
dongsheng@627
|
13901 "quote> means <quote>insert this line.</quote> For example, a line that is "
|
dongsheng@627
|
13902 "modified is represented by one deletion and one insertion."
|
dongsheng@627
|
13903 msgstr ""
|
dongsheng@627
|
13904
|
dongsheng@627
|
13905 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13906 #: ../en/ch11-mq.xml:243
|
dongsheng@627
|
13907 msgid ""
|
dongsheng@627
|
13908 "We will return to some of the more subtle aspects of patches later (in "
|
dongsheng@627
|
13909 "section <xref linkend=\"sec.mq.adv-patch\"/>), but you should have enough "
|
dongsheng@627
|
13910 "information now to use MQ."
|
dongsheng@627
|
13911 msgstr ""
|
dongsheng@627
|
13912
|
dongsheng@627
|
13913 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
13914 #: ../en/ch11-mq.xml:250
|
dongsheng@627
|
13915 msgid "Getting started with Mercurial Queues"
|
dongsheng@636
|
13916 msgstr "开始使用 MQ"
|
dongsheng@627
|
13917
|
dongsheng@627
|
13918 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13919 #: ../en/ch11-mq.xml:252
|
dongsheng@627
|
13920 msgid ""
|
dongsheng@627
|
13921 "Because MQ is implemented as an extension, you must explicitly enable before "
|
dongsheng@627
|
13922 "you can use it. (You don't need to download anything; MQ ships with the "
|
dongsheng@627
|
13923 "standard Mercurial distribution.) To enable MQ, edit your <filename role="
|
dongsheng@627
|
13924 "\"home\">~/.hgrc</filename> file, and add the lines below."
|
dongsheng@627
|
13925 msgstr ""
|
dongsheng@627
|
13926
|
dongsheng@627
|
13927 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13928 #: ../en/ch11-mq.xml:262
|
dongsheng@627
|
13929 msgid ""
|
dongsheng@627
|
13930 "Once the extension is enabled, it will make a number of new commands "
|
dongsheng@627
|
13931 "available. To verify that the extension is working, you can use <command "
|
dongsheng@627
|
13932 "role=\"hg-cmd\">hg help</command> to see if the <command role=\"hg-ext-mq"
|
dongsheng@627
|
13933 "\">qinit</command> command is now available."
|
dongsheng@627
|
13934 msgstr ""
|
dongsheng@627
|
13935
|
dongsheng@627
|
13936 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13937 #: ../en/ch11-mq.xml:270
|
dongsheng@627
|
13938 msgid ""
|
dongsheng@627
|
13939 "You can use MQ with <emphasis>any</emphasis> Mercurial repository, and its "
|
dongsheng@627
|
13940 "commands only operate within that repository. To get started, simply prepare "
|
dongsheng@627
|
13941 "the repository using the <command role=\"hg-ext-mq\">qinit</command> command."
|
dongsheng@627
|
13942 msgstr ""
|
dongsheng@627
|
13943
|
dongsheng@627
|
13944 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
13945 #: ../en/ch11-mq.xml:277
|
dongsheng@627
|
13946 msgid ""
|
dongsheng@627
|
13947 "This command creates an empty directory called <filename role=\"special\" "
|
dongsheng@627
|
13948 "class=\"directory\">.hg/patches</filename>, where MQ will keep its metadata. "
|
dongsheng@627
|
13949 "As with many Mercurial commands, the <command role=\"hg-ext-mq\">qinit</"
|
dongsheng@627
|
13950 "command> command prints nothing if it succeeds."
|
dongsheng@627
|
13951 msgstr ""
|
dongsheng@627
|
13952
|
dongsheng@627
|
13953 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
13954 #: ../en/ch11-mq.xml:284
|
dongsheng@627
|
13955 msgid "Creating a new patch"
|
dongsheng@636
|
13956 msgstr "创建新补丁"
|
dongsheng@627
|
13957
|
dongsheng@627
|
13958 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13959 #: ../en/ch11-mq.xml:286
|
dongsheng@627
|
13960 msgid ""
|
dongsheng@627
|
13961 "To begin work on a new patch, use the <command role=\"hg-ext-mq\">qnew</"
|
dongsheng@627
|
13962 "command> command. This command takes one argument, the name of the patch to "
|
dongsheng@627
|
13963 "create."
|
dongsheng@627
|
13964 msgstr ""
|
dongsheng@627
|
13965
|
dongsheng@627
|
13966 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13967 #: ../en/ch11-mq.xml:290
|
dongsheng@627
|
13968 msgid ""
|
dongsheng@627
|
13969 "MQ will use this as the name of an actual file in the <filename role=\"special"
|
dongsheng@627
|
13970 "\" class=\"directory\">.hg/patches</filename> directory, as you can see below."
|
dongsheng@627
|
13971 msgstr ""
|
dongsheng@627
|
13972
|
dongsheng@627
|
13973 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13974 #: ../en/ch11-mq.xml:297
|
dongsheng@627
|
13975 msgid ""
|
dongsheng@627
|
13976 "Also newly present in the <filename role=\"special\" class=\"directory\">.hg/"
|
dongsheng@627
|
13977 "patches</filename> directory are two other files, <filename role=\"special"
|
dongsheng@627
|
13978 "\">series</filename> and <filename role=\"special\">status</filename>. The "
|
dongsheng@627
|
13979 "<filename role=\"special\">series</filename> file lists all of the patches "
|
dongsheng@627
|
13980 "that MQ knows about for this repository, with one patch per line. Mercurial "
|
dongsheng@627
|
13981 "uses the <filename role=\"special\">status</filename> file for internal book-"
|
dongsheng@627
|
13982 "keeping; it tracks all of the patches that MQ has <emphasis>applied</"
|
dongsheng@627
|
13983 "emphasis> in this repository."
|
dongsheng@627
|
13984 msgstr ""
|
dongsheng@627
|
13985
|
dongsheng@627
|
13986 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
13987 #: ../en/ch11-mq.xml:309
|
dongsheng@627
|
13988 msgid ""
|
dongsheng@627
|
13989 "You may sometimes want to edit the <filename role=\"special\">series</"
|
dongsheng@627
|
13990 "filename> file by hand; for example, to change the sequence in which some "
|
dongsheng@627
|
13991 "patches are applied. However, manually editing the <filename role=\"special"
|
dongsheng@627
|
13992 "\">status</filename> file is almost always a bad idea, as it's easy to "
|
dongsheng@627
|
13993 "corrupt MQ's idea of what is happening."
|
dongsheng@627
|
13994 msgstr ""
|
dongsheng@627
|
13995
|
dongsheng@627
|
13996 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
13997 #: ../en/ch11-mq.xml:318
|
dongsheng@627
|
13998 msgid ""
|
dongsheng@627
|
13999 "Once you have created your new patch, you can edit files in the working "
|
dongsheng@627
|
14000 "directory as you usually would. All of the normal Mercurial commands, such "
|
dongsheng@627
|
14001 "as <command role=\"hg-cmd\">hg diff</command> and <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
14002 "annotate</command>, work exactly as they did before."
|
dongsheng@627
|
14003 msgstr ""
|
dongsheng@627
|
14004
|
dongsheng@627
|
14005 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14006 #: ../en/ch11-mq.xml:326
|
dongsheng@627
|
14007 msgid "Refreshing a patch"
|
dongsheng@636
|
14008 msgstr "刷新补丁"
|
dongsheng@627
|
14009
|
dongsheng@627
|
14010 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14011 #: ../en/ch11-mq.xml:328
|
dongsheng@627
|
14012 msgid ""
|
dongsheng@627
|
14013 "When you reach a point where you want to save your work, use the <command "
|
dongsheng@627
|
14014 "role=\"hg-ext-mq\">qrefresh</command> command to update the patch you are "
|
dongsheng@627
|
14015 "working on."
|
dongsheng@627
|
14016 msgstr ""
|
dongsheng@627
|
14017
|
dongsheng@627
|
14018 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14019 #: ../en/ch11-mq.xml:334
|
dongsheng@627
|
14020 msgid ""
|
dongsheng@627
|
14021 "This command folds the changes you have made in the working directory into "
|
dongsheng@627
|
14022 "your patch, and updates its corresponding changeset to contain those changes."
|
dongsheng@627
|
14023 msgstr ""
|
dongsheng@627
|
14024
|
dongsheng@627
|
14025 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14026 #: ../en/ch11-mq.xml:338
|
dongsheng@627
|
14027 msgid ""
|
dongsheng@627
|
14028 "You can run <command role=\"hg-ext-mq\">qrefresh</command> as often as you "
|
dongsheng@627
|
14029 "like, so it's a good way to <quote>checkpoint</quote> your work. Refresh "
|
dongsheng@627
|
14030 "your patch at an opportune time; try an experiment; and if the experiment "
|
dongsheng@627
|
14031 "doesn't work out, <command role=\"hg-cmd\">hg revert</command> your "
|
dongsheng@627
|
14032 "modifications back to the last time you refreshed."
|
dongsheng@627
|
14033 msgstr ""
|
dongsheng@627
|
14034
|
dongsheng@627
|
14035 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14036 #: ../en/ch11-mq.xml:349
|
dongsheng@627
|
14037 msgid "Stacking and tracking patches"
|
dongsheng@636
|
14038 msgstr "堆叠和跟踪补丁"
|
dongsheng@627
|
14039
|
dongsheng@627
|
14040 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14041 #: ../en/ch11-mq.xml:351
|
dongsheng@627
|
14042 msgid ""
|
dongsheng@627
|
14043 "Once you have finished working on a patch, or need to work on another, you "
|
dongsheng@627
|
14044 "can use the <command role=\"hg-ext-mq\">qnew</command> command again to "
|
dongsheng@627
|
14045 "create a new patch. Mercurial will apply this patch on top of your existing "
|
dongsheng@627
|
14046 "patch."
|
dongsheng@627
|
14047 msgstr ""
|
dongsheng@627
|
14048
|
dongsheng@627
|
14049 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14050 #: ../en/ch11-mq.xml:358
|
dongsheng@627
|
14051 msgid ""
|
dongsheng@627
|
14052 "Notice that the patch contains the changes in our prior patch as part of its "
|
dongsheng@627
|
14053 "context (you can see this more clearly in the output of <command role=\"hg-cmd"
|
dongsheng@627
|
14054 "\">hg annotate</command>)."
|
dongsheng@627
|
14055 msgstr ""
|
dongsheng@627
|
14056
|
dongsheng@627
|
14057 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14058 #: ../en/ch11-mq.xml:363
|
dongsheng@627
|
14059 msgid ""
|
dongsheng@627
|
14060 "So far, with the exception of <command role=\"hg-ext-mq\">qnew</command> and "
|
dongsheng@627
|
14061 "<command role=\"hg-ext-mq\">qrefresh</command>, we've been careful to only "
|
dongsheng@627
|
14062 "use regular Mercurial commands. However, MQ provides many commands that are "
|
dongsheng@627
|
14063 "easier to use when you are thinking about patches, as illustrated below."
|
dongsheng@627
|
14064 msgstr ""
|
dongsheng@627
|
14065
|
dongsheng@627
|
14066 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14067 #: ../en/ch11-mq.xml:373
|
dongsheng@627
|
14068 msgid ""
|
dongsheng@627
|
14069 "The <command role=\"hg-ext-mq\">qseries</command> command lists every patch "
|
dongsheng@627
|
14070 "that MQ knows about in this repository, from oldest to newest (most recently "
|
dongsheng@627
|
14071 "<emphasis>created</emphasis>)."
|
dongsheng@627
|
14072 msgstr ""
|
dongsheng@627
|
14073
|
dongsheng@627
|
14074 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14075 #: ../en/ch11-mq.xml:379
|
dongsheng@627
|
14076 msgid ""
|
dongsheng@627
|
14077 "The <command role=\"hg-ext-mq\">qapplied</command> command lists every patch "
|
dongsheng@627
|
14078 "that MQ has <emphasis>applied</emphasis> in this repository, again from "
|
dongsheng@627
|
14079 "oldest to newest (most recently applied)."
|
dongsheng@627
|
14080 msgstr ""
|
dongsheng@627
|
14081
|
dongsheng@627
|
14082 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14083 #: ../en/ch11-mq.xml:388
|
dongsheng@627
|
14084 msgid "Manipulating the patch stack"
|
dongsheng@636
|
14085 msgstr "操作补丁堆栈"
|
dongsheng@627
|
14086
|
dongsheng@627
|
14087 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14088 #: ../en/ch11-mq.xml:390
|
dongsheng@627
|
14089 msgid ""
|
dongsheng@627
|
14090 "The previous discussion implied that there must be a difference between "
|
dongsheng@627
|
14091 "<quote>known</quote> and <quote>applied</quote> patches, and there is. MQ "
|
dongsheng@627
|
14092 "can manage a patch without it being applied in the repository."
|
dongsheng@627
|
14093 msgstr ""
|
dongsheng@627
|
14094
|
dongsheng@627
|
14095 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14096 #: ../en/ch11-mq.xml:395
|
dongsheng@627
|
14097 msgid ""
|
dongsheng@627
|
14098 "An <emphasis>applied</emphasis> patch has a corresponding changeset in the "
|
dongsheng@627
|
14099 "repository, and the effects of the patch and changeset are visible in the "
|
dongsheng@627
|
14100 "working directory. You can undo the application of a patch using the "
|
dongsheng@627
|
14101 "<command role=\"hg-ext-mq\">qpop</command> command. MQ still <emphasis>knows "
|
dongsheng@627
|
14102 "about</emphasis>, or manages, a popped patch, but the patch no longer has a "
|
dongsheng@627
|
14103 "corresponding changeset in the repository, and the working directory does not "
|
dongsheng@641
|
14104 "contain the changes made by the patch. Figure <xref endterm=\"fig.mq.stack."
|
dongsheng@641
|
14105 "caption\" linkend=\"fig.mq.stack\"/> illustrates the difference between "
|
dongsheng@641
|
14106 "applied and tracked patches."
|
dongsheng@627
|
14107 msgstr ""
|
dongsheng@627
|
14108
|
dongsheng@627
|
14109 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject>
|
dongsheng@650
|
14110 #: ../en/ch11-mq.xml:409
|
dongsheng@627
|
14111 msgid "<imageobject><imagedata fileref=\"images/mq-stack.png\"/></imageobject>"
|
dongsheng@627
|
14112 msgstr ""
|
dongsheng@627
|
14113
|
dongsheng@627
|
14114 #. type: Content of: <book><chapter><sect1><sect2><informalfigure><mediaobject><caption><para>
|
dongsheng@650
|
14115 #: ../en/ch11-mq.xml:411
|
dongsheng@627
|
14116 msgid "Applied and unapplied patches in the MQ patch stack"
|
dongsheng@627
|
14117 msgstr ""
|
dongsheng@627
|
14118
|
dongsheng@627
|
14119 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14120 #: ../en/ch11-mq.xml:416
|
dongsheng@627
|
14121 msgid ""
|
dongsheng@627
|
14122 "You can reapply an unapplied, or popped, patch using the <command role=\"hg-"
|
dongsheng@627
|
14123 "ext-mq\">qpush</command> command. This creates a new changeset to correspond "
|
dongsheng@627
|
14124 "to the patch, and the patch's changes once again become present in the "
|
dongsheng@627
|
14125 "working directory. See below for examples of <command role=\"hg-ext-mq"
|
dongsheng@627
|
14126 "\">qpop</command> and <command role=\"hg-ext-mq\">qpush</command> in action."
|
dongsheng@627
|
14127 msgstr ""
|
dongsheng@627
|
14128
|
dongsheng@627
|
14129 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14130 #: ../en/ch11-mq.xml:425
|
dongsheng@627
|
14131 msgid ""
|
dongsheng@627
|
14132 "Notice that once we have popped a patch or two patches, the output of "
|
dongsheng@627
|
14133 "<command role=\"hg-ext-mq\">qseries</command> remains the same, while that of "
|
dongsheng@627
|
14134 "<command role=\"hg-ext-mq\">qapplied</command> has changed."
|
dongsheng@627
|
14135 msgstr ""
|
dongsheng@627
|
14136
|
dongsheng@627
|
14137 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14138 #: ../en/ch11-mq.xml:433
|
dongsheng@627
|
14139 msgid "Pushing and popping many patches"
|
dongsheng@636
|
14140 msgstr "压入或弹出多个补丁"
|
dongsheng@627
|
14141
|
dongsheng@627
|
14142 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14143 #: ../en/ch11-mq.xml:435
|
dongsheng@627
|
14144 msgid ""
|
dongsheng@627
|
14145 "While <command role=\"hg-ext-mq\">qpush</command> and <command role=\"hg-ext-"
|
dongsheng@627
|
14146 "mq\">qpop</command> each operate on a single patch at a time by default, you "
|
dongsheng@627
|
14147 "can push and pop many patches in one go. The <option role=\"hg-ext-mq-cmd-"
|
dongsheng@627
|
14148 "qpush-opt\">hg -a</option> option to <command role=\"hg-ext-mq\">qpush</"
|
dongsheng@627
|
14149 "command> causes it to push all unapplied patches, while the <option role=\"hg-"
|
dongsheng@627
|
14150 "ext-mq-cmd-qpop-opt\">-a</option> option to <command role=\"hg-ext-mq\">qpop</"
|
dongsheng@627
|
14151 "command> causes it to pop all applied patches. (For some more ways to push "
|
dongsheng@627
|
14152 "and pop many patches, see section <xref linkend=\"sec.mq.perf\"/> below.)"
|
dongsheng@627
|
14153 msgstr ""
|
dongsheng@627
|
14154
|
dongsheng@627
|
14155 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14156 #: ../en/ch11-mq.xml:452
|
dongsheng@627
|
14157 msgid "Safety checks, and overriding them"
|
dongsheng@636
|
14158 msgstr "安全的检查,然后覆盖它们"
|
dongsheng@627
|
14159
|
dongsheng@627
|
14160 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14161 #: ../en/ch11-mq.xml:454
|
dongsheng@627
|
14162 msgid ""
|
dongsheng@627
|
14163 "Several MQ commands check the working directory before they do anything, and "
|
dongsheng@627
|
14164 "fail if they find any modifications. They do this to ensure that you won't "
|
dongsheng@627
|
14165 "lose any changes that you have made, but not yet incorporated into a patch. "
|
dongsheng@627
|
14166 "The example below illustrates this; the <command role=\"hg-ext-mq\">qnew</"
|
dongsheng@627
|
14167 "command> command will not create a new patch if there are outstanding "
|
dongsheng@627
|
14168 "changes, caused in this case by the <command role=\"hg-cmd\">hg add</command> "
|
dongsheng@627
|
14169 "of <filename>file3</filename>."
|
dongsheng@627
|
14170 msgstr ""
|
dongsheng@627
|
14171
|
dongsheng@627
|
14172 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14173 #: ../en/ch11-mq.xml:466
|
dongsheng@627
|
14174 msgid ""
|
dongsheng@627
|
14175 "Commands that check the working directory all take an <quote>I know what I'm "
|
dongsheng@627
|
14176 "doing</quote> option, which is always named <option>-f</option>. The exact "
|
dongsheng@627
|
14177 "meaning of <option>-f</option> depends on the command. For example, <command "
|
dongsheng@627
|
14178 "role=\"hg-cmd\">hg qnew <option role=\"hg-ext-mq-cmd-qnew-opt\">hg -f</"
|
dongsheng@627
|
14179 "option></command> will incorporate any outstanding changes into the new patch "
|
dongsheng@627
|
14180 "it creates, but <command role=\"hg-cmd\">hg qpop <option role=\"hg-ext-mq-cmd-"
|
dongsheng@627
|
14181 "qpop-opt\">hg -f</option></command> will revert modifications to any files "
|
dongsheng@627
|
14182 "affected by the patch that it is popping. Be sure to read the documentation "
|
dongsheng@627
|
14183 "for a command's <option>-f</option> option before you use it!"
|
dongsheng@627
|
14184 msgstr ""
|
dongsheng@627
|
14185
|
dongsheng@627
|
14186 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14187 #: ../en/ch11-mq.xml:481
|
dongsheng@627
|
14188 msgid "Working on several patches at once"
|
dongsheng@636
|
14189 msgstr "同时处理多个补丁"
|
dongsheng@627
|
14190
|
dongsheng@627
|
14191 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14192 #: ../en/ch11-mq.xml:483
|
dongsheng@627
|
14193 msgid ""
|
dongsheng@627
|
14194 "The <command role=\"hg-ext-mq\">qrefresh</command> command always refreshes "
|
dongsheng@627
|
14195 "the <emphasis>topmost</emphasis> applied patch. This means that you can "
|
dongsheng@627
|
14196 "suspend work on one patch (by refreshing it), pop or push to make a different "
|
dongsheng@627
|
14197 "patch the top, and work on <emphasis>that</emphasis> patch for a while."
|
dongsheng@627
|
14198 msgstr ""
|
dongsheng@627
|
14199
|
dongsheng@627
|
14200 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14201 #: ../en/ch11-mq.xml:490
|
dongsheng@627
|
14202 msgid ""
|
dongsheng@627
|
14203 "Here's an example that illustrates how you can use this ability. Let's say "
|
dongsheng@627
|
14204 "you're developing a new feature as two patches. The first is a change to the "
|
dongsheng@627
|
14205 "core of your software, and the second&emdash;layered on top of the "
|
dongsheng@627
|
14206 "first&emdash;changes the user interface to use the code you just added to the "
|
dongsheng@627
|
14207 "core. If you notice a bug in the core while you're working on the UI patch, "
|
dongsheng@627
|
14208 "it's easy to fix the core. Simply <command role=\"hg-ext-mq\">qrefresh</"
|
dongsheng@627
|
14209 "command> the UI patch to save your in-progress changes, and <command role="
|
dongsheng@627
|
14210 "\"hg-ext-mq\">qpop</command> down to the core patch. Fix the core bug, "
|
dongsheng@627
|
14211 "<command role=\"hg-ext-mq\">qrefresh</command> the core patch, and <command "
|
dongsheng@627
|
14212 "role=\"hg-ext-mq\">qpush</command> back to the UI patch to continue where you "
|
dongsheng@627
|
14213 "left off."
|
dongsheng@627
|
14214 msgstr ""
|
dongsheng@627
|
14215
|
dongsheng@627
|
14216 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
14217 #: ../en/ch11-mq.xml:507
|
dongsheng@627
|
14218 msgid "More about patches"
|
dongsheng@636
|
14219 msgstr "关于补丁的更多信息"
|
dongsheng@627
|
14220
|
dongsheng@627
|
14221 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14222 #: ../en/ch11-mq.xml:509
|
dongsheng@627
|
14223 msgid ""
|
dongsheng@627
|
14224 "MQ uses the GNU <command>patch</command> command to apply patches, so it's "
|
dongsheng@627
|
14225 "helpful to know a few more detailed aspects of how <command>patch</command> "
|
dongsheng@627
|
14226 "works, and about patches themselves."
|
dongsheng@627
|
14227 msgstr ""
|
dongsheng@627
|
14228
|
dongsheng@627
|
14229 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14230 #: ../en/ch11-mq.xml:515
|
dongsheng@627
|
14231 msgid "The strip count"
|
dongsheng@636
|
14232 msgstr "修剪计数"
|
dongsheng@627
|
14233
|
dongsheng@627
|
14234 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14235 #: ../en/ch11-mq.xml:517
|
dongsheng@627
|
14236 msgid ""
|
dongsheng@627
|
14237 "If you look at the file headers in a patch, you will notice that the "
|
dongsheng@627
|
14238 "pathnames usually have an extra component on the front that isn't present in "
|
dongsheng@627
|
14239 "the actual path name. This is a holdover from the way that people used to "
|
dongsheng@627
|
14240 "generate patches (people still do this, but it's somewhat rare with modern "
|
dongsheng@627
|
14241 "revision control tools)."
|
dongsheng@627
|
14242 msgstr ""
|
dongsheng@627
|
14243
|
dongsheng@627
|
14244 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14245 #: ../en/ch11-mq.xml:524
|
dongsheng@627
|
14246 msgid ""
|
dongsheng@627
|
14247 "Alice would unpack a tarball, edit her files, then decide that she wanted to "
|
dongsheng@627
|
14248 "create a patch. So she'd rename her working directory, unpack the tarball "
|
dongsheng@627
|
14249 "again (hence the need for the rename), and use the <option role=\"cmd-opt-diff"
|
dongsheng@627
|
14250 "\">-r</option> and <option role=\"cmd-opt-diff\">-N</option> options to "
|
dongsheng@627
|
14251 "<command>diff</command> to recursively generate a patch between the "
|
dongsheng@627
|
14252 "unmodified directory and the modified one. The result would be that the name "
|
dongsheng@627
|
14253 "of the unmodified directory would be at the front of the left-hand path in "
|
dongsheng@627
|
14254 "every file header, and the name of the modified directory would be at the "
|
dongsheng@627
|
14255 "front of the right-hand path."
|
dongsheng@627
|
14256 msgstr ""
|
dongsheng@627
|
14257
|
dongsheng@627
|
14258 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14259 #: ../en/ch11-mq.xml:537
|
dongsheng@627
|
14260 msgid ""
|
dongsheng@627
|
14261 "Since someone receiving a patch from the Alices of the net would be unlikely "
|
dongsheng@627
|
14262 "to have unmodified and modified directories with exactly the same names, the "
|
dongsheng@627
|
14263 "<command>patch</command> command has a <option role=\"cmd-opt-patch\">-p</"
|
dongsheng@627
|
14264 "option> option that indicates the number of leading path name components to "
|
dongsheng@627
|
14265 "strip when trying to apply a patch. This number is called the "
|
dongsheng@627
|
14266 "<emphasis>strip count</emphasis>."
|
dongsheng@627
|
14267 msgstr ""
|
dongsheng@627
|
14268
|
dongsheng@627
|
14269 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14270 #: ../en/ch11-mq.xml:545
|
dongsheng@627
|
14271 msgid ""
|
dongsheng@627
|
14272 "An option of <quote><literal>-p1</literal></quote> means <quote>use a strip "
|
dongsheng@627
|
14273 "count of one</quote>. If <command>patch</command> sees a file name "
|
dongsheng@627
|
14274 "<filename>foo/bar/baz</filename> in a file header, it will strip "
|
dongsheng@627
|
14275 "<filename>foo</filename> and try to patch a file named <filename>bar/baz</"
|
dongsheng@627
|
14276 "filename>. (Strictly speaking, the strip count refers to the number of "
|
dongsheng@627
|
14277 "<emphasis>path separators</emphasis> (and the components that go with them ) "
|
dongsheng@627
|
14278 "to strip. A strip count of one will turn <filename>foo/bar</filename> into "
|
dongsheng@627
|
14279 "<filename>bar</filename>, but <filename>/foo/bar</filename> (notice the extra "
|
dongsheng@627
|
14280 "leading slash) into <filename>foo/bar</filename>.)"
|
dongsheng@627
|
14281 msgstr ""
|
dongsheng@627
|
14282
|
dongsheng@627
|
14283 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14284 #: ../en/ch11-mq.xml:558
|
dongsheng@627
|
14285 msgid ""
|
dongsheng@627
|
14286 "The <quote>standard</quote> strip count for patches is one; almost all "
|
dongsheng@627
|
14287 "patches contain one leading path name component that needs to be stripped. "
|
dongsheng@627
|
14288 "Mercurial's <command role=\"hg-cmd\">hg diff</command> command generates path "
|
dongsheng@627
|
14289 "names in this form, and the <command role=\"hg-cmd\">hg import</command> "
|
dongsheng@627
|
14290 "command and MQ expect patches to have a strip count of one."
|
dongsheng@627
|
14291 msgstr ""
|
dongsheng@627
|
14292
|
dongsheng@627
|
14293 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14294 #: ../en/ch11-mq.xml:566
|
dongsheng@627
|
14295 msgid ""
|
dongsheng@627
|
14296 "If you receive a patch from someone that you want to add to your patch queue, "
|
dongsheng@627
|
14297 "and the patch needs a strip count other than one, you cannot just <command "
|
dongsheng@627
|
14298 "role=\"hg-ext-mq\">qimport</command> the patch, because <command role=\"hg-"
|
dongsheng@627
|
14299 "ext-mq\">qimport</command> does not yet have a <literal>-p</literal> option "
|
dongsheng@627
|
14300 "(see <ulink role=\"hg-bug\" url=\"http://www.selenic.com/mercurial/bts/"
|
dongsheng@627
|
14301 "issue311\">issue 311</ulink>). Your best bet is to <command role=\"hg-ext-mq"
|
dongsheng@627
|
14302 "\">qnew</command> a patch of your own, then use <command>patch -pN</command> "
|
dongsheng@627
|
14303 "to apply their patch, followed by <command role=\"hg-cmd\">hg addremove</"
|
dongsheng@627
|
14304 "command> to pick up any files added or removed by the patch, followed by "
|
dongsheng@627
|
14305 "<command role=\"hg-ext-mq\">hg qrefresh</command>. This complexity may become "
|
dongsheng@627
|
14306 "unnecessary; see <ulink role=\"hg-bug\" url=\"http://www.selenic.com/"
|
dongsheng@627
|
14307 "mercurial/bts/issue311\">issue 311</ulink> for details."
|
dongsheng@627
|
14308 msgstr ""
|
dongsheng@627
|
14309
|
dongsheng@627
|
14310 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14311 #: ../en/ch11-mq.xml:585
|
dongsheng@627
|
14312 msgid "Strategies for applying a patch"
|
dongsheng@636
|
14313 msgstr "应用补丁的策略"
|
dongsheng@627
|
14314
|
dongsheng@627
|
14315 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14316 #: ../en/ch11-mq.xml:587
|
dongsheng@627
|
14317 msgid ""
|
dongsheng@627
|
14318 "When <command>patch</command> applies a hunk, it tries a handful of "
|
dongsheng@627
|
14319 "successively less accurate strategies to try to make the hunk apply. This "
|
dongsheng@627
|
14320 "falling-back technique often makes it possible to take a patch that was "
|
dongsheng@627
|
14321 "generated against an old version of a file, and apply it against a newer "
|
dongsheng@627
|
14322 "version of that file."
|
dongsheng@627
|
14323 msgstr ""
|
dongsheng@627
|
14324
|
dongsheng@627
|
14325 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14326 #: ../en/ch11-mq.xml:594
|
dongsheng@627
|
14327 msgid ""
|
dongsheng@627
|
14328 "First, <command>patch</command> tries an exact match, where the line numbers, "
|
dongsheng@627
|
14329 "the context, and the text to be modified must apply exactly. If it cannot "
|
dongsheng@627
|
14330 "make an exact match, it tries to find an exact match for the context, without "
|
dongsheng@627
|
14331 "honouring the line numbering information. If this succeeds, it prints a line "
|
dongsheng@627
|
14332 "of output saying that the hunk was applied, but at some <emphasis>offset</"
|
dongsheng@627
|
14333 "emphasis> from the original line number."
|
dongsheng@627
|
14334 msgstr ""
|
dongsheng@627
|
14335
|
dongsheng@627
|
14336 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14337 #: ../en/ch11-mq.xml:603
|
dongsheng@627
|
14338 msgid ""
|
dongsheng@627
|
14339 "If a context-only match fails, <command>patch</command> removes the first and "
|
dongsheng@627
|
14340 "last lines of the context, and tries a <emphasis>reduced</emphasis> context-"
|
dongsheng@627
|
14341 "only match. If the hunk with reduced context succeeds, it prints a message "
|
dongsheng@627
|
14342 "saying that it applied the hunk with a <emphasis>fuzz factor</emphasis> (the "
|
dongsheng@627
|
14343 "number after the fuzz factor indicates how many lines of context "
|
dongsheng@627
|
14344 "<command>patch</command> had to trim before the patch applied)."
|
dongsheng@627
|
14345 msgstr ""
|
dongsheng@627
|
14346
|
dongsheng@627
|
14347 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14348 #: ../en/ch11-mq.xml:612
|
dongsheng@627
|
14349 msgid ""
|
dongsheng@627
|
14350 "When neither of these techniques works, <command>patch</command> prints a "
|
dongsheng@627
|
14351 "message saying that the hunk in question was rejected. It saves rejected "
|
dongsheng@627
|
14352 "hunks (also simply called <quote>rejects</quote>) to a file with the same "
|
dongsheng@627
|
14353 "name, and an added <filename role=\"special\">.rej</filename> extension. It "
|
dongsheng@627
|
14354 "also saves an unmodified copy of the file with a <filename role=\"special\">."
|
dongsheng@627
|
14355 "orig</filename> extension; the copy of the file without any extensions will "
|
dongsheng@627
|
14356 "contain any changes made by hunks that <emphasis>did</emphasis> apply "
|
dongsheng@627
|
14357 "cleanly. If you have a patch that modifies <filename>foo</filename> with six "
|
dongsheng@627
|
14358 "hunks, and one of them fails to apply, you will have: an unmodified "
|
dongsheng@627
|
14359 "<filename>foo.orig</filename>, a <filename>foo.rej</filename> containing one "
|
dongsheng@627
|
14360 "hunk, and <filename>foo</filename>, containing the changes made by the five "
|
dongsheng@627
|
14361 "successful hunks."
|
dongsheng@627
|
14362 msgstr ""
|
dongsheng@627
|
14363
|
dongsheng@627
|
14364 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14365 #: ../en/ch11-mq.xml:630
|
dongsheng@627
|
14366 msgid "Some quirks of patch representation"
|
dongsheng@636
|
14367 msgstr "补丁的一些特性"
|
dongsheng@627
|
14368
|
dongsheng@627
|
14369 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14370 #: ../en/ch11-mq.xml:632
|
dongsheng@627
|
14371 msgid ""
|
dongsheng@627
|
14372 "There are a few useful things to know about how <command>patch</command> "
|
dongsheng@627
|
14373 "works with files."
|
dongsheng@627
|
14374 msgstr ""
|
dongsheng@627
|
14375
|
dongsheng@627
|
14376 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14377 #: ../en/ch11-mq.xml:635
|
dongsheng@627
|
14378 msgid ""
|
dongsheng@627
|
14379 "This should already be obvious, but <command>patch</command> cannot handle "
|
dongsheng@627
|
14380 "binary files."
|
dongsheng@627
|
14381 msgstr ""
|
dongsheng@627
|
14382
|
dongsheng@627
|
14383 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14384 #: ../en/ch11-mq.xml:639
|
dongsheng@627
|
14385 msgid ""
|
dongsheng@627
|
14386 "Neither does it care about the executable bit; it creates new files as "
|
dongsheng@627
|
14387 "readable, but not executable."
|
dongsheng@627
|
14388 msgstr ""
|
dongsheng@627
|
14389
|
dongsheng@627
|
14390 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14391 #: ../en/ch11-mq.xml:643
|
dongsheng@627
|
14392 msgid ""
|
dongsheng@627
|
14393 "<command>patch</command> treats the removal of a file as a diff between the "
|
dongsheng@627
|
14394 "file to be removed and the empty file. So your idea of <quote>I deleted this "
|
dongsheng@627
|
14395 "file</quote> looks like <quote>every line of this file was deleted</quote> in "
|
dongsheng@627
|
14396 "a patch."
|
dongsheng@627
|
14397 msgstr ""
|
dongsheng@627
|
14398
|
dongsheng@627
|
14399 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14400 #: ../en/ch11-mq.xml:649
|
dongsheng@627
|
14401 msgid ""
|
dongsheng@627
|
14402 "It treats the addition of a file as a diff between the empty file and the "
|
dongsheng@627
|
14403 "file to be added. So in a patch, your idea of <quote>I added this file</"
|
dongsheng@627
|
14404 "quote> looks like <quote>every line of this file was added</quote>."
|
dongsheng@627
|
14405 msgstr ""
|
dongsheng@627
|
14406
|
dongsheng@627
|
14407 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14408 #: ../en/ch11-mq.xml:655
|
dongsheng@627
|
14409 msgid ""
|
dongsheng@627
|
14410 "It treats a renamed file as the removal of the old name, and the addition of "
|
dongsheng@627
|
14411 "the new name. This means that renamed files have a big footprint in "
|
dongsheng@627
|
14412 "patches. (Note also that Mercurial does not currently try to infer when "
|
dongsheng@627
|
14413 "files have been renamed or copied in a patch.)"
|
dongsheng@627
|
14414 msgstr ""
|
dongsheng@627
|
14415
|
dongsheng@627
|
14416 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14417 #: ../en/ch11-mq.xml:661
|
dongsheng@627
|
14418 msgid ""
|
dongsheng@627
|
14419 "<command>patch</command> cannot represent empty files, so you cannot use a "
|
dongsheng@627
|
14420 "patch to represent the notion <quote>I added this empty file to the tree</"
|
dongsheng@627
|
14421 "quote>."
|
dongsheng@627
|
14422 msgstr ""
|
dongsheng@627
|
14423
|
dongsheng@627
|
14424 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14425 #: ../en/ch11-mq.xml:668
|
dongsheng@627
|
14426 msgid "Beware the fuzz"
|
dongsheng@636
|
14427 msgstr "当心毛刺"
|
dongsheng@627
|
14428
|
dongsheng@627
|
14429 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14430 #: ../en/ch11-mq.xml:670
|
dongsheng@627
|
14431 msgid ""
|
dongsheng@627
|
14432 "While applying a hunk at an offset, or with a fuzz factor, will often be "
|
dongsheng@627
|
14433 "completely successful, these inexact techniques naturally leave open the "
|
dongsheng@627
|
14434 "possibility of corrupting the patched file. The most common cases typically "
|
dongsheng@627
|
14435 "involve applying a patch twice, or at an incorrect location in the file. If "
|
dongsheng@627
|
14436 "<command>patch</command> or <command role=\"hg-ext-mq\">qpush</command> ever "
|
dongsheng@627
|
14437 "mentions an offset or fuzz factor, you should make sure that the modified "
|
dongsheng@627
|
14438 "files are correct afterwards."
|
dongsheng@627
|
14439 msgstr ""
|
dongsheng@627
|
14440
|
dongsheng@627
|
14441 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14442 #: ../en/ch11-mq.xml:680
|
dongsheng@627
|
14443 msgid ""
|
dongsheng@627
|
14444 "It's often a good idea to refresh a patch that has applied with an offset or "
|
dongsheng@627
|
14445 "fuzz factor; refreshing the patch generates new context information that will "
|
dongsheng@627
|
14446 "make it apply cleanly. I say <quote>often,</quote> not <quote>always,</"
|
dongsheng@627
|
14447 "quote> because sometimes refreshing a patch will make it fail to apply "
|
dongsheng@627
|
14448 "against a different revision of the underlying files. In some cases, such as "
|
dongsheng@627
|
14449 "when you're maintaining a patch that must sit on top of multiple versions of "
|
dongsheng@627
|
14450 "a source tree, it's acceptable to have a patch apply with some fuzz, provided "
|
dongsheng@627
|
14451 "you've verified the results of the patching process in such cases."
|
dongsheng@627
|
14452 msgstr ""
|
dongsheng@627
|
14453
|
dongsheng@627
|
14454 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14455 #: ../en/ch11-mq.xml:693
|
dongsheng@627
|
14456 msgid "Handling rejection"
|
dongsheng@636
|
14457 msgstr "处理拒绝"
|
dongsheng@627
|
14458
|
dongsheng@627
|
14459 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14460 #: ../en/ch11-mq.xml:695
|
dongsheng@627
|
14461 msgid ""
|
dongsheng@627
|
14462 "If <command role=\"hg-ext-mq\">qpush</command> fails to apply a patch, it "
|
dongsheng@627
|
14463 "will print an error message and exit. If it has left <filename role=\"special"
|
dongsheng@627
|
14464 "\">.rej</filename> files behind, it is usually best to fix up the rejected "
|
dongsheng@627
|
14465 "hunks before you push more patches or do any further work."
|
dongsheng@627
|
14466 msgstr ""
|
dongsheng@627
|
14467
|
dongsheng@627
|
14468 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14469 #: ../en/ch11-mq.xml:701
|
dongsheng@627
|
14470 msgid ""
|
dongsheng@627
|
14471 "If your patch <emphasis>used to</emphasis> apply cleanly, and no longer does "
|
dongsheng@627
|
14472 "because you've changed the underlying code that your patches are based on, "
|
dongsheng@627
|
14473 "Mercurial Queues can help; see section <xref linkend=\"sec.mq.merge\"/> for "
|
dongsheng@627
|
14474 "details."
|
dongsheng@627
|
14475 msgstr ""
|
dongsheng@627
|
14476
|
dongsheng@627
|
14477 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14478 #: ../en/ch11-mq.xml:707
|
dongsheng@627
|
14479 msgid ""
|
dongsheng@627
|
14480 "Unfortunately, there aren't any great techniques for dealing with rejected "
|
dongsheng@627
|
14481 "hunks. Most often, you'll need to view the <filename role=\"special\">.rej</"
|
dongsheng@627
|
14482 "filename> file and edit the target file, applying the rejected hunks by hand."
|
dongsheng@627
|
14483 msgstr ""
|
dongsheng@627
|
14484
|
dongsheng@627
|
14485 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14486 #: ../en/ch11-mq.xml:712
|
dongsheng@627
|
14487 msgid ""
|
dongsheng@627
|
14488 "If you're feeling adventurous, Neil Brown, a Linux kernel hacker, wrote a "
|
dongsheng@627
|
14489 "tool called <command>wiggle</command> <citation>web:wiggle</citation>, which "
|
dongsheng@627
|
14490 "is more vigorous than <command>patch</command> in its attempts to make a "
|
dongsheng@627
|
14491 "patch apply."
|
dongsheng@627
|
14492 msgstr ""
|
dongsheng@627
|
14493
|
dongsheng@627
|
14494 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14495 #: ../en/ch11-mq.xml:718
|
dongsheng@627
|
14496 msgid ""
|
dongsheng@627
|
14497 "Another Linux kernel hacker, Chris Mason (the author of Mercurial Queues), "
|
dongsheng@627
|
14498 "wrote a similar tool called <command>mpatch</command> <citation>web:mpatch</"
|
dongsheng@627
|
14499 "citation>, which takes a simple approach to automating the application of "
|
dongsheng@627
|
14500 "hunks rejected by <command>patch</command>. The <command>mpatch</command> "
|
dongsheng@627
|
14501 "command can help with four common reasons that a hunk may be rejected:"
|
dongsheng@627
|
14502 msgstr ""
|
dongsheng@627
|
14503
|
dongsheng@627
|
14504 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14505 #: ../en/ch11-mq.xml:727
|
dongsheng@627
|
14506 msgid "The context in the middle of a hunk has changed."
|
dongsheng@627
|
14507 msgstr ""
|
dongsheng@627
|
14508
|
dongsheng@627
|
14509 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14510 #: ../en/ch11-mq.xml:730
|
dongsheng@627
|
14511 msgid "A hunk is missing some context at the beginning or end."
|
dongsheng@627
|
14512 msgstr ""
|
dongsheng@627
|
14513
|
dongsheng@627
|
14514 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14515 #: ../en/ch11-mq.xml:733
|
dongsheng@627
|
14516 msgid ""
|
dongsheng@627
|
14517 "A large hunk might apply better&emdash;either entirely or in part&emdash;if "
|
dongsheng@627
|
14518 "it was broken up into smaller hunks."
|
dongsheng@627
|
14519 msgstr ""
|
dongsheng@627
|
14520
|
dongsheng@627
|
14521 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
14522 #: ../en/ch11-mq.xml:737
|
dongsheng@627
|
14523 msgid ""
|
dongsheng@627
|
14524 "A hunk removes lines with slightly different content than those currently "
|
dongsheng@627
|
14525 "present in the file."
|
dongsheng@627
|
14526 msgstr ""
|
dongsheng@627
|
14527
|
dongsheng@627
|
14528 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14529 #: ../en/ch11-mq.xml:741
|
dongsheng@627
|
14530 msgid ""
|
dongsheng@627
|
14531 "If you use <command>wiggle</command> or <command>mpatch</command>, you should "
|
dongsheng@627
|
14532 "be doubly careful to check your results when you're done. In fact, "
|
dongsheng@627
|
14533 "<command>mpatch</command> enforces this method of double-checking the tool's "
|
dongsheng@627
|
14534 "output, by automatically dropping you into a merge program when it has done "
|
dongsheng@627
|
14535 "its job, so that you can verify its work and finish off any remaining merges."
|
dongsheng@627
|
14536 msgstr ""
|
dongsheng@627
|
14537
|
dongsheng@627
|
14538 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
14539 #: ../en/ch11-mq.xml:753
|
dongsheng@627
|
14540 msgid "Getting the best performance out of MQ"
|
dongsheng@636
|
14541 msgstr "MQ 的性能"
|
dongsheng@627
|
14542
|
dongsheng@627
|
14543 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14544 #: ../en/ch11-mq.xml:755
|
dongsheng@627
|
14545 msgid ""
|
dongsheng@627
|
14546 "MQ is very efficient at handling a large number of patches. I ran some "
|
dongsheng@627
|
14547 "performance experiments in mid-2006 for a talk that I gave at the 2006 "
|
dongsheng@627
|
14548 "EuroPython conference <citation>web:europython</citation>. I used as my data "
|
dongsheng@627
|
14549 "set the Linux 2.6.17-mm1 patch series, which consists of 1,738 patches. I "
|
dongsheng@627
|
14550 "applied these on top of a Linux kernel repository containing all 27,472 "
|
dongsheng@627
|
14551 "revisions between Linux 2.6.12-rc2 and Linux 2.6.17."
|
dongsheng@627
|
14552 msgstr ""
|
dongsheng@627
|
14553
|
dongsheng@627
|
14554 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14555 #: ../en/ch11-mq.xml:764
|
dongsheng@627
|
14556 msgid ""
|
dongsheng@627
|
14557 "On my old, slow laptop, I was able to <command role=\"hg-cmd\">hg qpush "
|
dongsheng@627
|
14558 "<option role=\"hg-ext-mq-cmd-qpush-opt\">hg -a</option></command> all 1,738 "
|
dongsheng@627
|
14559 "patches in 3.5 minutes, and <command role=\"hg-cmd\">hg qpop <option role="
|
dongsheng@627
|
14560 "\"hg-ext-mq-cmd-qpop-opt\">hg -a</option></command> them all in 30 seconds. "
|
dongsheng@627
|
14561 "(On a newer laptop, the time to push all patches dropped to two minutes.) I "
|
dongsheng@627
|
14562 "could <command role=\"hg-ext-mq\">qrefresh</command> one of the biggest "
|
dongsheng@627
|
14563 "patches (which made 22,779 lines of changes to 287 files) in 6.6 seconds."
|
dongsheng@627
|
14564 msgstr ""
|
dongsheng@627
|
14565
|
dongsheng@627
|
14566 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14567 #: ../en/ch11-mq.xml:775
|
dongsheng@627
|
14568 msgid ""
|
dongsheng@627
|
14569 "Clearly, MQ is well suited to working in large trees, but there are a few "
|
dongsheng@627
|
14570 "tricks you can use to get the best performance of it."
|
dongsheng@627
|
14571 msgstr ""
|
dongsheng@627
|
14572
|
dongsheng@627
|
14573 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14574 #: ../en/ch11-mq.xml:779
|
dongsheng@627
|
14575 msgid ""
|
dongsheng@627
|
14576 "First of all, try to <quote>batch</quote> operations together. Every time "
|
dongsheng@627
|
14577 "you run <command role=\"hg-ext-mq\">qpush</command> or <command role=\"hg-ext-"
|
dongsheng@627
|
14578 "mq\">qpop</command>, these commands scan the working directory once to make "
|
dongsheng@627
|
14579 "sure you haven't made some changes and then forgotten to run <command role="
|
dongsheng@627
|
14580 "\"hg-ext-mq\">qrefresh</command>. On a small tree, the time that this scan "
|
dongsheng@627
|
14581 "takes is unnoticeable. However, on a medium-sized tree (containing tens of "
|
dongsheng@627
|
14582 "thousands of files), it can take a second or more."
|
dongsheng@627
|
14583 msgstr ""
|
dongsheng@627
|
14584
|
dongsheng@627
|
14585 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14586 #: ../en/ch11-mq.xml:790
|
dongsheng@627
|
14587 msgid ""
|
dongsheng@627
|
14588 "The <command role=\"hg-ext-mq\">qpush</command> and <command role=\"hg-ext-mq"
|
dongsheng@627
|
14589 "\">qpop</command> commands allow you to push and pop multiple patches at a "
|
dongsheng@627
|
14590 "time. You can identify the <quote>destination patch</quote> that you want to "
|
dongsheng@627
|
14591 "end up at. When you <command role=\"hg-ext-mq\">qpush</command> with a "
|
dongsheng@627
|
14592 "destination specified, it will push patches until that patch is at the top of "
|
dongsheng@627
|
14593 "the applied stack. When you <command role=\"hg-ext-mq\">qpop</command> to a "
|
dongsheng@627
|
14594 "destination, MQ will pop patches until the destination patch is at the top."
|
dongsheng@627
|
14595 msgstr ""
|
dongsheng@627
|
14596
|
dongsheng@627
|
14597 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14598 #: ../en/ch11-mq.xml:800
|
dongsheng@627
|
14599 msgid ""
|
dongsheng@627
|
14600 "You can identify a destination patch using either the name of the patch, or "
|
dongsheng@627
|
14601 "by number. If you use numeric addressing, patches are counted from zero; "
|
dongsheng@627
|
14602 "this means that the first patch is zero, the second is one, and so on."
|
dongsheng@627
|
14603 msgstr ""
|
dongsheng@627
|
14604
|
dongsheng@627
|
14605 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
14606 #: ../en/ch11-mq.xml:807
|
dongsheng@627
|
14607 msgid "Updating your patches when the underlying code changes"
|
dongsheng@636
|
14608 msgstr "当基础代码改变时,更新补丁的方法"
|
dongsheng@627
|
14609
|
dongsheng@627
|
14610 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14611 #: ../en/ch11-mq.xml:810
|
dongsheng@627
|
14612 msgid ""
|
dongsheng@627
|
14613 "It's common to have a stack of patches on top of an underlying repository "
|
dongsheng@627
|
14614 "that you don't modify directly. If you're working on changes to third-party "
|
dongsheng@627
|
14615 "code, or on a feature that is taking longer to develop than the rate of "
|
dongsheng@627
|
14616 "change of the code beneath, you will often need to sync up with the "
|
dongsheng@627
|
14617 "underlying code, and fix up any hunks in your patches that no longer apply. "
|
dongsheng@627
|
14618 "This is called <emphasis>rebasing</emphasis> your patch series."
|
dongsheng@627
|
14619 msgstr ""
|
dongsheng@627
|
14620
|
dongsheng@627
|
14621 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14622 #: ../en/ch11-mq.xml:819
|
dongsheng@627
|
14623 msgid ""
|
dongsheng@627
|
14624 "The simplest way to do this is to <command role=\"hg-cmd\">hg qpop <option "
|
dongsheng@627
|
14625 "role=\"hg-ext-mq-cmd-qpop-opt\">hg -a</option></command> your patches, then "
|
dongsheng@627
|
14626 "<command role=\"hg-cmd\">hg pull</command> changes into the underlying "
|
dongsheng@627
|
14627 "repository, and finally <command role=\"hg-cmd\">hg qpush <option role=\"hg-"
|
dongsheng@627
|
14628 "ext-mq-cmd-qpop-opt\">hg -a</option></command> your patches again. MQ will "
|
dongsheng@627
|
14629 "stop pushing any time it runs across a patch that fails to apply during "
|
dongsheng@627
|
14630 "conflicts, allowing you to fix your conflicts, <command role=\"hg-ext-mq"
|
dongsheng@627
|
14631 "\">qrefresh</command> the affected patch, and continue pushing until you have "
|
dongsheng@627
|
14632 "fixed your entire stack."
|
dongsheng@627
|
14633 msgstr ""
|
dongsheng@627
|
14634
|
dongsheng@627
|
14635 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14636 #: ../en/ch11-mq.xml:831
|
dongsheng@627
|
14637 msgid ""
|
dongsheng@627
|
14638 "This approach is easy to use and works well if you don't expect changes to "
|
dongsheng@627
|
14639 "the underlying code to affect how well your patches apply. If your patch "
|
dongsheng@627
|
14640 "stack touches code that is modified frequently or invasively in the "
|
dongsheng@627
|
14641 "underlying repository, however, fixing up rejected hunks by hand quickly "
|
dongsheng@627
|
14642 "becomes tiresome."
|
dongsheng@627
|
14643 msgstr ""
|
dongsheng@627
|
14644
|
dongsheng@627
|
14645 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14646 #: ../en/ch11-mq.xml:838
|
dongsheng@627
|
14647 msgid ""
|
dongsheng@627
|
14648 "It's possible to partially automate the rebasing process. If your patches "
|
dongsheng@627
|
14649 "apply cleanly against some revision of the underlying repo, MQ can use this "
|
dongsheng@627
|
14650 "information to help you to resolve conflicts between your patches and a "
|
dongsheng@627
|
14651 "different revision."
|
dongsheng@627
|
14652 msgstr ""
|
dongsheng@627
|
14653
|
dongsheng@627
|
14654 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14655 #: ../en/ch11-mq.xml:844
|
dongsheng@627
|
14656 msgid "The process is a little involved."
|
dongsheng@627
|
14657 msgstr ""
|
dongsheng@627
|
14658
|
dongsheng@627
|
14659 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
14660 #: ../en/ch11-mq.xml:846
|
dongsheng@627
|
14661 msgid ""
|
dongsheng@627
|
14662 "To begin, <command role=\"hg-cmd\">hg qpush -a</command> all of your patches "
|
dongsheng@627
|
14663 "on top of the revision where you know that they apply cleanly."
|
dongsheng@627
|
14664 msgstr ""
|
dongsheng@627
|
14665
|
dongsheng@627
|
14666 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
14667 #: ../en/ch11-mq.xml:850
|
dongsheng@627
|
14668 msgid ""
|
dongsheng@627
|
14669 "Save a backup copy of your patch directory using <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
14670 "qsave <option role=\"hg-ext-mq-cmd-qsave-opt\">hg -e</option> <option role="
|
dongsheng@627
|
14671 "\"hg-ext-mq-cmd-qsave-opt\">hg -c</option></command>. This prints the name "
|
dongsheng@627
|
14672 "of the directory that it has saved the patches in. It will save the patches "
|
dongsheng@627
|
14673 "to a directory called <filename role=\"special\" class=\"directory\">.hg/"
|
dongsheng@627
|
14674 "patches.N</filename>, where <literal>N</literal> is a small integer. It also "
|
dongsheng@627
|
14675 "commits a <quote>save changeset</quote> on top of your applied patches; this "
|
dongsheng@627
|
14676 "is for internal book-keeping, and records the states of the <filename role="
|
dongsheng@627
|
14677 "\"special\">series</filename> and <filename role=\"special\">status</"
|
dongsheng@627
|
14678 "filename> files."
|
dongsheng@627
|
14679 msgstr ""
|
dongsheng@627
|
14680
|
dongsheng@627
|
14681 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
14682 #: ../en/ch11-mq.xml:864
|
dongsheng@627
|
14683 msgid ""
|
dongsheng@627
|
14684 "Use <command role=\"hg-cmd\">hg pull</command> to bring new changes into the "
|
dongsheng@627
|
14685 "underlying repository. (Don't run <command role=\"hg-cmd\">hg pull -u</"
|
dongsheng@627
|
14686 "command>; see below for why.)"
|
dongsheng@627
|
14687 msgstr ""
|
dongsheng@627
|
14688
|
dongsheng@627
|
14689 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
14690 #: ../en/ch11-mq.xml:869
|
dongsheng@627
|
14691 msgid ""
|
dongsheng@627
|
14692 "Update to the new tip revision, using <command role=\"hg-cmd\">hg update "
|
dongsheng@627
|
14693 "<option role=\"hg-opt-update\">-C</option></command> to override the patches "
|
dongsheng@627
|
14694 "you have pushed."
|
dongsheng@627
|
14695 msgstr ""
|
dongsheng@627
|
14696
|
dongsheng@627
|
14697 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
14698 #: ../en/ch11-mq.xml:874
|
dongsheng@650
|
14699 msgid ""
|
dongsheng@650
|
14700 "Merge all patches using <command>hg qpush -m -a</command>. The <option role="
|
dongsheng@650
|
14701 "\"hg-ext-mq-cmd-qpush-opt\">-m</option> option to <command role=\"hg-ext-mq"
|
dongsheng@650
|
14702 "\">qpush</command> tells MQ to perform a three-way merge if the patch fails "
|
dongsheng@650
|
14703 "to apply."
|
dongsheng@650
|
14704 msgstr ""
|
dongsheng@650
|
14705
|
dongsheng@650
|
14706 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14707 #: ../en/ch11-mq.xml:882
|
dongsheng@627
|
14708 msgid ""
|
dongsheng@627
|
14709 "During the <command role=\"hg-cmd\">hg qpush <option role=\"hg-ext-mq-cmd-"
|
dongsheng@627
|
14710 "qpush-opt\">hg -m</option></command>, each patch in the <filename role="
|
dongsheng@627
|
14711 "\"special\">series</filename> file is applied normally. If a patch applies "
|
dongsheng@627
|
14712 "with fuzz or rejects, MQ looks at the queue you <command role=\"hg-ext-mq"
|
dongsheng@627
|
14713 "\">qsave</command>d, and performs a three-way merge with the corresponding "
|
dongsheng@627
|
14714 "changeset. This merge uses Mercurial's normal merge machinery, so it may pop "
|
dongsheng@627
|
14715 "up a GUI merge tool to help you to resolve problems."
|
dongsheng@627
|
14716 msgstr ""
|
dongsheng@627
|
14717
|
dongsheng@627
|
14718 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14719 #: ../en/ch11-mq.xml:892
|
dongsheng@627
|
14720 msgid ""
|
dongsheng@627
|
14721 "When you finish resolving the effects of a patch, MQ refreshes your patch "
|
dongsheng@627
|
14722 "based on the result of the merge."
|
dongsheng@627
|
14723 msgstr ""
|
dongsheng@627
|
14724
|
dongsheng@627
|
14725 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14726 #: ../en/ch11-mq.xml:895
|
dongsheng@627
|
14727 msgid ""
|
dongsheng@627
|
14728 "At the end of this process, your repository will have one extra head from the "
|
dongsheng@627
|
14729 "old patch queue, and a copy of the old patch queue will be in <filename role="
|
dongsheng@627
|
14730 "\"special\" class=\"directory\">.hg/patches.N</filename>. You can remove the "
|
dongsheng@627
|
14731 "extra head using <command role=\"hg-cmd\">hg qpop -a -n patches.N</command> "
|
dongsheng@627
|
14732 "or <command role=\"hg-cmd\">hg strip</command>. You can delete <filename "
|
dongsheng@627
|
14733 "role=\"special\" class=\"directory\">.hg/patches.N</filename> once you are "
|
dongsheng@627
|
14734 "sure that you no longer need it as a backup."
|
dongsheng@627
|
14735 msgstr ""
|
dongsheng@627
|
14736
|
dongsheng@627
|
14737 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
14738 #: ../en/ch11-mq.xml:907
|
dongsheng@627
|
14739 msgid "Identifying patches"
|
dongsheng@636
|
14740 msgstr "标识补丁"
|
dongsheng@627
|
14741
|
dongsheng@627
|
14742 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14743 #: ../en/ch11-mq.xml:909
|
dongsheng@627
|
14744 msgid ""
|
dongsheng@627
|
14745 "MQ commands that work with patches let you refer to a patch either by using "
|
dongsheng@627
|
14746 "its name or by a number. By name is obvious enough; pass the name "
|
dongsheng@627
|
14747 "<filename>foo.patch</filename> to <command role=\"hg-ext-mq\">qpush</"
|
dongsheng@627
|
14748 "command>, for example, and it will push patches until <filename>foo.patch</"
|
dongsheng@627
|
14749 "filename> is applied."
|
dongsheng@627
|
14750 msgstr ""
|
dongsheng@627
|
14751
|
dongsheng@627
|
14752 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14753 #: ../en/ch11-mq.xml:916
|
dongsheng@627
|
14754 msgid ""
|
dongsheng@627
|
14755 "As a shortcut, you can refer to a patch using both a name and a numeric "
|
dongsheng@627
|
14756 "offset; <literal>foo.patch-2</literal> means <quote>two patches before "
|
dongsheng@627
|
14757 "<literal>foo.patch</literal></quote>, while <literal>bar.patch+4</literal> "
|
dongsheng@627
|
14758 "means <quote>four patches after <literal>bar.patch</literal></quote>."
|
dongsheng@627
|
14759 msgstr ""
|
dongsheng@627
|
14760
|
dongsheng@627
|
14761 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14762 #: ../en/ch11-mq.xml:922
|
dongsheng@627
|
14763 msgid ""
|
dongsheng@627
|
14764 "Referring to a patch by index isn't much different. The first patch printed "
|
dongsheng@627
|
14765 "in the output of <command role=\"hg-ext-mq\">qseries</command> is patch zero "
|
dongsheng@627
|
14766 "(yes, it's one of those start-at-zero counting systems); the second is patch "
|
dongsheng@627
|
14767 "one; and so on."
|
dongsheng@627
|
14768 msgstr ""
|
dongsheng@627
|
14769
|
dongsheng@627
|
14770 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14771 #: ../en/ch11-mq.xml:928
|
dongsheng@627
|
14772 msgid ""
|
dongsheng@627
|
14773 "MQ also makes it easy to work with patches when you are using normal "
|
dongsheng@627
|
14774 "Mercurial commands. Every command that accepts a changeset ID will also "
|
dongsheng@627
|
14775 "accept the name of an applied patch. MQ augments the tags normally in the "
|
dongsheng@627
|
14776 "repository with an eponymous one for each applied patch. In addition, the "
|
dongsheng@650
|
14777 "special tags <literal role=\"tag\">qbase</literal> and <literal role=\"tag"
|
dongsheng@650
|
14778 "\">qtip</literal> identify the <quote>bottom-most</quote> and topmost applied "
|
dongsheng@650
|
14779 "patches, respectively."
|
dongsheng@650
|
14780 msgstr ""
|
dongsheng@650
|
14781
|
dongsheng@650
|
14782 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14783 #: ../en/ch11-mq.xml:938
|
dongsheng@627
|
14784 msgid ""
|
dongsheng@627
|
14785 "These additions to Mercurial's normal tagging capabilities make dealing with "
|
dongsheng@627
|
14786 "patches even more of a breeze."
|
dongsheng@627
|
14787 msgstr ""
|
dongsheng@627
|
14788
|
dongsheng@627
|
14789 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
14790 #: ../en/ch11-mq.xml:941
|
dongsheng@627
|
14791 msgid "Want to patchbomb a mailing list with your latest series of changes?"
|
dongsheng@627
|
14792 msgstr ""
|
dongsheng@627
|
14793
|
dongsheng@627
|
14794 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
14795 #: ../en/ch11-mq.xml:944
|
dongsheng@627
|
14796 msgid ""
|
dongsheng@627
|
14797 "(Don't know what <quote>patchbombing</quote> is? See section <xref linkend="
|
dongsheng@627
|
14798 "\"sec.hgext.patchbomb\"/>.)"
|
dongsheng@627
|
14799 msgstr ""
|
dongsheng@627
|
14800
|
dongsheng@627
|
14801 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
14802 #: ../en/ch11-mq.xml:947
|
dongsheng@627
|
14803 msgid ""
|
dongsheng@627
|
14804 "Need to see all of the patches since <literal>foo.patch</literal> that have "
|
dongsheng@627
|
14805 "touched files in a subdirectory of your tree?"
|
dongsheng@627
|
14806 msgstr ""
|
dongsheng@627
|
14807
|
dongsheng@650
|
14808 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14809 #: ../en/ch11-mq.xml:954
|
dongsheng@627
|
14810 msgid ""
|
dongsheng@627
|
14811 "Because MQ makes the names of patches available to the rest of Mercurial "
|
dongsheng@627
|
14812 "through its normal internal tag machinery, you don't need to type in the "
|
dongsheng@627
|
14813 "entire name of a patch when you want to identify it by name."
|
dongsheng@627
|
14814 msgstr ""
|
dongsheng@627
|
14815
|
dongsheng@627
|
14816 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14817 #: ../en/ch11-mq.xml:959
|
dongsheng@627
|
14818 msgid ""
|
dongsheng@627
|
14819 "Another nice consequence of representing patch names as tags is that when you "
|
dongsheng@627
|
14820 "run the <command role=\"hg-cmd\">hg log</command> command, it will display a "
|
dongsheng@627
|
14821 "patch's name as a tag, simply as part of its normal output. This makes it "
|
dongsheng@627
|
14822 "easy to visually distinguish applied patches from underlying <quote>normal</"
|
dongsheng@627
|
14823 "quote> revisions. The following example shows a few normal Mercurial "
|
dongsheng@627
|
14824 "commands in use with applied patches."
|
dongsheng@627
|
14825 msgstr ""
|
dongsheng@627
|
14826
|
dongsheng@627
|
14827 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
14828 #: ../en/ch11-mq.xml:972
|
dongsheng@627
|
14829 msgid "Useful things to know about"
|
dongsheng@636
|
14830 msgstr "其它需要了解的东西"
|
dongsheng@627
|
14831
|
dongsheng@627
|
14832 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14833 #: ../en/ch11-mq.xml:974
|
dongsheng@627
|
14834 msgid ""
|
dongsheng@627
|
14835 "There are a number of aspects of MQ usage that don't fit tidily into sections "
|
dongsheng@627
|
14836 "of their own, but that are good to know. Here they are, in one place."
|
dongsheng@627
|
14837 msgstr ""
|
dongsheng@627
|
14838
|
dongsheng@627
|
14839 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
14840 #: ../en/ch11-mq.xml:979
|
dongsheng@627
|
14841 msgid ""
|
dongsheng@627
|
14842 "Normally, when you <command role=\"hg-ext-mq\">qpop</command> a patch and "
|
dongsheng@627
|
14843 "<command role=\"hg-ext-mq\">qpush</command> it again, the changeset that "
|
dongsheng@627
|
14844 "represents the patch after the pop/push will have a <emphasis>different "
|
dongsheng@627
|
14845 "identity</emphasis> than the changeset that represented the hash beforehand. "
|
dongsheng@627
|
14846 "See section <xref linkend=\"sec.mqref.cmd.qpush\"/> for information as to why "
|
dongsheng@627
|
14847 "this is."
|
dongsheng@627
|
14848 msgstr ""
|
dongsheng@627
|
14849
|
dongsheng@627
|
14850 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
14851 #: ../en/ch11-mq.xml:988
|
dongsheng@627
|
14852 msgid ""
|
dongsheng@627
|
14853 "It's not a good idea to <command role=\"hg-cmd\">hg merge</command> changes "
|
dongsheng@627
|
14854 "from another branch with a patch changeset, at least if you want to maintain "
|
dongsheng@627
|
14855 "the <quote>patchiness</quote> of that changeset and changesets below it on "
|
dongsheng@627
|
14856 "the patch stack. If you try to do this, it will appear to succeed, but MQ "
|
dongsheng@627
|
14857 "will become confused."
|
dongsheng@627
|
14858 msgstr ""
|
dongsheng@627
|
14859
|
dongsheng@627
|
14860 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
14861 #: ../en/ch11-mq.xml:999
|
dongsheng@627
|
14862 msgid "Managing patches in a repository"
|
dongsheng@636
|
14863 msgstr "在版本库管理补丁"
|
dongsheng@627
|
14864
|
dongsheng@627
|
14865 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14866 #: ../en/ch11-mq.xml:1001
|
dongsheng@627
|
14867 msgid ""
|
dongsheng@627
|
14868 "Because MQ's <filename role=\"special\" class=\"directory\">.hg/patches</"
|
dongsheng@627
|
14869 "filename> directory resides outside a Mercurial repository's working "
|
dongsheng@627
|
14870 "directory, the <quote>underlying</quote> Mercurial repository knows nothing "
|
dongsheng@627
|
14871 "about the management or presence of patches."
|
dongsheng@627
|
14872 msgstr ""
|
dongsheng@627
|
14873
|
dongsheng@627
|
14874 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14875 #: ../en/ch11-mq.xml:1007
|
dongsheng@627
|
14876 msgid ""
|
dongsheng@627
|
14877 "This presents the interesting possibility of managing the contents of the "
|
dongsheng@627
|
14878 "patch directory as a Mercurial repository in its own right. This can be a "
|
dongsheng@627
|
14879 "useful way to work. For example, you can work on a patch for a while, "
|
dongsheng@627
|
14880 "<command role=\"hg-ext-mq\">qrefresh</command> it, then <command role=\"hg-cmd"
|
dongsheng@627
|
14881 "\">hg commit</command> the current state of the patch. This lets you "
|
dongsheng@627
|
14882 "<quote>roll back</quote> to that version of the patch later on."
|
dongsheng@627
|
14883 msgstr ""
|
dongsheng@627
|
14884
|
dongsheng@627
|
14885 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14886 #: ../en/ch11-mq.xml:1016
|
dongsheng@627
|
14887 msgid ""
|
dongsheng@627
|
14888 "You can then share different versions of the same patch stack among multiple "
|
dongsheng@627
|
14889 "underlying repositories. I use this when I am developing a Linux kernel "
|
dongsheng@627
|
14890 "feature. I have a pristine copy of my kernel sources for each of several CPU "
|
dongsheng@627
|
14891 "architectures, and a cloned repository under each that contains the patches I "
|
dongsheng@627
|
14892 "am working on. When I want to test a change on a different architecture, I "
|
dongsheng@627
|
14893 "push my current patches to the patch repository associated with that kernel "
|
dongsheng@627
|
14894 "tree, pop and push all of my patches, and build and test that kernel."
|
dongsheng@627
|
14895 msgstr ""
|
dongsheng@627
|
14896
|
dongsheng@627
|
14897 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
14898 #: ../en/ch11-mq.xml:1026
|
dongsheng@627
|
14899 msgid ""
|
dongsheng@627
|
14900 "Managing patches in a repository makes it possible for multiple developers to "
|
dongsheng@627
|
14901 "work on the same patch series without colliding with each other, all on top "
|
dongsheng@627
|
14902 "of an underlying source base that they may or may not control."
|
dongsheng@627
|
14903 msgstr ""
|
dongsheng@627
|
14904
|
dongsheng@627
|
14905 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14906 #: ../en/ch11-mq.xml:1032
|
dongsheng@627
|
14907 msgid "MQ support for patch repositories"
|
dongsheng@636
|
14908 msgstr "MQ 支持补丁版本库"
|
dongsheng@627
|
14909
|
dongsheng@627
|
14910 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14911 #: ../en/ch11-mq.xml:1034
|
dongsheng@627
|
14912 msgid ""
|
dongsheng@627
|
14913 "MQ helps you to work with the <filename role=\"special\" class=\"directory\">."
|
dongsheng@627
|
14914 "hg/patches</filename> directory as a repository; when you prepare a "
|
dongsheng@627
|
14915 "repository for working with patches using <command role=\"hg-ext-mq\">qinit</"
|
dongsheng@627
|
14916 "command>, you can pass the <option role=\"hg-ext-mq-cmd-qinit-opt\">hg -c</"
|
dongsheng@627
|
14917 "option> option to create the <filename role=\"special\" class=\"directory\">."
|
dongsheng@627
|
14918 "hg/patches</filename> directory as a Mercurial repository."
|
dongsheng@627
|
14919 msgstr ""
|
dongsheng@627
|
14920
|
dongsheng@627
|
14921 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
14922 #: ../en/ch11-mq.xml:1044
|
dongsheng@627
|
14923 msgid ""
|
dongsheng@627
|
14924 "If you forget to use the <option role=\"hg-ext-mq-cmd-qinit-opt\">hg -c</"
|
dongsheng@627
|
14925 "option> option, you can simply go into the <filename role=\"special\" class="
|
dongsheng@627
|
14926 "\"directory\">.hg/patches</filename> directory at any time and run <command "
|
dongsheng@627
|
14927 "role=\"hg-cmd\">hg init</command>. Don't forget to add an entry for the "
|
dongsheng@627
|
14928 "<filename role=\"special\">status</filename> file to the <filename role="
|
dongsheng@627
|
14929 "\"special\">.hgignore</filename> file, though"
|
dongsheng@627
|
14930 msgstr ""
|
dongsheng@627
|
14931
|
dongsheng@627
|
14932 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
14933 #: ../en/ch11-mq.xml:1053
|
dongsheng@627
|
14934 msgid ""
|
dongsheng@627
|
14935 "(<command role=\"hg-cmd\">hg qinit <option role=\"hg-ext-mq-cmd-qinit-opt"
|
dongsheng@627
|
14936 "\">hg -c</option></command> does this for you automatically); you "
|
dongsheng@627
|
14937 "<emphasis>really</emphasis> don't want to manage the <filename role=\"special"
|
dongsheng@627
|
14938 "\">status</filename> file."
|
dongsheng@627
|
14939 msgstr ""
|
dongsheng@627
|
14940
|
dongsheng@627
|
14941 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14942 #: ../en/ch11-mq.xml:1060
|
dongsheng@627
|
14943 msgid ""
|
dongsheng@627
|
14944 "As a convenience, if MQ notices that the <filename class=\"directory\">.hg/"
|
dongsheng@627
|
14945 "patches</filename> directory is a repository, it will automatically <command "
|
dongsheng@627
|
14946 "role=\"hg-cmd\">hg add</command> every patch that you create and import."
|
dongsheng@627
|
14947 msgstr ""
|
dongsheng@627
|
14948
|
dongsheng@627
|
14949 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14950 #: ../en/ch11-mq.xml:1065
|
dongsheng@627
|
14951 msgid ""
|
dongsheng@627
|
14952 "MQ provides a shortcut command, <command role=\"hg-ext-mq\">qcommit</"
|
dongsheng@627
|
14953 "command>, that runs <command role=\"hg-cmd\">hg commit</command> in the "
|
dongsheng@627
|
14954 "<filename role=\"special\" class=\"directory\">.hg/patches</filename> "
|
dongsheng@627
|
14955 "directory. This saves some bothersome typing."
|
dongsheng@627
|
14956 msgstr ""
|
dongsheng@627
|
14957
|
dongsheng@627
|
14958 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14959 #: ../en/ch11-mq.xml:1071
|
dongsheng@627
|
14960 msgid ""
|
dongsheng@627
|
14961 "Finally, as a convenience to manage the patch directory, you can define the "
|
dongsheng@627
|
14962 "alias <command>mq</command> on Unix systems. For example, on Linux systems "
|
dongsheng@627
|
14963 "using the <command>bash</command> shell, you can include the following "
|
dongsheng@627
|
14964 "snippet in your <filename role=\"home\">~/.bashrc</filename>."
|
dongsheng@627
|
14965 msgstr ""
|
dongsheng@627
|
14966
|
dongsheng@627
|
14967 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14968 #: ../en/ch11-mq.xml:1080
|
dongsheng@627
|
14969 msgid ""
|
dongsheng@627
|
14970 "You can then issue commands of the form <command>mq pull</command> from the "
|
dongsheng@627
|
14971 "main repository."
|
dongsheng@627
|
14972 msgstr ""
|
dongsheng@627
|
14973
|
dongsheng@627
|
14974 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
14975 #: ../en/ch11-mq.xml:1085
|
dongsheng@627
|
14976 msgid "A few things to watch out for"
|
dongsheng@636
|
14977 msgstr "需要注意的事情"
|
dongsheng@627
|
14978
|
dongsheng@627
|
14979 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14980 #: ../en/ch11-mq.xml:1087
|
dongsheng@627
|
14981 msgid ""
|
dongsheng@627
|
14982 "MQ's support for working with a repository full of patches is limited in a "
|
dongsheng@627
|
14983 "few small respects."
|
dongsheng@627
|
14984 msgstr ""
|
dongsheng@627
|
14985
|
dongsheng@627
|
14986 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
14987 #: ../en/ch11-mq.xml:1090
|
dongsheng@627
|
14988 msgid ""
|
dongsheng@627
|
14989 "MQ cannot automatically detect changes that you make to the patch directory. "
|
dongsheng@627
|
14990 "If you <command role=\"hg-cmd\">hg pull</command>, manually edit, or <command "
|
dongsheng@627
|
14991 "role=\"hg-cmd\">hg update</command> changes to patches or the <filename role="
|
dongsheng@627
|
14992 "\"special\">series</filename> file, you will have to <command role=\"hg-cmd"
|
dongsheng@627
|
14993 "\">hg qpop <option role=\"hg-ext-mq-cmd-qpop-opt\">hg -a</option></command> "
|
dongsheng@627
|
14994 "and then <command role=\"hg-cmd\">hg qpush <option role=\"hg-ext-mq-cmd-qpush-"
|
dongsheng@627
|
14995 "opt\">hg -a</option></command> in the underlying repository to see those "
|
dongsheng@627
|
14996 "changes show up there. If you forget to do this, you can confuse MQ's idea "
|
dongsheng@627
|
14997 "of which patches are applied."
|
dongsheng@627
|
14998 msgstr ""
|
dongsheng@627
|
14999
|
dongsheng@627
|
15000 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15001 #: ../en/ch11-mq.xml:1106
|
dongsheng@627
|
15002 msgid "Third party tools for working with patches"
|
dongsheng@636
|
15003 msgstr "操作补丁的第三方工具"
|
dongsheng@627
|
15004
|
dongsheng@627
|
15005 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15006 #: ../en/ch11-mq.xml:1108
|
dongsheng@627
|
15007 msgid ""
|
dongsheng@627
|
15008 "Once you've been working with patches for a while, you'll find yourself "
|
dongsheng@627
|
15009 "hungry for tools that will help you to understand and manipulate the patches "
|
dongsheng@627
|
15010 "you're dealing with."
|
dongsheng@627
|
15011 msgstr ""
|
dongsheng@627
|
15012
|
dongsheng@627
|
15013 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15014 #: ../en/ch11-mq.xml:1112
|
dongsheng@627
|
15015 msgid ""
|
dongsheng@627
|
15016 "The <command>diffstat</command> command <citation>web:diffstat</citation> "
|
dongsheng@627
|
15017 "generates a histogram of the modifications made to each file in a patch. It "
|
dongsheng@627
|
15018 "provides a good way to <quote>get a sense of</quote> a patch&emdash;which "
|
dongsheng@627
|
15019 "files it affects, and how much change it introduces to each file and as a "
|
dongsheng@627
|
15020 "whole. (I find that it's a good idea to use <command>diffstat</command>'s "
|
dongsheng@627
|
15021 "<option role=\"cmd-opt-diffstat\">-p</option> option as a matter of course, "
|
dongsheng@627
|
15022 "as otherwise it will try to do clever things with prefixes of file names that "
|
dongsheng@627
|
15023 "inevitably confuse at least me.)"
|
dongsheng@627
|
15024 msgstr ""
|
dongsheng@627
|
15025
|
dongsheng@627
|
15026 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15027 #: ../en/ch11-mq.xml:1126
|
dongsheng@627
|
15028 msgid ""
|
dongsheng@627
|
15029 "The <literal role=\"package\">patchutils</literal> package <citation>web:"
|
dongsheng@627
|
15030 "patchutils</citation> is invaluable. It provides a set of small utilities "
|
dongsheng@627
|
15031 "that follow the <quote>Unix philosophy;</quote> each does one useful thing "
|
dongsheng@627
|
15032 "with a patch. The <literal role=\"package\">patchutils</literal> command I "
|
dongsheng@627
|
15033 "use most is <command>filterdiff</command>, which extracts subsets from a "
|
dongsheng@627
|
15034 "patch file. For example, given a patch that modifies hundreds of files "
|
dongsheng@627
|
15035 "across dozens of directories, a single invocation of <command>filterdiff</"
|
dongsheng@627
|
15036 "command> can generate a smaller patch that only touches files whose names "
|
dongsheng@627
|
15037 "match a particular glob pattern. See section <xref linkend=\"mq-collab.tips."
|
dongsheng@627
|
15038 "interdiff\"/> for another example."
|
dongsheng@627
|
15039 msgstr ""
|
dongsheng@627
|
15040
|
dongsheng@627
|
15041 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15042 #: ../en/ch11-mq.xml:1142
|
dongsheng@627
|
15043 msgid "Good ways to work with patches"
|
dongsheng@636
|
15044 msgstr "操作补丁的好习惯"
|
dongsheng@627
|
15045
|
dongsheng@627
|
15046 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15047 #: ../en/ch11-mq.xml:1144
|
dongsheng@627
|
15048 msgid ""
|
dongsheng@627
|
15049 "Whether you are working on a patch series to submit to a free software or "
|
dongsheng@627
|
15050 "open source project, or a series that you intend to treat as a sequence of "
|
dongsheng@627
|
15051 "regular changesets when you're done, you can use some simple techniques to "
|
dongsheng@627
|
15052 "keep your work well organised."
|
dongsheng@627
|
15053 msgstr ""
|
dongsheng@627
|
15054
|
dongsheng@627
|
15055 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15056 #: ../en/ch11-mq.xml:1150
|
dongsheng@627
|
15057 msgid ""
|
dongsheng@627
|
15058 "Give your patches descriptive names. A good name for a patch might be "
|
dongsheng@627
|
15059 "<filename>rework-device-alloc.patch</filename>, because it will immediately "
|
dongsheng@627
|
15060 "give you a hint what the purpose of the patch is. Long names shouldn't be a "
|
dongsheng@627
|
15061 "problem; you won't be typing the names often, but you <emphasis>will</"
|
dongsheng@627
|
15062 "emphasis> be running commands like <command role=\"hg-ext-mq\">qapplied</"
|
dongsheng@627
|
15063 "command> and <command role=\"hg-ext-mq\">qtop</command> over and over. Good "
|
dongsheng@627
|
15064 "naming becomes especially important when you have a number of patches to work "
|
dongsheng@627
|
15065 "with, or if you are juggling a number of different tasks and your patches "
|
dongsheng@627
|
15066 "only get a fraction of your attention."
|
dongsheng@627
|
15067 msgstr ""
|
dongsheng@627
|
15068
|
dongsheng@627
|
15069 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15070 #: ../en/ch11-mq.xml:1162
|
dongsheng@627
|
15071 msgid ""
|
dongsheng@627
|
15072 "Be aware of what patch you're working on. Use the <command role=\"hg-ext-mq"
|
dongsheng@627
|
15073 "\">qtop</command> command and skim over the text of your patches "
|
dongsheng@627
|
15074 "frequently&emdash;for example, using <command role=\"hg-cmd\">hg tip <option "
|
dongsheng@627
|
15075 "role=\"hg-opt-tip\">-p</option></command>)&emdash;to be sure of where you "
|
dongsheng@627
|
15076 "stand. I have several times worked on and <command role=\"hg-ext-mq"
|
dongsheng@627
|
15077 "\">qrefresh</command>ed a patch other than the one I intended, and it's often "
|
dongsheng@627
|
15078 "tricky to migrate changes into the right patch after making them in the wrong "
|
dongsheng@627
|
15079 "one."
|
dongsheng@627
|
15080 msgstr ""
|
dongsheng@627
|
15081
|
dongsheng@627
|
15082 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15083 #: ../en/ch11-mq.xml:1172
|
dongsheng@627
|
15084 msgid ""
|
dongsheng@627
|
15085 "For this reason, it is very much worth investing a little time to learn how "
|
dongsheng@627
|
15086 "to use some of the third-party tools I described in section <xref linkend="
|
dongsheng@627
|
15087 "\"sec.mq.tools\"/>, particularly <command>diffstat</command> and "
|
dongsheng@627
|
15088 "<command>filterdiff</command>. The former will give you a quick idea of what "
|
dongsheng@627
|
15089 "changes your patch is making, while the latter makes it easy to splice hunks "
|
dongsheng@627
|
15090 "selectively out of one patch and into another."
|
dongsheng@627
|
15091 msgstr ""
|
dongsheng@627
|
15092
|
dongsheng@627
|
15093 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15094 #: ../en/ch11-mq.xml:1183
|
dongsheng@627
|
15095 msgid "MQ cookbook"
|
dongsheng@636
|
15096 msgstr "MQ 手册"
|
dongsheng@627
|
15097
|
dongsheng@627
|
15098 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
15099 #: ../en/ch11-mq.xml:1186
|
dongsheng@627
|
15100 msgid "Manage <quote>trivial</quote> patches"
|
dongsheng@636
|
15101 msgstr "管理<quote>琐碎的</quote>补丁"
|
dongsheng@627
|
15102
|
dongsheng@627
|
15103 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15104 #: ../en/ch11-mq.xml:1188
|
dongsheng@627
|
15105 msgid ""
|
dongsheng@627
|
15106 "Because the overhead of dropping files into a new Mercurial repository is so "
|
dongsheng@627
|
15107 "low, it makes a lot of sense to manage patches this way even if you simply "
|
dongsheng@627
|
15108 "want to make a few changes to a source tarball that you downloaded."
|
dongsheng@627
|
15109 msgstr ""
|
dongsheng@627
|
15110
|
dongsheng@627
|
15111 #
|
dongsheng@627
|
15112 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15113 #: ../en/ch11-mq.xml:1193
|
dongsheng@627
|
15114 msgid ""
|
dongsheng@627
|
15115 "Begin by downloading and unpacking the source tarball, and turning it into a "
|
dongsheng@627
|
15116 "Mercurial repository."
|
dongsheng@627
|
15117 msgstr ""
|
dongsheng@627
|
15118
|
dongsheng@627
|
15119 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15120 #: ../en/ch11-mq.xml:1198
|
dongsheng@627
|
15121 msgid "Continue by creating a patch stack and making your changes."
|
dongsheng@627
|
15122 msgstr ""
|
dongsheng@627
|
15123
|
dongsheng@627
|
15124 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15125 #: ../en/ch11-mq.xml:1203
|
dongsheng@627
|
15126 msgid ""
|
dongsheng@627
|
15127 "Let's say a few weeks or months pass, and your package author releases a new "
|
dongsheng@627
|
15128 "version. First, bring their changes into the repository."
|
dongsheng@627
|
15129 msgstr ""
|
dongsheng@627
|
15130
|
dongsheng@627
|
15131 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15132 #: ../en/ch11-mq.xml:1209
|
dongsheng@627
|
15133 msgid ""
|
dongsheng@627
|
15134 "The pipeline starting with <command role=\"hg-cmd\">hg locate</command> above "
|
dongsheng@627
|
15135 "deletes all files in the working directory, so that <command role=\"hg-cmd"
|
dongsheng@627
|
15136 "\">hg commit</command>'s <option role=\"hg-opt-commit\">--addremove</option> "
|
dongsheng@627
|
15137 "option can actually tell which files have really been removed in the newer "
|
dongsheng@627
|
15138 "version of the source."
|
dongsheng@627
|
15139 msgstr ""
|
dongsheng@627
|
15140
|
dongsheng@627
|
15141 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15142 #: ../en/ch11-mq.xml:1217
|
dongsheng@627
|
15143 msgid "Finally, you can apply your patches on top of the new tree."
|
dongsheng@627
|
15144 msgstr ""
|
dongsheng@627
|
15145
|
dongsheng@627
|
15146 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
15147 #: ../en/ch11-mq.xml:1224
|
dongsheng@627
|
15148 msgid "Combining entire patches"
|
dongsheng@636
|
15149 msgstr "组合全部的补丁"
|
dongsheng@627
|
15150
|
dongsheng@627
|
15151 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15152 #: ../en/ch11-mq.xml:1226
|
dongsheng@627
|
15153 msgid ""
|
dongsheng@627
|
15154 "MQ provides a command, <command role=\"hg-ext-mq\">qfold</command> that lets "
|
dongsheng@627
|
15155 "you combine entire patches. This <quote>folds</quote> the patches you name, "
|
dongsheng@627
|
15156 "in the order you name them, into the topmost applied patch, and concatenates "
|
dongsheng@627
|
15157 "their descriptions onto the end of its description. The patches that you "
|
dongsheng@627
|
15158 "fold must be unapplied before you fold them."
|
dongsheng@627
|
15159 msgstr ""
|
dongsheng@627
|
15160
|
dongsheng@627
|
15161 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15162 #: ../en/ch11-mq.xml:1234
|
dongsheng@627
|
15163 msgid ""
|
dongsheng@627
|
15164 "The order in which you fold patches matters. If your topmost applied patch "
|
dongsheng@627
|
15165 "is <literal>foo</literal>, and you <command role=\"hg-ext-mq\">qfold</"
|
dongsheng@627
|
15166 "command> <literal>bar</literal> and <literal>quux</literal> into it, you will "
|
dongsheng@627
|
15167 "end up with a patch that has the same effect as if you applied first "
|
dongsheng@627
|
15168 "<literal>foo</literal>, then <literal>bar</literal>, followed by "
|
dongsheng@627
|
15169 "<literal>quux</literal>."
|
dongsheng@627
|
15170 msgstr ""
|
dongsheng@627
|
15171
|
dongsheng@627
|
15172 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
15173 #: ../en/ch11-mq.xml:1245
|
dongsheng@627
|
15174 msgid "Merging part of one patch into another"
|
dongsheng@636
|
15175 msgstr "合并补丁的部分内容到其它补丁"
|
dongsheng@627
|
15176
|
dongsheng@627
|
15177 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15178 #: ../en/ch11-mq.xml:1247
|
dongsheng@627
|
15179 msgid ""
|
dongsheng@627
|
15180 "Merging <emphasis>part</emphasis> of one patch into another is more difficult "
|
dongsheng@627
|
15181 "than combining entire patches."
|
dongsheng@627
|
15182 msgstr ""
|
dongsheng@627
|
15183
|
dongsheng@627
|
15184 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15185 #: ../en/ch11-mq.xml:1251
|
dongsheng@627
|
15186 msgid ""
|
dongsheng@627
|
15187 "If you want to move changes to entire files, you can use <command>filterdiff</"
|
dongsheng@627
|
15188 "command>'s <option role=\"cmd-opt-filterdiff\">-i</option> and <option role="
|
dongsheng@627
|
15189 "\"cmd-opt-filterdiff\">-x</option> options to choose the modifications to "
|
dongsheng@627
|
15190 "snip out of one patch, concatenating its output onto the end of the patch you "
|
dongsheng@627
|
15191 "want to merge into. You usually won't need to modify the patch you've merged "
|
dongsheng@627
|
15192 "the changes from. Instead, MQ will report some rejected hunks when you "
|
dongsheng@627
|
15193 "<command role=\"hg-ext-mq\">qpush</command> it (from the hunks you moved into "
|
dongsheng@627
|
15194 "the other patch), and you can simply <command role=\"hg-ext-mq\">qrefresh</"
|
dongsheng@627
|
15195 "command> the patch to drop the duplicate hunks."
|
dongsheng@627
|
15196 msgstr ""
|
dongsheng@627
|
15197
|
dongsheng@627
|
15198 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15199 #: ../en/ch11-mq.xml:1264
|
dongsheng@627
|
15200 msgid ""
|
dongsheng@627
|
15201 "If you have a patch that has multiple hunks modifying a file, and you only "
|
dongsheng@627
|
15202 "want to move a few of those hunks, the job becomes more messy, but you can "
|
dongsheng@627
|
15203 "still partly automate it. Use <command>lsdiff -nvv</command> to print some "
|
dongsheng@627
|
15204 "metadata about the patch."
|
dongsheng@627
|
15205 msgstr ""
|
dongsheng@627
|
15206
|
dongsheng@627
|
15207 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15208 #: ../en/ch11-mq.xml:1272
|
dongsheng@627
|
15209 msgid "This command prints three different kinds of number:"
|
dongsheng@627
|
15210 msgstr ""
|
dongsheng@627
|
15211
|
dongsheng@627
|
15212 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
15213 #: ../en/ch11-mq.xml:1275
|
dongsheng@627
|
15214 msgid ""
|
dongsheng@627
|
15215 "(in the first column) a <emphasis>file number</emphasis> to identify each "
|
dongsheng@627
|
15216 "file modified in the patch;"
|
dongsheng@627
|
15217 msgstr ""
|
dongsheng@627
|
15218
|
dongsheng@627
|
15219 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
15220 #: ../en/ch11-mq.xml:1279
|
dongsheng@627
|
15221 msgid ""
|
dongsheng@627
|
15222 "(on the next line, indented) the line number within a modified file where a "
|
dongsheng@627
|
15223 "hunk starts; and"
|
dongsheng@627
|
15224 msgstr ""
|
dongsheng@627
|
15225
|
dongsheng@627
|
15226 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
15227 #: ../en/ch11-mq.xml:1282
|
dongsheng@627
|
15228 msgid ""
|
dongsheng@627
|
15229 "(on the same line) a <emphasis>hunk number</emphasis> to identify that hunk."
|
dongsheng@627
|
15230 msgstr ""
|
dongsheng@627
|
15231
|
dongsheng@627
|
15232 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15233 #: ../en/ch11-mq.xml:1286
|
dongsheng@627
|
15234 msgid ""
|
dongsheng@627
|
15235 "You'll have to use some visual inspection, and reading of the patch, to "
|
dongsheng@627
|
15236 "identify the file and hunk numbers you'll want, but you can then pass them to "
|
dongsheng@627
|
15237 "to <command>filterdiff</command>'s <option role=\"cmd-opt-filterdiff\">--"
|
dongsheng@627
|
15238 "files</option> and <option role=\"cmd-opt-filterdiff\">--hunks</option> "
|
dongsheng@627
|
15239 "options, to select exactly the file and hunk you want to extract."
|
dongsheng@627
|
15240 msgstr ""
|
dongsheng@627
|
15241
|
dongsheng@627
|
15242 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15243 #: ../en/ch11-mq.xml:1294
|
dongsheng@627
|
15244 msgid ""
|
dongsheng@627
|
15245 "Once you have this hunk, you can concatenate it onto the end of your "
|
dongsheng@627
|
15246 "destination patch and continue with the remainder of section <xref linkend="
|
dongsheng@627
|
15247 "\"sec.mq.combine\"/>."
|
dongsheng@627
|
15248 msgstr ""
|
dongsheng@627
|
15249
|
dongsheng@627
|
15250 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15251 #: ../en/ch11-mq.xml:1301
|
dongsheng@627
|
15252 msgid "Differences between quilt and MQ"
|
dongsheng@636
|
15253 msgstr "MQ 与 quilt 的区别"
|
dongsheng@627
|
15254
|
dongsheng@627
|
15255 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15256 #: ../en/ch11-mq.xml:1303
|
dongsheng@627
|
15257 msgid ""
|
dongsheng@627
|
15258 "If you are already familiar with quilt, MQ provides a similar command set. "
|
dongsheng@627
|
15259 "There are a few differences in the way that it works."
|
dongsheng@627
|
15260 msgstr ""
|
dongsheng@627
|
15261
|
dongsheng@627
|
15262 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15263 #: ../en/ch11-mq.xml:1307
|
dongsheng@627
|
15264 msgid ""
|
dongsheng@627
|
15265 "You will already have noticed that most quilt commands have MQ counterparts "
|
dongsheng@627
|
15266 "that simply begin with a <quote><literal>q</literal></quote>. The exceptions "
|
dongsheng@627
|
15267 "are quilt's <literal>add</literal> and <literal>remove</literal> commands, "
|
dongsheng@627
|
15268 "the counterparts for which are the normal Mercurial <command role=\"hg-cmd"
|
dongsheng@627
|
15269 "\">hg add</command> and <command role=\"hg-cmd\">hg remove</command> "
|
dongsheng@627
|
15270 "commands. There is no MQ equivalent of the quilt <literal>edit</literal> "
|
dongsheng@627
|
15271 "command."
|
dongsheng@627
|
15272 msgstr ""
|
dongsheng@627
|
15273
|
dongsheng@627
|
15274 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
15275 #: ../en/ch12-mq-collab.xml:5
|
dongsheng@627
|
15276 msgid "Advanced uses of Mercurial Queues"
|
dongsheng@627
|
15277 msgstr "MQ 的高级用法"
|
dongsheng@627
|
15278
|
dongsheng@627
|
15279 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
15280 #: ../en/ch12-mq-collab.xml:7
|
dongsheng@627
|
15281 msgid ""
|
dongsheng@627
|
15282 "While it's easy to pick up straightforward uses of Mercurial Queues, use of a "
|
dongsheng@627
|
15283 "little discipline and some of MQ's less frequently used capabilities makes it "
|
dongsheng@627
|
15284 "possible to work in complicated development environments."
|
dongsheng@627
|
15285 msgstr ""
|
dongsheng@627
|
15286
|
dongsheng@627
|
15287 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
15288 #: ../en/ch12-mq-collab.xml:12
|
dongsheng@627
|
15289 msgid ""
|
dongsheng@627
|
15290 "In this chapter, I will use as an example a technique I have used to manage "
|
dongsheng@627
|
15291 "the development of an Infiniband device driver for the Linux kernel. The "
|
dongsheng@627
|
15292 "driver in question is large (at least as drivers go), with 25,000 lines of "
|
dongsheng@627
|
15293 "code spread across 35 source files. It is maintained by a small team of "
|
dongsheng@627
|
15294 "developers."
|
dongsheng@627
|
15295 msgstr ""
|
dongsheng@627
|
15296
|
dongsheng@627
|
15297 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
15298 #: ../en/ch12-mq-collab.xml:18
|
dongsheng@627
|
15299 msgid ""
|
dongsheng@627
|
15300 "While much of the material in this chapter is specific to Linux, the same "
|
dongsheng@627
|
15301 "principles apply to any code base for which you're not the primary owner, and "
|
dongsheng@627
|
15302 "upon which you need to do a lot of development."
|
dongsheng@627
|
15303 msgstr ""
|
dongsheng@627
|
15304
|
dongsheng@627
|
15305 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15306 #: ../en/ch12-mq-collab.xml:24
|
dongsheng@627
|
15307 msgid "The problem of many targets"
|
dongsheng@636
|
15308 msgstr "多个目标的问题"
|
dongsheng@627
|
15309
|
dongsheng@627
|
15310 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15311 #: ../en/ch12-mq-collab.xml:26
|
dongsheng@627
|
15312 msgid ""
|
dongsheng@627
|
15313 "The Linux kernel changes rapidly, and has never been internally stable; "
|
dongsheng@627
|
15314 "developers frequently make drastic changes between releases. This means that "
|
dongsheng@627
|
15315 "a version of the driver that works well with a particular released version of "
|
dongsheng@627
|
15316 "the kernel will not even <emphasis>compile</emphasis> correctly against, "
|
dongsheng@627
|
15317 "typically, any other version."
|
dongsheng@627
|
15318 msgstr ""
|
dongsheng@627
|
15319
|
dongsheng@627
|
15320 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15321 #: ../en/ch12-mq-collab.xml:33
|
dongsheng@627
|
15322 msgid ""
|
dongsheng@627
|
15323 "To maintain a driver, we have to keep a number of distinct versions of Linux "
|
dongsheng@627
|
15324 "in mind."
|
dongsheng@627
|
15325 msgstr ""
|
dongsheng@627
|
15326
|
dongsheng@627
|
15327 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15328 #: ../en/ch12-mq-collab.xml:36
|
dongsheng@627
|
15329 msgid ""
|
dongsheng@627
|
15330 "One target is the main Linux kernel development tree. Maintenance of the code "
|
dongsheng@627
|
15331 "is in this case partly shared by other developers in the kernel community, "
|
dongsheng@627
|
15332 "who make <quote>drive-by</quote> modifications to the driver as they develop "
|
dongsheng@627
|
15333 "and refine kernel subsystems."
|
dongsheng@627
|
15334 msgstr ""
|
dongsheng@627
|
15335
|
dongsheng@627
|
15336 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15337 #: ../en/ch12-mq-collab.xml:42
|
dongsheng@627
|
15338 msgid ""
|
dongsheng@627
|
15339 "We also maintain a number of <quote>backports</quote> to older versions of "
|
dongsheng@627
|
15340 "the Linux kernel, to support the needs of customers who are running older "
|
dongsheng@627
|
15341 "Linux distributions that do not incorporate our drivers. (To "
|
dongsheng@627
|
15342 "<emphasis>backport</emphasis> a piece of code is to modify it to work in an "
|
dongsheng@627
|
15343 "older version of its target environment than the version it was developed "
|
dongsheng@627
|
15344 "for.)"
|
dongsheng@627
|
15345 msgstr ""
|
dongsheng@627
|
15346
|
dongsheng@627
|
15347 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15348 #: ../en/ch12-mq-collab.xml:50
|
dongsheng@627
|
15349 msgid ""
|
dongsheng@627
|
15350 "Finally, we make software releases on a schedule that is necessarily not "
|
dongsheng@627
|
15351 "aligned with those used by Linux distributors and kernel developers, so that "
|
dongsheng@627
|
15352 "we can deliver new features to customers without forcing them to upgrade "
|
dongsheng@627
|
15353 "their entire kernels or distributions."
|
dongsheng@627
|
15354 msgstr ""
|
dongsheng@627
|
15355
|
dongsheng@627
|
15356 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
15357 #: ../en/ch12-mq-collab.xml:58
|
dongsheng@627
|
15358 msgid "Tempting approaches that don't work well"
|
dongsheng@636
|
15359 msgstr "工作不好的诱人方法"
|
dongsheng@627
|
15360
|
dongsheng@627
|
15361 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15362 #: ../en/ch12-mq-collab.xml:60
|
dongsheng@627
|
15363 msgid ""
|
dongsheng@627
|
15364 "There are two <quote>standard</quote> ways to maintain a piece of software "
|
dongsheng@627
|
15365 "that has to target many different environments."
|
dongsheng@627
|
15366 msgstr ""
|
dongsheng@627
|
15367
|
dongsheng@627
|
15368 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15369 #: ../en/ch12-mq-collab.xml:64
|
dongsheng@627
|
15370 msgid ""
|
dongsheng@627
|
15371 "The first is to maintain a number of branches, each intended for a single "
|
dongsheng@627
|
15372 "target. The trouble with this approach is that you must maintain iron "
|
dongsheng@627
|
15373 "discipline in the flow of changes between repositories. A new feature or bug "
|
dongsheng@627
|
15374 "fix must start life in a <quote>pristine</quote> repository, then percolate "
|
dongsheng@627
|
15375 "out to every backport repository. Backport changes are more limited in the "
|
dongsheng@627
|
15376 "branches they should propagate to; a backport change that is applied to a "
|
dongsheng@627
|
15377 "branch where it doesn't belong will probably stop the driver from compiling."
|
dongsheng@627
|
15378 msgstr ""
|
dongsheng@627
|
15379
|
dongsheng@627
|
15380 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15381 #: ../en/ch12-mq-collab.xml:74
|
dongsheng@627
|
15382 msgid ""
|
dongsheng@627
|
15383 "The second is to maintain a single source tree filled with conditional "
|
dongsheng@627
|
15384 "statements that turn chunks of code on or off depending on the intended "
|
dongsheng@627
|
15385 "target. Because these <quote>ifdefs</quote> are not allowed in the Linux "
|
dongsheng@627
|
15386 "kernel tree, a manual or automatic process must be followed to strip them out "
|
dongsheng@627
|
15387 "and yield a clean tree. A code base maintained in this fashion rapidly "
|
dongsheng@627
|
15388 "becomes a rat's nest of conditional blocks that are difficult to understand "
|
dongsheng@627
|
15389 "and maintain."
|
dongsheng@627
|
15390 msgstr ""
|
dongsheng@627
|
15391
|
dongsheng@627
|
15392 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15393 #: ../en/ch12-mq-collab.xml:83
|
dongsheng@627
|
15394 msgid ""
|
dongsheng@627
|
15395 "Neither of these approaches is well suited to a situation where you don't "
|
dongsheng@627
|
15396 "<quote>own</quote> the canonical copy of a source tree. In the case of a "
|
dongsheng@627
|
15397 "Linux driver that is distributed with the standard kernel, Linus's tree "
|
dongsheng@627
|
15398 "contains the copy of the code that will be treated by the world as "
|
dongsheng@627
|
15399 "canonical. The upstream version of <quote>my</quote> driver can be modified "
|
dongsheng@627
|
15400 "by people I don't know, without me even finding out about it until after the "
|
dongsheng@627
|
15401 "changes show up in Linus's tree."
|
dongsheng@627
|
15402 msgstr ""
|
dongsheng@627
|
15403
|
dongsheng@627
|
15404 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15405 #: ../en/ch12-mq-collab.xml:93
|
dongsheng@627
|
15406 msgid ""
|
dongsheng@627
|
15407 "These approaches have the added weakness of making it difficult to generate "
|
dongsheng@627
|
15408 "well-formed patches to submit upstream."
|
dongsheng@627
|
15409 msgstr ""
|
dongsheng@627
|
15410
|
dongsheng@627
|
15411 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15412 #: ../en/ch12-mq-collab.xml:97
|
dongsheng@627
|
15413 msgid ""
|
dongsheng@627
|
15414 "In principle, Mercurial Queues seems like a good candidate to manage a "
|
dongsheng@627
|
15415 "development scenario such as the above. While this is indeed the case, MQ "
|
dongsheng@627
|
15416 "contains a few added features that make the job more pleasant."
|
dongsheng@627
|
15417 msgstr ""
|
dongsheng@627
|
15418
|
dongsheng@627
|
15419 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15420 #: ../en/ch12-mq-collab.xml:105
|
dongsheng@627
|
15421 msgid "Conditionally applying patches with guards"
|
dongsheng@636
|
15422 msgstr "有条件的应用补丁"
|
dongsheng@627
|
15423
|
dongsheng@627
|
15424 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15425 #: ../en/ch12-mq-collab.xml:107
|
dongsheng@627
|
15426 msgid ""
|
dongsheng@627
|
15427 "Perhaps the best way to maintain sanity with so many targets is to be able to "
|
dongsheng@627
|
15428 "choose specific patches to apply for a given situation. MQ provides a "
|
dongsheng@627
|
15429 "feature called <quote>guards</quote> (which originates with quilt's "
|
dongsheng@627
|
15430 "<literal>guards</literal> command) that does just this. To start off, let's "
|
dongsheng@627
|
15431 "create a simple repository for experimenting in."
|
dongsheng@627
|
15432 msgstr ""
|
dongsheng@627
|
15433
|
dongsheng@627
|
15434 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15435 #: ../en/ch12-mq-collab.xml:116
|
dongsheng@627
|
15436 msgid ""
|
dongsheng@627
|
15437 "This gives us a tiny repository that contains two patches that don't have any "
|
dongsheng@627
|
15438 "dependencies on each other, because they touch different files."
|
dongsheng@627
|
15439 msgstr ""
|
dongsheng@627
|
15440
|
dongsheng@627
|
15441 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15442 #: ../en/ch12-mq-collab.xml:120
|
dongsheng@627
|
15443 msgid ""
|
dongsheng@627
|
15444 "The idea behind conditional application is that you can <quote>tag</quote> a "
|
dongsheng@627
|
15445 "patch with a <emphasis>guard</emphasis>, which is simply a text string of "
|
dongsheng@627
|
15446 "your choosing, then tell MQ to select specific guards to use when applying "
|
dongsheng@627
|
15447 "patches. MQ will then either apply, or skip over, a guarded patch, depending "
|
dongsheng@627
|
15448 "on the guards that you have selected."
|
dongsheng@627
|
15449 msgstr ""
|
dongsheng@627
|
15450
|
dongsheng@627
|
15451 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15452 #: ../en/ch12-mq-collab.xml:127
|
dongsheng@627
|
15453 msgid ""
|
dongsheng@627
|
15454 "A patch can have an arbitrary number of guards; each one is "
|
dongsheng@627
|
15455 "<emphasis>positive</emphasis> (<quote>apply this patch if this guard is "
|
dongsheng@627
|
15456 "selected</quote>) or <emphasis>negative</emphasis> (<quote>skip this patch if "
|
dongsheng@627
|
15457 "this guard is selected</quote>). A patch with no guards is always applied."
|
dongsheng@627
|
15458 msgstr ""
|
dongsheng@627
|
15459
|
dongsheng@627
|
15460 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15461 #: ../en/ch12-mq-collab.xml:135
|
dongsheng@627
|
15462 msgid "Controlling the guards on a patch"
|
dongsheng@636
|
15463 msgstr "控制补丁的应用条件"
|
dongsheng@627
|
15464
|
dongsheng@627
|
15465 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15466 #: ../en/ch12-mq-collab.xml:137
|
dongsheng@627
|
15467 msgid ""
|
dongsheng@627
|
15468 "The <command role=\"hg-ext-mq\">qguard</command> command lets you determine "
|
dongsheng@627
|
15469 "which guards should apply to a patch, or display the guards that are already "
|
dongsheng@627
|
15470 "in effect. Without any arguments, it displays the guards on the current "
|
dongsheng@627
|
15471 "topmost patch."
|
dongsheng@627
|
15472 msgstr ""
|
dongsheng@627
|
15473
|
dongsheng@627
|
15474 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15475 #: ../en/ch12-mq-collab.xml:144
|
dongsheng@627
|
15476 msgid ""
|
dongsheng@627
|
15477 "To set a positive guard on a patch, prefix the name of the guard with a "
|
dongsheng@627
|
15478 "<quote><literal>+</literal></quote>."
|
dongsheng@627
|
15479 msgstr ""
|
dongsheng@627
|
15480
|
dongsheng@627
|
15481 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15482 #: ../en/ch12-mq-collab.xml:149
|
dongsheng@627
|
15483 msgid ""
|
dongsheng@627
|
15484 "To set a negative guard on a patch, prefix the name of the guard with a "
|
dongsheng@627
|
15485 "<quote><literal>-</literal></quote>."
|
dongsheng@627
|
15486 msgstr ""
|
dongsheng@627
|
15487
|
dongsheng@627
|
15488 #. type: Content of: <book><chapter><sect1><note><para>
|
dongsheng@650
|
15489 #: ../en/ch12-mq-collab.xml:156
|
dongsheng@627
|
15490 msgid ""
|
dongsheng@627
|
15491 "The <command role=\"hg-ext-mq\">qguard</command> command <emphasis>sets</"
|
dongsheng@627
|
15492 "emphasis> the guards on a patch; it doesn't <emphasis>modify</emphasis> "
|
dongsheng@627
|
15493 "them. What this means is that if you run <command role=\"hg-cmd\">hg qguard "
|
dongsheng@627
|
15494 "+a +b</command> on a patch, then <command role=\"hg-cmd\">hg qguard +c</"
|
dongsheng@627
|
15495 "command> on the same patch, the <emphasis>only</emphasis> guard that will be "
|
dongsheng@627
|
15496 "set on it afterwards is <literal>+c</literal>."
|
dongsheng@627
|
15497 msgstr ""
|
dongsheng@627
|
15498
|
dongsheng@627
|
15499 #
|
dongsheng@627
|
15500 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15501 #: ../en/ch12-mq-collab.xml:165
|
dongsheng@627
|
15502 msgid ""
|
dongsheng@627
|
15503 "Mercurial stores guards in the <filename role=\"special\">series</filename> "
|
dongsheng@627
|
15504 "file; the form in which they are stored is easy both to understand and to "
|
dongsheng@627
|
15505 "edit by hand. (In other words, you don't have to use the <command role=\"hg-"
|
dongsheng@627
|
15506 "ext-mq\">qguard</command> command if you don't want to; it's okay to simply "
|
dongsheng@627
|
15507 "edit the <filename role=\"special\">series</filename> file.)"
|
dongsheng@627
|
15508 msgstr ""
|
dongsheng@627
|
15509
|
dongsheng@627
|
15510 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15511 #: ../en/ch12-mq-collab.xml:177
|
dongsheng@627
|
15512 msgid "Selecting the guards to use"
|
dongsheng@636
|
15513 msgstr "选择使用的条件"
|
dongsheng@627
|
15514
|
dongsheng@627
|
15515 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15516 #: ../en/ch12-mq-collab.xml:179
|
dongsheng@627
|
15517 msgid ""
|
dongsheng@627
|
15518 "The <command role=\"hg-ext-mq\">qselect</command> command determines which "
|
dongsheng@627
|
15519 "guards are active at a given time. The effect of this is to determine which "
|
dongsheng@627
|
15520 "patches MQ will apply the next time you run <command role=\"hg-ext-mq"
|
dongsheng@627
|
15521 "\">qpush</command>. It has no other effect; in particular, it doesn't do "
|
dongsheng@627
|
15522 "anything to patches that are already applied."
|
dongsheng@627
|
15523 msgstr ""
|
dongsheng@627
|
15524
|
dongsheng@627
|
15525 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15526 #: ../en/ch12-mq-collab.xml:186
|
dongsheng@627
|
15527 msgid ""
|
dongsheng@627
|
15528 "With no arguments, the <command role=\"hg-ext-mq\">qselect</command> command "
|
dongsheng@627
|
15529 "lists the guards currently in effect, one per line of output. Each argument "
|
dongsheng@627
|
15530 "is treated as the name of a guard to apply."
|
dongsheng@627
|
15531 msgstr ""
|
dongsheng@627
|
15532
|
dongsheng@627
|
15533 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15534 #: ../en/ch12-mq-collab.xml:193
|
dongsheng@627
|
15535 msgid ""
|
dongsheng@627
|
15536 "In case you're interested, the currently selected guards are stored in the "
|
dongsheng@627
|
15537 "<filename role=\"special\">guards</filename> file."
|
dongsheng@627
|
15538 msgstr ""
|
dongsheng@627
|
15539
|
dongsheng@627
|
15540 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15541 #: ../en/ch12-mq-collab.xml:198
|
dongsheng@627
|
15542 msgid ""
|
dongsheng@627
|
15543 "We can see the effect the selected guards have when we run <command role=\"hg-"
|
dongsheng@627
|
15544 "ext-mq\">qpush</command>."
|
dongsheng@627
|
15545 msgstr ""
|
dongsheng@627
|
15546
|
dongsheng@627
|
15547 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15548 #: ../en/ch12-mq-collab.xml:203
|
dongsheng@627
|
15549 msgid ""
|
dongsheng@627
|
15550 "A guard cannot start with a <quote><literal>+</literal></quote> or "
|
dongsheng@627
|
15551 "<quote><literal>-</literal></quote> character. The name of a guard must not "
|
dongsheng@627
|
15552 "contain white space, but most other characters are acceptable. If you try to "
|
dongsheng@627
|
15553 "use a guard with an invalid name, MQ will complain:"
|
dongsheng@627
|
15554 msgstr ""
|
dongsheng@627
|
15555
|
dongsheng@627
|
15556 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15557 #: ../en/ch12-mq-collab.xml:212
|
dongsheng@627
|
15558 msgid "Changing the selected guards changes the patches that are applied."
|
dongsheng@627
|
15559 msgstr ""
|
dongsheng@627
|
15560
|
dongsheng@627
|
15561 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15562 #: ../en/ch12-mq-collab.xml:217
|
dongsheng@627
|
15563 msgid ""
|
dongsheng@627
|
15564 "You can see in the example below that negative guards take precedence over "
|
dongsheng@627
|
15565 "positive guards."
|
dongsheng@627
|
15566 msgstr ""
|
dongsheng@627
|
15567
|
dongsheng@627
|
15568 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15569 #: ../en/ch12-mq-collab.xml:224
|
dongsheng@627
|
15570 msgid "MQ's rules for applying patches"
|
dongsheng@636
|
15571 msgstr "MQ 应用补丁的规则"
|
dongsheng@627
|
15572
|
dongsheng@627
|
15573 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15574 #: ../en/ch12-mq-collab.xml:226
|
dongsheng@627
|
15575 msgid ""
|
dongsheng@627
|
15576 "The rules that MQ uses when deciding whether to apply a patch are as follows."
|
dongsheng@627
|
15577 msgstr ""
|
dongsheng@627
|
15578
|
dongsheng@627
|
15579 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15580 #: ../en/ch12-mq-collab.xml:229
|
dongsheng@627
|
15581 msgid "A patch that has no guards is always applied."
|
dongsheng@627
|
15582 msgstr ""
|
dongsheng@627
|
15583
|
dongsheng@627
|
15584 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15585 #: ../en/ch12-mq-collab.xml:232
|
dongsheng@627
|
15586 msgid ""
|
dongsheng@627
|
15587 "If the patch has any negative guard that matches any currently selected "
|
dongsheng@627
|
15588 "guard, the patch is skipped."
|
dongsheng@627
|
15589 msgstr ""
|
dongsheng@627
|
15590
|
dongsheng@627
|
15591 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15592 #: ../en/ch12-mq-collab.xml:235
|
dongsheng@627
|
15593 msgid ""
|
dongsheng@627
|
15594 "If the patch has any positive guard that matches any currently selected "
|
dongsheng@627
|
15595 "guard, the patch is applied."
|
dongsheng@627
|
15596 msgstr ""
|
dongsheng@627
|
15597
|
dongsheng@627
|
15598 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15599 #: ../en/ch12-mq-collab.xml:238
|
dongsheng@627
|
15600 msgid ""
|
dongsheng@627
|
15601 "If the patch has positive or negative guards, but none matches any currently "
|
dongsheng@627
|
15602 "selected guard, the patch is skipped."
|
dongsheng@627
|
15603 msgstr ""
|
dongsheng@627
|
15604
|
dongsheng@627
|
15605 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15606 #: ../en/ch12-mq-collab.xml:245
|
dongsheng@627
|
15607 msgid "Trimming the work environment"
|
dongsheng@636
|
15608 msgstr "修剪工作环境"
|
dongsheng@627
|
15609
|
dongsheng@627
|
15610 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15611 #: ../en/ch12-mq-collab.xml:247
|
dongsheng@627
|
15612 msgid ""
|
dongsheng@627
|
15613 "In working on the device driver I mentioned earlier, I don't apply the "
|
dongsheng@627
|
15614 "patches to a normal Linux kernel tree. Instead, I use a repository that "
|
dongsheng@627
|
15615 "contains only a snapshot of the source files and headers that are relevant to "
|
dongsheng@627
|
15616 "Infiniband development. This repository is 1% the size of a kernel "
|
dongsheng@627
|
15617 "repository, so it's easier to work with."
|
dongsheng@627
|
15618 msgstr ""
|
dongsheng@627
|
15619
|
dongsheng@627
|
15620 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15621 #: ../en/ch12-mq-collab.xml:254
|
dongsheng@627
|
15622 msgid ""
|
dongsheng@627
|
15623 "I then choose a <quote>base</quote> version on top of which the patches are "
|
dongsheng@627
|
15624 "applied. This is a snapshot of the Linux kernel tree as of a revision of my "
|
dongsheng@627
|
15625 "choosing. When I take the snapshot, I record the changeset ID from the "
|
dongsheng@627
|
15626 "kernel repository in the commit message. Since the snapshot preserves the "
|
dongsheng@627
|
15627 "<quote>shape</quote> and content of the relevant parts of the kernel tree, I "
|
dongsheng@627
|
15628 "can apply my patches on top of either my tiny repository or a normal kernel "
|
dongsheng@627
|
15629 "tree."
|
dongsheng@627
|
15630 msgstr ""
|
dongsheng@627
|
15631
|
dongsheng@627
|
15632 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15633 #: ../en/ch12-mq-collab.xml:263
|
dongsheng@627
|
15634 msgid ""
|
dongsheng@627
|
15635 "Normally, the base tree atop which the patches apply should be a snapshot of "
|
dongsheng@627
|
15636 "a very recent upstream tree. This best facilitates the development of "
|
dongsheng@627
|
15637 "patches that can easily be submitted upstream with few or no modifications."
|
dongsheng@627
|
15638 msgstr ""
|
dongsheng@627
|
15639
|
dongsheng@627
|
15640 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15641 #: ../en/ch12-mq-collab.xml:270
|
dongsheng@627
|
15642 msgid "Dividing up the <filename role=\"special\">series</filename> file"
|
dongsheng@636
|
15643 msgstr "分类补丁<filename role=\"special\">系列</filename>"
|
dongsheng@627
|
15644
|
dongsheng@627
|
15645 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15646 #: ../en/ch12-mq-collab.xml:273
|
dongsheng@627
|
15647 msgid ""
|
dongsheng@627
|
15648 "I categorise the patches in the <filename role=\"special\">series</filename> "
|
dongsheng@627
|
15649 "file into a number of logical groups. Each section of like patches begins "
|
dongsheng@627
|
15650 "with a block of comments that describes the purpose of the patches that "
|
dongsheng@627
|
15651 "follow."
|
dongsheng@627
|
15652 msgstr ""
|
dongsheng@627
|
15653
|
dongsheng@627
|
15654 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15655 #: ../en/ch12-mq-collab.xml:279
|
dongsheng@627
|
15656 msgid ""
|
dongsheng@627
|
15657 "The sequence of patch groups that I maintain follows. The ordering of these "
|
dongsheng@627
|
15658 "groups is important; I'll describe why after I introduce the groups."
|
dongsheng@627
|
15659 msgstr ""
|
dongsheng@627
|
15660
|
dongsheng@627
|
15661 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15662 #: ../en/ch12-mq-collab.xml:283
|
dongsheng@627
|
15663 msgid ""
|
dongsheng@627
|
15664 "The <quote>accepted</quote> group. Patches that the development team has "
|
dongsheng@627
|
15665 "submitted to the maintainer of the Infiniband subsystem, and which he has "
|
dongsheng@627
|
15666 "accepted, but which are not present in the snapshot that the tiny repository "
|
dongsheng@627
|
15667 "is based on. These are <quote>read only</quote> patches, present only to "
|
dongsheng@627
|
15668 "transform the tree into a similar state as it is in the upstream maintainer's "
|
dongsheng@627
|
15669 "repository."
|
dongsheng@627
|
15670 msgstr ""
|
dongsheng@627
|
15671
|
dongsheng@627
|
15672 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15673 #: ../en/ch12-mq-collab.xml:291
|
dongsheng@627
|
15674 msgid ""
|
dongsheng@627
|
15675 "The <quote>rework</quote> group. Patches that I have submitted, but that the "
|
dongsheng@627
|
15676 "upstream maintainer has requested modifications to before he will accept them."
|
dongsheng@627
|
15677 msgstr ""
|
dongsheng@627
|
15678
|
dongsheng@627
|
15679 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15680 #: ../en/ch12-mq-collab.xml:296
|
dongsheng@627
|
15681 msgid ""
|
dongsheng@627
|
15682 "The <quote>pending</quote> group. Patches that I have not yet submitted to "
|
dongsheng@627
|
15683 "the upstream maintainer, but which we have finished working on. These will be "
|
dongsheng@627
|
15684 "<quote>read only</quote> for a while. If the upstream maintainer accepts "
|
dongsheng@627
|
15685 "them upon submission, I'll move them to the end of the <quote>accepted</"
|
dongsheng@627
|
15686 "quote> group. If he requests that I modify any, I'll move them to the "
|
dongsheng@627
|
15687 "beginning of the <quote>rework</quote> group."
|
dongsheng@627
|
15688 msgstr ""
|
dongsheng@627
|
15689
|
dongsheng@627
|
15690 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15691 #: ../en/ch12-mq-collab.xml:305
|
dongsheng@627
|
15692 msgid ""
|
dongsheng@627
|
15693 "The <quote>in progress</quote> group. Patches that are actively being "
|
dongsheng@627
|
15694 "developed, and should not be submitted anywhere yet."
|
dongsheng@627
|
15695 msgstr ""
|
dongsheng@627
|
15696
|
dongsheng@627
|
15697 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15698 #: ../en/ch12-mq-collab.xml:309
|
dongsheng@627
|
15699 msgid ""
|
dongsheng@627
|
15700 "The <quote>backport</quote> group. Patches that adapt the source tree to "
|
dongsheng@627
|
15701 "older versions of the kernel tree."
|
dongsheng@627
|
15702 msgstr ""
|
dongsheng@627
|
15703
|
dongsheng@627
|
15704 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15705 #: ../en/ch12-mq-collab.xml:313
|
dongsheng@627
|
15706 msgid ""
|
dongsheng@627
|
15707 "The <quote>do not ship</quote> group. Patches that for some reason should "
|
dongsheng@627
|
15708 "never be submitted upstream. For example, one such patch might change "
|
dongsheng@627
|
15709 "embedded driver identification strings to make it easier to distinguish, in "
|
dongsheng@627
|
15710 "the field, between an out-of-tree version of the driver and a version shipped "
|
dongsheng@627
|
15711 "by a distribution vendor."
|
dongsheng@627
|
15712 msgstr ""
|
dongsheng@627
|
15713
|
dongsheng@627
|
15714 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15715 #: ../en/ch12-mq-collab.xml:321
|
dongsheng@627
|
15716 msgid ""
|
dongsheng@627
|
15717 "Now to return to the reasons for ordering groups of patches in this way. We "
|
dongsheng@627
|
15718 "would like the lowest patches in the stack to be as stable as possible, so "
|
dongsheng@627
|
15719 "that we will not need to rework higher patches due to changes in context. "
|
dongsheng@627
|
15720 "Putting patches that will never be changed first in the <filename role="
|
dongsheng@627
|
15721 "\"special\">series</filename> file serves this purpose."
|
dongsheng@627
|
15722 msgstr ""
|
dongsheng@627
|
15723
|
dongsheng@627
|
15724 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15725 #: ../en/ch12-mq-collab.xml:329
|
dongsheng@627
|
15726 msgid ""
|
dongsheng@627
|
15727 "We would also like the patches that we know we'll need to modify to be "
|
dongsheng@627
|
15728 "applied on top of a source tree that resembles the upstream tree as closely "
|
dongsheng@627
|
15729 "as possible. This is why we keep accepted patches around for a while."
|
dongsheng@627
|
15730 msgstr ""
|
dongsheng@627
|
15731
|
dongsheng@627
|
15732 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15733 #: ../en/ch12-mq-collab.xml:334
|
dongsheng@627
|
15734 msgid ""
|
dongsheng@627
|
15735 "The <quote>backport</quote> and <quote>do not ship</quote> patches float at "
|
dongsheng@627
|
15736 "the end of the <filename role=\"special\">series</filename> file. The "
|
dongsheng@627
|
15737 "backport patches must be applied on top of all other patches, and the "
|
dongsheng@627
|
15738 "<quote>do not ship</quote> patches might as well stay out of harm's way."
|
dongsheng@627
|
15739 msgstr ""
|
dongsheng@627
|
15740
|
dongsheng@627
|
15741 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15742 #: ../en/ch12-mq-collab.xml:343
|
dongsheng@627
|
15743 msgid "Maintaining the patch series"
|
dongsheng@636
|
15744 msgstr "维护补丁系列"
|
dongsheng@627
|
15745
|
dongsheng@627
|
15746 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15747 #: ../en/ch12-mq-collab.xml:345
|
dongsheng@627
|
15748 msgid ""
|
dongsheng@627
|
15749 "In my work, I use a number of guards to control which patches are to be "
|
dongsheng@627
|
15750 "applied."
|
dongsheng@627
|
15751 msgstr ""
|
dongsheng@627
|
15752
|
dongsheng@627
|
15753 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15754 #: ../en/ch12-mq-collab.xml:349
|
dongsheng@627
|
15755 msgid ""
|
dongsheng@627
|
15756 "<quote>Accepted</quote> patches are guarded with <literal>accepted</"
|
dongsheng@627
|
15757 "literal>. I enable this guard most of the time. When I'm applying the "
|
dongsheng@627
|
15758 "patches on top of a tree where the patches are already present, I can turn "
|
dongsheng@627
|
15759 "this patch off, and the patches that follow it will apply cleanly."
|
dongsheng@627
|
15760 msgstr ""
|
dongsheng@627
|
15761
|
dongsheng@627
|
15762 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15763 #: ../en/ch12-mq-collab.xml:356
|
dongsheng@627
|
15764 msgid ""
|
dongsheng@627
|
15765 "Patches that are <quote>finished</quote>, but not yet submitted, have no "
|
dongsheng@627
|
15766 "guards. If I'm applying the patch stack to a copy of the upstream tree, I "
|
dongsheng@627
|
15767 "don't need to enable any guards in order to get a reasonably safe source tree."
|
dongsheng@627
|
15768 msgstr ""
|
dongsheng@627
|
15769
|
dongsheng@627
|
15770 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15771 #: ../en/ch12-mq-collab.xml:362
|
dongsheng@627
|
15772 msgid ""
|
dongsheng@627
|
15773 "Those patches that need reworking before being resubmitted are guarded with "
|
dongsheng@627
|
15774 "<literal>rework</literal>."
|
dongsheng@627
|
15775 msgstr ""
|
dongsheng@627
|
15776
|
dongsheng@627
|
15777 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15778 #: ../en/ch12-mq-collab.xml:366
|
dongsheng@627
|
15779 msgid ""
|
dongsheng@627
|
15780 "For those patches that are still under development, I use <literal>devel</"
|
dongsheng@627
|
15781 "literal>."
|
dongsheng@627
|
15782 msgstr ""
|
dongsheng@627
|
15783
|
dongsheng@627
|
15784 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
15785 #: ../en/ch12-mq-collab.xml:369
|
dongsheng@627
|
15786 msgid ""
|
dongsheng@627
|
15787 "A backport patch may have several guards, one for each version of the kernel "
|
dongsheng@627
|
15788 "to which it applies. For example, a patch that backports a piece of code to "
|
dongsheng@627
|
15789 "2.6.9 will have a <literal>2.6.9</literal> guard."
|
dongsheng@627
|
15790 msgstr ""
|
dongsheng@627
|
15791
|
dongsheng@627
|
15792 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
15793 #: ../en/ch12-mq-collab.xml:374
|
dongsheng@627
|
15794 msgid ""
|
dongsheng@627
|
15795 "This variety of guards gives me considerable flexibility in determining what "
|
dongsheng@627
|
15796 "kind of source tree I want to end up with. For most situations, the "
|
dongsheng@627
|
15797 "selection of appropriate guards is automated during the build process, but I "
|
dongsheng@627
|
15798 "can manually tune the guards to use for less common circumstances."
|
dongsheng@627
|
15799 msgstr ""
|
dongsheng@627
|
15800
|
dongsheng@627
|
15801 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
15802 #: ../en/ch12-mq-collab.xml:381
|
dongsheng@627
|
15803 msgid "The art of writing backport patches"
|
dongsheng@636
|
15804 msgstr "编写向后移植补丁的艺术"
|
dongsheng@627
|
15805
|
dongsheng@627
|
15806 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15807 #: ../en/ch12-mq-collab.xml:383
|
dongsheng@627
|
15808 msgid ""
|
dongsheng@627
|
15809 "Using MQ, writing a backport patch is a simple process. All such a patch has "
|
dongsheng@627
|
15810 "to do is modify a piece of code that uses a kernel feature not present in the "
|
dongsheng@627
|
15811 "older version of the kernel, so that the driver continues to work correctly "
|
dongsheng@627
|
15812 "under that older version."
|
dongsheng@627
|
15813 msgstr ""
|
dongsheng@627
|
15814
|
dongsheng@627
|
15815 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15816 #: ../en/ch12-mq-collab.xml:389
|
dongsheng@627
|
15817 msgid ""
|
dongsheng@627
|
15818 "A useful goal when writing a good backport patch is to make your code look as "
|
dongsheng@627
|
15819 "if it was written for the older version of the kernel you're targeting. The "
|
dongsheng@627
|
15820 "less obtrusive the patch, the easier it will be to understand and maintain. "
|
dongsheng@627
|
15821 "If you're writing a collection of backport patches to avoid the <quote>rat's "
|
dongsheng@627
|
15822 "nest</quote> effect of lots of <literal>#ifdef</literal>s (hunks of source "
|
dongsheng@627
|
15823 "code that are only used conditionally) in your code, don't introduce version-"
|
dongsheng@627
|
15824 "dependent <literal>#ifdef</literal>s into the patches. Instead, write "
|
dongsheng@627
|
15825 "several patches, each of which makes unconditional changes, and control their "
|
dongsheng@627
|
15826 "application using guards."
|
dongsheng@627
|
15827 msgstr ""
|
dongsheng@627
|
15828
|
dongsheng@627
|
15829 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15830 #: ../en/ch12-mq-collab.xml:402
|
dongsheng@627
|
15831 msgid ""
|
dongsheng@627
|
15832 "There are two reasons to divide backport patches into a distinct group, away "
|
dongsheng@627
|
15833 "from the <quote>regular</quote> patches whose effects they modify. The first "
|
dongsheng@627
|
15834 "is that intermingling the two makes it more difficult to use a tool like the "
|
dongsheng@627
|
15835 "<literal role=\"hg-ext\">patchbomb</literal> extension to automate the "
|
dongsheng@627
|
15836 "process of submitting the patches to an upstream maintainer. The second is "
|
dongsheng@627
|
15837 "that a backport patch could perturb the context in which a subsequent regular "
|
dongsheng@627
|
15838 "patch is applied, making it impossible to apply the regular patch cleanly "
|
dongsheng@627
|
15839 "<emphasis>without</emphasis> the earlier backport patch already being applied."
|
dongsheng@627
|
15840 msgstr ""
|
dongsheng@627
|
15841
|
dongsheng@627
|
15842 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
15843 #: ../en/ch12-mq-collab.xml:417
|
dongsheng@627
|
15844 msgid "Useful tips for developing with MQ"
|
dongsheng@636
|
15845 msgstr "使用 MQ 开发的技巧"
|
dongsheng@627
|
15846
|
dongsheng@627
|
15847 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
15848 #: ../en/ch12-mq-collab.xml:420
|
dongsheng@627
|
15849 msgid "Organising patches in directories"
|
dongsheng@636
|
15850 msgstr "将补丁放到几个目录中"
|
dongsheng@627
|
15851
|
dongsheng@627
|
15852 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15853 #: ../en/ch12-mq-collab.xml:422
|
dongsheng@627
|
15854 msgid ""
|
dongsheng@627
|
15855 "If you're working on a substantial project with MQ, it's not difficult to "
|
dongsheng@627
|
15856 "accumulate a large number of patches. For example, I have one patch "
|
dongsheng@627
|
15857 "repository that contains over 250 patches."
|
dongsheng@627
|
15858 msgstr ""
|
dongsheng@627
|
15859
|
dongsheng@627
|
15860 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15861 #: ../en/ch12-mq-collab.xml:427
|
dongsheng@627
|
15862 msgid ""
|
dongsheng@627
|
15863 "If you can group these patches into separate logical categories, you can if "
|
dongsheng@627
|
15864 "you like store them in different directories; MQ has no problems with patch "
|
dongsheng@627
|
15865 "names that contain path separators."
|
dongsheng@627
|
15866 msgstr ""
|
dongsheng@627
|
15867
|
dongsheng@627
|
15868 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
15869 #: ../en/ch12-mq-collab.xml:434
|
dongsheng@627
|
15870 msgid "Viewing the history of a patch"
|
dongsheng@636
|
15871 msgstr "察看补丁的历史"
|
dongsheng@627
|
15872
|
dongsheng@627
|
15873 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15874 #: ../en/ch12-mq-collab.xml:436
|
dongsheng@627
|
15875 msgid ""
|
dongsheng@627
|
15876 "If you're developing a set of patches over a long time, it's a good idea to "
|
dongsheng@627
|
15877 "maintain them in a repository, as discussed in section <xref linkend=\"sec.mq."
|
dongsheng@627
|
15878 "repo\"/>. If you do so, you'll quickly discover that using the <command role="
|
dongsheng@627
|
15879 "\"hg-cmd\">hg diff</command> command to look at the history of changes to a "
|
dongsheng@627
|
15880 "patch is unworkable. This is in part because you're looking at the second "
|
dongsheng@627
|
15881 "derivative of the real code (a diff of a diff), but also because MQ adds "
|
dongsheng@627
|
15882 "noise to the process by modifying time stamps and directory names when it "
|
dongsheng@627
|
15883 "updates a patch."
|
dongsheng@627
|
15884 msgstr ""
|
dongsheng@627
|
15885
|
dongsheng@627
|
15886 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15887 #: ../en/ch12-mq-collab.xml:448
|
dongsheng@627
|
15888 msgid ""
|
dongsheng@627
|
15889 "However, you can use the <literal role=\"hg-ext\">extdiff</literal> "
|
dongsheng@627
|
15890 "extension, which is bundled with Mercurial, to turn a diff of two versions of "
|
dongsheng@627
|
15891 "a patch into something readable. To do this, you will need a third-party "
|
dongsheng@627
|
15892 "package called <literal role=\"package\">patchutils</literal> <citation>web:"
|
dongsheng@627
|
15893 "patchutils</citation>. This provides a command named <command>interdiff</"
|
dongsheng@627
|
15894 "command>, which shows the differences between two diffs as a diff. Used on "
|
dongsheng@627
|
15895 "two versions of the same diff, it generates a diff that represents the diff "
|
dongsheng@627
|
15896 "from the first to the second version."
|
dongsheng@627
|
15897 msgstr ""
|
dongsheng@627
|
15898
|
dongsheng@627
|
15899 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15900 #: ../en/ch12-mq-collab.xml:459
|
dongsheng@627
|
15901 msgid ""
|
dongsheng@627
|
15902 "You can enable the <literal role=\"hg-ext\">extdiff</literal> extension in "
|
dongsheng@627
|
15903 "the usual way, by adding a line to the <literal role=\"rc-extensions"
|
dongsheng@650
|
15904 "\">extensions</literal> section of your <filename role=\"special\">~/.hgrc</"
|
dongsheng@627
|
15905 "filename>."
|
dongsheng@627
|
15906 msgstr ""
|
dongsheng@627
|
15907
|
dongsheng@627
|
15908 #
|
dongsheng@646
|
15909 #. &example.hg-interdiff;
|
dongsheng@627
|
15910 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15911 #: ../en/ch12-mq-collab.xml:466
|
dongsheng@627
|
15912 msgid ""
|
dongsheng@627
|
15913 "The <command>interdiff</command> command expects to be passed the names of "
|
dongsheng@627
|
15914 "two files, but the <literal role=\"hg-ext\">extdiff</literal> extension "
|
dongsheng@627
|
15915 "passes the program it runs a pair of directories, each of which can contain "
|
dongsheng@627
|
15916 "an arbitrary number of files. We thus need a small program that will run "
|
dongsheng@627
|
15917 "<command>interdiff</command> on each pair of files in these two directories. "
|
dongsheng@627
|
15918 "This program is available as <filename role=\"special\">hg-interdiff</"
|
dongsheng@627
|
15919 "filename> in the <filename class=\"directory\">examples</filename> directory "
|
dongsheng@627
|
15920 "of the source code repository that accompanies this book."
|
dongsheng@627
|
15921 msgstr ""
|
dongsheng@627
|
15922
|
dongsheng@627
|
15923 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15924 #: ../en/ch12-mq-collab.xml:478
|
dongsheng@627
|
15925 msgid ""
|
dongsheng@627
|
15926 "With the <filename role=\"special\">hg-interdiff</filename> program in your "
|
dongsheng@627
|
15927 "shell's search path, you can run it as follows, from inside an MQ patch "
|
dongsheng@627
|
15928 "directory:"
|
dongsheng@627
|
15929 msgstr ""
|
dongsheng@627
|
15930
|
dongsheng@627
|
15931 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15932 #: ../en/ch12-mq-collab.xml:482
|
dongsheng@627
|
15933 msgid ""
|
dongsheng@627
|
15934 "Since you'll probably want to use this long-winded command a lot, you can get "
|
dongsheng@627
|
15935 "<literal role=\"hg-ext\">hgext</literal> to make it available as a normal "
|
dongsheng@650
|
15936 "Mercurial command, again by editing your <filename role=\"special\">~/.hgrc</"
|
dongsheng@627
|
15937 "filename>."
|
dongsheng@627
|
15938 msgstr ""
|
dongsheng@627
|
15939
|
dongsheng@627
|
15940 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15941 #: ../en/ch12-mq-collab.xml:489
|
dongsheng@627
|
15942 msgid ""
|
dongsheng@627
|
15943 "This directs <literal role=\"hg-ext\">hgext</literal> to make an "
|
dongsheng@627
|
15944 "<literal>interdiff</literal> command available, so you can now shorten the "
|
dongsheng@627
|
15945 "previous invocation of <command role=\"hg-ext-extdiff\">extdiff</command> to "
|
dongsheng@627
|
15946 "something a little more wieldy."
|
dongsheng@627
|
15947 msgstr ""
|
dongsheng@627
|
15948
|
dongsheng@627
|
15949 #. type: Content of: <book><chapter><sect1><sect2><note><para>
|
dongsheng@650
|
15950 #: ../en/ch12-mq-collab.xml:497
|
dongsheng@627
|
15951 msgid ""
|
dongsheng@627
|
15952 "The <command>interdiff</command> command works well only if the underlying "
|
dongsheng@627
|
15953 "files against which versions of a patch are generated remain the same. If "
|
dongsheng@627
|
15954 "you create a patch, modify the underlying files, and then regenerate the "
|
dongsheng@627
|
15955 "patch, <command>interdiff</command> may not produce useful output."
|
dongsheng@627
|
15956 msgstr ""
|
dongsheng@627
|
15957
|
dongsheng@627
|
15958 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
15959 #: ../en/ch12-mq-collab.xml:505
|
dongsheng@627
|
15960 msgid ""
|
dongsheng@627
|
15961 "The <literal role=\"hg-ext\">extdiff</literal> extension is useful for more "
|
dongsheng@627
|
15962 "than merely improving the presentation of MQ patches. To read more about it, "
|
dongsheng@627
|
15963 "go to section <xref linkend=\"sec.hgext.extdiff\"/>."
|
dongsheng@627
|
15964 msgstr ""
|
dongsheng@627
|
15965
|
dongsheng@627
|
15966 #. type: Content of: <book><chapter><title>
|
dongsheng@650
|
15967 #: ../en/ch13-hgext.xml:5
|
dongsheng@627
|
15968 msgid "Adding functionality with extensions"
|
dongsheng@627
|
15969 msgstr "使用扩展增加功能"
|
dongsheng@627
|
15970
|
dongsheng@627
|
15971 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
15972 #: ../en/ch13-hgext.xml:7
|
dongsheng@627
|
15973 msgid ""
|
dongsheng@627
|
15974 "While the core of Mercurial is quite complete from a functionality "
|
dongsheng@627
|
15975 "standpoint, it's deliberately shorn of fancy features. This approach of "
|
dongsheng@627
|
15976 "preserving simplicity keeps the software easy to deal with for both "
|
dongsheng@627
|
15977 "maintainers and users."
|
dongsheng@627
|
15978 msgstr ""
|
dongsheng@627
|
15979
|
dongsheng@627
|
15980 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
15981 #: ../en/ch13-hgext.xml:12
|
dongsheng@627
|
15982 msgid ""
|
dongsheng@627
|
15983 "However, Mercurial doesn't box you in with an inflexible command set: you can "
|
dongsheng@627
|
15984 "add features to it as <emphasis>extensions</emphasis> (sometimes known as "
|
dongsheng@627
|
15985 "<emphasis>plugins</emphasis>). We've already discussed a few of these "
|
dongsheng@627
|
15986 "extensions in earlier chapters."
|
dongsheng@627
|
15987 msgstr ""
|
dongsheng@627
|
15988
|
dongsheng@627
|
15989 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
|
dongsheng@650
|
15990 #: ../en/ch13-hgext.xml:18
|
dongsheng@627
|
15991 msgid ""
|
dongsheng@627
|
15992 "Section <xref linkend=\"sec.tour-merge.fetch\"/> covers the <literal role="
|
dongsheng@627
|
15993 "\"hg-ext\">fetch</literal> extension; this combines pulling new changes and "
|
dongsheng@627
|
15994 "merging them with local changes into a single command, <command role=\"hg-ext-"
|
dongsheng@627
|
15995 "fetch\">fetch</command>."
|
dongsheng@627
|
15996 msgstr ""
|
dongsheng@627
|
15997
|
dongsheng@627
|
15998 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
|
dongsheng@650
|
15999 #: ../en/ch13-hgext.xml:24
|
dongsheng@627
|
16000 msgid ""
|
dongsheng@627
|
16001 "In chapter <xref linkend=\"chap.hook\"/>, we covered several extensions that "
|
dongsheng@627
|
16002 "are useful for hook-related functionality: <literal role=\"hg-ext\">acl</"
|
dongsheng@627
|
16003 "literal> adds access control lists; <literal role=\"hg-ext\">bugzilla</"
|
dongsheng@627
|
16004 "literal> adds integration with the Bugzilla bug tracking system; and <literal "
|
dongsheng@627
|
16005 "role=\"hg-ext\">notify</literal> sends notification emails on new changes."
|
dongsheng@627
|
16006 msgstr ""
|
dongsheng@627
|
16007
|
dongsheng@627
|
16008 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
|
dongsheng@650
|
16009 #: ../en/ch13-hgext.xml:33
|
dongsheng@627
|
16010 msgid ""
|
dongsheng@627
|
16011 "The Mercurial Queues patch management extension is so invaluable that it "
|
dongsheng@627
|
16012 "merits two chapters and an appendix all to itself. Chapter <xref linkend="
|
dongsheng@627
|
16013 "\"chap.mq\"/> covers the basics; chapter <xref linkend=\"chap.mq-collab\"/> "
|
dongsheng@627
|
16014 "discusses advanced topics; and appendix <xref linkend=\"chap.mqref\"/> goes "
|
dongsheng@627
|
16015 "into detail on each command."
|
dongsheng@627
|
16016 msgstr ""
|
dongsheng@627
|
16017
|
dongsheng@627
|
16018 #. type: Content of: <book><chapter><para>
|
dongsheng@650
|
16019 #: ../en/ch13-hgext.xml:43
|
dongsheng@627
|
16020 msgid ""
|
dongsheng@627
|
16021 "In this chapter, we'll cover some of the other extensions that are available "
|
dongsheng@627
|
16022 "for Mercurial, and briefly touch on some of the machinery you'll need to know "
|
dongsheng@627
|
16023 "about if you want to write an extension of your own."
|
dongsheng@627
|
16024 msgstr ""
|
dongsheng@627
|
16025
|
dongsheng@627
|
16026 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
|
dongsheng@650
|
16027 #: ../en/ch13-hgext.xml:48
|
dongsheng@627
|
16028 msgid ""
|
dongsheng@627
|
16029 "In section <xref linkend=\"sec.hgext.inotify\"/>, we'll discuss the "
|
dongsheng@627
|
16030 "possibility of <emphasis>huge</emphasis> performance improvements using the "
|
dongsheng@627
|
16031 "<literal role=\"hg-ext\">inotify</literal> extension."
|
dongsheng@627
|
16032 msgstr ""
|
dongsheng@627
|
16033
|
dongsheng@627
|
16034 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
16035 #: ../en/ch13-hgext.xml:55
|
dongsheng@627
|
16036 msgid ""
|
dongsheng@627
|
16037 "Improve performance with the <literal role=\"hg-ext\">inotify</literal> "
|
dongsheng@627
|
16038 "extension"
|
dongsheng@636
|
16039 msgstr "使用扩展 <literal role=\"hg-ext\">inotify</literal> 以提高性能"
|
dongsheng@627
|
16040
|
dongsheng@627
|
16041 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16042 #: ../en/ch13-hgext.xml:58
|
dongsheng@627
|
16043 msgid ""
|
dongsheng@627
|
16044 "Are you interested in having some of the most common Mercurial operations run "
|
dongsheng@627
|
16045 "as much as a hundred times faster? Read on!"
|
dongsheng@627
|
16046 msgstr ""
|
dongsheng@627
|
16047
|
dongsheng@627
|
16048 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16049 #: ../en/ch13-hgext.xml:62
|
dongsheng@627
|
16050 msgid ""
|
dongsheng@627
|
16051 "Mercurial has great performance under normal circumstances. For example, "
|
dongsheng@627
|
16052 "when you run the <command role=\"hg-cmd\">hg status</command> command, "
|
dongsheng@627
|
16053 "Mercurial has to scan almost every directory and file in your repository so "
|
dongsheng@627
|
16054 "that it can display file status. Many other Mercurial commands need to do "
|
dongsheng@627
|
16055 "the same work behind the scenes; for example, the <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
16056 "diff</command> command uses the status machinery to avoid doing an expensive "
|
dongsheng@627
|
16057 "comparison operation on files that obviously haven't changed."
|
dongsheng@627
|
16058 msgstr ""
|
dongsheng@627
|
16059
|
dongsheng@627
|
16060 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16061 #: ../en/ch13-hgext.xml:72
|
dongsheng@627
|
16062 msgid ""
|
dongsheng@627
|
16063 "Because obtaining file status is crucial to good performance, the authors of "
|
dongsheng@627
|
16064 "Mercurial have optimised this code to within an inch of its life. However, "
|
dongsheng@627
|
16065 "there's no avoiding the fact that when you run <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
16066 "status</command>, Mercurial is going to have to perform at least one "
|
dongsheng@627
|
16067 "expensive system call for each managed file to determine whether it's changed "
|
dongsheng@627
|
16068 "since the last time Mercurial checked. For a sufficiently large repository, "
|
dongsheng@627
|
16069 "this can take a long time."
|
dongsheng@627
|
16070 msgstr ""
|
dongsheng@627
|
16071
|
dongsheng@627
|
16072 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16073 #: ../en/ch13-hgext.xml:82
|
dongsheng@627
|
16074 msgid ""
|
dongsheng@627
|
16075 "To put a number on the magnitude of this effect, I created a repository "
|
dongsheng@627
|
16076 "containing 150,000 managed files. I timed <command role=\"hg-cmd\">hg "
|
dongsheng@627
|
16077 "status</command> as taking ten seconds to run, even when <emphasis>none</"
|
dongsheng@627
|
16078 "emphasis> of those files had been modified."
|
dongsheng@627
|
16079 msgstr ""
|
dongsheng@627
|
16080
|
dongsheng@627
|
16081 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16082 #: ../en/ch13-hgext.xml:88
|
dongsheng@627
|
16083 msgid ""
|
dongsheng@627
|
16084 "Many modern operating systems contain a file notification facility. If a "
|
dongsheng@627
|
16085 "program signs up to an appropriate service, the operating system will notify "
|
dongsheng@627
|
16086 "it every time a file of interest is created, modified, or deleted. On Linux "
|
dongsheng@627
|
16087 "systems, the kernel component that does this is called <literal>inotify</"
|
dongsheng@627
|
16088 "literal>."
|
dongsheng@627
|
16089 msgstr ""
|
dongsheng@627
|
16090
|
dongsheng@627
|
16091 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16092 #: ../en/ch13-hgext.xml:95
|
dongsheng@627
|
16093 msgid ""
|
dongsheng@627
|
16094 "Mercurial's <literal role=\"hg-ext\">inotify</literal> extension talks to the "
|
dongsheng@627
|
16095 "kernel's <literal>inotify</literal> component to optimise <command role=\"hg-"
|
dongsheng@627
|
16096 "cmd\">hg status</command> commands. The extension has two components. A "
|
dongsheng@627
|
16097 "daemon sits in the background and receives notifications from the "
|
dongsheng@627
|
16098 "<literal>inotify</literal> subsystem. It also listens for connections from a "
|
dongsheng@627
|
16099 "regular Mercurial command. The extension modifies Mercurial's behaviour so "
|
dongsheng@627
|
16100 "that instead of scanning the filesystem, it queries the daemon. Since the "
|
dongsheng@627
|
16101 "daemon has perfect information about the state of the repository, it can "
|
dongsheng@627
|
16102 "respond with a result instantaneously, avoiding the need to scan every "
|
dongsheng@627
|
16103 "directory and file in the repository."
|
dongsheng@627
|
16104 msgstr ""
|
dongsheng@627
|
16105
|
dongsheng@627
|
16106 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16107 #: ../en/ch13-hgext.xml:108
|
dongsheng@627
|
16108 msgid ""
|
dongsheng@627
|
16109 "Recall the ten seconds that I measured plain Mercurial as taking to run "
|
dongsheng@627
|
16110 "<command role=\"hg-cmd\">hg status</command> on a 150,000 file repository. "
|
dongsheng@627
|
16111 "With the <literal role=\"hg-ext\">inotify</literal> extension enabled, the "
|
dongsheng@627
|
16112 "time dropped to 0.1 seconds, a factor of <emphasis>one hundred</emphasis> "
|
dongsheng@627
|
16113 "faster."
|
dongsheng@627
|
16114 msgstr ""
|
dongsheng@627
|
16115
|
dongsheng@627
|
16116 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16117 #: ../en/ch13-hgext.xml:115
|
dongsheng@627
|
16118 msgid "Before we continue, please pay attention to some caveats."
|
dongsheng@627
|
16119 msgstr ""
|
dongsheng@627
|
16120
|
dongsheng@627
|
16121 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
16122 #: ../en/ch13-hgext.xml:118
|
dongsheng@627
|
16123 msgid ""
|
dongsheng@627
|
16124 "The <literal role=\"hg-ext\">inotify</literal> extension is Linux-specific. "
|
dongsheng@627
|
16125 "Because it interfaces directly to the Linux kernel's <literal>inotify</"
|
dongsheng@627
|
16126 "literal> subsystem, it does not work on other operating systems."
|
dongsheng@627
|
16127 msgstr ""
|
dongsheng@627
|
16128
|
dongsheng@627
|
16129 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
16130 #: ../en/ch13-hgext.xml:123
|
dongsheng@627
|
16131 msgid ""
|
dongsheng@627
|
16132 "It should work on any Linux distribution that was released after early 2005. "
|
dongsheng@627
|
16133 "Older distributions are likely to have a kernel that lacks <literal>inotify</"
|
dongsheng@627
|
16134 "literal>, or a version of <literal>glibc</literal> that does not have the "
|
dongsheng@627
|
16135 "necessary interfacing support."
|
dongsheng@627
|
16136 msgstr ""
|
dongsheng@627
|
16137
|
dongsheng@627
|
16138 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
|
dongsheng@650
|
16139 #: ../en/ch13-hgext.xml:130
|
dongsheng@627
|
16140 msgid ""
|
dongsheng@627
|
16141 "Not all filesystems are suitable for use with the <literal role=\"hg-ext"
|
dongsheng@627
|
16142 "\">inotify</literal> extension. Network filesystems such as NFS are a non-"
|
dongsheng@627
|
16143 "starter, for example, particularly if you're running Mercurial on several "
|
dongsheng@627
|
16144 "systems, all mounting the same network filesystem. The kernel's "
|
dongsheng@627
|
16145 "<literal>inotify</literal> system has no way of knowing about changes made on "
|
dongsheng@627
|
16146 "another system. Most local filesystems (e.g. ext3, XFS, ReiserFS) should "
|
dongsheng@627
|
16147 "work fine."
|
dongsheng@627
|
16148 msgstr ""
|
dongsheng@627
|
16149
|
dongsheng@627
|
16150 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16151 #: ../en/ch13-hgext.xml:141
|
dongsheng@627
|
16152 msgid ""
|
dongsheng@627
|
16153 "The <literal role=\"hg-ext\">inotify</literal> extension is not yet shipped "
|
dongsheng@627
|
16154 "with Mercurial as of May 2007, so it's a little more involved to set up than "
|
dongsheng@627
|
16155 "other extensions. But the performance improvement is worth it!"
|
dongsheng@627
|
16156 msgstr ""
|
dongsheng@627
|
16157
|
dongsheng@627
|
16158 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16159 #: ../en/ch13-hgext.xml:146
|
dongsheng@627
|
16160 msgid ""
|
dongsheng@627
|
16161 "The extension currently comes in two parts: a set of patches to the Mercurial "
|
dongsheng@627
|
16162 "source code, and a library of Python bindings to the <literal>inotify</"
|
dongsheng@627
|
16163 "literal> subsystem."
|
dongsheng@627
|
16164 msgstr ""
|
dongsheng@627
|
16165
|
dongsheng@627
|
16166 #. type: Content of: <book><chapter><sect1><note><para>
|
dongsheng@650
|
16167 #: ../en/ch13-hgext.xml:150
|
dongsheng@627
|
16168 msgid ""
|
dongsheng@627
|
16169 "There are <emphasis>two</emphasis> Python <literal>inotify</literal> binding "
|
dongsheng@627
|
16170 "libraries. One of them is called <literal>pyinotify</literal>, and is "
|
dongsheng@627
|
16171 "packaged by some Linux distributions as <literal>python-inotify</literal>. "
|
dongsheng@627
|
16172 "This is <emphasis>not</emphasis> the one you'll need, as it is too buggy and "
|
dongsheng@627
|
16173 "inefficient to be practical."
|
dongsheng@627
|
16174 msgstr ""
|
dongsheng@627
|
16175
|
dongsheng@627
|
16176 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16177 #: ../en/ch13-hgext.xml:157
|
dongsheng@627
|
16178 msgid ""
|
dongsheng@627
|
16179 "To get going, it's best to already have a functioning copy of Mercurial "
|
dongsheng@627
|
16180 "installed."
|
dongsheng@627
|
16181 msgstr ""
|
dongsheng@627
|
16182
|
dongsheng@627
|
16183 #. type: Content of: <book><chapter><sect1><note><para>
|
dongsheng@650
|
16184 #: ../en/ch13-hgext.xml:160
|
dongsheng@627
|
16185 msgid ""
|
dongsheng@627
|
16186 "If you follow the instructions below, you'll be <emphasis>replacing</"
|
dongsheng@627
|
16187 "emphasis> and overwriting any existing installation of Mercurial that you "
|
dongsheng@627
|
16188 "might already have, using the latest <quote>bleeding edge</quote> Mercurial "
|
dongsheng@627
|
16189 "code. Don't say you weren't warned!"
|
dongsheng@627
|
16190 msgstr ""
|
dongsheng@627
|
16191
|
dongsheng@627
|
16192 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
16193 #: ../en/ch13-hgext.xml:167
|
dongsheng@627
|
16194 msgid ""
|
dongsheng@627
|
16195 "Clone the Python <literal>inotify</literal> binding repository. Build and "
|
dongsheng@627
|
16196 "install it."
|
dongsheng@627
|
16197 msgstr ""
|
dongsheng@627
|
16198
|
dongsheng@627
|
16199 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
16200 #: ../en/ch13-hgext.xml:174
|
dongsheng@627
|
16201 msgid ""
|
dongsheng@627
|
16202 "Clone the <filename class=\"directory\">crew</filename> Mercurial "
|
dongsheng@627
|
16203 "repository. Clone the <literal role=\"hg-ext\">inotify</literal> patch "
|
dongsheng@627
|
16204 "repository so that Mercurial Queues will be able to apply patches to your "
|
dongsheng@627
|
16205 "cope of the <filename class=\"directory\">crew</filename> repository."
|
dongsheng@627
|
16206 msgstr ""
|
dongsheng@627
|
16207
|
dongsheng@627
|
16208 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
16209 #: ../en/ch13-hgext.xml:184
|
dongsheng@627
|
16210 msgid ""
|
dongsheng@627
|
16211 "Make sure that you have the Mercurial Queues extension, <literal role=\"hg-ext"
|
dongsheng@627
|
16212 "\">mq</literal>, enabled. If you've never used MQ, read section <xref "
|
dongsheng@627
|
16213 "linkend=\"sec.mq.start\"/> to get started quickly."
|
dongsheng@627
|
16214 msgstr ""
|
dongsheng@627
|
16215
|
dongsheng@627
|
16216 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
16217 #: ../en/ch13-hgext.xml:190
|
dongsheng@627
|
16218 msgid ""
|
dongsheng@627
|
16219 "Go into the <filename class=\"directory\">inotify</filename> repo, and apply "
|
dongsheng@627
|
16220 "all of the <literal role=\"hg-ext\">inotify</literal> patches using the "
|
dongsheng@627
|
16221 "<option role=\"hg-ext-mq-cmd-qpush-opt\">hg -a</option> option to the "
|
dongsheng@627
|
16222 "<command role=\"hg-ext-mq\">qpush</command> command."
|
dongsheng@627
|
16223 msgstr ""
|
dongsheng@627
|
16224
|
dongsheng@627
|
16225 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
16226 #: ../en/ch13-hgext.xml:199
|
dongsheng@627
|
16227 msgid ""
|
dongsheng@627
|
16228 "If you get an error message from <command role=\"hg-ext-mq\">qpush</command>, "
|
dongsheng@627
|
16229 "you should not continue. Instead, ask for help."
|
dongsheng@627
|
16230 msgstr ""
|
dongsheng@627
|
16231
|
dongsheng@627
|
16232 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
|
dongsheng@650
|
16233 #: ../en/ch13-hgext.xml:203
|
dongsheng@627
|
16234 msgid "Build and install the patched version of Mercurial."
|
dongsheng@627
|
16235 msgstr ""
|
dongsheng@627
|
16236
|
dongsheng@627
|
16237 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16238 #: ../en/ch13-hgext.xml:209
|
dongsheng@627
|
16239 msgid ""
|
dongsheng@627
|
16240 "Once you've build a suitably patched version of Mercurial, all you need to do "
|
dongsheng@627
|
16241 "to enable the <literal role=\"hg-ext\">inotify</literal> extension is add an "
|
dongsheng@650
|
16242 "entry to your <filename role=\"special\">~/.hgrc</filename>."
|
dongsheng@650
|
16243 msgstr ""
|
dongsheng@650
|
16244
|
dongsheng@650
|
16245 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16246 #: ../en/ch13-hgext.xml:214
|
dongsheng@627
|
16247 msgid ""
|
dongsheng@627
|
16248 "When the <literal role=\"hg-ext\">inotify</literal> extension is enabled, "
|
dongsheng@627
|
16249 "Mercurial will automatically and transparently start the status daemon the "
|
dongsheng@627
|
16250 "first time you run a command that needs status in a repository. It runs one "
|
dongsheng@627
|
16251 "status daemon per repository."
|
dongsheng@627
|
16252 msgstr ""
|
dongsheng@627
|
16253
|
dongsheng@627
|
16254 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16255 #: ../en/ch13-hgext.xml:220
|
dongsheng@627
|
16256 msgid ""
|
dongsheng@627
|
16257 "The status daemon is started silently, and runs in the background. If you "
|
dongsheng@627
|
16258 "look at a list of running processes after you've enabled the <literal role="
|
dongsheng@627
|
16259 "\"hg-ext\">inotify</literal> extension and run a few commands in different "
|
dongsheng@627
|
16260 "repositories, you'll thus see a few <literal>hg</literal> processes sitting "
|
dongsheng@627
|
16261 "around, waiting for updates from the kernel and queries from Mercurial."
|
dongsheng@627
|
16262 msgstr ""
|
dongsheng@627
|
16263
|
dongsheng@627
|
16264 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16265 #: ../en/ch13-hgext.xml:228
|
dongsheng@627
|
16266 msgid ""
|
dongsheng@627
|
16267 "The first time you run a Mercurial command in a repository when you have the "
|
dongsheng@627
|
16268 "<literal role=\"hg-ext\">inotify</literal> extension enabled, it will run "
|
dongsheng@627
|
16269 "with about the same performance as a normal Mercurial command. This is "
|
dongsheng@627
|
16270 "because the status daemon needs to perform a normal status scan so that it "
|
dongsheng@627
|
16271 "has a baseline against which to apply later updates from the kernel. "
|
dongsheng@627
|
16272 "However, <emphasis>every</emphasis> subsequent command that does any kind of "
|
dongsheng@627
|
16273 "status check should be noticeably faster on repositories of even fairly "
|
dongsheng@627
|
16274 "modest size. Better yet, the bigger your repository is, the greater a "
|
dongsheng@627
|
16275 "performance advantage you'll see. The <literal role=\"hg-ext\">inotify</"
|
dongsheng@627
|
16276 "literal> daemon makes status operations almost instantaneous on repositories "
|
dongsheng@627
|
16277 "of all sizes!"
|
dongsheng@627
|
16278 msgstr ""
|
dongsheng@627
|
16279
|
dongsheng@627
|
16280 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16281 #: ../en/ch13-hgext.xml:242
|
dongsheng@627
|
16282 msgid ""
|
dongsheng@627
|
16283 "If you like, you can manually start a status daemon using the <command role="
|
dongsheng@627
|
16284 "\"hg-ext-inotify\">inserve</command> command. This gives you slightly finer "
|
dongsheng@627
|
16285 "control over how the daemon ought to run. This command will of course only "
|
dongsheng@627
|
16286 "be available when the <literal role=\"hg-ext\">inotify</literal> extension is "
|
dongsheng@627
|
16287 "enabled."
|
dongsheng@627
|
16288 msgstr ""
|
dongsheng@627
|
16289
|
dongsheng@627
|
16290 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16291 #: ../en/ch13-hgext.xml:249
|
dongsheng@627
|
16292 msgid ""
|
dongsheng@627
|
16293 "When you're using the <literal role=\"hg-ext\">inotify</literal> extension, "
|
dongsheng@627
|
16294 "you should notice <emphasis>no difference at all</emphasis> in Mercurial's "
|
dongsheng@627
|
16295 "behaviour, with the sole exception of status-related commands running a whole "
|
dongsheng@627
|
16296 "lot faster than they used to. You should specifically expect that commands "
|
dongsheng@627
|
16297 "will not print different output; neither should they give different results. "
|
dongsheng@627
|
16298 "If either of these situations occurs, please report a bug."
|
dongsheng@627
|
16299 msgstr ""
|
dongsheng@627
|
16300
|
dongsheng@627
|
16301 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
16302 #: ../en/ch13-hgext.xml:260
|
dongsheng@627
|
16303 msgid ""
|
dongsheng@627
|
16304 "Flexible diff support with the <literal role=\"hg-ext\">extdiff</literal> "
|
dongsheng@627
|
16305 "extension"
|
dongsheng@636
|
16306 msgstr "使用扩展 <literal role=\"hg-ext\">extdiff</literal> 以扩展差异支持"
|
dongsheng@627
|
16307
|
dongsheng@627
|
16308 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16309 #: ../en/ch13-hgext.xml:263
|
dongsheng@627
|
16310 msgid ""
|
dongsheng@627
|
16311 "Mercurial's built-in <command role=\"hg-cmd\">hg diff</command> command "
|
dongsheng@627
|
16312 "outputs plaintext unified diffs."
|
dongsheng@627
|
16313 msgstr ""
|
dongsheng@627
|
16314 "Mercurial 内置命令 <command role=\"hg-cmd\">hg diff</command> 的输出与统一差异"
|
dongsheng@627
|
16315 "不同。"
|
dongsheng@627
|
16316
|
dongsheng@627
|
16317 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16318 #: ../en/ch13-hgext.xml:268
|
dongsheng@627
|
16319 msgid ""
|
dongsheng@627
|
16320 "If you would like to use an external tool to display modifications, you'll "
|
dongsheng@627
|
16321 "want to use the <literal role=\"hg-ext\">extdiff</literal> extension. This "
|
dongsheng@627
|
16322 "will let you use, for example, a graphical diff tool."
|
dongsheng@627
|
16323 msgstr ""
|
dongsheng@627
|
16324
|
dongsheng@627
|
16325 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16326 #: ../en/ch13-hgext.xml:273
|
dongsheng@627
|
16327 msgid ""
|
dongsheng@627
|
16328 "The <literal role=\"hg-ext\">extdiff</literal> extension is bundled with "
|
dongsheng@627
|
16329 "Mercurial, so it's easy to set up. In the <literal role=\"rc-extensions"
|
dongsheng@650
|
16330 "\">extensions</literal> section of your <filename role=\"special\">~/.hgrc</"
|
dongsheng@627
|
16331 "filename>, simply add a one-line entry to enable the extension."
|
dongsheng@627
|
16332 msgstr ""
|
dongsheng@627
|
16333
|
dongsheng@627
|
16334 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16335 #: ../en/ch13-hgext.xml:280
|
dongsheng@627
|
16336 msgid ""
|
dongsheng@627
|
16337 "This introduces a command named <command role=\"hg-ext-extdiff\">extdiff</"
|
dongsheng@627
|
16338 "command>, which by default uses your system's <command>diff</command> command "
|
dongsheng@627
|
16339 "to generate a unified diff in the same form as the built-in <command role="
|
dongsheng@627
|
16340 "\"hg-cmd\">hg diff</command> command."
|
dongsheng@627
|
16341 msgstr ""
|
dongsheng@627
|
16342
|
dongsheng@627
|
16343 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16344 #: ../en/ch13-hgext.xml:288
|
dongsheng@627
|
16345 msgid ""
|
dongsheng@627
|
16346 "The result won't be exactly the same as with the built-in <command role=\"hg-"
|
dongsheng@627
|
16347 "cmd\">hg diff</command> variations, because the output of <command>diff</"
|
dongsheng@627
|
16348 "command> varies from one system to another, even when passed the same options."
|
dongsheng@627
|
16349 msgstr ""
|
dongsheng@627
|
16350
|
dongsheng@627
|
16351 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16352 #: ../en/ch13-hgext.xml:293
|
dongsheng@627
|
16353 msgid ""
|
dongsheng@627
|
16354 "As the <quote><literal>making snapshot</literal></quote> lines of output "
|
dongsheng@627
|
16355 "above imply, the <command role=\"hg-ext-extdiff\">extdiff</command> command "
|
dongsheng@627
|
16356 "works by creating two snapshots of your source tree. The first snapshot is "
|
dongsheng@627
|
16357 "of the source revision; the second, of the target revision or working "
|
dongsheng@627
|
16358 "directory. The <command role=\"hg-ext-extdiff\">extdiff</command> command "
|
dongsheng@627
|
16359 "generates these snapshots in a temporary directory, passes the name of each "
|
dongsheng@627
|
16360 "directory to an external diff viewer, then deletes the temporary directory. "
|
dongsheng@627
|
16361 "For efficiency, it only snapshots the directories and files that have changed "
|
dongsheng@627
|
16362 "between the two revisions."
|
dongsheng@627
|
16363 msgstr ""
|
dongsheng@627
|
16364
|
dongsheng@627
|
16365 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16366 #: ../en/ch13-hgext.xml:306
|
dongsheng@627
|
16367 msgid ""
|
dongsheng@627
|
16368 "Snapshot directory names have the same base name as your repository. If your "
|
dongsheng@627
|
16369 "repository path is <filename class=\"directory\">/quux/bar/foo</filename>, "
|
dongsheng@627
|
16370 "then <filename class=\"directory\">foo</filename> will be the name of each "
|
dongsheng@627
|
16371 "snapshot directory. Each snapshot directory name has its changeset ID "
|
dongsheng@627
|
16372 "appended, if appropriate. If a snapshot is of revision "
|
dongsheng@627
|
16373 "<literal>a631aca1083f</literal>, the directory will be named <filename class="
|
dongsheng@627
|
16374 "\"directory\">foo.a631aca1083f</filename>. A snapshot of the working "
|
dongsheng@627
|
16375 "directory won't have a changeset ID appended, so it would just be <filename "
|
dongsheng@627
|
16376 "class=\"directory\">foo</filename> in this example. To see what this looks "
|
dongsheng@627
|
16377 "like in practice, look again at the <command role=\"hg-ext-extdiff\">extdiff</"
|
dongsheng@627
|
16378 "command> example above. Notice that the diff has the snapshot directory "
|
dongsheng@627
|
16379 "names embedded in its header."
|
dongsheng@627
|
16380 msgstr ""
|
dongsheng@627
|
16381
|
dongsheng@627
|
16382 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16383 #: ../en/ch13-hgext.xml:322
|
dongsheng@627
|
16384 msgid ""
|
dongsheng@627
|
16385 "The <command role=\"hg-ext-extdiff\">extdiff</command> command accepts two "
|
dongsheng@627
|
16386 "important options. The <option role=\"hg-ext-extdiff-cmd-extdiff-opt\">hg -p</"
|
dongsheng@627
|
16387 "option> option lets you choose a program to view differences with, instead of "
|
dongsheng@627
|
16388 "<command>diff</command>. With the <option role=\"hg-ext-extdiff-cmd-extdiff-"
|
dongsheng@627
|
16389 "opt\">hg -o</option> option, you can change the options that <command role="
|
dongsheng@627
|
16390 "\"hg-ext-extdiff\">extdiff</command> passes to the program (by default, these "
|
dongsheng@627
|
16391 "options are <quote><literal>-Npru</literal></quote>, which only make sense if "
|
dongsheng@627
|
16392 "you're running <command>diff</command>). In other respects, the <command "
|
dongsheng@627
|
16393 "role=\"hg-ext-extdiff\">extdiff</command> command acts similarly to the built-"
|
dongsheng@627
|
16394 "in <command role=\"hg-cmd\">hg diff</command> command: you use the same "
|
dongsheng@627
|
16395 "option names, syntax, and arguments to specify the revisions you want, the "
|
dongsheng@627
|
16396 "files you want, and so on."
|
dongsheng@627
|
16397 msgstr ""
|
dongsheng@627
|
16398
|
dongsheng@627
|
16399 #
|
dongsheng@627
|
16400 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16401 #: ../en/ch13-hgext.xml:339
|
dongsheng@627
|
16402 msgid ""
|
dongsheng@627
|
16403 "As an example, here's how to run the normal system <command>diff</command> "
|
dongsheng@627
|
16404 "command, getting it to generate context diffs (using the <option role=\"cmd-"
|
dongsheng@627
|
16405 "opt-diff\">-c</option> option) instead of unified diffs, and five lines of "
|
dongsheng@627
|
16406 "context instead of the default three (passing <literal>5</literal> as the "
|
dongsheng@627
|
16407 "argument to the <option role=\"cmd-opt-diff\">-C</option> option)."
|
dongsheng@627
|
16408 msgstr ""
|
dongsheng@627
|
16409
|
dongsheng@627
|
16410 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16411 #: ../en/ch13-hgext.xml:348
|
dongsheng@627
|
16412 msgid ""
|
dongsheng@627
|
16413 "Launching a visual diff tool is just as easy. Here's how to launch the "
|
dongsheng@627
|
16414 "<command>kdiff3</command> viewer."
|
dongsheng@627
|
16415 msgstr ""
|
dongsheng@627
|
16416
|
dongsheng@627
|
16417 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16418 #: ../en/ch13-hgext.xml:352
|
dongsheng@627
|
16419 msgid ""
|
dongsheng@627
|
16420 "If your diff viewing command can't deal with directories, you can easily work "
|
dongsheng@627
|
16421 "around this with a little scripting. For an example of such scripting in "
|
dongsheng@627
|
16422 "action with the <literal role=\"hg-ext\">mq</literal> extension and the "
|
dongsheng@627
|
16423 "<command>interdiff</command> command, see section <xref linkend=\"mq-collab."
|
dongsheng@627
|
16424 "tips.interdiff\"/>."
|
dongsheng@627
|
16425 msgstr ""
|
dongsheng@627
|
16426
|
dongsheng@627
|
16427 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
16428 #: ../en/ch13-hgext.xml:360
|
dongsheng@627
|
16429 msgid "Defining command aliases"
|
dongsheng@636
|
16430 msgstr "定义命令的别名"
|
dongsheng@627
|
16431
|
dongsheng@627
|
16432 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
16433 #: ../en/ch13-hgext.xml:362
|
dongsheng@627
|
16434 msgid ""
|
dongsheng@627
|
16435 "It can be cumbersome to remember the options to both the <command role=\"hg-"
|
dongsheng@627
|
16436 "ext-extdiff\">extdiff</command> command and the diff viewer you want to use, "
|
dongsheng@627
|
16437 "so the <literal role=\"hg-ext\">extdiff</literal> extension lets you define "
|
dongsheng@627
|
16438 "<emphasis>new</emphasis> commands that will invoke your diff viewer with "
|
dongsheng@627
|
16439 "exactly the right options."
|
dongsheng@627
|
16440 msgstr ""
|
dongsheng@627
|
16441
|
dongsheng@627
|
16442 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
16443 #: ../en/ch13-hgext.xml:369
|
dongsheng@650
|
16444 msgid ""
|
dongsheng@650
|
16445 "All you need to do is edit your <filename role=\"special\">~/.hgrc</"
|
dongsheng@627
|
16446 "filename>, and add a section named <literal role=\"rc-extdiff\">extdiff</"
|
dongsheng@627
|
16447 "literal>. Inside this section, you can define multiple commands. Here's how "
|
dongsheng@627
|
16448 "to add a <literal>kdiff3</literal> command. Once you've defined this, you "
|
dongsheng@627
|
16449 "can type <quote><literal>hg kdiff3</literal></quote> and the <literal role="
|
dongsheng@627
|
16450 "\"hg-ext\">extdiff</literal> extension will run <command>kdiff3</command> for "
|
dongsheng@627
|
16451 "you."
|
dongsheng@627
|
16452 msgstr ""
|
dongsheng@627
|
16453
|
dongsheng@627
|
16454 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
16455 #: ../en/ch13-hgext.xml:379
|
dongsheng@627
|
16456 msgid ""
|
dongsheng@627
|
16457 "If you leave the right hand side of the definition empty, as above, the "
|
dongsheng@627
|
16458 "<literal role=\"hg-ext\">extdiff</literal> extension uses the name of the "
|
dongsheng@627
|
16459 "command you defined as the name of the external program to run. But these "
|
dongsheng@627
|
16460 "names don't have to be the same. Here, we define a command named "
|
dongsheng@627
|
16461 "<quote><literal>hg wibble</literal></quote>, which runs <command>kdiff3</"
|
dongsheng@627
|
16462 "command>."
|
dongsheng@627
|
16463 msgstr ""
|
dongsheng@627
|
16464
|
dongsheng@627
|
16465 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
16466 #: ../en/ch13-hgext.xml:389
|
dongsheng@627
|
16467 msgid ""
|
dongsheng@627
|
16468 "You can also specify the default options that you want to invoke your diff "
|
dongsheng@627
|
16469 "viewing program with. The prefix to use is <quote><literal>opts.</literal></"
|
dongsheng@627
|
16470 "quote>, followed by the name of the command to which the options apply. This "
|
dongsheng@627
|
16471 "example defines a <quote><literal>hg vimdiff</literal></quote> command that "
|
dongsheng@627
|
16472 "runs the <command>vim</command> editor's <literal>DirDiff</literal> extension."
|
dongsheng@627
|
16473 msgstr ""
|
dongsheng@627
|
16474
|
dongsheng@627
|
16475 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
16476 #: ../en/ch13-hgext.xml:403
|
dongsheng@627
|
16477 msgid ""
|
dongsheng@627
|
16478 "Cherrypicking changes with the <literal role=\"hg-ext\">transplant</literal> "
|
dongsheng@627
|
16479 "extension"
|
dongsheng@636
|
16480 msgstr "使用扩展 <literal role=\"hg-ext\">transplant</literal> 以挑选修改"
|
dongsheng@627
|
16481
|
dongsheng@627
|
16482 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16483 #: ../en/ch13-hgext.xml:406
|
dongsheng@627
|
16484 msgid "Need to have a long chat with Brendan about this."
|
dongsheng@627
|
16485 msgstr ""
|
dongsheng@627
|
16486
|
dongsheng@627
|
16487 #. type: Content of: <book><chapter><sect1><title>
|
dongsheng@650
|
16488 #: ../en/ch13-hgext.xml:410
|
dongsheng@627
|
16489 msgid ""
|
dongsheng@627
|
16490 "Send changes via email with the <literal role=\"hg-ext\">patchbomb</literal> "
|
dongsheng@627
|
16491 "extension"
|
dongsheng@627
|
16492 msgstr ""
|
dongsheng@636
|
16493 "使用扩展 <literal role=\"hg-ext\">patchbomb</literal> 通过 email 发送修改"
|
dongsheng@627
|
16494
|
dongsheng@627
|
16495 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16496 #: ../en/ch13-hgext.xml:413
|
dongsheng@627
|
16497 msgid ""
|
dongsheng@627
|
16498 "Many projects have a culture of <quote>change review</quote>, in which people "
|
dongsheng@627
|
16499 "send their modifications to a mailing list for others to read and comment on "
|
dongsheng@627
|
16500 "before they commit the final version to a shared repository. Some projects "
|
dongsheng@627
|
16501 "have people who act as gatekeepers; they apply changes from other people to a "
|
dongsheng@627
|
16502 "repository to which those others don't have access."
|
dongsheng@627
|
16503 msgstr ""
|
dongsheng@627
|
16504
|
dongsheng@627
|
16505 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16506 #: ../en/ch13-hgext.xml:421
|
dongsheng@627
|
16507 msgid ""
|
dongsheng@627
|
16508 "Mercurial makes it easy to send changes over email for review or application, "
|
dongsheng@627
|
16509 "via its <literal role=\"hg-ext\">patchbomb</literal> extension. The "
|
dongsheng@627
|
16510 "extension is so named because changes are formatted as patches, and it's "
|
dongsheng@627
|
16511 "usual to send one changeset per email message. Sending a long series of "
|
dongsheng@627
|
16512 "changes by email is thus much like <quote>bombing</quote> the recipient's "
|
dongsheng@627
|
16513 "inbox, hence <quote>patchbomb</quote>."
|
dongsheng@627
|
16514 msgstr ""
|
dongsheng@627
|
16515
|
dongsheng@627
|
16516 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16517 #: ../en/ch13-hgext.xml:429
|
dongsheng@627
|
16518 msgid ""
|
dongsheng@627
|
16519 "As usual, the basic configuration of the <literal role=\"hg-ext\">patchbomb</"
|
dongsheng@627
|
16520 "literal> extension takes just one or two lines in your <filename role="
|
dongsheng@627
|
16521 "\"special\"> /.hgrc</filename>."
|
dongsheng@627
|
16522 msgstr ""
|
dongsheng@627
|
16523
|
dongsheng@627
|
16524 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16525 #: ../en/ch13-hgext.xml:435
|
dongsheng@627
|
16526 msgid ""
|
dongsheng@627
|
16527 "Once you've enabled the extension, you will have a new command available, "
|
dongsheng@627
|
16528 "named <command role=\"hg-ext-patchbomb\">email</command>."
|
dongsheng@627
|
16529 msgstr ""
|
dongsheng@627
|
16530
|
dongsheng@627
|
16531 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16532 #: ../en/ch13-hgext.xml:439
|
dongsheng@627
|
16533 msgid ""
|
dongsheng@627
|
16534 "The safest and best way to invoke the <command role=\"hg-ext-patchbomb"
|
dongsheng@627
|
16535 "\">email</command> command is to <emphasis>always</emphasis> run it first "
|
dongsheng@627
|
16536 "with the <option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -n</option> "
|
dongsheng@627
|
16537 "option. This will show you what the command <emphasis>would</emphasis> send, "
|
dongsheng@627
|
16538 "without actually sending anything. Once you've had a quick glance over the "
|
dongsheng@627
|
16539 "changes and verified that you are sending the right ones, you can rerun the "
|
dongsheng@627
|
16540 "same command, with the <option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -n</"
|
dongsheng@627
|
16541 "option> option removed."
|
dongsheng@627
|
16542 msgstr ""
|
dongsheng@627
|
16543
|
dongsheng@627
|
16544 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16545 #: ../en/ch13-hgext.xml:450
|
dongsheng@627
|
16546 msgid ""
|
dongsheng@627
|
16547 "The <command role=\"hg-ext-patchbomb\">email</command> command accepts the "
|
dongsheng@627
|
16548 "same kind of revision syntax as every other Mercurial command. For example, "
|
dongsheng@627
|
16549 "this command will send every revision between 7 and <literal>tip</literal>, "
|
dongsheng@627
|
16550 "inclusive."
|
dongsheng@627
|
16551 msgstr ""
|
dongsheng@627
|
16552
|
dongsheng@627
|
16553 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16554 #: ../en/ch13-hgext.xml:455
|
dongsheng@627
|
16555 msgid ""
|
dongsheng@627
|
16556 "You can also specify a <emphasis>repository</emphasis> to compare with. If "
|
dongsheng@627
|
16557 "you provide a repository but no revisions, the <command role=\"hg-ext-"
|
dongsheng@627
|
16558 "patchbomb\">email</command> command will send all revisions in the local "
|
dongsheng@627
|
16559 "repository that are not present in the remote repository. If you "
|
dongsheng@627
|
16560 "additionally specify revisions or a branch name (the latter using the <option "
|
dongsheng@627
|
16561 "role=\"hg-ext-patchbomb-cmd-email-opt\">hg -b</option> option), this will "
|
dongsheng@627
|
16562 "constrain the revisions sent."
|
dongsheng@627
|
16563 msgstr ""
|
dongsheng@627
|
16564
|
dongsheng@627
|
16565 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16566 #: ../en/ch13-hgext.xml:464
|
dongsheng@627
|
16567 msgid ""
|
dongsheng@627
|
16568 "It's perfectly safe to run the <command role=\"hg-ext-patchbomb\">email</"
|
dongsheng@627
|
16569 "command> command without the names of the people you want to send to: if you "
|
dongsheng@627
|
16570 "do this, it will just prompt you for those values interactively. (If you're "
|
dongsheng@627
|
16571 "using a Linux or Unix-like system, you should have enhanced "
|
dongsheng@627
|
16572 "<literal>readline</literal>-style editing capabilities when entering those "
|
dongsheng@627
|
16573 "headers, too, which is useful.)"
|
dongsheng@627
|
16574 msgstr ""
|
dongsheng@627
|
16575
|
dongsheng@627
|
16576 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16577 #: ../en/ch13-hgext.xml:472
|
dongsheng@627
|
16578 msgid ""
|
dongsheng@627
|
16579 "When you are sending just one revision, the <command role=\"hg-ext-patchbomb"
|
dongsheng@627
|
16580 "\">email</command> command will by default use the first line of the "
|
dongsheng@627
|
16581 "changeset description as the subject of the single email message it sends."
|
dongsheng@627
|
16582 msgstr ""
|
dongsheng@627
|
16583
|
dongsheng@627
|
16584 #. type: Content of: <book><chapter><sect1><para>
|
dongsheng@650
|
16585 #: ../en/ch13-hgext.xml:477
|
dongsheng@627
|
16586 msgid ""
|
dongsheng@627
|
16587 "If you send multiple revisions, the <command role=\"hg-ext-patchbomb\">email</"
|
dongsheng@627
|
16588 "command> command will usually send one message per changeset. It will "
|
dongsheng@627
|
16589 "preface the series with an introductory message, in which you should describe "
|
dongsheng@627
|
16590 "the purpose of the series of changes you're sending."
|
dongsheng@627
|
16591 msgstr ""
|
dongsheng@627
|
16592
|
dongsheng@627
|
16593 #. type: Content of: <book><chapter><sect1><sect2><title>
|
dongsheng@650
|
16594 #: ../en/ch13-hgext.xml:484
|
dongsheng@627
|
16595 msgid "Changing the behaviour of patchbombs"
|
dongsheng@636
|
16596 msgstr "修改 patchbomb 的行为"
|
dongsheng@627
|
16597
|
dongsheng@627
|
16598 #. type: Content of: <book><chapter><sect1><sect2><para>
|
dongsheng@650
|
16599 #: ../en/ch13-hgext.xml:486
|
dongsheng@627
|
16600 msgid ""
|
dongsheng@627
|
16601 "Not every project has exactly the same conventions for sending changes in "
|
dongsheng@627
|
16602 "email; the <literal role=\"hg-ext\">patchbomb</literal> extension tries to "
|
dongsheng@627
|
16603 "accommodate a number of variations through command line options."
|
dongsheng@627
|
16604 msgstr ""
|
dongsheng@627
|
16605
|
dongsheng@627
|
16606 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
16607 #: ../en/ch13-hgext.xml:492
|
dongsheng@627
|
16608 msgid ""
|
dongsheng@627
|
16609 "You can write a subject for the introductory message on the command line "
|
dongsheng@627
|
16610 "using the <option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -s</option> "
|
dongsheng@627
|
16611 "option. This takes one argument, the text of the subject to use."
|
dongsheng@627
|
16612 msgstr ""
|
dongsheng@627
|
16613
|
dongsheng@627
|
16614 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
16615 #: ../en/ch13-hgext.xml:498
|
dongsheng@627
|
16616 msgid ""
|
dongsheng@627
|
16617 "To change the email address from which the messages originate, use the "
|
dongsheng@627
|
16618 "<option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -f</option> option. This "
|
dongsheng@627
|
16619 "takes one argument, the email address to use."
|
dongsheng@627
|
16620 msgstr ""
|
dongsheng@627
|
16621
|
dongsheng@627
|
16622 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
16623 #: ../en/ch13-hgext.xml:504
|
dongsheng@627
|
16624 msgid ""
|
dongsheng@627
|
16625 "The default behaviour is to send unified diffs (see section <xref linkend="
|
dongsheng@627
|
16626 "\"sec.mq.patch\"/> for a description of the format), one per message. You "
|
dongsheng@627
|
16627 "can send a binary bundle instead with the <option role=\"hg-ext-patchbomb-cmd-"
|
dongsheng@627
|
16628 "email-opt\">hg -b</option> option."
|
dongsheng@627
|
16629 msgstr ""
|
dongsheng@627
|
16630
|
dongsheng@627
|
16631 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
16632 #: ../en/ch13-hgext.xml:512
|
dongsheng@627
|
16633 msgid ""
|
dongsheng@627
|
16634 "Unified diffs are normally prefaced with a metadata header. You can omit "
|
dongsheng@627
|
16635 "this, and send unadorned diffs, with the <option role=\"hg-ext-patchbomb-cmd-"
|
dongsheng@627
|
16636 "email-opt\">hg --plain</option> option."
|
dongsheng@627
|
16637 msgstr ""
|
dongsheng@627
|
16638
|
dongsheng@627
|
16639 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
16640 #: ../en/ch13-hgext.xml:518
|
dongsheng@627
|
16641 msgid ""
|
dongsheng@627
|
16642 "Diffs are normally sent <quote>inline</quote>, in the same body part as the "
|
dongsheng@627
|
16643 "description of a patch. This makes it easiest for the largest number of "
|
dongsheng@627
|
16644 "readers to quote and respond to parts of a diff, as some mail clients will "
|
dongsheng@627
|
16645 "only quote the first MIME body part in a message. If you'd prefer to send the "
|
dongsheng@627
|
16646 "description and the diff in separate body parts, use the <option role=\"hg-"
|
dongsheng@627
|
16647 "ext-patchbomb-cmd-email-opt\">hg -a</option> option."
|
dongsheng@627
|
16648 msgstr ""
|
dongsheng@627
|
16649
|
dongsheng@627
|
16650 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
16651 #: ../en/ch13-hgext.xml:528
|
dongsheng@627
|
16652 msgid ""
|
dongsheng@627
|
16653 "Instead of sending mail messages, you can write them to an <literal>mbox</"
|
dongsheng@627
|
16654 "literal>-format mail folder using the <option role=\"hg-ext-patchbomb-cmd-"
|
dongsheng@627
|
16655 "email-opt\">hg -m</option> option. That option takes one argument, the name "
|
dongsheng@627
|
16656 "of the file to write to."
|
dongsheng@627
|
16657 msgstr ""
|
dongsheng@627
|
16658
|
dongsheng@627
|
16659 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
|
dongsheng@650
|
16660 #: ../en/ch13-hgext.xml:535
|
dongsheng@627
|
16661 msgid ""
|
dongsheng@627
|
16662 "If you would like to add a <command>diffstat</command>-format summary to each "
|
dongsheng@627
|
16663 "patch, and one to the introductory message, use the <option role=\"hg-ext-"
|
dongsheng@627
|
16664 "patchbomb-cmd-email-opt\">hg -d</option> option. The <command>diffstat</"
|
dongsheng@627
|
16665 "command> command displays a table containing the name of each file patched, "
|
dongsheng@627
|
16666 "the number of lines affected, and a histogram showing how much each file is "
|
dongsheng@627
|
16667 "modified. This gives readers a qualitative glance at how complex a patch is."
|
dongsheng@627
|
16668 msgstr ""
|