hgbook

annotate po/zh.po @ 665:53f179393f5c

Update Chinese translation
author Dongsheng Song <songdongsheng@live.cn>
date Tue Mar 31 14:54:24 2009 +0800 (2009-03-31)
parents 65b82a891cf7
children 3b33dd6aba87
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 # Check translation:
dongsheng@627 9 # msgfmt --statistics -c -o zh.mo zh.po
dongsheng@627 10 #
dongsheng@627 11 # Please format your translation before commit:
dongsheng@627 12 # msgcat --sort-by-file --width=80 -o zh_new.po zh.po
dongsheng@627 13 # mv -f zh_new.po zh.po
dongsheng@627 14 #
dongsheng@627 15 # Dictionary:
dongsheng@627 16 # blame 追溯
dongsheng@627 17 # branch 分支
dongsheng@627 18 # changes 修改
dongsheng@627 19 # changeset 修改集
dongsheng@627 20 # checkout 检出
dongsheng@627 21 # remove 移除(从版本库删除)
dongsheng@627 22 # delete 删除(只从文件系统删除)
dongsheng@660 23 # filelog 文件日志
dongsheng@627 24 # patchset 补丁集
dongsheng@627 25 # pushing to 推到
dongsheng@635 26 # pulling from 拉自,抓取
dongsheng@627 27 # rename 改名
dongsheng@627 28 # repository 版本库
dongsheng@627 29 # revert 恢复
dongsheng@627 30 # revision 版本
dongsheng@660 31 # revlog 版本日志
dongsheng@627 32 # tag 标签
dongsheng@627 33 # tip 顶点
dongsheng@627 34 # undo 撤销
dongsheng@627 35 # unversioned 未版本控制
dongsheng@660 36 # updated 更新到,同步到(适用于旧版本)
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@661 44 "POT-Creation-Date: 2009-03-31 10:46+0800\n"
dongsheng@660 45 "PO-Revision-Date: 2009-03-31 10: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>
songdongsheng@658 87 #: ../en/appA-cmdref.xml:5
dongsheng@627 88 msgid "Command reference"
dongsheng@627 89 msgstr "命令参考"
dongsheng@627 90
dongsheng@627 91 #. type: Content of: <book><appendix><para>
songdongsheng@658 92 #: ../en/appA-cmdref.xml:7
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>
songdongsheng@658 99 #: ../en/appA-cmdref.xml:12
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>
songdongsheng@658 104 #: ../en/appA-cmdref.xml:14
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, "
songdongsheng@658 108 "see <xref linkend=\"sec:mq:patch\"/>."
dongsheng@627 109 msgstr ""
dongsheng@627 110
dongsheng@627 111 #. type: Content of: <book><appendix><para>
songdongsheng@658 112 #: ../en/appA-cmdref.xml:18
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>
songdongsheng@658 121 #: ../en/appA-cmdref.xml:23
dongsheng@627 122 msgid "Options"
dongsheng@627 123 msgstr "选项"
dongsheng@627 124
dongsheng@627 125 #. type: Content of: <book><appendix><sect2><para>
songdongsheng@658 126 #: ../en/appA-cmdref.xml:25
dongsheng@627 127 msgid "\\loptref{diff}{nodates}"
dongsheng@627 128 msgstr ""
dongsheng@627 129
dongsheng@627 130 #. type: Content of: <book><appendix><sect2><para>
songdongsheng@658 131 #: ../en/appA-cmdref.xml:27
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>
songdongsheng@658 136 #: ../en/appA-cmdref.xml:29
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>
songdongsheng@658 141 #: ../en/appA-cmdref.xml:31
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>
songdongsheng@658 148 #: ../en/appA-cmdref.xml:35
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>
songdongsheng@658 153 #: ../en/appA-cmdref.xml:38
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>
songdongsheng@658 158 #: ../en/appA-cmdref.xml:41
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>
songdongsheng@658 163 #: ../en/appA-cmdref.xml:44
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>
songdongsheng@658 168 #: ../en/appA-cmdref.xml:47
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>
songdongsheng@658 173 #: ../en/appA-cmdref.xml:50
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>
songdongsheng@658 182 #: ../en/appA-cmdref.xml:56
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>
songdongsheng@658 190 #: ../en/appA-cmdref.xml:61
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>
songdongsheng@658 195 #: ../en/appA-cmdref.xml:64
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>
songdongsheng@658 202 #: ../en/appA-cmdref.xml:68
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>
songdongsheng@658 207 #: ../en/appA-cmdref.xml:71
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>
songdongsheng@658 214 #: ../en/appA-cmdref.xml:75
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>
songdongsheng@658 219 #: ../en/appA-cmdref.xml:78
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>
songdongsheng@658 229 #: ../en/appA-cmdref.xml:85
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>
songdongsheng@658 234 #: ../en/appA-cmdref.xml:88
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>
songdongsheng@658 242 #: ../en/appA-cmdref.xml:94
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>
songdongsheng@658 249 #: ../en/appA-cmdref.xml:98
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>
songdongsheng@658 256 #: ../en/appA-cmdref.xml:102
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>
songdongsheng@658 261 #: ../en/appA-cmdref.xml:106
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>
songdongsheng@658 269 #: ../en/appA-cmdref.xml:113
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>
songdongsheng@658 282 #: ../en/appA-cmdref.xml:123
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>
songdongsheng@658 287 #: ../en/appA-cmdref.xml:126
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>
songdongsheng@658 292 #: ../en/appA-cmdref.xml:129
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>
songdongsheng@658 299 #: ../en/appA-cmdref.xml:134
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>
songdongsheng@658 307 #: ../en/appA-cmdref.xml:139
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>
songdongsheng@658 317 #: ../en/appA-cmdref.xml:147
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>
songdongsheng@658 324 #: ../en/appA-cmdref.xml:151
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>
songdongsheng@658 333 #: ../en/appA-cmdref.xml:160
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>
songdongsheng@658 338 #: ../en/appA-cmdref.xml:163
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>
songdongsheng@658 347 #: ../en/appA-cmdref.xml:165
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>
songdongsheng@658 358 #: ../en/appA-cmdref.xml:172
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>
songdongsheng@658 370 #: ../en/appA-cmdref.xml:180
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>
songdongsheng@658 378 #: ../en/appA-cmdref.xml:185
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>
songdongsheng@658 397 #: ../en/appA-cmdref.xml:201
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>
songdongsheng@658 402 #: ../en/appA-cmdref.xml:203
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>
songdongsheng@658 412 #: ../en/appA-cmdref.xml:210
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@661 439 msgid "<command role=\"hg-ext-mq\">qapplied</command>—print applied patches"
dongsheng@661 440 msgstr "<command role=\"hg-ext-mq\">qapplied</command>—显示已应用的补丁"
dongsheng@627 441
dongsheng@627 442 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@627 443 #: ../en/appB-mq-ref.xml:17
dongsheng@627 444 msgid ""
dongsheng@627 445 "The <command role=\"hg-ext-mq\">qapplied</command> command prints the current "
dongsheng@627 446 "stack of applied patches. Patches are printed in oldest-to-newest order, so "
dongsheng@627 447 "the last patch in the list is the <quote>top</quote> patch."
dongsheng@627 448 msgstr ""
dongsheng@627 449
dongsheng@627 450 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@627 451 #: ../en/appB-mq-ref.xml:24
dongsheng@627 452 msgid ""
dongsheng@661 453 "<command role=\"hg-ext-mq\">qcommit</command>—commit changes in the queue "
dongsheng@661 454 "repository"
dongsheng@661 455 msgstr "<command role=\"hg-ext-mq\">qcommit</command>—提交队列中的修改"
dongsheng@627 456
dongsheng@627 457 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@627 458 #: ../en/appB-mq-ref.xml:27
dongsheng@627 459 msgid ""
dongsheng@627 460 "The <command role=\"hg-ext-mq\">qcommit</command> command commits any "
dongsheng@627 461 "outstanding changes in the <filename role=\"special\" class=\"directory\">.hg/"
dongsheng@627 462 "patches</filename> repository. This command only works if the <filename role="
dongsheng@627 463 "\"special\" class=\"directory\">.hg/patches</filename> directory is a "
dongsheng@627 464 "repository, i.e. you created the directory using <command role=\"hg-cmd\">hg "
dongsheng@627 465 "qinit <option role=\"hg-ext-mq-cmd-qinit-opt\">-c</option></command> or ran "
dongsheng@627 466 "<command role=\"hg-cmd\">hg init</command> in the directory after running "
dongsheng@627 467 "<command role=\"hg-ext-mq\">qinit</command>."
dongsheng@627 468 msgstr ""
dongsheng@627 469
dongsheng@627 470 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@627 471 #: ../en/appB-mq-ref.xml:39
dongsheng@627 472 msgid ""
dongsheng@627 473 "This command is shorthand for <command role=\"hg-cmd\">hg commit --cwd .hg/"
dongsheng@627 474 "patches</command>."
dongsheng@627 475 msgstr ""
dongsheng@627 476
dongsheng@650 477 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 478 #: ../en/appB-mq-ref.xml:43
dongsheng@650 479 msgid ""
dongsheng@661 480 "<command role=\"hg-ext-mq\">qdelete</command>—delete a patch from the "
dongsheng@653 481 "<filename role=\"special\">series</filename> file"
dongsheng@653 482 msgstr ""
dongsheng@661 483 "<command role=\"hg-ext-mq\">qdelete</command>—从文件 <filename role=\"special"
dongsheng@661 484 "\">series</filename> 中删除补丁"
dongsheng@650 485
dongsheng@627 486 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 487 #: ../en/appB-mq-ref.xml:48
dongsheng@627 488 msgid ""
dongsheng@627 489 "The <command role=\"hg-ext-mq\">qdelete</command> command removes the entry "
dongsheng@627 490 "for a patch from the <filename role=\"special\">series</filename> file in the "
dongsheng@627 491 "<filename role=\"special\" class=\"directory\">.hg/patches</filename> "
dongsheng@627 492 "directory. It does not pop the patch if the patch is already applied. By "
dongsheng@627 493 "default, it does not delete the patch file; use the <option role=\"hg-ext-mq-"
dongsheng@627 494 "cmd-qdel-opt\">-f</option> option to do that."
dongsheng@627 495 msgstr ""
dongsheng@627 496
dongsheng@627 497 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 498 #: ../en/appB-mq-ref.xml:57 ../en/appB-mq-ref.xml:99 ../en/appB-mq-ref.xml:157
dongsheng@650 499 #: ../en/appB-mq-ref.xml:197 ../en/appB-mq-ref.xml:264
dongsheng@650 500 #: ../en/appB-mq-ref.xml:335 ../en/appB-mq-ref.xml:404
dongsheng@650 501 #: ../en/appB-mq-ref.xml:497
dongsheng@627 502 msgid "Options:"
dongsheng@627 503 msgstr ""
dongsheng@627 504
dongsheng@627 505 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 506 #: ../en/appB-mq-ref.xml:59
dongsheng@627 507 msgid ""
dongsheng@627 508 "<option role=\"hg-ext-mq-cmd-qdel-opt\">-f</option>: Delete the patch file."
dongsheng@627 509 msgstr ""
dongsheng@627 510
dongsheng@627 511 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 512 #: ../en/appB-mq-ref.xml:66
dongsheng@627 513 msgid ""
dongsheng@661 514 "<command role=\"hg-ext-mq\">qdiff</command>—print a diff of the topmost "
dongsheng@661 515 "applied patch"
dongsheng@661 516 msgstr "<command role=\"hg-ext-mq\">qdiff</command>—显示最新应用补丁的差异"
dongsheng@627 517
dongsheng@627 518 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 519 #: ../en/appB-mq-ref.xml:69
dongsheng@627 520 msgid ""
dongsheng@627 521 "The <command role=\"hg-ext-mq\">qdiff</command> command prints a diff of the "
dongsheng@627 522 "topmost applied patch. It is equivalent to <command role=\"hg-cmd\">hg diff -"
dongsheng@627 523 "r-2:-1</command>."
dongsheng@627 524 msgstr ""
dongsheng@627 525
dongsheng@627 526 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 527 #: ../en/appB-mq-ref.xml:75
dongsheng@627 528 msgid ""
dongsheng@661 529 "<command role=\"hg-ext-mq\">qfold</command>—merge (<quote>fold</quote>) "
dongsheng@661 530 "several patches into one"
dongsheng@661 531 msgstr ""
dongsheng@661 532 "<command role=\"hg-ext-mq\">qfold</command>—将多个补丁合并(<quote>折叠</"
dongsheng@661 533 "quote>)成一个"
dongsheng@627 534
dongsheng@627 535 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 536 #: ../en/appB-mq-ref.xml:78
dongsheng@627 537 msgid ""
dongsheng@627 538 "The <command role=\"hg-ext-mq\">qfold</command> command merges multiple "
dongsheng@627 539 "patches into the topmost applied patch, so that the topmost applied patch "
dongsheng@627 540 "makes the union of all of the changes in the patches in question."
dongsheng@627 541 msgstr ""
dongsheng@627 542
dongsheng@627 543 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 544 #: ../en/appB-mq-ref.xml:83
dongsheng@627 545 msgid ""
dongsheng@627 546 "The patches to fold must not be applied; <command role=\"hg-ext-mq\">qfold</"
dongsheng@627 547 "command> will exit with an error if any is. The order in which patches are "
dongsheng@627 548 "folded is significant; <command role=\"hg-cmd\">hg qfold a b</command> means "
dongsheng@627 549 "<quote>apply the current topmost patch, followed by <literal>a</literal>, "
dongsheng@627 550 "followed by <literal>b</literal></quote>."
dongsheng@627 551 msgstr ""
dongsheng@627 552
dongsheng@627 553 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 554 #: ../en/appB-mq-ref.xml:91
dongsheng@627 555 msgid ""
dongsheng@627 556 "The comments from the folded patches are appended to the comments of the "
dongsheng@627 557 "destination patch, with each block of comments separated by three asterisk "
dongsheng@627 558 "(<quote><literal>*</literal></quote>) characters. Use the <option role=\"hg-"
dongsheng@627 559 "ext-mq-cmd-qfold-opt\">-e</option> option to edit the commit message for the "
dongsheng@627 560 "combined patch/changeset after the folding has completed."
dongsheng@627 561 msgstr ""
dongsheng@627 562
dongsheng@627 563 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 564 #: ../en/appB-mq-ref.xml:101
dongsheng@627 565 msgid ""
dongsheng@627 566 "<option role=\"hg-ext-mq-cmd-qfold-opt\">-e</option>: Edit the commit message "
dongsheng@627 567 "and patch description for the newly folded patch."
dongsheng@627 568 msgstr ""
dongsheng@627 569
dongsheng@627 570 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 571 #: ../en/appB-mq-ref.xml:106
dongsheng@627 572 msgid ""
dongsheng@627 573 "<option role=\"hg-ext-mq-cmd-qfold-opt\">-l</option>: Use the contents of the "
dongsheng@627 574 "given file as the new commit message and patch description for the folded "
dongsheng@627 575 "patch."
dongsheng@627 576 msgstr ""
dongsheng@627 577
dongsheng@627 578 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 579 #: ../en/appB-mq-ref.xml:111
dongsheng@627 580 msgid ""
dongsheng@627 581 "<option role=\"hg-ext-mq-cmd-qfold-opt\">-m</option>: Use the given text as "
dongsheng@627 582 "the new commit message and patch description for the folded patch."
dongsheng@627 583 msgstr ""
dongsheng@627 584
dongsheng@627 585 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 586 #: ../en/appB-mq-ref.xml:119
dongsheng@627 587 msgid ""
dongsheng@661 588 "<command role=\"hg-ext-mq\">qheader</command>—display the header/description "
dongsheng@661 589 "of a patch"
dongsheng@661 590 msgstr "<command role=\"hg-ext-mq\">qheader</command>—显示补丁头部描述"
dongsheng@627 591
dongsheng@627 592 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 593 #: ../en/appB-mq-ref.xml:123
dongsheng@627 594 msgid ""
dongsheng@627 595 "The <command role=\"hg-ext-mq\">qheader</command> command prints the header, "
dongsheng@627 596 "or description, of a patch. By default, it prints the header of the topmost "
dongsheng@627 597 "applied patch. Given an argument, it prints the header of the named patch."
dongsheng@627 598 msgstr ""
dongsheng@627 599
dongsheng@627 600 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 601 #: ../en/appB-mq-ref.xml:130
dongsheng@627 602 msgid ""
dongsheng@661 603 "<command role=\"hg-ext-mq\">qimport</command>—import a third-party patch into "
dongsheng@661 604 "the queue"
dongsheng@661 605 msgstr "<command role=\"hg-ext-mq\">qimport</command>—将第三方补丁导入队列"
dongsheng@627 606
dongsheng@627 607 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 608 #: ../en/appB-mq-ref.xml:133
dongsheng@627 609 msgid ""
dongsheng@627 610 "The <command role=\"hg-ext-mq\">qimport</command> command adds an entry for "
dongsheng@627 611 "an external patch to the <filename role=\"special\">series</filename> file, "
dongsheng@627 612 "and copies the patch into the <filename role=\"special\" class=\"directory\">."
dongsheng@627 613 "hg/patches</filename> directory. It adds the entry immediately after the "
dongsheng@627 614 "topmost applied patch, but does not push the patch."
dongsheng@627 615 msgstr ""
dongsheng@627 616
dongsheng@627 617 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 618 #: ../en/appB-mq-ref.xml:141
dongsheng@627 619 msgid ""
dongsheng@627 620 "If the <filename role=\"special\" class=\"directory\">.hg/patches</filename> "
dongsheng@627 621 "directory is a repository, <command role=\"hg-ext-mq\">qimport</command> "
dongsheng@627 622 "automatically does an <command role=\"hg-cmd\">hg add</command> of the "
dongsheng@627 623 "imported patch."
dongsheng@627 624 msgstr ""
dongsheng@627 625
dongsheng@627 626 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 627 #: ../en/appB-mq-ref.xml:149
dongsheng@627 628 msgid ""
dongsheng@661 629 "<command role=\"hg-ext-mq\">qinit</command>—prepare a repository to work with "
dongsheng@661 630 "MQ"
dongsheng@661 631 msgstr "<command role=\"hg-ext-mq\">qinit</command>—为使用 MQ 配置版本库"
dongsheng@627 632
dongsheng@627 633 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 634 #: ../en/appB-mq-ref.xml:152
dongsheng@627 635 msgid ""
dongsheng@627 636 "The <command role=\"hg-ext-mq\">qinit</command> command prepares a repository "
dongsheng@627 637 "to work with MQ. It creates a directory called <filename role=\"special\" "
dongsheng@627 638 "class=\"directory\">.hg/patches</filename>."
dongsheng@627 639 msgstr ""
dongsheng@627 640
dongsheng@627 641 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 642 #: ../en/appB-mq-ref.xml:159
dongsheng@627 643 msgid ""
dongsheng@627 644 "<option role=\"hg-ext-mq-cmd-qinit-opt\">-c</option>: Create <filename role="
dongsheng@627 645 "\"special\" class=\"directory\">.hg/patches</filename> as a repository in its "
dongsheng@627 646 "own right. Also creates a <filename role=\"special\">.hgignore</filename> "
dongsheng@627 647 "file that will ignore the <filename role=\"special\">status</filename> file."
dongsheng@627 648 msgstr ""
dongsheng@627 649
dongsheng@627 650 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 651 #: ../en/appB-mq-ref.xml:169
dongsheng@627 652 msgid ""
dongsheng@627 653 "When the <filename role=\"special\" class=\"directory\">.hg/patches</"
dongsheng@627 654 "filename> directory is a repository, the <command role=\"hg-ext-mq\">qimport</"
dongsheng@627 655 "command> and <command role=\"hg-ext-mq\">qnew</command> commands "
dongsheng@627 656 "automatically <command role=\"hg-cmd\">hg add</command> new patches."
dongsheng@627 657 msgstr ""
dongsheng@627 658
dongsheng@627 659 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 660 #: ../en/appB-mq-ref.xml:178
dongsheng@661 661 msgid "<command role=\"hg-ext-mq\">qnew</command>—create a new patch"
dongsheng@661 662 msgstr "<command role=\"hg-ext-mq\">qnew</command>—创建新补丁"
dongsheng@627 663
dongsheng@627 664 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 665 #: ../en/appB-mq-ref.xml:181
dongsheng@627 666 msgid ""
dongsheng@627 667 "The <command role=\"hg-ext-mq\">qnew</command> command creates a new patch. "
dongsheng@627 668 "It takes one mandatory argument, the name to use for the patch file. The "
dongsheng@627 669 "newly created patch is created empty by default. It is added to the "
dongsheng@627 670 "<filename role=\"special\">series</filename> file after the current topmost "
dongsheng@627 671 "applied patch, and is immediately pushed on top of that patch."
dongsheng@627 672 msgstr ""
dongsheng@627 673
dongsheng@627 674 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 675 #: ../en/appB-mq-ref.xml:189
dongsheng@627 676 msgid ""
dongsheng@627 677 "If <command role=\"hg-ext-mq\">qnew</command> finds modified files in the "
dongsheng@627 678 "working directory, it will refuse to create a new patch unless the <option "
dongsheng@627 679 "role=\"hg-ext-mq-cmd-qnew-opt\">-f</option> option is used (see below). This "
dongsheng@627 680 "behaviour allows you to <command role=\"hg-ext-mq\">qrefresh</command> your "
dongsheng@627 681 "topmost applied patch before you apply a new patch on top of it."
dongsheng@627 682 msgstr ""
dongsheng@627 683
dongsheng@627 684 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 685 #: ../en/appB-mq-ref.xml:199
dongsheng@627 686 msgid ""
dongsheng@627 687 "<option role=\"hg-ext-mq-cmd-qnew-opt\">-f</option>: Create a new patch if "
dongsheng@627 688 "the contents of the working directory are modified. Any outstanding "
dongsheng@627 689 "modifications are added to the newly created patch, so after this command "
dongsheng@627 690 "completes, the working directory will no longer be modified."
dongsheng@627 691 msgstr ""
dongsheng@627 692
dongsheng@627 693 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 694 #: ../en/appB-mq-ref.xml:206
dongsheng@627 695 msgid ""
dongsheng@627 696 "<option role=\"hg-ext-mq-cmd-qnew-opt\">-m</option>: Use the given text as "
dongsheng@627 697 "the commit message. This text will be stored at the beginning of the patch "
dongsheng@627 698 "file, before the patch data."
dongsheng@627 699 msgstr ""
dongsheng@627 700
dongsheng@627 701 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 702 #: ../en/appB-mq-ref.xml:215
dongsheng@627 703 msgid ""
dongsheng@661 704 "<command role=\"hg-ext-mq\">qnext</command>—print the name of the next patch"
dongsheng@661 705 msgstr "<command role=\"hg-ext-mq\">qnext</command>—显示下个补丁的名称"
dongsheng@627 706
dongsheng@627 707 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 708 #: ../en/appB-mq-ref.xml:218
dongsheng@627 709 msgid ""
dongsheng@627 710 "The <command role=\"hg-ext-mq\">qnext</command> command prints the name name "
dongsheng@627 711 "of the next patch in the <filename role=\"special\">series</filename> file "
dongsheng@627 712 "after the topmost applied patch. This patch will become the topmost applied "
dongsheng@627 713 "patch if you run <command role=\"hg-ext-mq\">qpush</command>."
dongsheng@627 714 msgstr ""
dongsheng@627 715
dongsheng@627 716 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 717 #: ../en/appB-mq-ref.xml:227
dongsheng@661 718 msgid "<command role=\"hg-ext-mq\">qpop</command>—pop patches off the stack"
dongsheng@661 719 msgstr "<command role=\"hg-ext-mq\">qpop</command>—删除堆栈顶部的补丁"
dongsheng@627 720
dongsheng@627 721 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 722 #: ../en/appB-mq-ref.xml:230
dongsheng@627 723 msgid ""
dongsheng@627 724 "The <command role=\"hg-ext-mq\">qpop</command> command removes applied "
dongsheng@627 725 "patches from the top of the stack of applied patches. By default, it removes "
dongsheng@627 726 "only one patch."
dongsheng@627 727 msgstr ""
dongsheng@627 728
dongsheng@627 729 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 730 #: ../en/appB-mq-ref.xml:234
dongsheng@627 731 msgid ""
dongsheng@627 732 "This command removes the changesets that represent the popped patches from "
dongsheng@627 733 "the repository, and updates the working directory to undo the effects of the "
dongsheng@627 734 "patches."
dongsheng@627 735 msgstr ""
dongsheng@627 736
dongsheng@627 737 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 738 #: ../en/appB-mq-ref.xml:238
dongsheng@627 739 msgid ""
dongsheng@627 740 "This command takes an optional argument, which it uses as the name or index "
dongsheng@627 741 "of the patch to pop to. If given a name, it will pop patches until the named "
dongsheng@627 742 "patch is the topmost applied patch. If given a number, <command role=\"hg-"
dongsheng@627 743 "ext-mq\">qpop</command> treats the number as an index into the entries in the "
dongsheng@627 744 "series file, counting from zero (empty lines and lines containing only "
dongsheng@627 745 "comments do not count). It pops patches until the patch identified by the "
dongsheng@627 746 "given index is the topmost applied patch."
dongsheng@627 747 msgstr ""
dongsheng@627 748
dongsheng@627 749 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 750 #: ../en/appB-mq-ref.xml:248
dongsheng@627 751 msgid ""
dongsheng@627 752 "The <command role=\"hg-ext-mq\">qpop</command> command does not read or write "
dongsheng@627 753 "patches or the <filename role=\"special\">series</filename> file. It is thus "
dongsheng@627 754 "safe to <command role=\"hg-ext-mq\">qpop</command> a patch that you have "
dongsheng@627 755 "removed from the <filename role=\"special\">series</filename> file, or a "
dongsheng@627 756 "patch that you have renamed or deleted entirely. In the latter two cases, "
dongsheng@627 757 "use the name of the patch as it was when you applied it."
dongsheng@627 758 msgstr ""
dongsheng@627 759
dongsheng@627 760 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 761 #: ../en/appB-mq-ref.xml:257
dongsheng@627 762 msgid ""
dongsheng@627 763 "By default, the <command role=\"hg-ext-mq\">qpop</command> command will not "
dongsheng@627 764 "pop any patches if the working directory has been modified. You can override "
dongsheng@627 765 "this behaviour using the <option role=\"hg-ext-mq-cmd-qpop-opt\">-f</option> "
dongsheng@627 766 "option, which reverts all modifications in the working directory."
dongsheng@627 767 msgstr ""
dongsheng@627 768
dongsheng@627 769 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 770 #: ../en/appB-mq-ref.xml:266
dongsheng@627 771 msgid ""
dongsheng@627 772 "<option role=\"hg-ext-mq-cmd-qpop-opt\">-a</option>: Pop all applied "
dongsheng@627 773 "patches. This returns the repository to its state before you applied any "
dongsheng@627 774 "patches."
dongsheng@627 775 msgstr ""
dongsheng@627 776
dongsheng@627 777 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 778 #: ../en/appB-mq-ref.xml:271
dongsheng@627 779 msgid ""
dongsheng@627 780 "<option role=\"hg-ext-mq-cmd-qpop-opt\">-f</option>: Forcibly revert any "
dongsheng@627 781 "modifications to the working directory when popping."
dongsheng@627 782 msgstr ""
dongsheng@627 783
dongsheng@627 784 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 785 #: ../en/appB-mq-ref.xml:276
dongsheng@627 786 msgid ""
dongsheng@627 787 "<option role=\"hg-ext-mq-cmd-qpop-opt\">-n</option>: Pop a patch from the "
dongsheng@627 788 "named queue."
dongsheng@627 789 msgstr ""
dongsheng@627 790
dongsheng@627 791 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 792 #: ../en/appB-mq-ref.xml:281
dongsheng@627 793 msgid ""
dongsheng@627 794 "The <command role=\"hg-ext-mq\">qpop</command> command removes one line from "
dongsheng@627 795 "the end of the <filename role=\"special\">status</filename> file for each "
dongsheng@627 796 "patch that it pops."
dongsheng@627 797 msgstr ""
dongsheng@627 798
dongsheng@627 799 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 800 #: ../en/appB-mq-ref.xml:288
dongsheng@627 801 msgid ""
dongsheng@661 802 "<command role=\"hg-ext-mq\">qprev</command>—print the name of the previous "
dongsheng@661 803 "patch"
dongsheng@661 804 msgstr "<command role=\"hg-ext-mq\">qprev</command>—显示上个补丁的名称"
dongsheng@627 805
dongsheng@627 806 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 807 #: ../en/appB-mq-ref.xml:291
dongsheng@627 808 msgid ""
dongsheng@627 809 "The <command role=\"hg-ext-mq\">qprev</command> command prints the name of "
dongsheng@627 810 "the patch in the <filename role=\"special\">series</filename> file that comes "
dongsheng@627 811 "before the topmost applied patch. This will become the topmost applied patch "
dongsheng@627 812 "if you run <command role=\"hg-ext-mq\">qpop</command>."
dongsheng@627 813 msgstr ""
dongsheng@627 814
dongsheng@627 815 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 816 #: ../en/appB-mq-ref.xml:300
dongsheng@661 817 msgid "<command role=\"hg-ext-mq\">qpush</command>—push patches onto the stack"
dongsheng@661 818 msgstr "<command role=\"hg-ext-mq\">qpush</command>—增加补丁到堆栈"
dongsheng@627 819
dongsheng@627 820 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 821 #: ../en/appB-mq-ref.xml:303
dongsheng@627 822 msgid ""
dongsheng@627 823 "The <command role=\"hg-ext-mq\">qpush</command> command adds patches onto the "
dongsheng@627 824 "applied stack. By default, it adds only one patch."
dongsheng@627 825 msgstr ""
dongsheng@627 826
dongsheng@627 827 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 828 #: ../en/appB-mq-ref.xml:307
dongsheng@627 829 msgid ""
dongsheng@627 830 "This command creates a new changeset to represent each applied patch, and "
dongsheng@627 831 "updates the working directory to apply the effects of the patches."
dongsheng@627 832 msgstr ""
dongsheng@627 833
dongsheng@627 834 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 835 #: ../en/appB-mq-ref.xml:311
dongsheng@627 836 msgid "The default data used when creating a changeset are as follows:"
dongsheng@627 837 msgstr ""
dongsheng@627 838
dongsheng@627 839 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 840 #: ../en/appB-mq-ref.xml:314
dongsheng@627 841 msgid ""
dongsheng@627 842 "The commit date and time zone are the current date and time zone. Because "
dongsheng@627 843 "these data are used to compute the identity of a changeset, this means that "
dongsheng@627 844 "if you <command role=\"hg-ext-mq\">qpop</command> a patch and <command role="
dongsheng@627 845 "\"hg-ext-mq\">qpush</command> it again, the changeset that you push will have "
dongsheng@627 846 "a different identity than the changeset you popped."
dongsheng@627 847 msgstr ""
dongsheng@627 848
dongsheng@627 849 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 850 #: ../en/appB-mq-ref.xml:322
dongsheng@627 851 msgid ""
dongsheng@627 852 "The author is the same as the default used by the <command role=\"hg-cmd\">hg "
dongsheng@627 853 "commit</command> command."
dongsheng@627 854 msgstr ""
dongsheng@627 855
dongsheng@627 856 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 857 #: ../en/appB-mq-ref.xml:326
dongsheng@627 858 msgid ""
dongsheng@627 859 "The commit message is any text from the patch file that comes before the "
dongsheng@627 860 "first diff header. If there is no such text, a default commit message is "
dongsheng@627 861 "used that identifies the name of the patch."
dongsheng@627 862 msgstr ""
dongsheng@627 863
dongsheng@627 864 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 865 #: ../en/appB-mq-ref.xml:331
dongsheng@627 866 msgid ""
dongsheng@627 867 "If a patch contains a Mercurial patch header (XXX add link), the information "
dongsheng@627 868 "in the patch header overrides these defaults."
dongsheng@627 869 msgstr ""
dongsheng@627 870
dongsheng@627 871 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 872 #: ../en/appB-mq-ref.xml:337
dongsheng@627 873 msgid ""
dongsheng@627 874 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-a</option>: Push all unapplied "
dongsheng@627 875 "patches from the <filename role=\"special\">series</filename> file until "
dongsheng@627 876 "there are none left to push."
dongsheng@627 877 msgstr ""
dongsheng@627 878
dongsheng@627 879 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 880 #: ../en/appB-mq-ref.xml:343
dongsheng@627 881 msgid ""
dongsheng@627 882 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-l</option>: Add the name of the "
dongsheng@627 883 "patch to the end of the commit message."
dongsheng@627 884 msgstr ""
dongsheng@627 885
dongsheng@627 886 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 887 #: ../en/appB-mq-ref.xml:347
dongsheng@627 888 msgid ""
dongsheng@627 889 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-m</option>: If a patch fails to "
dongsheng@627 890 "apply cleanly, use the entry for the patch in another saved queue to compute "
dongsheng@627 891 "the parameters for a three-way merge, and perform a three-way merge using the "
dongsheng@627 892 "normal Mercurial merge machinery. Use the resolution of the merge as the new "
dongsheng@627 893 "patch content."
dongsheng@627 894 msgstr ""
dongsheng@627 895
dongsheng@627 896 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 897 #: ../en/appB-mq-ref.xml:355
dongsheng@627 898 msgid ""
dongsheng@627 899 "<option role=\"hg-ext-mq-cmd-qpush-opt\">-n</option>: Use the named queue if "
dongsheng@627 900 "merging while pushing."
dongsheng@627 901 msgstr ""
dongsheng@627 902
dongsheng@627 903 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 904 #: ../en/appB-mq-ref.xml:360
dongsheng@627 905 msgid ""
dongsheng@627 906 "The <command role=\"hg-ext-mq\">qpush</command> command reads, but does not "
dongsheng@627 907 "modify, the <filename role=\"special\">series</filename> file. It appends "
dongsheng@627 908 "one line to the <command role=\"hg-cmd\">hg status</command> file for each "
dongsheng@627 909 "patch that it pushes."
dongsheng@627 910 msgstr ""
dongsheng@627 911
dongsheng@627 912 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 913 #: ../en/appB-mq-ref.xml:368
dongsheng@627 914 msgid ""
dongsheng@661 915 "<command role=\"hg-ext-mq\">qrefresh</command>—update the topmost applied "
dongsheng@661 916 "patch"
dongsheng@661 917 msgstr "<command role=\"hg-ext-mq\">qrefresh</command>—更新最新的补丁"
dongsheng@627 918
dongsheng@627 919 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 920 #: ../en/appB-mq-ref.xml:372
dongsheng@627 921 msgid ""
dongsheng@627 922 "The <command role=\"hg-ext-mq\">qrefresh</command> command updates the "
dongsheng@627 923 "topmost applied patch. It modifies the patch, removes the old changeset that "
dongsheng@627 924 "represented the patch, and creates a new changeset to represent the modified "
dongsheng@627 925 "patch."
dongsheng@627 926 msgstr ""
dongsheng@627 927
dongsheng@627 928 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 929 #: ../en/appB-mq-ref.xml:378
dongsheng@627 930 msgid ""
dongsheng@627 931 "The <command role=\"hg-ext-mq\">qrefresh</command> command looks for the "
dongsheng@627 932 "following modifications:"
dongsheng@627 933 msgstr ""
dongsheng@627 934
dongsheng@627 935 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 936 #: ../en/appB-mq-ref.xml:381
dongsheng@627 937 msgid ""
dongsheng@627 938 "Changes to the commit message, i.e. the text before the first diff header in "
dongsheng@627 939 "the patch file, are reflected in the new changeset that represents the patch."
dongsheng@627 940 msgstr ""
dongsheng@627 941
dongsheng@627 942 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 943 #: ../en/appB-mq-ref.xml:386
dongsheng@627 944 msgid ""
dongsheng@627 945 "Modifications to tracked files in the working directory are added to the "
dongsheng@627 946 "patch."
dongsheng@627 947 msgstr ""
dongsheng@627 948
dongsheng@627 949 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 950 #: ../en/appB-mq-ref.xml:389
dongsheng@627 951 msgid ""
dongsheng@627 952 "Changes to the files tracked using <command role=\"hg-cmd\">hg add</command>, "
dongsheng@627 953 "<command role=\"hg-cmd\">hg copy</command>, <command role=\"hg-cmd\">hg "
dongsheng@627 954 "remove</command>, or <command role=\"hg-cmd\">hg rename</command>. Added "
dongsheng@627 955 "files and copy and rename destinations are added to the patch, while removed "
dongsheng@627 956 "files and rename sources are removed."
dongsheng@627 957 msgstr ""
dongsheng@627 958
dongsheng@627 959 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 960 #: ../en/appB-mq-ref.xml:398
dongsheng@627 961 msgid ""
dongsheng@627 962 "Even if <command role=\"hg-ext-mq\">qrefresh</command> detects no changes, it "
dongsheng@627 963 "still recreates the changeset that represents the patch. This causes the "
dongsheng@627 964 "identity of the changeset to differ from the previous changeset that "
dongsheng@627 965 "identified the patch."
dongsheng@627 966 msgstr ""
dongsheng@627 967
dongsheng@627 968 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 969 #: ../en/appB-mq-ref.xml:406
dongsheng@627 970 msgid ""
dongsheng@627 971 "<option role=\"hg-ext-mq-cmd-qrefresh-opt\">-e</option>: Modify the commit "
dongsheng@627 972 "and patch description, using the preferred text editor."
dongsheng@627 973 msgstr ""
dongsheng@627 974
dongsheng@627 975 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 976 #: ../en/appB-mq-ref.xml:411
dongsheng@627 977 msgid ""
dongsheng@627 978 "<option role=\"hg-ext-mq-cmd-qrefresh-opt\">-m</option>: Modify the commit "
dongsheng@627 979 "message and patch description, using the given text."
dongsheng@627 980 msgstr ""
dongsheng@627 981
dongsheng@627 982 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 983 #: ../en/appB-mq-ref.xml:416
dongsheng@627 984 msgid ""
dongsheng@627 985 "<option role=\"hg-ext-mq-cmd-qrefresh-opt\">-l</option>: Modify the commit "
dongsheng@627 986 "message and patch description, using text from the given file."
dongsheng@627 987 msgstr ""
dongsheng@627 988
dongsheng@627 989 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 990 #: ../en/appB-mq-ref.xml:424
dongsheng@661 991 msgid "<command role=\"hg-ext-mq\">qrename</command>—rename a patch"
dongsheng@661 992 msgstr "<command role=\"hg-ext-mq\">qrename</command>—改名补丁"
dongsheng@627 993
dongsheng@627 994 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 995 #: ../en/appB-mq-ref.xml:427
dongsheng@627 996 msgid ""
dongsheng@627 997 "The <command role=\"hg-ext-mq\">qrename</command> command renames a patch, "
dongsheng@627 998 "and changes the entry for the patch in the <filename role=\"special\">series</"
dongsheng@627 999 "filename> file."
dongsheng@627 1000 msgstr ""
dongsheng@627 1001
dongsheng@627 1002 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1003 #: ../en/appB-mq-ref.xml:431
dongsheng@627 1004 msgid ""
dongsheng@627 1005 "With a single argument, <command role=\"hg-ext-mq\">qrename</command> renames "
dongsheng@627 1006 "the topmost applied patch. With two arguments, it renames its first argument "
dongsheng@627 1007 "to its second."
dongsheng@627 1008 msgstr ""
dongsheng@627 1009
dongsheng@627 1010 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1011 #: ../en/appB-mq-ref.xml:438
dongsheng@661 1012 msgid "<command role=\"hg-ext-mq\">qrestore</command>—restore saved queue state"
dongsheng@661 1013 msgstr "<command role=\"hg-ext-mq\">qrestore</command>—恢复保存的队列"
dongsheng@627 1014
dongsheng@627 1015 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1016 #: ../en/appB-mq-ref.xml:442
dongsheng@627 1017 msgid "XXX No idea what this does."
dongsheng@627 1018 msgstr ""
dongsheng@627 1019
dongsheng@627 1020 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1021 #: ../en/appB-mq-ref.xml:446
dongsheng@661 1022 msgid "<command role=\"hg-ext-mq\">qsave</command>—save current queue state"
dongsheng@661 1023 msgstr "<command role=\"hg-ext-mq\">qsave</command>—保存当前的队列状态"
dongsheng@627 1024
dongsheng@627 1025 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1026 #: ../en/appB-mq-ref.xml:449
dongsheng@627 1027 msgid "XXX Likewise."
dongsheng@627 1028 msgstr ""
dongsheng@627 1029
dongsheng@627 1030 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1031 #: ../en/appB-mq-ref.xml:453
dongsheng@627 1032 msgid ""
dongsheng@661 1033 "<command role=\"hg-ext-mq\">qseries</command>—print the entire patch series"
dongsheng@661 1034 msgstr "<command role=\"hg-ext-mq\">qseries</command>—显示补丁序列"
dongsheng@627 1035
dongsheng@627 1036 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1037 #: ../en/appB-mq-ref.xml:456
dongsheng@627 1038 msgid ""
dongsheng@627 1039 "The <command role=\"hg-ext-mq\">qseries</command> command prints the entire "
dongsheng@627 1040 "patch series from the <filename role=\"special\">series</filename> file. It "
dongsheng@627 1041 "prints only patch names, not empty lines or comments. It prints in order "
dongsheng@627 1042 "from first to be applied to last."
dongsheng@627 1043 msgstr ""
dongsheng@627 1044
dongsheng@627 1045 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1046 #: ../en/appB-mq-ref.xml:464
dongsheng@627 1047 msgid ""
dongsheng@661 1048 "<command role=\"hg-ext-mq\">qtop</command>—print the name of the current patch"
dongsheng@661 1049 msgstr "<command role=\"hg-ext-mq\">qtop</command>—显示当前补丁的名称"
dongsheng@627 1050
dongsheng@627 1051 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1052 #: ../en/appB-mq-ref.xml:467
dongsheng@627 1053 msgid ""
dongsheng@627 1054 "The <command role=\"hg-ext-mq\">qtop</command> prints the name of the topmost "
dongsheng@627 1055 "currently applied patch."
dongsheng@627 1056 msgstr ""
dongsheng@627 1057
dongsheng@627 1058 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1059 #: ../en/appB-mq-ref.xml:472
dongsheng@627 1060 msgid ""
dongsheng@661 1061 "<command role=\"hg-ext-mq\">qunapplied</command>—print patches not yet applied"
dongsheng@661 1062 msgstr "<command role=\"hg-ext-mq\">qunapplied</command>—显示尚未应用的补丁"
dongsheng@627 1063
dongsheng@627 1064 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1065 #: ../en/appB-mq-ref.xml:476
dongsheng@627 1066 msgid ""
dongsheng@627 1067 "The <command role=\"hg-ext-mq\">qunapplied</command> command prints the names "
dongsheng@627 1068 "of patches from the <filename role=\"special\">series</filename> file that "
dongsheng@627 1069 "are not yet applied. It prints them in order from the next patch that will "
dongsheng@627 1070 "be pushed to the last."
dongsheng@627 1071 msgstr ""
dongsheng@627 1072
dongsheng@627 1073 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1074 #: ../en/appB-mq-ref.xml:484
dongsheng@627 1075 msgid ""
dongsheng@661 1076 "<command role=\"hg-cmd\">hg strip</command>—remove a revision and descendants"
dongsheng@661 1077 msgstr "<command role=\"hg-cmd\">hg strip</command>—删除一个版本及其后继"
dongsheng@627 1078
dongsheng@627 1079 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1080 #: ../en/appB-mq-ref.xml:487
dongsheng@627 1081 msgid ""
dongsheng@627 1082 "The <command role=\"hg-cmd\">hg strip</command> command removes a revision, "
dongsheng@627 1083 "and all of its descendants, from the repository. It undoes the effects of "
dongsheng@627 1084 "the removed revisions from the repository, and updates the working directory "
dongsheng@627 1085 "to the first parent of the removed revision."
dongsheng@627 1086 msgstr ""
dongsheng@627 1087
dongsheng@627 1088 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1089 #: ../en/appB-mq-ref.xml:493
dongsheng@627 1090 msgid ""
dongsheng@627 1091 "The <command role=\"hg-cmd\">hg strip</command> command saves a backup of the "
dongsheng@627 1092 "removed changesets in a bundle, so that they can be reapplied if removed in "
dongsheng@627 1093 "error."
dongsheng@627 1094 msgstr ""
dongsheng@627 1095
dongsheng@627 1096 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 1097 #: ../en/appB-mq-ref.xml:499
dongsheng@627 1098 msgid ""
dongsheng@627 1099 "<option role=\"hg-opt-strip\">-b</option>: Save unrelated changesets that are "
dongsheng@627 1100 "intermixed with the stripped changesets in the backup bundle."
dongsheng@627 1101 msgstr ""
dongsheng@627 1102
dongsheng@627 1103 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 1104 #: ../en/appB-mq-ref.xml:503
dongsheng@627 1105 msgid ""
dongsheng@627 1106 "<option role=\"hg-opt-strip\">-f</option>: If a branch has multiple heads, "
dongsheng@627 1107 "remove all heads. XXX This should be renamed, and use <literal>-f</literal> "
dongsheng@627 1108 "to strip revs when there are pending changes."
dongsheng@627 1109 msgstr ""
dongsheng@627 1110
dongsheng@627 1111 #. type: Content of: <book><appendix><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 1112 #: ../en/appB-mq-ref.xml:508
dongsheng@627 1113 msgid "<option role=\"hg-opt-strip\">-n</option>: Do not save a backup bundle."
dongsheng@627 1114 msgstr ""
dongsheng@627 1115
dongsheng@627 1116 #. type: Content of: <book><appendix><sect1><title>
dongsheng@650 1117 #: ../en/appB-mq-ref.xml:515
dongsheng@627 1118 msgid "MQ file reference"
dongsheng@627 1119 msgstr "MQ 文件参考"
dongsheng@627 1120
dongsheng@627 1121 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1122 #: ../en/appB-mq-ref.xml:518
dongsheng@627 1123 msgid "The <filename role=\"special\">series</filename> file"
dongsheng@627 1124 msgstr "<filename role=\"special\">序列</filename>文件"
dongsheng@627 1125
dongsheng@627 1126 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1127 #: ../en/appB-mq-ref.xml:521
dongsheng@627 1128 msgid ""
dongsheng@627 1129 "The <filename role=\"special\">series</filename> file contains a list of the "
dongsheng@627 1130 "names of all patches that MQ can apply. It is represented as a list of "
dongsheng@627 1131 "names, with one name saved per line. Leading and trailing white space in "
dongsheng@627 1132 "each line are ignored."
dongsheng@627 1133 msgstr ""
dongsheng@627 1134
dongsheng@627 1135 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1136 #: ../en/appB-mq-ref.xml:527
dongsheng@627 1137 msgid ""
dongsheng@627 1138 "Lines may contain comments. A comment begins with the <quote><literal>#</"
dongsheng@627 1139 "literal></quote> character, and extends to the end of the line. Empty lines, "
dongsheng@627 1140 "and lines that contain only comments, are ignored."
dongsheng@627 1141 msgstr ""
dongsheng@627 1142
dongsheng@627 1143 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1144 #: ../en/appB-mq-ref.xml:532
dongsheng@627 1145 msgid ""
dongsheng@627 1146 "You will often need to edit the <filename role=\"special\">series</filename> "
dongsheng@627 1147 "file by hand, hence the support for comments and empty lines noted above. "
dongsheng@627 1148 "For example, you can comment out a patch temporarily, and <command role=\"hg-"
dongsheng@627 1149 "ext-mq\">qpush</command> will skip over that patch when applying patches. "
dongsheng@627 1150 "You can also change the order in which patches are applied by reordering "
dongsheng@627 1151 "their entries in the <filename role=\"special\">series</filename> file."
dongsheng@627 1152 msgstr ""
dongsheng@627 1153
dongsheng@627 1154 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1155 #: ../en/appB-mq-ref.xml:541
dongsheng@627 1156 msgid ""
dongsheng@627 1157 "Placing the <filename role=\"special\">series</filename> file under revision "
dongsheng@627 1158 "control is also supported; it is a good idea to place all of the patches that "
dongsheng@627 1159 "it refers to under revision control, as well. If you create a patch "
dongsheng@627 1160 "directory using the <option role=\"hg-ext-mq-cmd-qinit-opt\">-c</option> "
dongsheng@627 1161 "option to <command role=\"hg-ext-mq\">qinit</command>, this will be done for "
dongsheng@627 1162 "you automatically."
dongsheng@627 1163 msgstr ""
dongsheng@627 1164
dongsheng@627 1165 #. type: Content of: <book><appendix><sect1><sect2><title>
dongsheng@650 1166 #: ../en/appB-mq-ref.xml:551
dongsheng@627 1167 msgid "The <filename role=\"special\">status</filename> file"
dongsheng@627 1168 msgstr "<filename role=\"special\">状态</filename>文件"
dongsheng@627 1169
dongsheng@627 1170 #. type: Content of: <book><appendix><sect1><sect2><para>
dongsheng@650 1171 #: ../en/appB-mq-ref.xml:554
dongsheng@627 1172 msgid ""
dongsheng@627 1173 "The <filename role=\"special\">status</filename> file contains the names and "
dongsheng@627 1174 "changeset hashes of all patches that MQ currently has applied. Unlike the "
dongsheng@627 1175 "<filename role=\"special\">series</filename> file, this file is not intended "
dongsheng@627 1176 "for editing. You should not place this file under revision control, or "
dongsheng@627 1177 "modify it in any way. It is used by MQ strictly for internal book-keeping."
dongsheng@627 1178 msgstr ""
dongsheng@627 1179
dongsheng@627 1180 #. type: Content of: <book><appendix><title>
dongsheng@627 1181 #: ../en/appC-srcinstall.xml:5
dongsheng@627 1182 msgid "Installing Mercurial from source"
dongsheng@627 1183 msgstr "从源代码安装 Mercurial"
dongsheng@627 1184
dongsheng@627 1185 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1186 #: ../en/appC-srcinstall.xml:8
dongsheng@627 1187 msgid "On a Unix-like system"
dongsheng@627 1188 msgstr "类 Unix 系统"
dongsheng@627 1189
dongsheng@627 1190 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1191 #: ../en/appC-srcinstall.xml:10
dongsheng@627 1192 msgid ""
dongsheng@627 1193 "If you are using a Unix-like system that has a sufficiently recent version of "
dongsheng@627 1194 "Python (2.3 or newer) available, it is easy to install Mercurial from source."
dongsheng@627 1195 msgstr ""
dongsheng@627 1196
dongsheng@627 1197 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1198 #: ../en/appC-srcinstall.xml:14
dongsheng@627 1199 msgid ""
dongsheng@627 1200 "Download a recent source tarball from <ulink url=\"http://www.selenic.com/"
dongsheng@627 1201 "mercurial/download\">http://www.selenic.com/mercurial/download</ulink>."
dongsheng@627 1202 msgstr ""
dongsheng@627 1203
dongsheng@627 1204 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1205 #: ../en/appC-srcinstall.xml:17
dongsheng@627 1206 msgid "Unpack the tarball:"
dongsheng@627 1207 msgstr ""
dongsheng@627 1208
dongsheng@627 1209 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1210 #: ../en/appC-srcinstall.xml:20
dongsheng@627 1211 msgid ""
dongsheng@627 1212 "Go into the source directory and run the installer script. This will build "
dongsheng@627 1213 "Mercurial and install it in your home directory."
dongsheng@627 1214 msgstr ""
dongsheng@627 1215
dongsheng@627 1216 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1217 #: ../en/appC-srcinstall.xml:27
dongsheng@627 1218 msgid ""
dongsheng@627 1219 "Once the install finishes, Mercurial will be in the <literal>bin</literal> "
dongsheng@627 1220 "subdirectory of your home directory. Don't forget to make sure that this "
dongsheng@627 1221 "directory is present in your shell's search path."
dongsheng@627 1222 msgstr ""
dongsheng@627 1223
dongsheng@627 1224 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1225 #: ../en/appC-srcinstall.xml:32
dongsheng@627 1226 msgid ""
dongsheng@627 1227 "You will probably need to set the <envar>PYTHONPATH</envar> environment "
dongsheng@627 1228 "variable so that the Mercurial executable can find the rest of the Mercurial "
dongsheng@627 1229 "packages. For example, on my laptop, I have set it to <literal>/home/bos/lib/"
dongsheng@627 1230 "python</literal>. The exact path that you will need to use depends on how "
dongsheng@627 1231 "Python was built for your system, but should be easy to figure out. If "
dongsheng@627 1232 "you're uncertain, look through the output of the installer script above, and "
dongsheng@627 1233 "see where the contents of the <literal>mercurial</literal> directory were "
dongsheng@627 1234 "installed to."
dongsheng@627 1235 msgstr ""
dongsheng@627 1236
dongsheng@627 1237 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1238 #: ../en/appC-srcinstall.xml:44
dongsheng@627 1239 msgid "On Windows"
dongsheng@627 1240 msgstr "Windows 系统"
dongsheng@627 1241
dongsheng@627 1242 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1243 #: ../en/appC-srcinstall.xml:46
dongsheng@627 1244 msgid ""
dongsheng@627 1245 "Building and installing Mercurial on Windows requires a variety of tools, a "
dongsheng@627 1246 "fair amount of technical knowledge, and considerable patience. I very much "
dongsheng@627 1247 "<emphasis>do not recommend</emphasis> this route if you are a <quote>casual "
dongsheng@627 1248 "user</quote>. Unless you intend to hack on Mercurial, I strongly suggest "
dongsheng@627 1249 "that you use a binary package instead."
dongsheng@627 1250 msgstr ""
dongsheng@627 1251
dongsheng@627 1252 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1253 #: ../en/appC-srcinstall.xml:53
dongsheng@627 1254 msgid ""
dongsheng@627 1255 "If you are intent on building Mercurial from source on Windows, follow the "
dongsheng@627 1256 "<quote>hard way</quote> directions on the Mercurial wiki at <ulink url="
dongsheng@627 1257 "\"http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall\">http://www."
dongsheng@627 1258 "selenic.com/mercurial/wiki/index.cgi/WindowsInstall</ulink>, and expect the "
dongsheng@627 1259 "process to involve a lot of fiddly work."
dongsheng@627 1260 msgstr ""
dongsheng@627 1261
dongsheng@627 1262 #. type: Content of: <book><appendix><title>
dongsheng@627 1263 #: ../en/appD-license.xml:5
dongsheng@627 1264 msgid "Open Publication License"
dongsheng@627 1265 msgstr ""
dongsheng@627 1266
dongsheng@627 1267 #. type: Content of: <book><appendix><para>
dongsheng@627 1268 #: ../en/appD-license.xml:7
dongsheng@627 1269 msgid "Version 1.0, 8 June 1999"
dongsheng@627 1270 msgstr ""
dongsheng@627 1271
dongsheng@627 1272 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1273 #: ../en/appD-license.xml:10
dongsheng@627 1274 msgid "Requirements on both unmodified and modified versions"
dongsheng@627 1275 msgstr ""
dongsheng@627 1276
dongsheng@627 1277 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1278 #: ../en/appD-license.xml:13
dongsheng@627 1279 msgid ""
dongsheng@627 1280 "The Open Publication works may be reproduced and distributed in whole or in "
dongsheng@627 1281 "part, in any medium physical or electronic, provided that the terms of this "
dongsheng@627 1282 "license are adhered to, and that this license or an incorporation of it by "
dongsheng@627 1283 "reference (with any options elected by the author(s) and/or publisher) is "
dongsheng@627 1284 "displayed in the reproduction."
dongsheng@627 1285 msgstr ""
dongsheng@627 1286
dongsheng@627 1287 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1288 #: ../en/appD-license.xml:20
dongsheng@627 1289 msgid "Proper form for an incorporation by reference is as follows:"
dongsheng@627 1290 msgstr ""
dongsheng@627 1291
dongsheng@627 1292 #. type: Content of: <book><appendix><sect1><blockquote><para>
dongsheng@627 1293 #: ../en/appD-license.xml:24
dongsheng@627 1294 msgid ""
dongsheng@627 1295 "Copyright (c) <emphasis>year</emphasis> by <emphasis>author's name or "
dongsheng@627 1296 "designee</emphasis>. This material may be distributed only subject to the "
dongsheng@627 1297 "terms and conditions set forth in the Open Publication License, v<emphasis>x."
dongsheng@627 1298 "y</emphasis> or later (the latest version is presently available at <ulink "
dongsheng@627 1299 "url=\"http://www.opencontent.org/openpub/\">http://www.opencontent.org/"
dongsheng@627 1300 "openpub/</ulink>)."
dongsheng@627 1301 msgstr ""
dongsheng@627 1302
dongsheng@627 1303 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1304 #: ../en/appD-license.xml:33
dongsheng@627 1305 msgid ""
dongsheng@627 1306 "The reference must be immediately followed with any options elected by the "
songdongsheng@658 1307 "author(s) and/or publisher of the document (see <xref linkend=\"sec:opl:"
songdongsheng@658 1308 "options\"/>)."
dongsheng@627 1309 msgstr ""
dongsheng@627 1310
dongsheng@627 1311 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1312 #: ../en/appD-license.xml:37
dongsheng@627 1313 msgid ""
dongsheng@627 1314 "Commercial redistribution of Open Publication-licensed material is permitted."
dongsheng@627 1315 msgstr ""
dongsheng@627 1316
dongsheng@627 1317 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1318 #: ../en/appD-license.xml:40
dongsheng@627 1319 msgid ""
dongsheng@627 1320 "Any publication in standard (paper) book form shall require the citation of "
dongsheng@627 1321 "the original publisher and author. The publisher and author's names shall "
dongsheng@627 1322 "appear on all outer surfaces of the book. On all outer surfaces of the book "
dongsheng@627 1323 "the original publisher's name shall be as large as the title of the work and "
dongsheng@627 1324 "cited as possessive with respect to the title."
dongsheng@627 1325 msgstr ""
dongsheng@627 1326
dongsheng@627 1327 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1328 #: ../en/appD-license.xml:49
dongsheng@627 1329 msgid "Copyright"
dongsheng@627 1330 msgstr ""
dongsheng@627 1331
dongsheng@627 1332 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1333 #: ../en/appD-license.xml:51
dongsheng@627 1334 msgid ""
dongsheng@627 1335 "The copyright to each Open Publication is owned by its author(s) or designee."
dongsheng@627 1336 msgstr ""
dongsheng@627 1337
dongsheng@627 1338 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1339 #: ../en/appD-license.xml:56
dongsheng@627 1340 msgid "Scope of license"
dongsheng@627 1341 msgstr ""
dongsheng@627 1342
dongsheng@627 1343 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1344 #: ../en/appD-license.xml:58
dongsheng@627 1345 msgid ""
dongsheng@627 1346 "The following license terms apply to all Open Publication works, unless "
dongsheng@627 1347 "otherwise explicitly stated in the document."
dongsheng@627 1348 msgstr ""
dongsheng@627 1349
dongsheng@627 1350 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1351 #: ../en/appD-license.xml:62
dongsheng@627 1352 msgid ""
dongsheng@627 1353 "Mere aggregation of Open Publication works or a portion of an Open "
dongsheng@627 1354 "Publication work with other works or programs on the same media shall not "
dongsheng@627 1355 "cause this license to apply to those other works. The aggregate work shall "
dongsheng@627 1356 "contain a notice specifying the inclusion of the Open Publication material "
dongsheng@627 1357 "and appropriate copyright notice."
dongsheng@627 1358 msgstr ""
dongsheng@627 1359
dongsheng@627 1360 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1361 #: ../en/appD-license.xml:69
dongsheng@627 1362 msgid ""
dongsheng@627 1363 "<emphasis role=\"bold\">Severability</emphasis>. If any part of this license "
dongsheng@627 1364 "is found to be unenforceable in any jurisdiction, the remaining portions of "
dongsheng@627 1365 "the license remain in force."
dongsheng@627 1366 msgstr ""
dongsheng@627 1367
dongsheng@627 1368 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1369 #: ../en/appD-license.xml:74
dongsheng@627 1370 msgid ""
dongsheng@627 1371 "<emphasis role=\"bold\">No warranty</emphasis>. Open Publication works are "
dongsheng@627 1372 "licensed and provided <quote>as is</quote> without warranty of any kind, "
dongsheng@627 1373 "express or implied, including, but not limited to, the implied warranties of "
dongsheng@627 1374 "merchantability and fitness for a particular purpose or a warranty of non-"
dongsheng@627 1375 "infringement."
dongsheng@627 1376 msgstr ""
dongsheng@627 1377
dongsheng@627 1378 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1379 #: ../en/appD-license.xml:83
dongsheng@627 1380 msgid "Requirements on modified works"
dongsheng@627 1381 msgstr ""
dongsheng@627 1382
dongsheng@627 1383 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1384 #: ../en/appD-license.xml:85
dongsheng@627 1385 msgid ""
dongsheng@627 1386 "All modified versions of documents covered by this license, including "
dongsheng@627 1387 "translations, anthologies, compilations and partial documents, must meet the "
dongsheng@627 1388 "following requirements:"
dongsheng@627 1389 msgstr ""
dongsheng@627 1390
dongsheng@627 1391 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1392 #: ../en/appD-license.xml:90
dongsheng@627 1393 msgid "The modified version must be labeled as such."
dongsheng@627 1394 msgstr ""
dongsheng@627 1395
dongsheng@627 1396 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1397 #: ../en/appD-license.xml:93
dongsheng@627 1398 msgid ""
dongsheng@627 1399 "The person making the modifications must be identified and the modifications "
dongsheng@627 1400 "dated."
dongsheng@627 1401 msgstr ""
dongsheng@627 1402
dongsheng@627 1403 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1404 #: ../en/appD-license.xml:96
dongsheng@627 1405 msgid ""
dongsheng@627 1406 "Acknowledgement of the original author and publisher if applicable must be "
dongsheng@627 1407 "retained according to normal academic citation practices."
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:100
dongsheng@627 1412 msgid "The location of the original unmodified document must be identified."
dongsheng@627 1413 msgstr ""
dongsheng@627 1414
dongsheng@627 1415 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1416 #: ../en/appD-license.xml:103
dongsheng@627 1417 msgid ""
dongsheng@627 1418 "The original author's (or authors') name(s) may not be used to assert or "
dongsheng@627 1419 "imply endorsement of the resulting document without the original author's (or "
dongsheng@627 1420 "authors') permission."
dongsheng@627 1421 msgstr ""
dongsheng@627 1422
dongsheng@627 1423 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1424 #: ../en/appD-license.xml:111
dongsheng@627 1425 msgid "Good-practice recommendations"
dongsheng@627 1426 msgstr ""
dongsheng@627 1427
dongsheng@627 1428 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1429 #: ../en/appD-license.xml:113
dongsheng@627 1430 msgid ""
dongsheng@627 1431 "In addition to the requirements of this license, it is requested from and "
dongsheng@627 1432 "strongly recommended of redistributors that:"
dongsheng@627 1433 msgstr ""
dongsheng@627 1434
dongsheng@627 1435 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1436 #: ../en/appD-license.xml:118
dongsheng@627 1437 msgid ""
dongsheng@627 1438 "If you are distributing Open Publication works on hardcopy or CD-ROM, you "
dongsheng@627 1439 "provide email notification to the authors of your intent to redistribute at "
dongsheng@627 1440 "least thirty days before your manuscript or media freeze, to give the authors "
dongsheng@627 1441 "time to provide updated documents. This notification should describe "
dongsheng@627 1442 "modifications, if any, made to the document."
dongsheng@627 1443 msgstr ""
dongsheng@627 1444
dongsheng@627 1445 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1446 #: ../en/appD-license.xml:125
dongsheng@627 1447 msgid ""
dongsheng@627 1448 "All substantive modifications (including deletions) be either clearly marked "
dongsheng@627 1449 "up in the document or else described in an attachment to the document."
dongsheng@627 1450 msgstr ""
dongsheng@627 1451
dongsheng@627 1452 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1453 #: ../en/appD-license.xml:129
dongsheng@627 1454 msgid ""
dongsheng@627 1455 "Finally, while it is not mandatory under this license, it is considered good "
dongsheng@627 1456 "form to offer a free copy of any hardcopy and CD-ROM expression of an Open "
dongsheng@627 1457 "Publication-licensed work to its author(s)."
dongsheng@627 1458 msgstr ""
dongsheng@627 1459
dongsheng@627 1460 #. type: Content of: <book><appendix><sect1><title>
dongsheng@627 1461 #: ../en/appD-license.xml:137
dongsheng@627 1462 msgid "License options"
dongsheng@627 1463 msgstr ""
dongsheng@627 1464
dongsheng@627 1465 #. type: Content of: <book><appendix><sect1><para>
dongsheng@627 1466 #: ../en/appD-license.xml:139
dongsheng@627 1467 msgid ""
dongsheng@627 1468 "The author(s) and/or publisher of an Open Publication-licensed document may "
dongsheng@627 1469 "elect certain options by appending language to the reference to or copy of "
dongsheng@627 1470 "the license. These options are considered part of the license instance and "
dongsheng@627 1471 "must be included with the license (or its incorporation by reference) in "
dongsheng@627 1472 "derived works."
dongsheng@627 1473 msgstr ""
dongsheng@627 1474
dongsheng@627 1475 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1476 #: ../en/appD-license.xml:147
dongsheng@627 1477 msgid ""
dongsheng@627 1478 "To prohibit distribution of substantively modified versions without the "
dongsheng@627 1479 "explicit permission of the author(s). <quote>Substantive modification</quote> "
dongsheng@627 1480 "is defined as a change to the semantic content of the document, and excludes "
dongsheng@627 1481 "mere changes in format or typographical corrections."
dongsheng@627 1482 msgstr ""
dongsheng@627 1483
dongsheng@627 1484 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1485 #: ../en/appD-license.xml:154
dongsheng@627 1486 msgid ""
dongsheng@627 1487 "To accomplish this, add the phrase <quote>Distribution of substantively "
dongsheng@627 1488 "modified versions of this document is prohibited without the explicit "
dongsheng@627 1489 "permission of the copyright holder.</quote> to the license reference or copy."
dongsheng@627 1490 msgstr ""
dongsheng@627 1491
dongsheng@627 1492 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1493 #: ../en/appD-license.xml:160
dongsheng@627 1494 msgid ""
dongsheng@627 1495 "To prohibit any publication of this work or derivative works in whole or in "
dongsheng@627 1496 "part in standard (paper) book form for commercial purposes is prohibited "
dongsheng@627 1497 "unless prior permission is obtained from the copyright holder."
dongsheng@627 1498 msgstr ""
dongsheng@627 1499
dongsheng@627 1500 #. type: Content of: <book><appendix><sect1><orderedlist><listitem><para>
dongsheng@627 1501 #: ../en/appD-license.xml:165
dongsheng@627 1502 msgid ""
dongsheng@627 1503 "To accomplish this, add the phrase <quote>Distribution of the work or "
dongsheng@627 1504 "derivative of the work in any standard (paper) book form is prohibited unless "
dongsheng@627 1505 "prior permission is obtained from the copyright holder.</quote> to the "
dongsheng@627 1506 "license reference or copy."
dongsheng@627 1507 msgstr ""
dongsheng@627 1508
dongsheng@653 1509 #. type: Content of: <book><preface><title>
dongsheng@653 1510 #: ../en/ch00-preface.xml:5
dongsheng@653 1511 msgid "Preface"
dongsheng@653 1512 msgstr "序言"
dongsheng@653 1513
dongsheng@653 1514 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 1515 #: ../en/ch00-preface.xml:8
dongsheng@653 1516 msgid "Why revision control? Why Mercurial?"
dongsheng@653 1517 msgstr "为什么使用版本控制? 为什么使用 Mercurial?"
dongsheng@653 1518
dongsheng@653 1519 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1520 #: ../en/ch00-preface.xml:10
dongsheng@653 1521 msgid ""
dongsheng@653 1522 "Revision control is the process of managing multiple versions of a piece of "
dongsheng@653 1523 "information. In its simplest form, this is something that many people do by "
dongsheng@653 1524 "hand: every time you modify a file, save it under a new name that contains a "
dongsheng@653 1525 "number, each one higher than the number of the preceding version."
dongsheng@653 1526 msgstr ""
dongsheng@653 1527
dongsheng@653 1528 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1529 #: ../en/ch00-preface.xml:16
dongsheng@653 1530 msgid ""
dongsheng@653 1531 "Manually managing multiple versions of even a single file is an error-prone "
dongsheng@653 1532 "task, though, so software tools to help automate this process have long been "
dongsheng@653 1533 "available. The earliest automated revision control tools were intended to "
dongsheng@653 1534 "help a single user to manage revisions of a single file. Over the past few "
dongsheng@653 1535 "decades, the scope of revision control tools has expanded greatly; they now "
dongsheng@653 1536 "manage multiple files, and help multiple people to work together. The best "
dongsheng@653 1537 "modern revision control tools have no problem coping with thousands of people "
dongsheng@653 1538 "working together on projects that consist of hundreds of thousands of files."
dongsheng@653 1539 msgstr ""
dongsheng@653 1540
dongsheng@653 1541 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1542 #: ../en/ch00-preface.xml:27
dongsheng@653 1543 msgid ""
dongsheng@653 1544 "The arrival of distributed revision control is relatively recent, and so far "
dongsheng@653 1545 "this new field has grown due to people's willingness to explore ill-charted "
dongsheng@653 1546 "territory."
dongsheng@653 1547 msgstr ""
dongsheng@653 1548
dongsheng@653 1549 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1550 #: ../en/ch00-preface.xml:31
dongsheng@653 1551 msgid ""
dongsheng@653 1552 "I am writing a book about distributed revision control because I believe that "
dongsheng@653 1553 "it is an important subject that deserves a field guide. I chose to write "
dongsheng@653 1554 "about Mercurial because it is the easiest tool to learn the terrain with, and "
dongsheng@653 1555 "yet it scales to the demands of real, challenging environments where many "
dongsheng@653 1556 "other revision control tools buckle."
dongsheng@653 1557 msgstr ""
dongsheng@653 1558
dongsheng@653 1559 #. type: Content of: <book><preface><sect1><sect2><title>
dongsheng@653 1560 #: ../en/ch00-preface.xml:39
dongsheng@653 1561 msgid "Why use revision control?"
dongsheng@653 1562 msgstr "为什么使用版本控制?"
dongsheng@653 1563
dongsheng@653 1564 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1565 #: ../en/ch00-preface.xml:41
dongsheng@653 1566 msgid ""
dongsheng@653 1567 "There are a number of reasons why you or your team might want to use an "
dongsheng@653 1568 "automated revision control tool for a project."
dongsheng@653 1569 msgstr ""
dongsheng@653 1570
dongsheng@653 1571 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1572 #: ../en/ch00-preface.xml:46
dongsheng@653 1573 msgid ""
dongsheng@653 1574 "It will track the history and evolution of your project, so you don't have "
dongsheng@653 1575 "to. For every change, you'll have a log of <emphasis>who</emphasis> made it; "
dongsheng@653 1576 "<emphasis>why</emphasis> they made it; <emphasis>when</emphasis> they made "
dongsheng@653 1577 "it; and <emphasis>what</emphasis> the change was."
dongsheng@653 1578 msgstr ""
dongsheng@653 1579
dongsheng@653 1580 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1581 #: ../en/ch00-preface.xml:53
dongsheng@653 1582 msgid ""
dongsheng@653 1583 "When you're working with other people, revision control software makes it "
dongsheng@653 1584 "easier for you to collaborate. For example, when people more or less "
dongsheng@653 1585 "simultaneously make potentially incompatible changes, the software will help "
dongsheng@653 1586 "you to identify and resolve those conflicts."
dongsheng@653 1587 msgstr ""
dongsheng@653 1588
dongsheng@653 1589 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1590 #: ../en/ch00-preface.xml:59
dongsheng@653 1591 msgid ""
dongsheng@653 1592 "It can help you to recover from mistakes. If you make a change that later "
dongsheng@653 1593 "turns out to be in error, you can revert to an earlier version of one or more "
dongsheng@653 1594 "files. In fact, a <emphasis>really</emphasis> good revision control tool "
dongsheng@653 1595 "will even help you to efficiently figure out exactly when a problem was "
songdongsheng@658 1596 "introduced (see <xref linkend=\"sec:undo:bisect\"/> for details)."
dongsheng@653 1597 msgstr ""
dongsheng@653 1598
dongsheng@653 1599 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1600 #: ../en/ch00-preface.xml:66
dongsheng@653 1601 msgid ""
dongsheng@653 1602 "It will help you to work simultaneously on, and manage the drift between, "
dongsheng@653 1603 "multiple versions of your project."
dongsheng@653 1604 msgstr ""
dongsheng@653 1605
dongsheng@653 1606 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1607 #: ../en/ch00-preface.xml:71
dongsheng@653 1608 msgid ""
dongsheng@653 1609 "Most of these reasons are equally valid---at least in theory---whether you're "
dongsheng@653 1610 "working on a project by yourself, or with a hundred other people."
dongsheng@653 1611 msgstr ""
dongsheng@653 1612
dongsheng@653 1613 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1614 #: ../en/ch00-preface.xml:75
dongsheng@653 1615 msgid ""
dongsheng@653 1616 "A key question about the practicality of revision control at these two "
dongsheng@653 1617 "different scales (<quote>lone hacker</quote> and <quote>huge team</quote>) is "
dongsheng@653 1618 "how its <emphasis>benefits</emphasis> compare to its <emphasis>costs</"
dongsheng@653 1619 "emphasis>. A revision control tool that's difficult to understand or use is "
dongsheng@653 1620 "going to impose a high cost."
dongsheng@653 1621 msgstr ""
dongsheng@653 1622
dongsheng@653 1623 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1624 #: ../en/ch00-preface.xml:83
dongsheng@653 1625 msgid ""
dongsheng@653 1626 "A five-hundred-person project is likely to collapse under its own weight "
dongsheng@653 1627 "almost immediately without a revision control tool and process. In this case, "
dongsheng@653 1628 "the cost of using revision control might hardly seem worth considering, since "
dongsheng@653 1629 "<emphasis>without</emphasis> it, failure is almost guaranteed."
dongsheng@653 1630 msgstr ""
dongsheng@653 1631
dongsheng@653 1632 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1633 #: ../en/ch00-preface.xml:90
dongsheng@653 1634 msgid ""
dongsheng@653 1635 "On the other hand, a one-person <quote>quick hack</quote> might seem like a "
dongsheng@653 1636 "poor place to use a revision control tool, because surely the cost of using "
dongsheng@653 1637 "one must be close to the overall cost of the project. Right?"
dongsheng@653 1638 msgstr ""
dongsheng@653 1639
dongsheng@653 1640 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1641 #: ../en/ch00-preface.xml:95
dongsheng@653 1642 msgid ""
dongsheng@653 1643 "Mercurial uniquely supports <emphasis>both</emphasis> of these scales of "
dongsheng@653 1644 "development. You can learn the basics in just a few minutes, and due to its "
dongsheng@653 1645 "low overhead, you can apply revision control to the smallest of projects with "
dongsheng@653 1646 "ease. Its simplicity means you won't have a lot of abstruse concepts or "
dongsheng@653 1647 "command sequences competing for mental space with whatever you're "
dongsheng@653 1648 "<emphasis>really</emphasis> trying to do. At the same time, Mercurial's high "
dongsheng@653 1649 "performance and peer-to-peer nature let you scale painlessly to handle large "
dongsheng@653 1650 "projects."
dongsheng@653 1651 msgstr ""
dongsheng@653 1652
dongsheng@653 1653 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1654 #: ../en/ch00-preface.xml:105
dongsheng@653 1655 msgid ""
dongsheng@653 1656 "No revision control tool can rescue a poorly run project, but a good choice "
dongsheng@653 1657 "of tools can make a huge difference to the fluidity with which you can work "
dongsheng@653 1658 "on a project."
dongsheng@653 1659 msgstr ""
dongsheng@653 1660
dongsheng@653 1661 #. type: Content of: <book><preface><sect1><sect2><title>
dongsheng@653 1662 #: ../en/ch00-preface.xml:112
dongsheng@653 1663 msgid "The many names of revision control"
dongsheng@653 1664 msgstr "版本控制的别名"
dongsheng@653 1665
dongsheng@653 1666 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1667 #: ../en/ch00-preface.xml:114
dongsheng@653 1668 msgid ""
dongsheng@653 1669 "Revision control is a diverse field, so much so that it is referred to by "
dongsheng@653 1670 "many names and acronyms. Here are a few of the more common variations you'll "
dongsheng@653 1671 "encounter:"
dongsheng@653 1672 msgstr ""
dongsheng@653 1673
dongsheng@653 1674 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1675 #: ../en/ch00-preface.xml:118
dongsheng@653 1676 msgid "Revision control (RCS)"
dongsheng@653 1677 msgstr "版本控制(RCS)"
dongsheng@653 1678
dongsheng@653 1679 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1680 #: ../en/ch00-preface.xml:119
dongsheng@653 1681 msgid "Software configuration management (SCM), or configuration management"
dongsheng@653 1682 msgstr "软件配置管理(SCM),或配置管理"
dongsheng@653 1683
dongsheng@653 1684 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1685 #: ../en/ch00-preface.xml:121
dongsheng@653 1686 msgid "Source code management"
dongsheng@653 1687 msgstr "源代码管理"
dongsheng@653 1688
dongsheng@653 1689 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1690 #: ../en/ch00-preface.xml:122
dongsheng@653 1691 msgid "Source code control, or source control"
dongsheng@653 1692 msgstr "源代码控制,或源控制"
dongsheng@653 1693
dongsheng@653 1694 #. type: Content of: <book><preface><sect1><sect2><itemizedlist><listitem><para>
dongsheng@653 1695 #: ../en/ch00-preface.xml:124
dongsheng@653 1696 msgid "Version control (VCS)"
dongsheng@653 1697 msgstr "版本控制(VCS)"
dongsheng@653 1698
dongsheng@653 1699 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1700 #: ../en/ch00-preface.xml:126
dongsheng@653 1701 msgid ""
dongsheng@653 1702 "Some people claim that these terms actually have different meanings, but in "
dongsheng@653 1703 "practice they overlap so much that there's no agreed or even useful way to "
dongsheng@653 1704 "tease them apart."
dongsheng@653 1705 msgstr ""
dongsheng@653 1706
dongsheng@653 1707 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 1708 #: ../en/ch00-preface.xml:134
dongsheng@653 1709 msgid "This book is a work in progress"
dongsheng@653 1710 msgstr "本书正在编写中"
dongsheng@653 1711
dongsheng@653 1712 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1713 #: ../en/ch00-preface.xml:136
dongsheng@653 1714 msgid ""
dongsheng@653 1715 "I am releasing this book while I am still writing it, in the hope that it "
dongsheng@653 1716 "will prove useful to others. I am writing under an open license in the hope "
dongsheng@653 1717 "that you, my readers, will contribute feedback and perhaps content of your "
dongsheng@653 1718 "own."
dongsheng@653 1719 msgstr ""
dongsheng@653 1720
dongsheng@653 1721 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 1722 #: ../en/ch00-preface.xml:143
dongsheng@653 1723 msgid "About the examples in this book"
dongsheng@653 1724 msgstr "本书的例子"
dongsheng@653 1725
dongsheng@653 1726 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1727 #: ../en/ch00-preface.xml:145
dongsheng@653 1728 msgid ""
dongsheng@653 1729 "This book takes an unusual approach to code samples. Every example is "
dongsheng@653 1730 "<quote>live</quote>---each one is actually the result of a shell script that "
dongsheng@653 1731 "executes the Mercurial commands you see. Every time an image of the book is "
dongsheng@653 1732 "built from its sources, all the example scripts are automatically run, and "
dongsheng@653 1733 "their current results compared against their expected results."
dongsheng@653 1734 msgstr ""
dongsheng@653 1735
dongsheng@653 1736 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1737 #: ../en/ch00-preface.xml:152
dongsheng@653 1738 msgid ""
dongsheng@653 1739 "The advantage of this approach is that the examples are always accurate; they "
dongsheng@653 1740 "describe <emphasis>exactly</emphasis> the behaviour of the version of "
dongsheng@653 1741 "Mercurial that's mentioned at the front of the book. If I update the version "
dongsheng@653 1742 "of Mercurial that I'm documenting, and the output of some command changes, "
dongsheng@653 1743 "the build fails."
dongsheng@653 1744 msgstr ""
dongsheng@653 1745
dongsheng@653 1746 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1747 #: ../en/ch00-preface.xml:159
dongsheng@653 1748 msgid ""
dongsheng@653 1749 "There is a small disadvantage to this approach, which is that the dates and "
dongsheng@653 1750 "times you'll see in examples tend to be <quote>squashed</quote> together in a "
dongsheng@653 1751 "way that they wouldn't be if the same commands were being typed by a human. "
dongsheng@653 1752 "Where a human can issue no more than one command every few seconds, with any "
dongsheng@653 1753 "resulting timestamps correspondingly spread out, my automated example scripts "
dongsheng@653 1754 "run many commands in one second."
dongsheng@653 1755 msgstr ""
dongsheng@653 1756
dongsheng@653 1757 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1758 #: ../en/ch00-preface.xml:167
dongsheng@653 1759 msgid ""
dongsheng@653 1760 "As an instance of this, several consecutive commits in an example can show up "
dongsheng@653 1761 "as having occurred during the same second. You can see this occur in the "
songdongsheng@658 1762 "<literal role=\"hg-ext\">bisect</literal> example in <xref linkend=\"sec:undo:"
songdongsheng@658 1763 "bisect\"/>, for instance."
dongsheng@653 1764 msgstr ""
dongsheng@653 1765
dongsheng@653 1766 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1767 #: ../en/ch00-preface.xml:173
dongsheng@653 1768 msgid ""
dongsheng@653 1769 "So when you're reading examples, don't place too much weight on the dates or "
dongsheng@653 1770 "times you see in the output of commands. But <emphasis>do</emphasis> be "
dongsheng@653 1771 "confident that the behaviour you're seeing is consistent and reproducible."
dongsheng@653 1772 msgstr ""
dongsheng@653 1773
dongsheng@653 1774 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 1775 #: ../en/ch00-preface.xml:181
dongsheng@653 1776 msgid "Trends in the field"
dongsheng@653 1777 msgstr "版本控制的发展趋势"
dongsheng@653 1778
dongsheng@653 1779 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1780 #: ../en/ch00-preface.xml:183
dongsheng@653 1781 msgid ""
dongsheng@653 1782 "There has been an unmistakable trend in the development and use of revision "
dongsheng@653 1783 "control tools over the past four decades, as people have become familiar with "
dongsheng@653 1784 "the capabilities of their tools and constrained by their limitations."
dongsheng@653 1785 msgstr ""
dongsheng@653 1786
dongsheng@653 1787 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1788 #: ../en/ch00-preface.xml:188
dongsheng@653 1789 msgid ""
dongsheng@653 1790 "The first generation began by managing single files on individual computers. "
dongsheng@653 1791 "Although these tools represented a huge advance over ad-hoc manual revision "
dongsheng@653 1792 "control, their locking model and reliance on a single computer limited them "
dongsheng@653 1793 "to small, tightly-knit teams."
dongsheng@653 1794 msgstr ""
dongsheng@653 1795
dongsheng@653 1796 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1797 #: ../en/ch00-preface.xml:194
dongsheng@653 1798 msgid ""
dongsheng@653 1799 "The second generation loosened these constraints by moving to network-"
dongsheng@653 1800 "centered architectures, and managing entire projects at a time. As projects "
dongsheng@653 1801 "grew larger, they ran into new problems. With clients needing to talk to "
dongsheng@653 1802 "servers very frequently, server scaling became an issue for large projects. "
dongsheng@653 1803 "An unreliable network connection could prevent remote users from being able "
dongsheng@653 1804 "to talk to the server at all. As open source projects started making read-"
dongsheng@653 1805 "only access available anonymously to anyone, people without commit privileges "
dongsheng@653 1806 "found that they could not use the tools to interact with a project in a "
dongsheng@653 1807 "natural way, as they could not record their changes."
dongsheng@653 1808 msgstr ""
dongsheng@653 1809
dongsheng@653 1810 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1811 #: ../en/ch00-preface.xml:206
dongsheng@653 1812 msgid ""
dongsheng@653 1813 "The current generation of revision control tools is peer-to-peer in nature. "
dongsheng@653 1814 "All of these systems have dropped the dependency on a single central server, "
dongsheng@653 1815 "and allow people to distribute their revision control data to where it's "
dongsheng@653 1816 "actually needed. Collaboration over the Internet has moved from constrained "
dongsheng@653 1817 "by technology to a matter of choice and consensus. Modern tools can operate "
dongsheng@653 1818 "offline indefinitely and autonomously, with a network connection only needed "
dongsheng@653 1819 "when syncing changes with another repository."
dongsheng@653 1820 msgstr ""
dongsheng@653 1821
dongsheng@653 1822 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 1823 #: ../en/ch00-preface.xml:218
dongsheng@653 1824 msgid "A few of the advantages of distributed revision control"
dongsheng@653 1825 msgstr "分布版本控制的优点"
dongsheng@653 1826
dongsheng@653 1827 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1828 #: ../en/ch00-preface.xml:221
dongsheng@653 1829 msgid ""
dongsheng@653 1830 "Even though distributed revision control tools have for several years been as "
dongsheng@653 1831 "robust and usable as their previous-generation counterparts, people using "
dongsheng@653 1832 "older tools have not yet necessarily woken up to their advantages. There are "
dongsheng@653 1833 "a number of ways in which distributed tools shine relative to centralised "
dongsheng@653 1834 "ones."
dongsheng@653 1835 msgstr ""
dongsheng@653 1836
dongsheng@653 1837 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1838 #: ../en/ch00-preface.xml:228
dongsheng@653 1839 msgid ""
dongsheng@653 1840 "For an individual developer, distributed tools are almost always much faster "
dongsheng@653 1841 "than centralised tools. This is for a simple reason: a centralised tool "
dongsheng@653 1842 "needs to talk over the network for many common operations, because most "
dongsheng@653 1843 "metadata is stored in a single copy on the central server. A distributed "
dongsheng@653 1844 "tool stores all of its metadata locally. All else being equal, talking over "
dongsheng@653 1845 "the network adds overhead to a centralised tool. Don't underestimate the "
dongsheng@653 1846 "value of a snappy, responsive tool: you're going to spend a lot of time "
dongsheng@653 1847 "interacting with your revision control software."
dongsheng@653 1848 msgstr ""
dongsheng@653 1849
dongsheng@653 1850 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1851 #: ../en/ch00-preface.xml:239
dongsheng@653 1852 msgid ""
dongsheng@653 1853 "Distributed tools are indifferent to the vagaries of your server "
dongsheng@653 1854 "infrastructure, again because they replicate metadata to so many locations. "
dongsheng@653 1855 "If you use a centralised system and your server catches fire, you'd better "
dongsheng@653 1856 "hope that your backup media are reliable, and that your last backup was "
dongsheng@653 1857 "recent and actually worked. With a distributed tool, you have many backups "
dongsheng@653 1858 "available on every contributor's computer."
dongsheng@653 1859 msgstr ""
dongsheng@653 1860
dongsheng@653 1861 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 1862 #: ../en/ch00-preface.xml:247
dongsheng@653 1863 msgid ""
dongsheng@653 1864 "The reliability of your network will affect distributed tools far less than "
dongsheng@653 1865 "it will centralised tools. You can't even use a centralised tool without a "
dongsheng@653 1866 "network connection, except for a few highly constrained commands. With a "
dongsheng@653 1867 "distributed tool, if your network connection goes down while you're working, "
dongsheng@653 1868 "you may not even notice. The only thing you won't be able to do is talk to "
dongsheng@653 1869 "repositories on other computers, something that is relatively rare compared "
dongsheng@653 1870 "with local operations. If you have a far-flung team of collaborators, this "
dongsheng@653 1871 "may be significant."
dongsheng@653 1872 msgstr ""
dongsheng@653 1873
dongsheng@653 1874 #. type: Content of: <book><preface><sect1><sect2><title>
dongsheng@653 1875 #: ../en/ch00-preface.xml:258
dongsheng@653 1876 msgid "Advantages for open source projects"
dongsheng@653 1877 msgstr "开源项目的优点"
dongsheng@653 1878
dongsheng@653 1879 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1880 #: ../en/ch00-preface.xml:260
dongsheng@653 1881 msgid ""
dongsheng@653 1882 "If you take a shine to an open source project and decide that you would like "
dongsheng@653 1883 "to start hacking on it, and that project uses a distributed revision control "
dongsheng@653 1884 "tool, you are at once a peer with the people who consider themselves the "
dongsheng@653 1885 "<quote>core</quote> of that project. If they publish their repositories, you "
dongsheng@653 1886 "can immediately copy their project history, start making changes, and record "
dongsheng@653 1887 "your work, using the same tools in the same ways as insiders. By contrast, "
dongsheng@653 1888 "with a centralised tool, you must use the software in a <quote>read only</"
dongsheng@653 1889 "quote> mode unless someone grants you permission to commit changes to their "
dongsheng@653 1890 "central server. Until then, you won't be able to record changes, and your "
dongsheng@653 1891 "local modifications will be at risk of corruption any time you try to update "
dongsheng@653 1892 "your client's view of the repository."
dongsheng@653 1893 msgstr ""
dongsheng@653 1894
dongsheng@653 1895 #. type: Content of: <book><preface><sect1><sect2><sect3><title>
dongsheng@653 1896 #: ../en/ch00-preface.xml:276
dongsheng@653 1897 msgid "The forking non-problem"
dongsheng@660 1898 msgstr "分叉不是问题"
dongsheng@653 1899
dongsheng@653 1900 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
dongsheng@653 1901 #: ../en/ch00-preface.xml:278
dongsheng@653 1902 msgid ""
dongsheng@653 1903 "It has been suggested that distributed revision control tools pose some sort "
dongsheng@653 1904 "of risk to open source projects because they make it easy to <quote>fork</"
dongsheng@653 1905 "quote> the development of a project. A fork happens when there are "
dongsheng@653 1906 "differences in opinion or attitude between groups of developers that cause "
dongsheng@653 1907 "them to decide that they can't work together any longer. Each side takes a "
dongsheng@653 1908 "more or less complete copy of the project's source code, and goes off in its "
dongsheng@653 1909 "own direction."
dongsheng@653 1910 msgstr ""
dongsheng@653 1911
dongsheng@653 1912 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
dongsheng@653 1913 #: ../en/ch00-preface.xml:288
dongsheng@653 1914 msgid ""
dongsheng@653 1915 "Sometimes the camps in a fork decide to reconcile their differences. With a "
dongsheng@653 1916 "centralised revision control system, the <emphasis>technical</emphasis> "
dongsheng@653 1917 "process of reconciliation is painful, and has to be performed largely by "
dongsheng@653 1918 "hand. You have to decide whose revision history is going to <quote>win</"
dongsheng@653 1919 "quote>, and graft the other team's changes into the tree somehow. This "
dongsheng@653 1920 "usually loses some or all of one side's revision history."
dongsheng@653 1921 msgstr ""
dongsheng@653 1922
dongsheng@653 1923 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
dongsheng@653 1924 #: ../en/ch00-preface.xml:297
dongsheng@653 1925 msgid ""
dongsheng@653 1926 "What distributed tools do with respect to forking is they make forking the "
dongsheng@653 1927 "<emphasis>only</emphasis> way to develop a project. Every single change that "
dongsheng@653 1928 "you make is potentially a fork point. The great strength of this approach is "
dongsheng@653 1929 "that a distributed revision control tool has to be really good at "
dongsheng@653 1930 "<emphasis>merging</emphasis> forks, because forks are absolutely fundamental: "
dongsheng@653 1931 "they happen all the time."
dongsheng@653 1932 msgstr ""
dongsheng@653 1933
dongsheng@653 1934 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
dongsheng@653 1935 #: ../en/ch00-preface.xml:306
dongsheng@653 1936 msgid ""
dongsheng@653 1937 "If every piece of work that everybody does, all the time, is framed in terms "
dongsheng@653 1938 "of forking and merging, then what the open source world refers to as a "
dongsheng@653 1939 "<quote>fork</quote> becomes <emphasis>purely</emphasis> a social issue. If "
dongsheng@653 1940 "anything, distributed tools <emphasis>lower</emphasis> the likelihood of a "
dongsheng@653 1941 "fork:"
dongsheng@653 1942 msgstr ""
dongsheng@653 1943
dongsheng@653 1944 #. type: Content of: <book><preface><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@653 1945 #: ../en/ch00-preface.xml:313
dongsheng@653 1946 msgid ""
dongsheng@653 1947 "They eliminate the social distinction that centralised tools impose: that "
dongsheng@653 1948 "between insiders (people with commit access) and outsiders (people without)."
dongsheng@653 1949 msgstr ""
dongsheng@653 1950
dongsheng@653 1951 #. type: Content of: <book><preface><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@653 1952 #: ../en/ch00-preface.xml:317
dongsheng@653 1953 msgid ""
dongsheng@653 1954 "They make it easier to reconcile after a social fork, because all that's "
dongsheng@653 1955 "involved from the perspective of the revision control software is just "
dongsheng@653 1956 "another merge."
dongsheng@653 1957 msgstr ""
dongsheng@653 1958
dongsheng@653 1959 #. type: Content of: <book><preface><sect1><sect2><sect3><para>
dongsheng@653 1960 #: ../en/ch00-preface.xml:322
dongsheng@653 1961 msgid ""
dongsheng@653 1962 "Some people resist distributed tools because they want to retain tight "
dongsheng@653 1963 "control over their projects, and they believe that centralised tools give "
dongsheng@653 1964 "them this control. However, if you're of this belief, and you publish your "
dongsheng@653 1965 "CVS or Subversion repositories publicly, there are plenty of tools available "
dongsheng@653 1966 "that can pull out your entire project's history (albeit slowly) and recreate "
dongsheng@653 1967 "it somewhere that you don't control. So while your control in this case is "
dongsheng@653 1968 "illusory, you are forgoing the ability to fluidly collaborate with whatever "
dongsheng@653 1969 "people feel compelled to mirror and fork your history."
dongsheng@653 1970 msgstr ""
dongsheng@653 1971
dongsheng@653 1972 #. type: Content of: <book><preface><sect1><sect2><title>
dongsheng@653 1973 #: ../en/ch00-preface.xml:337
dongsheng@653 1974 msgid "Advantages for commercial projects"
dongsheng@653 1975 msgstr "商业项目的优点"
dongsheng@653 1976
dongsheng@653 1977 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 1978 #: ../en/ch00-preface.xml:339
dongsheng@653 1979 msgid ""
dongsheng@653 1980 "Many commercial projects are undertaken by teams that are scattered across "
dongsheng@653 1981 "the globe. Contributors who are far from a central server will see slower "
dongsheng@653 1982 "command execution and perhaps less reliability. Commercial revision control "
dongsheng@653 1983 "systems attempt to ameliorate these problems with remote-site replication add-"
dongsheng@653 1984 "ons that are typically expensive to buy and cantankerous to administer. A "
dongsheng@653 1985 "distributed system doesn't suffer from these problems in the first place. "
dongsheng@653 1986 "Better yet, you can easily set up multiple authoritative servers, say one per "
dongsheng@653 1987 "site, so that there's no redundant communication between repositories over "
dongsheng@653 1988 "expensive long-haul network links."
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:351
dongsheng@653 1993 msgid ""
dongsheng@653 1994 "Centralised revision control systems tend to have relatively low "
dongsheng@653 1995 "scalability. It's not unusual for an expensive centralised system to fall "
dongsheng@653 1996 "over under the combined load of just a few dozen concurrent users. Once "
dongsheng@653 1997 "again, the typical response tends to be an expensive and clunky replication "
dongsheng@653 1998 "facility. Since the load on a central server---if you have one at all---is "
dongsheng@653 1999 "many times lower with a distributed tool (because all of the data is "
dongsheng@653 2000 "replicated everywhere), a single cheap server can handle the needs of a much "
dongsheng@653 2001 "larger team, and replication to balance load becomes a simple matter of "
dongsheng@653 2002 "scripting."
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:363
dongsheng@653 2007 msgid ""
dongsheng@653 2008 "If you have an employee in the field, troubleshooting a problem at a "
dongsheng@653 2009 "customer's site, they'll benefit from distributed revision control. The tool "
dongsheng@653 2010 "will let them generate custom builds, try different fixes in isolation from "
dongsheng@653 2011 "each other, and search efficiently through history for the sources of bugs "
dongsheng@653 2012 "and regressions in the customer's environment, all without needing to connect "
dongsheng@653 2013 "to your company's network."
dongsheng@653 2014 msgstr ""
dongsheng@653 2015
dongsheng@653 2016 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 2017 #: ../en/ch00-preface.xml:374
dongsheng@653 2018 msgid "Why choose Mercurial?"
dongsheng@653 2019 msgstr "为什么选择 Mercurial?"
dongsheng@653 2020
dongsheng@653 2021 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2022 #: ../en/ch00-preface.xml:376
dongsheng@653 2023 msgid ""
dongsheng@653 2024 "Mercurial has a unique set of properties that make it a particularly good "
dongsheng@653 2025 "choice as a revision control system."
dongsheng@653 2026 msgstr ""
dongsheng@653 2027
dongsheng@653 2028 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2029 #: ../en/ch00-preface.xml:379
dongsheng@653 2030 msgid "It is easy to learn and use."
dongsheng@653 2031 msgstr ""
dongsheng@653 2032
dongsheng@653 2033 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2034 #: ../en/ch00-preface.xml:380
dongsheng@653 2035 msgid "It is lightweight."
dongsheng@653 2036 msgstr ""
dongsheng@653 2037
dongsheng@653 2038 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2039 #: ../en/ch00-preface.xml:381
dongsheng@653 2040 msgid "It scales excellently."
dongsheng@653 2041 msgstr ""
dongsheng@653 2042
dongsheng@653 2043 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2044 #: ../en/ch00-preface.xml:382
dongsheng@653 2045 msgid "It is easy to customise."
dongsheng@653 2046 msgstr ""
dongsheng@653 2047
dongsheng@653 2048 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2049 #: ../en/ch00-preface.xml:385
dongsheng@653 2050 msgid ""
dongsheng@653 2051 "If you are at all familiar with revision control systems, you should be able "
dongsheng@653 2052 "to get up and running with Mercurial in less than five minutes. Even if not, "
dongsheng@653 2053 "it will take no more than a few minutes longer. Mercurial's command and "
dongsheng@653 2054 "feature sets are generally uniform and consistent, so you can keep track of a "
dongsheng@653 2055 "few general rules instead of a host of exceptions."
dongsheng@653 2056 msgstr ""
dongsheng@653 2057
dongsheng@653 2058 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2059 #: ../en/ch00-preface.xml:392
dongsheng@653 2060 msgid ""
dongsheng@653 2061 "On a small project, you can start working with Mercurial in moments. Creating "
dongsheng@653 2062 "new changes and branches; transferring changes around (whether locally or "
dongsheng@653 2063 "over a network); and history and status operations are all fast. Mercurial "
dongsheng@653 2064 "attempts to stay nimble and largely out of your way by combining low "
dongsheng@653 2065 "cognitive overhead with blazingly fast operations."
dongsheng@653 2066 msgstr ""
dongsheng@653 2067
dongsheng@653 2068 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2069 #: ../en/ch00-preface.xml:399
dongsheng@653 2070 msgid ""
dongsheng@653 2071 "The usefulness of Mercurial is not limited to small projects: it is used by "
dongsheng@653 2072 "projects with hundreds to thousands of contributors, each containing tens of "
dongsheng@653 2073 "thousands of files and hundreds of megabytes of source code."
dongsheng@653 2074 msgstr ""
dongsheng@653 2075
dongsheng@653 2076 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2077 #: ../en/ch00-preface.xml:404
dongsheng@653 2078 msgid ""
dongsheng@653 2079 "If the core functionality of Mercurial is not enough for you, it's easy to "
dongsheng@653 2080 "build on. Mercurial is well suited to scripting tasks, and its clean "
dongsheng@653 2081 "internals and implementation in Python make it easy to add features in the "
dongsheng@653 2082 "form of extensions. There are a number of popular and useful extensions "
dongsheng@653 2083 "already available, ranging from helping to identify bugs to improving "
dongsheng@653 2084 "performance."
dongsheng@653 2085 msgstr ""
dongsheng@653 2086
dongsheng@653 2087 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 2088 #: ../en/ch00-preface.xml:414
dongsheng@653 2089 msgid "Mercurial compared with other tools"
dongsheng@653 2090 msgstr "Mercurial 与其它工具的比较"
dongsheng@653 2091
dongsheng@653 2092 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2093 #: ../en/ch00-preface.xml:416
dongsheng@653 2094 msgid ""
dongsheng@653 2095 "Before you read on, please understand that this section necessarily reflects "
dongsheng@653 2096 "my own experiences, interests, and (dare I say it) biases. I have used every "
dongsheng@653 2097 "one of the revision control tools listed below, in most cases for several "
dongsheng@653 2098 "years at a time."
dongsheng@653 2099 msgstr ""
dongsheng@653 2100
dongsheng@653 2101 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2102 #: ../en/ch00-preface.xml:424 ../en/ch00-preface.xml:635
dongsheng@653 2103 msgid "Subversion"
dongsheng@653 2104 msgstr ""
dongsheng@653 2105
dongsheng@653 2106 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2107 #: ../en/ch00-preface.xml:426
dongsheng@653 2108 msgid ""
dongsheng@653 2109 "Subversion is a popular revision control tool, developed to replace CVS. It "
dongsheng@653 2110 "has a centralised client/server architecture."
dongsheng@653 2111 msgstr ""
dongsheng@653 2112
dongsheng@653 2113 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2114 #: ../en/ch00-preface.xml:430
dongsheng@653 2115 msgid ""
dongsheng@653 2116 "Subversion and Mercurial have similarly named commands for performing the "
dongsheng@653 2117 "same operations, so if you're familiar with one, it is easy to learn to use "
dongsheng@653 2118 "the other. Both tools are portable to all popular operating systems."
dongsheng@653 2119 msgstr ""
dongsheng@653 2120
dongsheng@653 2121 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2122 #: ../en/ch00-preface.xml:435
dongsheng@653 2123 msgid ""
dongsheng@653 2124 "Prior to version 1.5, Subversion had no useful support for merges. At the "
dongsheng@653 2125 "time of writing, its merge tracking capability is new, and known to be <ulink "
dongsheng@653 2126 "url=\"http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced."
dongsheng@653 2127 "html#svn.branchmerge.advanced.finalword\">complicated and buggy</ulink>."
dongsheng@653 2128 msgstr ""
dongsheng@653 2129
dongsheng@653 2130 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2131 #: ../en/ch00-preface.xml:441
dongsheng@653 2132 msgid ""
dongsheng@653 2133 "Mercurial has a substantial performance advantage over Subversion on every "
dongsheng@653 2134 "revision control operation I have benchmarked. I have measured its advantage "
dongsheng@653 2135 "as ranging from a factor of two to a factor of six when compared with "
dongsheng@653 2136 "Subversion 1.4.3's <emphasis>ra_local</emphasis> file store, which is the "
dongsheng@653 2137 "fastest access method available. In more realistic deployments involving a "
dongsheng@653 2138 "network-based store, Subversion will be at a substantially larger "
dongsheng@653 2139 "disadvantage. Because many Subversion commands must talk to the server and "
dongsheng@653 2140 "Subversion does not have useful replication facilities, server capacity and "
dongsheng@653 2141 "network bandwidth become bottlenecks for modestly large projects."
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:454
dongsheng@653 2146 msgid ""
dongsheng@653 2147 "Additionally, Subversion incurs substantial storage overhead to avoid network "
dongsheng@653 2148 "transactions for a few common operations, such as finding modified files "
dongsheng@653 2149 "(<literal>status</literal>) and displaying modifications against the current "
dongsheng@653 2150 "revision (<literal>diff</literal>). As a result, a Subversion working copy "
dongsheng@653 2151 "is often the same size as, or larger than, a Mercurial repository and working "
dongsheng@653 2152 "directory, even though the Mercurial repository contains a complete history "
dongsheng@653 2153 "of the project."
dongsheng@653 2154 msgstr ""
dongsheng@653 2155
dongsheng@653 2156 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2157 #: ../en/ch00-preface.xml:464
dongsheng@653 2158 msgid ""
dongsheng@653 2159 "Subversion is widely supported by third party tools. Mercurial currently "
dongsheng@653 2160 "lags considerably in this area. This gap is closing, however, and indeed "
dongsheng@653 2161 "some of Mercurial's GUI tools now outshine their Subversion equivalents. "
dongsheng@653 2162 "Like Mercurial, Subversion has an excellent user manual."
dongsheng@653 2163 msgstr ""
dongsheng@653 2164
dongsheng@653 2165 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2166 #: ../en/ch00-preface.xml:470
dongsheng@653 2167 msgid ""
dongsheng@653 2168 "Because Subversion doesn't store revision history on the client, it is well "
dongsheng@653 2169 "suited to managing projects that deal with lots of large, opaque binary "
dongsheng@653 2170 "files. If you check in fifty revisions to an incompressible 10MB file, "
dongsheng@653 2171 "Subversion's client-side space usage stays constant The space used by any "
dongsheng@653 2172 "distributed SCM will grow rapidly in proportion to the number of revisions, "
dongsheng@653 2173 "because the differences between each revision are large."
dongsheng@653 2174 msgstr ""
dongsheng@653 2175
dongsheng@653 2176 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2177 #: ../en/ch00-preface.xml:479
dongsheng@653 2178 msgid ""
dongsheng@653 2179 "In addition, it's often difficult or, more usually, impossible to merge "
dongsheng@653 2180 "different versions of a binary file. Subversion's ability to let a user lock "
dongsheng@653 2181 "a file, so that they temporarily have the exclusive right to commit changes "
dongsheng@653 2182 "to it, can be a significant advantage to a project where binary files are "
dongsheng@653 2183 "widely used."
dongsheng@653 2184 msgstr ""
dongsheng@653 2185
dongsheng@653 2186 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2187 #: ../en/ch00-preface.xml:486
dongsheng@653 2188 msgid ""
dongsheng@653 2189 "Mercurial can import revision history from a Subversion repository. It can "
dongsheng@653 2190 "also export revision history to a Subversion repository. This makes it easy "
dongsheng@653 2191 "to <quote>test the waters</quote> and use Mercurial and Subversion in "
dongsheng@653 2192 "parallel before deciding to switch. History conversion is incremental, so "
dongsheng@653 2193 "you can perform an initial conversion, then small additional conversions "
dongsheng@653 2194 "afterwards to bring in new changes."
dongsheng@653 2195 msgstr ""
dongsheng@653 2196
dongsheng@653 2197 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2198 #: ../en/ch00-preface.xml:498 ../en/ch00-preface.xml:637
dongsheng@653 2199 msgid "Git"
dongsheng@653 2200 msgstr ""
dongsheng@653 2201
dongsheng@653 2202 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2203 #: ../en/ch00-preface.xml:500
dongsheng@653 2204 msgid ""
dongsheng@653 2205 "Git is a distributed revision control tool that was developed for managing "
dongsheng@653 2206 "the Linux kernel source tree. Like Mercurial, its early design was somewhat "
dongsheng@653 2207 "influenced by Monotone."
dongsheng@653 2208 msgstr ""
dongsheng@653 2209
dongsheng@653 2210 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2211 #: ../en/ch00-preface.xml:505
dongsheng@653 2212 msgid ""
dongsheng@653 2213 "Git has a very large command set, with version 1.5.0 providing 139 individual "
dongsheng@653 2214 "commands. It has something of a reputation for being difficult to learn. "
dongsheng@653 2215 "Compared to Git, Mercurial has a strong focus on simplicity."
dongsheng@653 2216 msgstr ""
dongsheng@653 2217
dongsheng@653 2218 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2219 #: ../en/ch00-preface.xml:510
dongsheng@653 2220 msgid ""
dongsheng@653 2221 "In terms of performance, Git is extremely fast. In several cases, it is "
dongsheng@653 2222 "faster than Mercurial, at least on Linux, while Mercurial performs better on "
dongsheng@653 2223 "other operations. However, on Windows, the performance and general level of "
dongsheng@653 2224 "support that Git provides is, at the time of writing, far behind that of "
dongsheng@653 2225 "Mercurial."
dongsheng@653 2226 msgstr ""
dongsheng@653 2227
dongsheng@653 2228 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2229 #: ../en/ch00-preface.xml:517
dongsheng@653 2230 msgid ""
dongsheng@653 2231 "While a Mercurial repository needs no maintenance, a Git repository requires "
dongsheng@653 2232 "frequent manual <quote>repacks</quote> of its metadata. Without these, "
dongsheng@653 2233 "performance degrades, while space usage grows rapidly. A server that "
dongsheng@653 2234 "contains many Git repositories that are not rigorously and frequently "
dongsheng@653 2235 "repacked will become heavily disk-bound during backups, and there have been "
dongsheng@653 2236 "instances of daily backups taking far longer than 24 hours as a result. A "
dongsheng@653 2237 "freshly packed Git repository is slightly smaller than a Mercurial "
dongsheng@653 2238 "repository, but an unpacked repository is several orders of magnitude larger."
dongsheng@653 2239 msgstr ""
dongsheng@653 2240
dongsheng@653 2241 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2242 #: ../en/ch00-preface.xml:528
dongsheng@653 2243 msgid ""
dongsheng@653 2244 "The core of Git is written in C. Many Git commands are implemented as shell "
dongsheng@653 2245 "or Perl scripts, and the quality of these scripts varies widely. I have "
dongsheng@653 2246 "encountered several instances where scripts charged along blindly in the "
dongsheng@653 2247 "presence of errors that should have been fatal."
dongsheng@653 2248 msgstr ""
dongsheng@653 2249
dongsheng@653 2250 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2251 #: ../en/ch00-preface.xml:534
dongsheng@653 2252 msgid "Mercurial can import revision history from a Git repository."
dongsheng@653 2253 msgstr ""
dongsheng@653 2254
dongsheng@653 2255 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2256 #: ../en/ch00-preface.xml:540 ../en/ch00-preface.xml:636
dongsheng@653 2257 msgid "CVS"
dongsheng@653 2258 msgstr ""
dongsheng@653 2259
dongsheng@653 2260 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2261 #: ../en/ch00-preface.xml:542
dongsheng@653 2262 msgid ""
dongsheng@653 2263 "CVS is probably the most widely used revision control tool in the world. Due "
dongsheng@653 2264 "to its age and internal untidiness, it has been only lightly maintained for "
dongsheng@653 2265 "many years."
dongsheng@653 2266 msgstr ""
dongsheng@653 2267
dongsheng@653 2268 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2269 #: ../en/ch00-preface.xml:546
dongsheng@653 2270 msgid ""
dongsheng@653 2271 "It has a centralised client/server architecture. It does not group related "
dongsheng@653 2272 "file changes into atomic commits, making it easy for people to <quote>break "
dongsheng@653 2273 "the build</quote>: one person can successfully commit part of a change and "
dongsheng@653 2274 "then be blocked by the need for a merge, causing other people to see only a "
dongsheng@653 2275 "portion of the work they intended to do. This also affects how you work with "
dongsheng@653 2276 "project history. If you want to see all of the modifications someone made as "
dongsheng@653 2277 "part of a task, you will need to manually inspect the descriptions and "
dongsheng@653 2278 "timestamps of the changes made to each file involved (if you even know what "
dongsheng@653 2279 "those files were)."
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:558
dongsheng@653 2284 msgid ""
dongsheng@653 2285 "CVS has a muddled notion of tags and branches that I will not attempt to even "
dongsheng@653 2286 "describe. It does not support renaming of files or directories well, making "
dongsheng@653 2287 "it easy to corrupt a repository. It has almost no internal consistency "
dongsheng@653 2288 "checking capabilities, so it is usually not even possible to tell whether or "
dongsheng@653 2289 "how a repository is corrupt. I would not recommend CVS for any project, "
dongsheng@653 2290 "existing or new."
dongsheng@653 2291 msgstr ""
dongsheng@653 2292
dongsheng@653 2293 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2294 #: ../en/ch00-preface.xml:566
dongsheng@653 2295 msgid ""
dongsheng@653 2296 "Mercurial can import CVS revision history. However, there are a few caveats "
dongsheng@653 2297 "that apply; these are true of every other revision control tool's CVS "
dongsheng@653 2298 "importer, too. Due to CVS's lack of atomic changes and unversioned "
dongsheng@653 2299 "filesystem hierarchy, it is not possible to reconstruct CVS history "
dongsheng@653 2300 "completely accurately; some guesswork is involved, and renames will usually "
dongsheng@653 2301 "not show up. Because a lot of advanced CVS administration has to be done by "
dongsheng@653 2302 "hand and is hence error-prone, it's common for CVS importers to run into "
dongsheng@653 2303 "multiple problems with corrupted repositories (completely bogus revision "
dongsheng@653 2304 "timestamps and files that have remained locked for over a decade are just two "
dongsheng@653 2305 "of the less interesting problems I can recall from personal experience)."
dongsheng@653 2306 msgstr ""
dongsheng@653 2307
dongsheng@653 2308 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2309 #: ../en/ch00-preface.xml:580
dongsheng@653 2310 msgid "Mercurial can import revision history from a CVS repository."
dongsheng@653 2311 msgstr ""
dongsheng@653 2312
dongsheng@653 2313 #. type: Content of: <book><preface><sect1><sect2><title>
dongsheng@653 2314 #: ../en/ch00-preface.xml:586
dongsheng@653 2315 msgid "Commercial tools"
dongsheng@653 2316 msgstr "商业工具"
dongsheng@653 2317
dongsheng@653 2318 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2319 #: ../en/ch00-preface.xml:588
dongsheng@653 2320 msgid ""
dongsheng@653 2321 "Perforce has a centralised client/server architecture, with no client-side "
dongsheng@653 2322 "caching of any data. Unlike modern revision control tools, Perforce requires "
dongsheng@653 2323 "that a user run a command to inform the server about every file they intend "
dongsheng@653 2324 "to edit."
dongsheng@653 2325 msgstr ""
dongsheng@653 2326
dongsheng@653 2327 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2328 #: ../en/ch00-preface.xml:594
dongsheng@653 2329 msgid ""
dongsheng@653 2330 "The performance of Perforce is quite good for small teams, but it falls off "
dongsheng@653 2331 "rapidly as the number of users grows beyond a few dozen. Modestly large "
dongsheng@653 2332 "Perforce installations require the deployment of proxies to cope with the "
dongsheng@653 2333 "load their users generate."
dongsheng@653 2334 msgstr ""
dongsheng@653 2335
dongsheng@653 2336 #. type: Content of: <book><preface><sect1><sect2><title>
dongsheng@653 2337 #: ../en/ch00-preface.xml:603
dongsheng@653 2338 msgid "Choosing a revision control tool"
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:605
dongsheng@653 2343 msgid ""
dongsheng@653 2344 "With the exception of CVS, all of the tools listed above have unique "
dongsheng@653 2345 "strengths that suit them to particular styles of work. There is no single "
dongsheng@653 2346 "revision control tool that is best in all situations."
dongsheng@653 2347 msgstr ""
dongsheng@653 2348
dongsheng@653 2349 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2350 #: ../en/ch00-preface.xml:610
dongsheng@653 2351 msgid ""
dongsheng@653 2352 "As an example, Subversion is a good choice for working with frequently edited "
dongsheng@653 2353 "binary files, due to its centralised nature and support for file locking."
dongsheng@653 2354 msgstr ""
dongsheng@653 2355
dongsheng@653 2356 #. type: Content of: <book><preface><sect1><sect2><para>
dongsheng@653 2357 #: ../en/ch00-preface.xml:614
dongsheng@653 2358 msgid ""
dongsheng@653 2359 "I personally find Mercurial's properties of simplicity, performance, and good "
dongsheng@653 2360 "merge support to be a compelling combination that has served me well for "
dongsheng@653 2361 "several years."
dongsheng@653 2362 msgstr ""
dongsheng@653 2363
dongsheng@653 2364 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 2365 #: ../en/ch00-preface.xml:622
dongsheng@653 2366 msgid "Switching from another tool to Mercurial"
dongsheng@653 2367 msgstr "从其它工具切换到 Mercurial"
dongsheng@653 2368
dongsheng@653 2369 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2370 #: ../en/ch00-preface.xml:624
dongsheng@653 2371 msgid ""
dongsheng@653 2372 "Mercurial is bundled with an extension named <literal role=\"hg-ext"
dongsheng@653 2373 "\">convert</literal>, which can incrementally import revision history from "
dongsheng@653 2374 "several other revision control tools. By <quote>incremental</quote>, I mean "
dongsheng@653 2375 "that you can convert all of a project's history to date in one go, then rerun "
dongsheng@653 2376 "the conversion later to obtain new changes that happened after the initial "
dongsheng@653 2377 "conversion."
dongsheng@653 2378 msgstr ""
dongsheng@653 2379
dongsheng@653 2380 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2381 #: ../en/ch00-preface.xml:632
dongsheng@653 2382 msgid ""
dongsheng@653 2383 "The revision control tools supported by <literal role=\"hg-ext\">convert</"
dongsheng@653 2384 "literal> are as follows:"
dongsheng@653 2385 msgstr "<literal role=\"hg-ext\">convert</literal> 支持的版本控制工具有:"
dongsheng@653 2386
dongsheng@653 2387 #. type: Content of: <book><preface><sect1><itemizedlist><listitem><para>
dongsheng@653 2388 #: ../en/ch00-preface.xml:638
dongsheng@653 2389 msgid "Darcs"
dongsheng@653 2390 msgstr ""
dongsheng@653 2391
dongsheng@653 2392 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2393 #: ../en/ch00-preface.xml:640
dongsheng@653 2394 msgid ""
dongsheng@653 2395 "In addition, <literal role=\"hg-ext\">convert</literal> can export changes "
dongsheng@653 2396 "from Mercurial to Subversion. This makes it possible to try Subversion and "
dongsheng@653 2397 "Mercurial in parallel before committing to a switchover, without risking the "
dongsheng@653 2398 "loss of any work."
dongsheng@653 2399 msgstr ""
dongsheng@653 2400
dongsheng@653 2401 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2402 #: ../en/ch00-preface.xml:646
dongsheng@653 2403 msgid ""
dongsheng@653 2404 "The <command role=\"hg-ext-convert\">convert</command> command is easy to "
dongsheng@653 2405 "use. Simply point it at the path or URL of the source repository, optionally "
dongsheng@653 2406 "give it the name of the destination repository, and it will start working. "
dongsheng@653 2407 "After the initial conversion, just run the same command again to import new "
dongsheng@653 2408 "changes."
dongsheng@653 2409 msgstr ""
dongsheng@653 2410
dongsheng@653 2411 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 2412 #: ../en/ch00-preface.xml:655
dongsheng@653 2413 msgid "A short history of revision control"
dongsheng@653 2414 msgstr "版本控制简史"
dongsheng@653 2415
dongsheng@653 2416 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2417 #: ../en/ch00-preface.xml:657
dongsheng@653 2418 msgid ""
dongsheng@653 2419 "The best known of the old-time revision control tools is SCCS (Source Code "
dongsheng@653 2420 "Control System), which Marc Rochkind wrote at Bell Labs, in the early 1970s. "
dongsheng@653 2421 "SCCS operated on individual files, and required every person working on a "
dongsheng@653 2422 "project to have access to a shared workspace on a single system. Only one "
dongsheng@653 2423 "person could modify a file at any time; arbitration for access to files was "
dongsheng@653 2424 "via locks. It was common for people to lock files, and later forget to "
dongsheng@653 2425 "unlock them, preventing anyone else from modifying those files without the "
dongsheng@653 2426 "help of an administrator."
dongsheng@653 2427 msgstr ""
dongsheng@653 2428
dongsheng@653 2429 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2430 #: ../en/ch00-preface.xml:668
dongsheng@653 2431 msgid ""
dongsheng@653 2432 "Walter Tichy developed a free alternative to SCCS in the early 1980s; he "
dongsheng@653 2433 "called his program RCS (Revision Control System). Like SCCS, RCS required "
dongsheng@653 2434 "developers to work in a single shared workspace, and to lock files to prevent "
dongsheng@653 2435 "multiple people from modifying them simultaneously."
dongsheng@653 2436 msgstr ""
dongsheng@653 2437
dongsheng@653 2438 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2439 #: ../en/ch00-preface.xml:674
dongsheng@653 2440 msgid ""
dongsheng@653 2441 "Later in the 1980s, Dick Grune used RCS as a building block for a set of "
dongsheng@653 2442 "shell scripts he initially called cmt, but then renamed to CVS (Concurrent "
dongsheng@653 2443 "Versions System). The big innovation of CVS was that it let developers work "
dongsheng@653 2444 "simultaneously and somewhat independently in their own personal workspaces. "
dongsheng@653 2445 "The personal workspaces prevented developers from stepping on each other's "
dongsheng@653 2446 "toes all the time, as was common with SCCS and RCS. Each developer had a copy "
dongsheng@653 2447 "of every project file, and could modify their copies independently. They had "
dongsheng@653 2448 "to merge their edits prior to committing changes to the central repository."
dongsheng@653 2449 msgstr ""
dongsheng@653 2450
dongsheng@653 2451 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2452 #: ../en/ch00-preface.xml:685
dongsheng@653 2453 msgid ""
dongsheng@653 2454 "Brian Berliner took Grune's original scripts and rewrote them in C, releasing "
dongsheng@653 2455 "in 1989 the code that has since developed into the modern version of CVS. "
dongsheng@653 2456 "CVS subsequently acquired the ability to operate over a network connection, "
dongsheng@653 2457 "giving it a client/server architecture. CVS's architecture is centralised; "
dongsheng@653 2458 "only the server has a copy of the history of the project. Client workspaces "
dongsheng@653 2459 "just contain copies of recent versions of the project's files, and a little "
dongsheng@653 2460 "metadata to tell them where the server is. CVS has been enormously "
dongsheng@653 2461 "successful; it is probably the world's most widely used revision control "
dongsheng@653 2462 "system."
dongsheng@653 2463 msgstr ""
dongsheng@653 2464
dongsheng@653 2465 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2466 #: ../en/ch00-preface.xml:696
dongsheng@653 2467 msgid ""
dongsheng@653 2468 "In the early 1990s, Sun Microsystems developed an early distributed revision "
dongsheng@653 2469 "control system, called TeamWare. A TeamWare workspace contains a complete "
dongsheng@653 2470 "copy of the project's history. TeamWare has no notion of a central "
dongsheng@653 2471 "repository. (CVS relied upon RCS for its history storage; TeamWare used "
dongsheng@653 2472 "SCCS.)"
dongsheng@653 2473 msgstr ""
dongsheng@653 2474
dongsheng@653 2475 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2476 #: ../en/ch00-preface.xml:703
dongsheng@653 2477 msgid ""
dongsheng@653 2478 "As the 1990s progressed, awareness grew of a number of problems with CVS. It "
dongsheng@653 2479 "records simultaneous changes to multiple files individually, instead of "
dongsheng@653 2480 "grouping them together as a single logically atomic operation. It does not "
dongsheng@653 2481 "manage its file hierarchy well; it is easy to make a mess of a repository by "
dongsheng@653 2482 "renaming files and directories. Worse, its source code is difficult to read "
dongsheng@653 2483 "and maintain, which made the <quote>pain level</quote> of fixing these "
dongsheng@653 2484 "architectural problems prohibitive."
dongsheng@653 2485 msgstr ""
dongsheng@653 2486
dongsheng@653 2487 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2488 #: ../en/ch00-preface.xml:713
dongsheng@653 2489 msgid ""
dongsheng@653 2490 "In 2001, Jim Blandy and Karl Fogel, two developers who had worked on CVS, "
dongsheng@653 2491 "started a project to replace it with a tool that would have a better "
dongsheng@653 2492 "architecture and cleaner code. The result, Subversion, does not stray from "
dongsheng@653 2493 "CVS's centralised client/server model, but it adds multi-file atomic commits, "
dongsheng@653 2494 "better namespace management, and a number of other features that make it a "
dongsheng@653 2495 "generally better tool than CVS. Since its initial release, it has rapidly "
dongsheng@653 2496 "grown in popularity."
dongsheng@653 2497 msgstr ""
dongsheng@653 2498
dongsheng@653 2499 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2500 #: ../en/ch00-preface.xml:722
dongsheng@653 2501 msgid ""
dongsheng@653 2502 "More or less simultaneously, Graydon Hoare began working on an ambitious "
dongsheng@653 2503 "distributed revision control system that he named Monotone. While Monotone "
dongsheng@653 2504 "addresses many of CVS's design flaws and has a peer-to-peer architecture, it "
dongsheng@653 2505 "goes beyond earlier (and subsequent) revision control tools in a number of "
dongsheng@653 2506 "innovative ways. It uses cryptographic hashes as identifiers, and has an "
dongsheng@653 2507 "integral notion of <quote>trust</quote> for code from different sources."
dongsheng@653 2508 msgstr ""
dongsheng@653 2509
dongsheng@653 2510 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2511 #: ../en/ch00-preface.xml:731
dongsheng@653 2512 msgid ""
dongsheng@653 2513 "Mercurial began life in 2005. While a few aspects of its design are "
dongsheng@653 2514 "influenced by Monotone, Mercurial focuses on ease of use, high performance, "
dongsheng@653 2515 "and scalability to very large projects."
dongsheng@653 2516 msgstr ""
dongsheng@653 2517
dongsheng@653 2518 #. type: Content of: <book><preface><sect1><title>
dongsheng@653 2519 #: ../en/ch00-preface.xml:739
dongsheng@661 2520 msgid "Colophon—this book is Free"
dongsheng@661 2521 msgstr "后记—本书是自由的!"
dongsheng@653 2522
dongsheng@653 2523 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2524 #: ../en/ch00-preface.xml:741
dongsheng@653 2525 msgid ""
dongsheng@653 2526 "This book is licensed under the Open Publication License, and is produced "
dongsheng@653 2527 "entirely using Free Software tools. It is typeset with DocBook XML. "
dongsheng@653 2528 "Illustrations are drawn and rendered with <ulink url=\"http://www.inkscape."
dongsheng@653 2529 "org/\">Inkscape</ulink>."
dongsheng@653 2530 msgstr ""
dongsheng@653 2531
dongsheng@653 2532 #. type: Content of: <book><preface><sect1><para>
dongsheng@653 2533 #: ../en/ch00-preface.xml:746
dongsheng@653 2534 msgid ""
dongsheng@653 2535 "The complete source code for this book is published as a Mercurial "
dongsheng@653 2536 "repository, at <ulink url=\"http://hg.serpentine.com/mercurial/book\">http://"
dongsheng@653 2537 "hg.serpentine.com/mercurial/book</ulink>."
dongsheng@653 2538 msgstr ""
dongsheng@653 2539
dongsheng@627 2540 #. type: Content of: <book><chapter><title>
dongsheng@650 2541 #: ../en/ch01-tour-basic.xml:5
dongsheng@627 2542 msgid "A tour of Mercurial: the basics"
dongsheng@627 2543 msgstr "Mercurial 教程: 基础知识"
dongsheng@627 2544
dongsheng@627 2545 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 2546 #: ../en/ch01-tour-basic.xml:8
dongsheng@627 2547 msgid "Installing Mercurial on your system"
dongsheng@627 2548 msgstr "安装 Mercurial"
dongsheng@627 2549
dongsheng@627 2550 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2551 #: ../en/ch01-tour-basic.xml:10
dongsheng@627 2552 msgid ""
dongsheng@627 2553 "Prebuilt binary packages of Mercurial are available for every popular "
dongsheng@627 2554 "operating system. These make it easy to start using Mercurial on your "
dongsheng@627 2555 "computer immediately."
dongsheng@627 2556 msgstr ""
dongsheng@644 2557 "对于每种流行的操作系统,都有已经构建的二进制软件包。这让在你的计算机上开始使"
dongsheng@644 2558 "用 Mercurial 变得很容易。"
dongsheng@627 2559
dongsheng@627 2560 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 2561 #: ../en/ch01-tour-basic.xml:15
dongsheng@627 2562 msgid "Linux"
dongsheng@644 2563 msgstr "Linux"
dongsheng@627 2564
dongsheng@627 2565 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2566 #: ../en/ch01-tour-basic.xml:17
dongsheng@627 2567 msgid ""
dongsheng@627 2568 "Because each Linux distribution has its own packaging tools, policies, and "
dongsheng@627 2569 "rate of development, it's difficult to give a comprehensive set of "
dongsheng@627 2570 "instructions on how to install Mercurial binaries. The version of Mercurial "
dongsheng@627 2571 "that you will end up with can vary depending on how active the person is who "
dongsheng@627 2572 "maintains the package for your distribution."
dongsheng@627 2573 msgstr ""
dongsheng@644 2574 "由于每种 Linux 发行版都有自己的包管理工具,开发策略和进度,从而很难给出安装 "
dongsheng@644 2575 "Mercurial 二进制包的全面说明。你安装的 Mercurial 版本,在很大程度上依赖于你所"
dongsheng@644 2576 "使用的发行版的 Mercurial 维护者的活跃程度。"
dongsheng@627 2577
dongsheng@627 2578 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2579 #: ../en/ch01-tour-basic.xml:24
dongsheng@627 2580 msgid ""
dongsheng@627 2581 "To keep things simple, I will focus on installing Mercurial from the command "
dongsheng@627 2582 "line under the most popular Linux distributions. Most of these distributions "
dongsheng@627 2583 "provide graphical package managers that will let you install Mercurial with a "
dongsheng@627 2584 "single click; the package name to look for is <literal>mercurial</literal>."
dongsheng@627 2585 msgstr ""
dongsheng@644 2586 "为了让事情简单,我会致力于说明在最流行的 Linux 发行版中,从命令行安装 "
dongsheng@644 2587 "Mercurial 的方法。这些发行版都提供了图形界面的包管理器,让你通过点击鼠标安装 "
dongsheng@644 2588 "Mercurial;寻找的包名称是 <literal>mercurial</literal>。"
dongsheng@627 2589
dongsheng@627 2590 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 2591 #: ../en/ch01-tour-basic.xml:32
dongsheng@627 2592 msgid "Debian:"
dongsheng@644 2593 msgstr "Debian:"
dongsheng@627 2594
dongsheng@627 2595 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 2596 #: ../en/ch01-tour-basic.xml:34
dongsheng@627 2597 msgid "Fedora Core:"
dongsheng@644 2598 msgstr "Fedora Core:"
dongsheng@627 2599
dongsheng@627 2600 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 2601 #: ../en/ch01-tour-basic.xml:36
dongsheng@627 2602 msgid "Gentoo:"
dongsheng@644 2603 msgstr "Gentoo:"
dongsheng@627 2604
dongsheng@627 2605 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 2606 #: ../en/ch01-tour-basic.xml:38
dongsheng@627 2607 msgid "OpenSUSE:"
dongsheng@644 2608 msgstr "OpenSUSE:"
dongsheng@627 2609
dongsheng@627 2610 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 2611 #: ../en/ch01-tour-basic.xml:40
dongsheng@627 2612 msgid ""
dongsheng@627 2613 "Ubuntu: Ubuntu's Mercurial package is based on Debian's. To install it, run "
dongsheng@627 2614 "the following command."
dongsheng@646 2615 msgstr "Ubuntu: Ubuntu 的 Mercurial 包基于 Debian。安装时,使用如下命令:"
dongsheng@646 2616
dongsheng@646 2617 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 2618 #: ../en/ch01-tour-basic.xml:48
dongsheng@627 2619 msgid "Solaris"
dongsheng@646 2620 msgstr "Solaris"
dongsheng@646 2621
dongsheng@646 2622 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2623 #: ../en/ch01-tour-basic.xml:50
dongsheng@627 2624 msgid ""
dongsheng@627 2625 "SunFreeWare, at <ulink url=\"http://www.sunfreeware.com\">http://www."
dongsheng@627 2626 "sunfreeware.com</ulink>, is a good source for a large number of pre-built "
dongsheng@627 2627 "Solaris packages for 32 and 64 bit Intel and Sparc architectures, including "
dongsheng@627 2628 "current versions of Mercurial."
dongsheng@627 2629 msgstr ""
dongsheng@646 2630 "位于 <ulink url=\"http://www.sunfreeware.com\">http://www.sunfreeware.com</"
dongsheng@646 2631 "ulink> 的 SunFreeWare 是很好的二进制安装源,它包含 Intel 和 Sparc 架构的 32 位"
dongsheng@646 2632 "和 64 位包,包含 Mercurial 的当前版本。"
dongsheng@646 2633
dongsheng@646 2634 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 2635 #: ../en/ch01-tour-basic.xml:58
dongsheng@627 2636 msgid "Mac OS X"
dongsheng@646 2637 msgstr "Mac OS X"
dongsheng@646 2638
dongsheng@646 2639 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2640 #: ../en/ch01-tour-basic.xml:60
dongsheng@627 2641 msgid ""
dongsheng@627 2642 "Lee Cantey publishes an installer of Mercurial for Mac OS X at <ulink url="
dongsheng@627 2643 "\"http://mercurial.berkwood.com\">http://mercurial.berkwood.com</ulink>. "
dongsheng@627 2644 "This package works on both Intel- and Power-based Macs. Before you can use "
dongsheng@627 2645 "it, you must install a compatible version of Universal MacPython "
dongsheng@627 2646 "<citation>web:macpython</citation>. This is easy to do; simply follow the "
dongsheng@627 2647 "instructions on Lee's site."
dongsheng@627 2648 msgstr ""
dongsheng@627 2649
dongsheng@627 2650 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2651 #: ../en/ch01-tour-basic.xml:69
dongsheng@627 2652 msgid ""
dongsheng@627 2653 "It's also possible to install Mercurial using Fink or MacPorts, two popular "
dongsheng@627 2654 "free package managers for Mac OS X. If you have Fink, use <command>sudo apt-"
dongsheng@627 2655 "get install mercurial-py25</command>. If MacPorts, <command>sudo port "
dongsheng@627 2656 "install mercurial</command>."
dongsheng@627 2657 msgstr ""
dongsheng@627 2658
dongsheng@627 2659 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 2660 #: ../en/ch01-tour-basic.xml:77
dongsheng@627 2661 msgid "Windows"
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:79
dongsheng@627 2666 msgid ""
dongsheng@627 2667 "Lee Cantey publishes an installer of Mercurial for Windows at <ulink url="
dongsheng@627 2668 "\"http://mercurial.berkwood.com\">http://mercurial.berkwood.com</ulink>. "
dongsheng@627 2669 "This package has no external dependencies; it <quote>just works</quote>."
dongsheng@627 2670 msgstr ""
dongsheng@627 2671
dongsheng@627 2672 #. type: Content of: <book><chapter><sect1><sect2><note><para>
dongsheng@650 2673 #: ../en/ch01-tour-basic.xml:86
dongsheng@627 2674 msgid ""
dongsheng@627 2675 "The Windows version of Mercurial does not automatically convert line endings "
dongsheng@627 2676 "between Windows and Unix styles. If you want to share work with Unix users, "
dongsheng@627 2677 "you must do a little additional configuration work. XXX Flesh this out."
dongsheng@627 2678 msgstr ""
dongsheng@627 2679
dongsheng@627 2680 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 2681 #: ../en/ch01-tour-basic.xml:96
dongsheng@627 2682 msgid "Getting started"
dongsheng@627 2683 msgstr "开始"
dongsheng@627 2684
dongsheng@627 2685 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2686 #: ../en/ch01-tour-basic.xml:98
dongsheng@627 2687 msgid ""
dongsheng@627 2688 "To begin, we'll use the <command role=\"hg-cmd\">hg version</command> command "
dongsheng@627 2689 "to find out whether Mercurial is actually installed properly. The actual "
dongsheng@627 2690 "version information that it prints isn't so important; it's whether it prints "
dongsheng@627 2691 "anything at all that we care about."
dongsheng@627 2692 msgstr ""
dongsheng@627 2693
dongsheng@627 2694 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 2695 #: ../en/ch01-tour-basic.xml:107
dongsheng@627 2696 msgid "Built-in help"
dongsheng@627 2697 msgstr "内置帮助"
dongsheng@627 2698
dongsheng@627 2699 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2700 #: ../en/ch01-tour-basic.xml:109
dongsheng@627 2701 msgid ""
dongsheng@627 2702 "Mercurial provides a built-in help system. This is invaluable for those "
dongsheng@627 2703 "times when you find yourself stuck trying to remember how to run a command. "
dongsheng@627 2704 "If you are completely stuck, simply run <command role=\"hg-cmd\">hg help</"
dongsheng@627 2705 "command>; it will print a brief list of commands, along with a description of "
dongsheng@627 2706 "what each does. If you ask for help on a specific command (as below), it "
dongsheng@627 2707 "prints more detailed information."
dongsheng@627 2708 msgstr ""
dongsheng@627 2709
dongsheng@627 2710 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2711 #: ../en/ch01-tour-basic.xml:120
dongsheng@627 2712 msgid ""
dongsheng@627 2713 "For a more impressive level of detail (which you won't usually need) run "
dongsheng@627 2714 "<command role=\"hg-cmd\">hg help <option role=\"hg-opt-global\">-v</option></"
dongsheng@627 2715 "command>. The <option role=\"hg-opt-global\">-v</option> option is short for "
dongsheng@627 2716 "<option role=\"hg-opt-global\">--verbose</option>, and tells Mercurial to "
dongsheng@627 2717 "print more information than it usually would."
dongsheng@627 2718 msgstr ""
dongsheng@627 2719
dongsheng@627 2720 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 2721 #: ../en/ch01-tour-basic.xml:131
dongsheng@627 2722 msgid "Working with a repository"
dongsheng@627 2723 msgstr "使用版本库"
dongsheng@627 2724
dongsheng@627 2725 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2726 #: ../en/ch01-tour-basic.xml:133
dongsheng@627 2727 msgid ""
dongsheng@627 2728 "In Mercurial, everything happens inside a <emphasis>repository</emphasis>. "
dongsheng@627 2729 "The repository for a project contains all of the files that <quote>belong to</"
dongsheng@627 2730 "quote> that project, along with a historical record of the project's files."
dongsheng@627 2731 msgstr ""
dongsheng@627 2732
dongsheng@627 2733 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2734 #: ../en/ch01-tour-basic.xml:139
dongsheng@627 2735 msgid ""
dongsheng@627 2736 "There's nothing particularly magical about a repository; it is simply a "
dongsheng@627 2737 "directory tree in your filesystem that Mercurial treats as special. You can "
dongsheng@627 2738 "rename or delete a repository any time you like, using either the command "
dongsheng@627 2739 "line or your file browser."
dongsheng@627 2740 msgstr ""
dongsheng@627 2741
dongsheng@627 2742 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 2743 #: ../en/ch01-tour-basic.xml:146
dongsheng@627 2744 msgid "Making a local copy of a repository"
dongsheng@627 2745 msgstr "创建版本库的工作副本"
dongsheng@627 2746
dongsheng@627 2747 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2748 #: ../en/ch01-tour-basic.xml:148
dongsheng@627 2749 msgid ""
dongsheng@627 2750 "<emphasis>Copying</emphasis> a repository is just a little bit special. "
dongsheng@627 2751 "While you could use a normal file copying command to make a copy of a "
dongsheng@627 2752 "repository, it's best to use a built-in command that Mercurial provides. "
dongsheng@627 2753 "This command is called <command role=\"hg-cmd\">hg clone</command>, because "
dongsheng@627 2754 "it creates an identical copy of an existing repository."
dongsheng@627 2755 msgstr ""
dongsheng@627 2756
dongsheng@627 2757 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2758 #: ../en/ch01-tour-basic.xml:157
dongsheng@627 2759 msgid ""
dongsheng@627 2760 "If our clone succeeded, we should now have a local directory called <filename "
dongsheng@627 2761 "class=\"directory\">hello</filename>. This directory will contain some files."
dongsheng@627 2762 msgstr ""
dongsheng@627 2763
dongsheng@627 2764 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2765 #: ../en/ch01-tour-basic.xml:163
dongsheng@627 2766 msgid ""
dongsheng@627 2767 "These files have the same contents and history in our repository as they do "
dongsheng@627 2768 "in the repository we cloned."
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:166
dongsheng@627 2773 msgid ""
dongsheng@627 2774 "Every Mercurial repository is complete, self-contained, and independent. It "
dongsheng@627 2775 "contains its own private copy of a project's files and history. A cloned "
dongsheng@627 2776 "repository remembers the location of the repository it was cloned from, but "
dongsheng@627 2777 "it does not communicate with that repository, or any other, unless you tell "
dongsheng@627 2778 "it to."
dongsheng@627 2779 msgstr ""
dongsheng@627 2780
dongsheng@627 2781 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2782 #: ../en/ch01-tour-basic.xml:173
dongsheng@627 2783 msgid ""
dongsheng@627 2784 "What this means for now is that we're free to experiment with our repository, "
dongsheng@627 2785 "safe in the knowledge that it's a private <quote>sandbox</quote> that won't "
dongsheng@627 2786 "affect anyone else."
dongsheng@627 2787 msgstr ""
dongsheng@627 2788
dongsheng@627 2789 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 2790 #: ../en/ch01-tour-basic.xml:179
dongsheng@627 2791 msgid "What's in a repository?"
dongsheng@627 2792 msgstr "什么是版本库?"
dongsheng@627 2793
dongsheng@627 2794 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2795 #: ../en/ch01-tour-basic.xml:181
dongsheng@627 2796 msgid ""
dongsheng@627 2797 "When we take a more detailed look inside a repository, we can see that it "
dongsheng@627 2798 "contains a directory named <filename class=\"directory\">.hg</filename>. "
dongsheng@627 2799 "This is where Mercurial keeps all of its metadata for the repository."
dongsheng@627 2800 msgstr ""
dongsheng@627 2801
dongsheng@627 2802 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2803 #: ../en/ch01-tour-basic.xml:188
dongsheng@627 2804 msgid ""
dongsheng@627 2805 "The contents of the <filename class=\"directory\">.hg</filename> directory "
dongsheng@627 2806 "and its subdirectories are private to Mercurial. Every other file and "
dongsheng@627 2807 "directory in the repository is yours to do with as you please."
dongsheng@627 2808 msgstr ""
dongsheng@627 2809
dongsheng@627 2810 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 2811 #: ../en/ch01-tour-basic.xml:194
dongsheng@627 2812 msgid ""
dongsheng@627 2813 "To introduce a little terminology, the <filename class=\"directory\">.hg</"
dongsheng@627 2814 "filename> directory is the <quote>real</quote> repository, and all of the "
dongsheng@627 2815 "files and directories that coexist with it are said to live in the "
dongsheng@627 2816 "<emphasis>working directory</emphasis>. An easy way to remember the "
dongsheng@627 2817 "distinction is that the <emphasis>repository</emphasis> contains the "
dongsheng@627 2818 "<emphasis>history</emphasis> of your project, while the <emphasis>working "
dongsheng@627 2819 "directory</emphasis> contains a <emphasis>snapshot</emphasis> of your project "
dongsheng@627 2820 "at a particular point in history."
dongsheng@627 2821 msgstr ""
dongsheng@627 2822
dongsheng@627 2823 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 2824 #: ../en/ch01-tour-basic.xml:209
dongsheng@627 2825 msgid "A tour through history"
dongsheng@627 2826 msgstr "回溯历史"
dongsheng@627 2827
dongsheng@627 2828 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2829 #: ../en/ch01-tour-basic.xml:211
dongsheng@627 2830 msgid ""
dongsheng@627 2831 "One of the first things we might want to do with a new, unfamiliar repository "
dongsheng@627 2832 "is understand its history. The <command role=\"hg-cmd\">hg log</command> "
dongsheng@627 2833 "command gives us a view of history."
dongsheng@627 2834 msgstr ""
dongsheng@627 2835
dongsheng@627 2836 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2837 #: ../en/ch01-tour-basic.xml:218
dongsheng@627 2838 msgid ""
dongsheng@627 2839 "By default, this command prints a brief paragraph of output for each change "
dongsheng@627 2840 "to the project that was recorded. In Mercurial terminology, we call each of "
dongsheng@627 2841 "these recorded events a <emphasis>changeset</emphasis>, because it can "
dongsheng@627 2842 "contain a record of changes to several files."
dongsheng@627 2843 msgstr ""
dongsheng@627 2844
dongsheng@627 2845 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2846 #: ../en/ch01-tour-basic.xml:224
dongsheng@627 2847 msgid ""
dongsheng@627 2848 "The fields in a record of output from <command role=\"hg-cmd\">hg log</"
dongsheng@627 2849 "command> are as follows."
dongsheng@627 2850 msgstr ""
dongsheng@627 2851
dongsheng@627 2852 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 2853 #: ../en/ch01-tour-basic.xml:227
dongsheng@627 2854 msgid ""
dongsheng@627 2855 "<literal>changeset</literal>: This field has the format of a number, followed "
dongsheng@627 2856 "by a colon, followed by a hexadecimal string. These are "
dongsheng@627 2857 "<emphasis>identifiers</emphasis> for the changeset. There are two "
dongsheng@627 2858 "identifiers because the number is shorter and easier to type than the hex "
dongsheng@627 2859 "string."
dongsheng@627 2860 msgstr ""
dongsheng@627 2861
dongsheng@627 2862 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 2863 #: ../en/ch01-tour-basic.xml:233
dongsheng@627 2864 msgid ""
dongsheng@627 2865 "<literal>user</literal>: The identity of the person who created the "
dongsheng@627 2866 "changeset. This is a free-form field, but it most often contains a person's "
dongsheng@627 2867 "name and email address."
dongsheng@627 2868 msgstr ""
dongsheng@627 2869
dongsheng@627 2870 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 2871 #: ../en/ch01-tour-basic.xml:237
dongsheng@627 2872 msgid ""
dongsheng@627 2873 "<literal>date</literal>: The date and time on which the changeset was "
dongsheng@627 2874 "created, and the timezone in which it was created. (The date and time are "
dongsheng@627 2875 "local to that timezone; they display what time and date it was for the person "
dongsheng@627 2876 "who created the changeset.)"
dongsheng@627 2877 msgstr ""
dongsheng@627 2878
dongsheng@627 2879 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 2880 #: ../en/ch01-tour-basic.xml:242
dongsheng@627 2881 msgid ""
dongsheng@627 2882 "<literal>summary</literal>: The first line of the text message that the "
dongsheng@627 2883 "creator of the changeset entered to describe the changeset."
dongsheng@627 2884 msgstr ""
dongsheng@627 2885
dongsheng@627 2886 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2887 #: ../en/ch01-tour-basic.xml:245
dongsheng@627 2888 msgid ""
dongsheng@627 2889 "The default output printed by <command role=\"hg-cmd\">hg log</command> is "
dongsheng@627 2890 "purely a summary; it is missing a lot of detail."
dongsheng@627 2891 msgstr ""
dongsheng@627 2892
dongsheng@627 2893 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 2894 #: ../en/ch01-tour-basic.xml:249
dongsheng@627 2895 msgid ""
songdongsheng@658 2896 "<xref linkend=\"fig:tour-basic:history\"/> provides a graphical "
songdongsheng@658 2897 "representation of the history of the <filename class=\"directory\">hello</"
songdongsheng@658 2898 "filename> repository, to make it a little easier to see which direction "
songdongsheng@658 2899 "history is <quote>flowing</quote> in. We'll be returning to this figure "
songdongsheng@658 2900 "several times in this chapter and the chapter that follows."
songdongsheng@658 2901 msgstr ""
songdongsheng@658 2902
songdongsheng@658 2903 #. type: Content of: <book><chapter><sect1><figure><title>
songdongsheng@658 2904 #: ../en/ch01-tour-basic.xml:258
dongsheng@627 2905 msgid ""
dongsheng@627 2906 "Graphical history of the <filename class=\"directory\">hello</filename> "
dongsheng@627 2907 "repository"
dongsheng@660 2908 msgstr "版本库 <filename class=\"directory\">hello</filename> 的历史图"
dongsheng@627 2909
songdongsheng@658 2910 #. type: Content of: <book><chapter><sect1><figure>
songdongsheng@658 2911 #: ../en/ch01-tour-basic.xml:260 ../en/ch02-tour-merge.xml:50
songdongsheng@658 2912 #: ../en/ch02-tour-merge.xml:181 ../en/ch03-concepts.xml:293
songdongsheng@658 2913 msgid "<placeholder type=\"mediaobject\" id=\"0\"/>"
songdongsheng@658 2914 msgstr ""
songdongsheng@658 2915
songdongsheng@658 2916 #. type: Content of: <book><chapter><sect1><figure><mediaobject>
songdongsheng@658 2917 #: ../en/ch01-tour-basic.xml:261
songdongsheng@658 2918 msgid ""
songdongsheng@658 2919 "<imageobject><imagedata fileref=\"figs/tour-history.png\"/></imageobject>"
songdongsheng@658 2920 msgstr ""
songdongsheng@658 2921
songdongsheng@658 2922 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject><textobject><phrase>
songdongsheng@658 2923 #: ../en/ch01-tour-basic.xml:262 ../en/ch02-tour-merge.xml:52
songdongsheng@658 2924 #: ../en/ch02-tour-merge.xml:82 ../en/ch02-tour-merge.xml:129
songdongsheng@658 2925 #: ../en/ch02-tour-merge.xml:183 ../en/ch02-tour-merge.xml:254
songdongsheng@658 2926 #: ../en/ch03-concepts.xml:57 ../en/ch03-concepts.xml:106
songdongsheng@658 2927 #: ../en/ch03-concepts.xml:191 ../en/ch03-concepts.xml:295
songdongsheng@658 2928 #: ../en/ch03-concepts.xml:346 ../en/ch03-concepts.xml:361
songdongsheng@658 2929 #: ../en/ch03-concepts.xml:402 ../en/ch03-concepts.xml:422
songdongsheng@658 2930 #: ../en/ch03-concepts.xml:465 ../en/ch05-collab.xml:276
songdongsheng@658 2931 #: ../en/ch08-undo.xml:365 ../en/ch08-undo.xml:412 ../en/ch08-undo.xml:477
songdongsheng@658 2932 #: ../en/ch08-undo.xml:515 ../en/ch11-mq.xml:412
songdongsheng@658 2933 msgid "XXX add text"
songdongsheng@658 2934 msgstr ""
songdongsheng@658 2935
dongsheng@627 2936 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 2937 #: ../en/ch01-tour-basic.xml:267
dongsheng@627 2938 msgid "Changesets, revisions, and talking to other people"
songdongsheng@665 2939 msgstr "修改集,版本,与其它用户交互"
dongsheng@627 2940
dongsheng@627 2941 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 2942 #: ../en/ch01-tour-basic.xml:270
dongsheng@627 2943 msgid ""
dongsheng@627 2944 "As English is a notoriously sloppy language, and computer science has a "
dongsheng@627 2945 "hallowed history of terminological confusion (why use one term when four will "
dongsheng@627 2946 "do?), revision control has a variety of words and phrases that mean the same "
dongsheng@627 2947 "thing. If you are talking about Mercurial history with other people, you "
dongsheng@627 2948 "will find that the word <quote>changeset</quote> is often compressed to "
dongsheng@627 2949 "<quote>change</quote> or (when written) <quote>cset</quote>, and sometimes a "
dongsheng@627 2950 "changeset is referred to as a <quote>revision</quote> or a <quote>rev</quote>."
dongsheng@627 2951 msgstr ""
dongsheng@627 2952
dongsheng@627 2953 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 2954 #: ../en/ch01-tour-basic.xml:280
dongsheng@627 2955 msgid ""
dongsheng@627 2956 "While it doesn't matter what <emphasis>word</emphasis> you use to refer to "
dongsheng@627 2957 "the concept of <quote>a changeset</quote>, the <emphasis>identifier</"
dongsheng@627 2958 "emphasis> that you use to refer to <quote>a <emphasis>specific</emphasis> "
dongsheng@627 2959 "changeset</quote> is of great importance. Recall that the <literal>changeset</"
dongsheng@627 2960 "literal> field in the output from <command role=\"hg-cmd\">hg log</command> "
dongsheng@627 2961 "identifies a changeset using both a number and a hexadecimal string."
dongsheng@627 2962 msgstr ""
dongsheng@627 2963
dongsheng@627 2964 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 2965 #: ../en/ch01-tour-basic.xml:289
songdongsheng@658 2966 msgid ""
songdongsheng@658 2967 "The revision number is <emphasis>only valid in that repository</emphasis>,"
songdongsheng@658 2968 msgstr ""
songdongsheng@658 2969
songdongsheng@658 2970 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 2971 #: ../en/ch01-tour-basic.xml:291
dongsheng@627 2972 msgid ""
dongsheng@627 2973 "while the hex string is the <emphasis>permanent, unchanging identifier</"
dongsheng@627 2974 "emphasis> that will always identify that exact changeset in <emphasis>every</"
dongsheng@627 2975 "emphasis> copy of the repository."
dongsheng@627 2976 msgstr ""
dongsheng@627 2977
dongsheng@627 2978 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 2979 #: ../en/ch01-tour-basic.xml:296
dongsheng@627 2980 msgid ""
dongsheng@627 2981 "This distinction is important. If you send someone an email talking about "
dongsheng@627 2982 "<quote>revision 33</quote>, there's a high likelihood that their revision 33 "
dongsheng@627 2983 "will <emphasis>not be the same</emphasis> as yours. The reason for this is "
dongsheng@627 2984 "that a revision number depends on the order in which changes arrived in a "
dongsheng@627 2985 "repository, and there is no guarantee that the same changes will happen in "
dongsheng@627 2986 "the same order in different repositories. Three changes $a,b,c$ can easily "
dongsheng@627 2987 "appear in one repository as $0,1,2$, while in another as $1,0,2$."
dongsheng@627 2988 msgstr ""
dongsheng@627 2989
dongsheng@627 2990 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 2991 #: ../en/ch01-tour-basic.xml:306
dongsheng@627 2992 msgid ""
dongsheng@627 2993 "Mercurial uses revision numbers purely as a convenient shorthand. If you "
dongsheng@627 2994 "need to discuss a changeset with someone, or make a record of a changeset for "
dongsheng@627 2995 "some other reason (for example, in a bug report), use the hexadecimal "
dongsheng@627 2996 "identifier."
dongsheng@627 2997 msgstr ""
dongsheng@627 2998
dongsheng@627 2999 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3000 #: ../en/ch01-tour-basic.xml:314
dongsheng@627 3001 msgid "Viewing specific revisions"
dongsheng@627 3002 msgstr "察看指定版本"
dongsheng@627 3003
dongsheng@627 3004 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3005 #: ../en/ch01-tour-basic.xml:316
dongsheng@627 3006 msgid ""
dongsheng@627 3007 "To narrow the output of <command role=\"hg-cmd\">hg log</command> down to a "
dongsheng@627 3008 "single revision, use the <option role=\"hg-opt-log\">-r</option> (or <option "
dongsheng@627 3009 "role=\"hg-opt-log\">--rev</option>) option. You can use either a revision "
dongsheng@627 3010 "number or a long-form changeset identifier, and you can provide as many "
dongsheng@627 3011 "revisions as you want."
dongsheng@627 3012 msgstr ""
dongsheng@627 3013
dongsheng@627 3014 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3015 #: ../en/ch01-tour-basic.xml:325
dongsheng@627 3016 msgid ""
dongsheng@627 3017 "If you want to see the history of several revisions without having to list "
dongsheng@627 3018 "each one, you can use <emphasis>range notation</emphasis>; this lets you "
dongsheng@627 3019 "express the idea <quote>I want all revisions between <literal>abc</literal> "
dongsheng@627 3020 "and <literal>def</literal>, inclusive</quote>."
dongsheng@627 3021 msgstr ""
dongsheng@627 3022
dongsheng@627 3023 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3024 #: ../en/ch01-tour-basic.xml:333
dongsheng@627 3025 msgid ""
dongsheng@627 3026 "Mercurial also honours the order in which you specify revisions, so <command "
dongsheng@627 3027 "role=\"hg-cmd\">hg log -r 2:4</command> prints 2, 3, and 4. while <command "
dongsheng@627 3028 "role=\"hg-cmd\">hg log -r 4:2</command> prints 4, 3, and 2."
dongsheng@627 3029 msgstr ""
dongsheng@627 3030
dongsheng@627 3031 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3032 #: ../en/ch01-tour-basic.xml:340
dongsheng@627 3033 msgid "More detailed information"
dongsheng@627 3034 msgstr "更详细的信息"
dongsheng@627 3035
dongsheng@627 3036 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3037 #: ../en/ch01-tour-basic.xml:342
dongsheng@627 3038 msgid ""
dongsheng@627 3039 "While the summary information printed by <command role=\"hg-cmd\">hg log</"
dongsheng@627 3040 "command> is useful if you already know what you're looking for, you may need "
dongsheng@627 3041 "to see a complete description of the change, or a list of the files changed, "
dongsheng@627 3042 "if you're trying to decide whether a changeset is the one you're looking for. "
dongsheng@627 3043 "The <command role=\"hg-cmd\">hg log</command> command's <option role=\"hg-opt-"
dongsheng@627 3044 "global\">-v</option> (or <option role=\"hg-opt-global\">--verbose</option>) "
dongsheng@627 3045 "option gives you this extra detail."
dongsheng@627 3046 msgstr ""
dongsheng@627 3047
dongsheng@627 3048 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3049 #: ../en/ch01-tour-basic.xml:354
dongsheng@627 3050 msgid ""
dongsheng@627 3051 "If you want to see both the description and content of a change, add the "
dongsheng@627 3052 "<option role=\"hg-opt-log\">-p</option> (or <option role=\"hg-opt-log\">--"
dongsheng@627 3053 "patch</option>) option. This displays the content of a change as a "
dongsheng@627 3054 "<emphasis>unified diff</emphasis> (if you've never seen a unified diff "
songdongsheng@658 3055 "before, see <xref linkend=\"sec:mq:patch\"/> for an overview)."
dongsheng@627 3056 msgstr ""
dongsheng@627 3057
dongsheng@627 3058 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 3059 #: ../en/ch01-tour-basic.xml:367
dongsheng@627 3060 msgid "All about command options"
dongsheng@627 3061 msgstr "命令选项"
dongsheng@627 3062
dongsheng@627 3063 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3064 #: ../en/ch01-tour-basic.xml:369
dongsheng@627 3065 msgid ""
dongsheng@627 3066 "Let's take a brief break from exploring Mercurial commands to discuss a "
dongsheng@627 3067 "pattern in the way that they work; you may find this useful to keep in mind "
dongsheng@627 3068 "as we continue our tour."
dongsheng@627 3069 msgstr ""
dongsheng@627 3070
dongsheng@627 3071 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3072 #: ../en/ch01-tour-basic.xml:373
dongsheng@627 3073 msgid ""
dongsheng@627 3074 "Mercurial has a consistent and straightforward approach to dealing with the "
dongsheng@627 3075 "options that you can pass to commands. It follows the conventions for "
dongsheng@627 3076 "options that are common to modern Linux and Unix systems."
dongsheng@627 3077 msgstr ""
dongsheng@627 3078
dongsheng@627 3079 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 3080 #: ../en/ch01-tour-basic.xml:378
dongsheng@627 3081 msgid ""
dongsheng@627 3082 "Every option has a long name. For example, as we've already seen, the "
dongsheng@627 3083 "<command role=\"hg-cmd\">hg log</command> command accepts a <option role=\"hg-"
dongsheng@627 3084 "opt-log\">--rev</option> option."
dongsheng@627 3085 msgstr ""
dongsheng@627 3086
dongsheng@627 3087 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 3088 #: ../en/ch01-tour-basic.xml:382
dongsheng@627 3089 msgid ""
dongsheng@627 3090 "Most options have short names, too. Instead of <option role=\"hg-opt-log\">--"
dongsheng@627 3091 "rev</option>, we can use <option role=\"hg-opt-log\">-r</option>. (The "
dongsheng@627 3092 "reason that some options don't have short names is that the options in "
dongsheng@627 3093 "question are rarely used.)"
dongsheng@627 3094 msgstr ""
dongsheng@627 3095
dongsheng@627 3096 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 3097 #: ../en/ch01-tour-basic.xml:387
dongsheng@627 3098 msgid ""
dongsheng@627 3099 "Long options start with two dashes (e.g. <option role=\"hg-opt-log\">--rev</"
dongsheng@627 3100 "option>), while short options start with one (e.g. <option role=\"hg-opt-log"
dongsheng@627 3101 "\">-r</option>)."
dongsheng@627 3102 msgstr ""
dongsheng@627 3103
dongsheng@627 3104 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 3105 #: ../en/ch01-tour-basic.xml:391
dongsheng@627 3106 msgid ""
dongsheng@627 3107 "Option naming and usage is consistent across commands. For example, every "
dongsheng@627 3108 "command that lets you specify a changeset ID or revision number accepts both "
dongsheng@627 3109 "<option role=\"hg-opt-log\">-r</option> and <option role=\"hg-opt-log\">--"
dongsheng@627 3110 "rev</option> arguments."
dongsheng@627 3111 msgstr ""
dongsheng@627 3112
dongsheng@627 3113 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3114 #: ../en/ch01-tour-basic.xml:397
dongsheng@627 3115 msgid ""
dongsheng@627 3116 "In the examples throughout this book, I use short options instead of long. "
dongsheng@627 3117 "This just reflects my own preference, so don't read anything significant into "
dongsheng@627 3118 "it."
dongsheng@627 3119 msgstr ""
dongsheng@627 3120
dongsheng@627 3121 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3122 #: ../en/ch01-tour-basic.xml:401
dongsheng@627 3123 msgid ""
dongsheng@627 3124 "Most commands that print output of some kind will print more output when "
dongsheng@627 3125 "passed a <option role=\"hg-opt-global\">-v</option> (or <option role=\"hg-opt-"
dongsheng@627 3126 "global\">--verbose</option>) option, and less when passed <option role=\"hg-"
dongsheng@627 3127 "opt-global\">-q</option> (or <option role=\"hg-opt-global\">--quiet</option>)."
dongsheng@627 3128 msgstr ""
dongsheng@627 3129
dongsheng@627 3130 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 3131 #: ../en/ch01-tour-basic.xml:409
dongsheng@627 3132 msgid "Making and reviewing changes"
dongsheng@627 3133 msgstr "创建和复审修改"
dongsheng@627 3134
dongsheng@627 3135 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3136 #: ../en/ch01-tour-basic.xml:411
dongsheng@627 3137 msgid ""
dongsheng@627 3138 "Now that we have a grasp of viewing history in Mercurial, let's take a look "
dongsheng@627 3139 "at making some changes and examining them."
dongsheng@627 3140 msgstr ""
dongsheng@627 3141
dongsheng@627 3142 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3143 #: ../en/ch01-tour-basic.xml:415
dongsheng@627 3144 msgid ""
dongsheng@627 3145 "The first thing we'll do is isolate our experiment in a repository of its "
dongsheng@627 3146 "own. We use the <command role=\"hg-cmd\">hg clone</command> command, but we "
dongsheng@627 3147 "don't need to clone a copy of the remote repository. Since we already have a "
dongsheng@627 3148 "copy of it locally, we can just clone that instead. This is much faster than "
dongsheng@627 3149 "cloning over the network, and cloning a local repository uses less disk space "
dongsheng@627 3150 "in most cases, too."
dongsheng@627 3151 msgstr ""
dongsheng@627 3152
dongsheng@627 3153 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3154 #: ../en/ch01-tour-basic.xml:425
dongsheng@627 3155 msgid ""
dongsheng@627 3156 "As an aside, it's often good practice to keep a <quote>pristine</quote> copy "
dongsheng@627 3157 "of a remote repository around, which you can then make temporary clones of to "
dongsheng@627 3158 "create sandboxes for each task you want to work on. This lets you work on "
dongsheng@627 3159 "multiple tasks in parallel, each isolated from the others until it's complete "
dongsheng@627 3160 "and you're ready to integrate it back. Because local clones are so cheap, "
dongsheng@627 3161 "there's almost no overhead to cloning and destroying repositories whenever "
dongsheng@627 3162 "you want."
dongsheng@627 3163 msgstr ""
dongsheng@627 3164
dongsheng@627 3165 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3166 #: ../en/ch01-tour-basic.xml:434
dongsheng@627 3167 msgid ""
dongsheng@627 3168 "In our <filename class=\"directory\">my-hello</filename> repository, we have "
dongsheng@627 3169 "a file <filename>hello.c</filename> that contains the classic <quote>hello, "
dongsheng@627 3170 "world</quote> program. Let's use the ancient and venerable <command>sed</"
dongsheng@627 3171 "command> command to edit this file so that it prints a second line of "
dongsheng@627 3172 "output. (I'm only using <command>sed</command> to do this because it's easy "
dongsheng@627 3173 "to write a scripted example this way. Since you're not under the same "
dongsheng@627 3174 "constraint, you probably won't want to use <command>sed</command>; simply use "
dongsheng@627 3175 "your preferred text editor to do the same thing.)"
dongsheng@627 3176 msgstr ""
dongsheng@627 3177
dongsheng@627 3178 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3179 #: ../en/ch01-tour-basic.xml:447
dongsheng@627 3180 msgid ""
dongsheng@627 3181 "Mercurial's <command role=\"hg-cmd\">hg status</command> command will tell us "
dongsheng@627 3182 "what Mercurial knows about the files in the repository."
dongsheng@627 3183 msgstr ""
dongsheng@627 3184
dongsheng@627 3185 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3186 #: ../en/ch01-tour-basic.xml:453
dongsheng@627 3187 msgid ""
dongsheng@627 3188 "The <command role=\"hg-cmd\">hg status</command> command prints no output for "
dongsheng@627 3189 "some files, but a line starting with <quote><literal>M</literal></quote> for "
dongsheng@627 3190 "<filename>hello.c</filename>. Unless you tell it to, <command role=\"hg-cmd"
dongsheng@627 3191 "\">hg status</command> will not print any output for files that have not been "
dongsheng@627 3192 "modified."
dongsheng@627 3193 msgstr ""
dongsheng@627 3194
dongsheng@627 3195 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3196 #: ../en/ch01-tour-basic.xml:460
dongsheng@627 3197 msgid ""
dongsheng@627 3198 "The <quote><literal>M</literal></quote> indicates that Mercurial has noticed "
dongsheng@627 3199 "that we modified <filename>hello.c</filename>. We didn't need to "
dongsheng@627 3200 "<emphasis>inform</emphasis> Mercurial that we were going to modify the file "
dongsheng@627 3201 "before we started, or that we had modified the file after we were done; it "
dongsheng@627 3202 "was able to figure this out itself."
dongsheng@627 3203 msgstr ""
dongsheng@627 3204
dongsheng@627 3205 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3206 #: ../en/ch01-tour-basic.xml:468
dongsheng@627 3207 msgid ""
dongsheng@627 3208 "It's a little bit helpful to know that we've modified <filename>hello.c</"
dongsheng@627 3209 "filename>, but we might prefer to know exactly <emphasis>what</emphasis> "
dongsheng@627 3210 "changes we've made to it. To do this, we use the <command role=\"hg-cmd\">hg "
dongsheng@627 3211 "diff</command> command."
dongsheng@627 3212 msgstr ""
dongsheng@627 3213
dongsheng@627 3214 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 3215 #: ../en/ch01-tour-basic.xml:478
dongsheng@627 3216 msgid "Recording changes in a new changeset"
dongsheng@627 3217 msgstr "在新修改集中记录修改"
dongsheng@627 3218
dongsheng@627 3219 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3220 #: ../en/ch01-tour-basic.xml:480
dongsheng@627 3221 msgid ""
dongsheng@627 3222 "We can modify files, build and test our changes, and use <command role=\"hg-"
dongsheng@627 3223 "cmd\">hg status</command> and <command role=\"hg-cmd\">hg diff</command> to "
dongsheng@627 3224 "review our changes, until we're satisfied with what we've done and arrive at "
dongsheng@627 3225 "a natural stopping point where we want to record our work in a new changeset."
dongsheng@627 3226 msgstr ""
dongsheng@627 3227
dongsheng@627 3228 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3229 #: ../en/ch01-tour-basic.xml:487
dongsheng@627 3230 msgid ""
dongsheng@627 3231 "The <command role=\"hg-cmd\">hg commit</command> command lets us create a new "
dongsheng@627 3232 "changeset; we'll usually refer to this as <quote>making a commit</quote> or "
dongsheng@627 3233 "<quote>committing</quote>."
dongsheng@627 3234 msgstr ""
dongsheng@627 3235
dongsheng@627 3236 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3237 #: ../en/ch01-tour-basic.xml:493
dongsheng@627 3238 msgid "Setting up a username"
dongsheng@627 3239 msgstr "配置用户名称"
dongsheng@627 3240
dongsheng@627 3241 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3242 #: ../en/ch01-tour-basic.xml:495
dongsheng@627 3243 msgid ""
dongsheng@627 3244 "When you try to run <command role=\"hg-cmd\">hg commit</command> for the "
dongsheng@627 3245 "first time, it is not guaranteed to succeed. Mercurial records your name and "
dongsheng@627 3246 "address with each change that you commit, so that you and others will later "
dongsheng@627 3247 "be able to tell who made each change. Mercurial tries to automatically "
dongsheng@627 3248 "figure out a sensible username to commit the change with. It will attempt "
dongsheng@627 3249 "each of the following methods, in order:"
dongsheng@627 3250 msgstr ""
dongsheng@627 3251
dongsheng@627 3252 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 3253 #: ../en/ch01-tour-basic.xml:504
dongsheng@627 3254 msgid ""
dongsheng@627 3255 "If you specify a <option role=\"hg-opt-commit\">-u</option> option to the "
dongsheng@627 3256 "<command role=\"hg-cmd\">hg commit</command> command on the command line, "
dongsheng@627 3257 "followed by a username, this is always given the highest precedence."
dongsheng@627 3258 msgstr ""
dongsheng@627 3259
dongsheng@627 3260 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 3261 #: ../en/ch01-tour-basic.xml:509
dongsheng@627 3262 msgid ""
dongsheng@627 3263 "If you have set the <envar>HGUSER</envar> environment variable, this is "
dongsheng@627 3264 "checked next."
dongsheng@627 3265 msgstr ""
dongsheng@627 3266
dongsheng@627 3267 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 3268 #: ../en/ch01-tour-basic.xml:512
dongsheng@627 3269 msgid ""
dongsheng@627 3270 "If you create a file in your home directory called <filename role=\"special"
dongsheng@627 3271 "\">.hgrc</filename>, with a <envar role=\"rc-item-ui\">username</envar> "
dongsheng@627 3272 "entry, that will be used next. To see what the contents of this file should "
songdongsheng@658 3273 "look like, refer to <xref linkend=\"sec:tour-basic:username\"/> below."
dongsheng@627 3274 msgstr ""
dongsheng@627 3275
dongsheng@627 3276 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 3277 #: ../en/ch01-tour-basic.xml:520
dongsheng@627 3278 msgid ""
dongsheng@627 3279 "If you have set the <envar>EMAIL</envar> environment variable, this will be "
dongsheng@627 3280 "used next."
dongsheng@627 3281 msgstr ""
dongsheng@627 3282
dongsheng@627 3283 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 3284 #: ../en/ch01-tour-basic.xml:523
dongsheng@627 3285 msgid ""
dongsheng@627 3286 "Mercurial will query your system to find out your local user name and host "
dongsheng@627 3287 "name, and construct a username from these components. Since this often "
dongsheng@627 3288 "results in a username that is not very useful, it will print a warning if it "
dongsheng@627 3289 "has to do this."
dongsheng@627 3290 msgstr ""
dongsheng@627 3291
dongsheng@627 3292 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3293 #: ../en/ch01-tour-basic.xml:530
dongsheng@627 3294 msgid ""
dongsheng@627 3295 "If all of these mechanisms fail, Mercurial will fail, printing an error "
dongsheng@627 3296 "message. In this case, it will not let you commit until you set up a "
dongsheng@627 3297 "username."
dongsheng@627 3298 msgstr ""
dongsheng@627 3299
dongsheng@627 3300 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3301 #: ../en/ch01-tour-basic.xml:534
dongsheng@627 3302 msgid ""
dongsheng@627 3303 "You should think of the <envar>HGUSER</envar> environment variable and the "
dongsheng@627 3304 "<option role=\"hg-opt-commit\">-u</option> option to the <command role=\"hg-"
dongsheng@627 3305 "cmd\">hg commit</command> command as ways to <emphasis>override</emphasis> "
dongsheng@627 3306 "Mercurial's default selection of username. For normal use, the simplest and "
dongsheng@627 3307 "most robust way to set a username for yourself is by creating a <filename "
dongsheng@627 3308 "role=\"special\">.hgrc</filename> file; see below for details."
dongsheng@627 3309 msgstr ""
dongsheng@627 3310
dongsheng@627 3311 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 3312 #: ../en/ch01-tour-basic.xml:543
dongsheng@627 3313 msgid "Creating a Mercurial configuration file"
dongsheng@627 3314 msgstr "创建 Mercurial 的配置文件"
dongsheng@627 3315
dongsheng@627 3316 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 3317 #: ../en/ch01-tour-basic.xml:545
dongsheng@627 3318 msgid ""
dongsheng@627 3319 "To set a user name, use your favourite editor to create a file called "
dongsheng@627 3320 "<filename role=\"special\">.hgrc</filename> in your home directory. "
dongsheng@627 3321 "Mercurial will use this file to look up your personalised configuration "
dongsheng@627 3322 "settings. The initial contents of your <filename role=\"special\">.hgrc</"
dongsheng@627 3323 "filename> should look like this."
dongsheng@627 3324 msgstr ""
dongsheng@627 3325
dongsheng@627 3326 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 3327 #: ../en/ch01-tour-basic.xml:557
dongsheng@627 3328 msgid ""
dongsheng@627 3329 "The <quote><literal>[ui]</literal></quote> line begins a <emphasis>section</"
dongsheng@627 3330 "emphasis> of the config file, so you can read the <quote><literal>username "
dongsheng@627 3331 "= ...</literal></quote> line as meaning <quote>set the value of the "
dongsheng@627 3332 "<literal>username</literal> item in the <literal>ui</literal> section</"
dongsheng@627 3333 "quote>. A section continues until a new section begins, or the end of the "
dongsheng@627 3334 "file. Mercurial ignores empty lines and treats any text from "
dongsheng@627 3335 "<quote><literal>#</literal></quote> to the end of a line as a comment."
dongsheng@627 3336 msgstr ""
dongsheng@627 3337
dongsheng@627 3338 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 3339 #: ../en/ch01-tour-basic.xml:570
dongsheng@627 3340 msgid "Choosing a user name"
dongsheng@627 3341 msgstr "选择用户名称"
dongsheng@627 3342
dongsheng@627 3343 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 3344 #: ../en/ch01-tour-basic.xml:572
dongsheng@627 3345 msgid ""
dongsheng@627 3346 "You can use any text you like as the value of the <literal>username</literal> "
dongsheng@627 3347 "config item, since this information is for reading by other people, but for "
dongsheng@627 3348 "interpreting by Mercurial. The convention that most people follow is to use "
dongsheng@627 3349 "their name and email address, as in the example above."
dongsheng@627 3350 msgstr ""
dongsheng@627 3351
dongsheng@627 3352 #. type: Content of: <book><chapter><sect1><sect2><sect3><note><para>
songdongsheng@658 3353 #: ../en/ch01-tour-basic.xml:579
dongsheng@627 3354 msgid ""
dongsheng@627 3355 "Mercurial's built-in web server obfuscates email addresses, to make it more "
dongsheng@627 3356 "difficult for the email harvesting tools that spammers use. This reduces the "
dongsheng@627 3357 "likelihood that you'll start receiving more junk email if you publish a "
dongsheng@627 3358 "Mercurial repository on the web."
dongsheng@627 3359 msgstr ""
dongsheng@627 3360
dongsheng@627 3361 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3362 #: ../en/ch01-tour-basic.xml:589
dongsheng@627 3363 msgid "Writing a commit message"
dongsheng@627 3364 msgstr "写提交日志"
dongsheng@627 3365
dongsheng@627 3366 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3367 #: ../en/ch01-tour-basic.xml:591
dongsheng@627 3368 msgid ""
dongsheng@627 3369 "When we commit a change, Mercurial drops us into a text editor, to enter a "
dongsheng@627 3370 "message that will describe the modifications we've made in this changeset. "
dongsheng@627 3371 "This is called the <emphasis>commit message</emphasis>. It will be a record "
dongsheng@627 3372 "for readers of what we did and why, and it will be printed by <command role="
dongsheng@627 3373 "\"hg-cmd\">hg log</command> after we've finished committing."
dongsheng@627 3374 msgstr ""
dongsheng@627 3375
dongsheng@627 3376 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3377 #: ../en/ch01-tour-basic.xml:601
dongsheng@627 3378 msgid ""
dongsheng@627 3379 "The editor that the <command role=\"hg-cmd\">hg commit</command> command "
dongsheng@627 3380 "drops us into will contain an empty line, followed by a number of lines "
dongsheng@627 3381 "starting with <quote><literal>HG:</literal></quote>."
dongsheng@627 3382 msgstr ""
dongsheng@627 3383
dongsheng@627 3384 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3385 #: ../en/ch01-tour-basic.xml:608
dongsheng@627 3386 msgid ""
dongsheng@627 3387 "Mercurial ignores the lines that start with <quote><literal>HG:</literal></"
dongsheng@627 3388 "quote>; it uses them only to tell us which files it's recording changes to. "
dongsheng@627 3389 "Modifying or deleting these lines has no effect."
dongsheng@627 3390 msgstr ""
dongsheng@627 3391
dongsheng@627 3392 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3393 #: ../en/ch01-tour-basic.xml:614
dongsheng@627 3394 msgid "Writing a good commit message"
dongsheng@627 3395 msgstr "写好提交日志"
dongsheng@627 3396
dongsheng@627 3397 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3398 #: ../en/ch01-tour-basic.xml:616
dongsheng@627 3399 msgid ""
dongsheng@627 3400 "Since <command role=\"hg-cmd\">hg log</command> only prints the first line of "
dongsheng@627 3401 "a commit message by default, it's best to write a commit message whose first "
dongsheng@627 3402 "line stands alone. Here's a real example of a commit message that "
dongsheng@627 3403 "<emphasis>doesn't</emphasis> follow this guideline, and hence has a summary "
dongsheng@627 3404 "that is not readable."
dongsheng@627 3405 msgstr ""
dongsheng@627 3406
dongsheng@627 3407 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3408 #: ../en/ch01-tour-basic.xml:630
dongsheng@627 3409 msgid ""
dongsheng@627 3410 "As far as the remainder of the contents of the commit message are concerned, "
dongsheng@627 3411 "there are no hard-and-fast rules. Mercurial itself doesn't interpret or care "
dongsheng@627 3412 "about the contents of the commit message, though your project may have "
dongsheng@627 3413 "policies that dictate a certain kind of formatting."
dongsheng@627 3414 msgstr ""
dongsheng@627 3415
dongsheng@627 3416 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3417 #: ../en/ch01-tour-basic.xml:636
dongsheng@627 3418 msgid ""
dongsheng@627 3419 "My personal preference is for short, but informative, commit messages that "
dongsheng@627 3420 "tell me something that I can't figure out with a quick glance at the output "
dongsheng@627 3421 "of <command role=\"hg-cmd\">hg log --patch</command>."
dongsheng@627 3422 msgstr ""
dongsheng@627 3423
dongsheng@627 3424 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3425 #: ../en/ch01-tour-basic.xml:643
dongsheng@627 3426 msgid "Aborting a commit"
dongsheng@627 3427 msgstr "终止提交"
dongsheng@627 3428
dongsheng@627 3429 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3430 #: ../en/ch01-tour-basic.xml:645
dongsheng@627 3431 msgid ""
dongsheng@627 3432 "If you decide that you don't want to commit while in the middle of editing a "
dongsheng@627 3433 "commit message, simply exit from your editor without saving the file that "
dongsheng@627 3434 "it's editing. This will cause nothing to happen to either the repository or "
dongsheng@627 3435 "the working directory."
dongsheng@627 3436 msgstr ""
dongsheng@627 3437
dongsheng@627 3438 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3439 #: ../en/ch01-tour-basic.xml:650
dongsheng@627 3440 msgid ""
dongsheng@627 3441 "If we run the <command role=\"hg-cmd\">hg commit</command> command without "
dongsheng@627 3442 "any arguments, it records all of the changes we've made, as reported by "
dongsheng@627 3443 "<command role=\"hg-cmd\">hg status</command> and <command role=\"hg-cmd\">hg "
dongsheng@627 3444 "diff</command>."
dongsheng@627 3445 msgstr ""
dongsheng@627 3446
dongsheng@627 3447 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3448 #: ../en/ch01-tour-basic.xml:657
dongsheng@627 3449 msgid "Admiring our new handiwork"
songdongsheng@665 3450 msgstr "欣赏我们的成果"
dongsheng@627 3451
dongsheng@627 3452 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3453 #: ../en/ch01-tour-basic.xml:659
dongsheng@627 3454 msgid ""
dongsheng@627 3455 "Once we've finished the commit, we can use the <command role=\"hg-cmd\">hg "
dongsheng@627 3456 "tip</command> command to display the changeset we just created. This command "
dongsheng@627 3457 "produces output that is identical to <command role=\"hg-cmd\">hg log</"
dongsheng@627 3458 "command>, but it only displays the newest revision in the repository."
dongsheng@627 3459 msgstr ""
dongsheng@627 3460
dongsheng@627 3461 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3462 #: ../en/ch01-tour-basic.xml:668
dongsheng@627 3463 msgid ""
dongsheng@627 3464 "We refer to the newest revision in the repository as the tip revision, or "
dongsheng@627 3465 "simply the tip."
dongsheng@627 3466 msgstr ""
dongsheng@627 3467
dongsheng@627 3468 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 3469 #: ../en/ch01-tour-basic.xml:675
dongsheng@627 3470 msgid "Sharing changes"
dongsheng@627 3471 msgstr "共享修改"
dongsheng@627 3472
dongsheng@627 3473 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3474 #: ../en/ch01-tour-basic.xml:677
dongsheng@627 3475 msgid ""
dongsheng@627 3476 "We mentioned earlier that repositories in Mercurial are self-contained. This "
dongsheng@627 3477 "means that the changeset we just created exists only in our <filename class="
dongsheng@627 3478 "\"directory\">my-hello</filename> repository. Let's look at a few ways that "
dongsheng@627 3479 "we can propagate this change into other repositories."
dongsheng@627 3480 msgstr ""
dongsheng@627 3481
dongsheng@627 3482 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3483 #: ../en/ch01-tour-basic.xml:685
dongsheng@627 3484 msgid "Pulling changes from another repository"
dongsheng@627 3485 msgstr "从其它版本库取得修改"
dongsheng@627 3486
dongsheng@627 3487 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3488 #: ../en/ch01-tour-basic.xml:686
dongsheng@627 3489 msgid ""
dongsheng@627 3490 "To get started, let's clone our original <filename class=\"directory\">hello</"
dongsheng@627 3491 "filename> repository, which does not contain the change we just committed. "
dongsheng@627 3492 "We'll call our temporary repository <filename class=\"directory\">hello-pull</"
dongsheng@627 3493 "filename>."
dongsheng@627 3494 msgstr ""
dongsheng@627 3495
dongsheng@627 3496 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3497 #: ../en/ch01-tour-basic.xml:694
dongsheng@627 3498 msgid ""
dongsheng@627 3499 "We'll use the <command role=\"hg-cmd\">hg pull</command> command to bring "
dongsheng@627 3500 "changes from <filename class=\"directory\">my-hello</filename> into <filename "
dongsheng@627 3501 "class=\"directory\">hello-pull</filename>. However, blindly pulling unknown "
dongsheng@627 3502 "changes into a repository is a somewhat scary prospect. Mercurial provides "
dongsheng@627 3503 "the <command role=\"hg-cmd\">hg incoming</command> command to tell us what "
dongsheng@627 3504 "changes the <command role=\"hg-cmd\">hg pull</command> command "
dongsheng@627 3505 "<emphasis>would</emphasis> pull into the repository, without actually pulling "
dongsheng@627 3506 "the changes in."
dongsheng@627 3507 msgstr ""
dongsheng@627 3508
dongsheng@627 3509 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3510 #: ../en/ch01-tour-basic.xml:707
dongsheng@627 3511 msgid ""
dongsheng@627 3512 "(Of course, someone could cause more changesets to appear in the repository "
dongsheng@627 3513 "that we ran <command role=\"hg-cmd\">hg incoming</command> in, before we get "
dongsheng@627 3514 "a chance to <command role=\"hg-cmd\">hg pull</command> the changes, so that "
dongsheng@627 3515 "we could end up pulling changes that we didn't expect.)"
dongsheng@627 3516 msgstr ""
dongsheng@627 3517
dongsheng@627 3518 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3519 #: ../en/ch01-tour-basic.xml:714
dongsheng@627 3520 msgid ""
dongsheng@627 3521 "Bringing changes into a repository is a simple matter of running the <command "
dongsheng@627 3522 "role=\"hg-cmd\">hg pull</command> command, and telling it which repository to "
dongsheng@627 3523 "pull from."
dongsheng@627 3524 msgstr ""
dongsheng@627 3525
dongsheng@627 3526 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3527 #: ../en/ch01-tour-basic.xml:721
dongsheng@627 3528 msgid ""
dongsheng@627 3529 "As you can see from the before-and-after output of <command role=\"hg-cmd"
dongsheng@627 3530 "\">hg tip</command>, we have successfully pulled changes into our "
dongsheng@627 3531 "repository. There remains one step before we can see these changes in the "
dongsheng@627 3532 "working directory."
dongsheng@627 3533 msgstr ""
dongsheng@627 3534
dongsheng@627 3535 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3536 #: ../en/ch01-tour-basic.xml:729
dongsheng@627 3537 msgid "Updating the working directory"
dongsheng@627 3538 msgstr "更新工作目录"
dongsheng@627 3539
dongsheng@627 3540 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3541 #: ../en/ch01-tour-basic.xml:731
dongsheng@627 3542 msgid ""
dongsheng@627 3543 "We have so far glossed over the relationship between a repository and its "
dongsheng@627 3544 "working directory. The <command role=\"hg-cmd\">hg pull</command> command "
songdongsheng@658 3545 "that we ran in <xref linkend=\"sec:tour:pull\"/> brought changes into the "
songdongsheng@658 3546 "repository, but if we check, there's no sign of those changes in the working "
songdongsheng@658 3547 "directory. This is because <command role=\"hg-cmd\">hg pull</command> does "
songdongsheng@658 3548 "not (by default) touch the working directory. Instead, we use the <command "
songdongsheng@658 3549 "role=\"hg-cmd\">hg update</command> command to do this."
songdongsheng@658 3550 msgstr ""
songdongsheng@658 3551
songdongsheng@658 3552 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3553 #: ../en/ch01-tour-basic.xml:743
dongsheng@627 3554 msgid ""
dongsheng@627 3555 "It might seem a bit strange that <command role=\"hg-cmd\">hg pull</command> "
dongsheng@627 3556 "doesn't update the working directory automatically. There's actually a good "
dongsheng@627 3557 "reason for this: you can use <command role=\"hg-cmd\">hg update</command> to "
dongsheng@627 3558 "update the working directory to the state it was in at <emphasis>any "
dongsheng@627 3559 "revision</emphasis> in the history of the repository. If you had the working "
dongsheng@627 3560 "directory updated to an old revision---to hunt down the origin of a bug, "
dongsheng@627 3561 "say---and ran a <command role=\"hg-cmd\">hg pull</command> which "
dongsheng@627 3562 "automatically updated the working directory to a new revision, you might not "
dongsheng@627 3563 "be terribly happy."
dongsheng@627 3564 msgstr ""
dongsheng@627 3565
dongsheng@627 3566 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3567 #: ../en/ch01-tour-basic.xml:754
dongsheng@627 3568 msgid ""
dongsheng@627 3569 "However, since pull-then-update is such a common thing to do, Mercurial lets "
dongsheng@627 3570 "you combine the two by passing the <option role=\"hg-opt-pull\">-u</option> "
dongsheng@627 3571 "option to <command role=\"hg-cmd\">hg pull</command>."
dongsheng@627 3572 msgstr ""
dongsheng@627 3573
dongsheng@627 3574 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3575 #: ../en/ch01-tour-basic.xml:759
dongsheng@627 3576 msgid ""
dongsheng@627 3577 "If you look back at the output of <command role=\"hg-cmd\">hg pull</command> "
songdongsheng@658 3578 "in <xref linkend=\"sec:tour:pull\"/> when we ran it without <option role=\"hg-"
songdongsheng@658 3579 "opt-pull\">-u</option>, you can see that it printed a helpful reminder that "
songdongsheng@658 3580 "we'd have to take an explicit step to update the working directory:"
songdongsheng@658 3581 msgstr ""
songdongsheng@658 3582
songdongsheng@658 3583 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3584 #: ../en/ch01-tour-basic.xml:768
dongsheng@627 3585 msgid ""
dongsheng@627 3586 "To find out what revision the working directory is at, use the <command role="
dongsheng@627 3587 "\"hg-cmd\">hg parents</command> command."
dongsheng@627 3588 msgstr ""
dongsheng@627 3589
dongsheng@627 3590 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3591 #: ../en/ch01-tour-basic.xml:774
songdongsheng@658 3592 msgid ""
songdongsheng@658 3593 "If you look back at <xref linkend=\"fig:tour-basic:history\"/>, you'll see "
songdongsheng@658 3594 "arrows connecting each changeset. The node that the arrow leads "
songdongsheng@658 3595 "<emphasis>from</emphasis> in each case is a parent, and the node that the "
songdongsheng@658 3596 "arrow leads <emphasis>to</emphasis> is its child. The working directory has "
songdongsheng@658 3597 "a parent in just the same way; this is the changeset that the working "
songdongsheng@658 3598 "directory currently contains."
songdongsheng@658 3599 msgstr ""
songdongsheng@658 3600
songdongsheng@658 3601 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3602 #: ../en/ch01-tour-basic.xml:783
dongsheng@627 3603 msgid ""
dongsheng@627 3604 "To update the working directory to a particular revision, give a revision "
dongsheng@627 3605 "number or changeset ID to the <command role=\"hg-cmd\">hg update</command> "
dongsheng@627 3606 "command."
dongsheng@627 3607 msgstr ""
dongsheng@627 3608
dongsheng@627 3609 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3610 #: ../en/ch01-tour-basic.xml:790
dongsheng@627 3611 msgid ""
dongsheng@627 3612 "If you omit an explicit revision, <command role=\"hg-cmd\">hg update</"
dongsheng@627 3613 "command> will update to the tip revision, as shown by the second call to "
dongsheng@627 3614 "<command role=\"hg-cmd\">hg update</command> in the example above."
dongsheng@627 3615 msgstr ""
dongsheng@627 3616
dongsheng@627 3617 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3618 #: ../en/ch01-tour-basic.xml:798
dongsheng@627 3619 msgid "Pushing changes to another repository"
dongsheng@627 3620 msgstr "发布修改到其它版本库"
dongsheng@627 3621
dongsheng@627 3622 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3623 #: ../en/ch01-tour-basic.xml:800
dongsheng@627 3624 msgid ""
dongsheng@627 3625 "Mercurial lets us push changes to another repository, from the repository "
dongsheng@627 3626 "we're currently visiting. As with the example of <command role=\"hg-cmd\">hg "
dongsheng@627 3627 "pull</command> above, we'll create a temporary repository to push our changes "
dongsheng@627 3628 "into."
dongsheng@627 3629 msgstr ""
dongsheng@627 3630
dongsheng@627 3631 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3632 #: ../en/ch01-tour-basic.xml:808
dongsheng@627 3633 msgid ""
dongsheng@627 3634 "The <command role=\"hg-cmd\">hg outgoing</command> command tells us what "
dongsheng@627 3635 "changes would be pushed into another repository."
dongsheng@627 3636 msgstr ""
dongsheng@627 3637
dongsheng@627 3638 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3639 #: ../en/ch01-tour-basic.xml:814
dongsheng@627 3640 msgid ""
dongsheng@627 3641 "And the <command role=\"hg-cmd\">hg push</command> command does the actual "
dongsheng@627 3642 "push."
dongsheng@627 3643 msgstr ""
dongsheng@627 3644
dongsheng@627 3645 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3646 #: ../en/ch01-tour-basic.xml:820
dongsheng@627 3647 msgid ""
dongsheng@627 3648 "As with <command role=\"hg-cmd\">hg pull</command>, the <command role=\"hg-cmd"
dongsheng@627 3649 "\">hg push</command> command does not update the working directory in the "
dongsheng@627 3650 "repository that it's pushing changes into. (Unlike <command role=\"hg-cmd"
dongsheng@627 3651 "\">hg pull</command>, <command role=\"hg-cmd\">hg push</command> does not "
dongsheng@627 3652 "provide a <literal>-u</literal> option that updates the other repository's "
dongsheng@627 3653 "working directory.)"
dongsheng@627 3654 msgstr ""
dongsheng@627 3655
dongsheng@627 3656 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3657 #: ../en/ch01-tour-basic.xml:829
dongsheng@627 3658 msgid ""
dongsheng@627 3659 "What happens if we try to pull or push changes and the receiving repository "
dongsheng@627 3660 "already has those changes? Nothing too exciting."
dongsheng@627 3661 msgstr ""
dongsheng@627 3662
dongsheng@627 3663 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3664 #: ../en/ch01-tour-basic.xml:836
dongsheng@627 3665 msgid "Sharing changes over a network"
dongsheng@627 3666 msgstr "通过网络共享修改"
dongsheng@627 3667
dongsheng@627 3668 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3669 #: ../en/ch01-tour-basic.xml:838
dongsheng@627 3670 msgid ""
dongsheng@627 3671 "The commands we have covered in the previous few sections are not limited to "
dongsheng@627 3672 "working with local repositories. Each works in exactly the same fashion over "
dongsheng@627 3673 "a network connection; simply pass in a URL instead of a local path."
dongsheng@627 3674 msgstr ""
dongsheng@627 3675
dongsheng@627 3676 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3677 #: ../en/ch01-tour-basic.xml:846
dongsheng@627 3678 msgid ""
dongsheng@627 3679 "In this example, we can see what changes we could push to the remote "
dongsheng@627 3680 "repository, but the repository is understandably not set up to let anonymous "
dongsheng@627 3681 "users push to it."
dongsheng@627 3682 msgstr ""
dongsheng@627 3683
dongsheng@627 3684 #. type: Content of: <book><chapter><title>
dongsheng@650 3685 #: ../en/ch02-tour-merge.xml:5
dongsheng@627 3686 msgid "A tour of Mercurial: merging work"
dongsheng@627 3687 msgstr "Mercurial 教程: 合并工作"
dongsheng@627 3688
dongsheng@627 3689 #. type: Content of: <book><chapter><para>
dongsheng@650 3690 #: ../en/ch02-tour-merge.xml:7
dongsheng@627 3691 msgid ""
dongsheng@627 3692 "We've now covered cloning a repository, making changes in a repository, and "
dongsheng@627 3693 "pulling or pushing changes from one repository into another. Our next step "
dongsheng@627 3694 "is <emphasis>merging</emphasis> changes from separate repositories."
dongsheng@627 3695 msgstr ""
dongsheng@627 3696
dongsheng@627 3697 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 3698 #: ../en/ch02-tour-merge.xml:13
dongsheng@627 3699 msgid "Merging streams of work"
dongsheng@627 3700 msgstr "合并的流程"
dongsheng@627 3701
dongsheng@627 3702 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 3703 #: ../en/ch02-tour-merge.xml:15
dongsheng@627 3704 msgid ""
dongsheng@627 3705 "Merging is a fundamental part of working with a distributed revision control "
dongsheng@627 3706 "tool."
dongsheng@627 3707 msgstr ""
dongsheng@627 3708
dongsheng@627 3709 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 3710 #: ../en/ch02-tour-merge.xml:18
dongsheng@627 3711 msgid ""
dongsheng@627 3712 "Alice and Bob each have a personal copy of a repository for a project they're "
dongsheng@627 3713 "collaborating on. Alice fixes a bug in her repository; Bob adds a new "
dongsheng@627 3714 "feature in his. They want the shared repository to contain both the bug fix "
dongsheng@627 3715 "and the new feature."
dongsheng@627 3716 msgstr ""
dongsheng@627 3717
dongsheng@627 3718 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 3719 #: ../en/ch02-tour-merge.xml:24
dongsheng@627 3720 msgid ""
dongsheng@627 3721 "I frequently work on several different tasks for a single project at once, "
dongsheng@627 3722 "each safely isolated in its own repository. Working this way means that I "
dongsheng@627 3723 "often need to merge one piece of my own work with another."
dongsheng@627 3724 msgstr ""
dongsheng@627 3725
dongsheng@627 3726 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 3727 #: ../en/ch02-tour-merge.xml:30
dongsheng@627 3728 msgid ""
dongsheng@627 3729 "Because merging is such a common thing to need to do, Mercurial makes it "
dongsheng@627 3730 "easy. Let's walk through the process. We'll begin by cloning yet another "
dongsheng@627 3731 "repository (see how often they spring up?) and making a change in it."
dongsheng@627 3732 msgstr ""
dongsheng@627 3733
dongsheng@627 3734 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 3735 #: ../en/ch02-tour-merge.xml:37
dongsheng@627 3736 msgid ""
dongsheng@627 3737 "We should now have two copies of <filename>hello.c</filename> with different "
dongsheng@627 3738 "contents. The histories of the two repositories have also diverged, as "
songdongsheng@658 3739 "illustrated in <xref linkend=\"fig:tour-merge:sep-repos\"/>."
songdongsheng@658 3740 msgstr ""
songdongsheng@658 3741
songdongsheng@658 3742 #. type: Content of: <book><chapter><sect1><figure><title>
songdongsheng@658 3743 #: ../en/ch02-tour-merge.xml:46
dongsheng@627 3744 msgid ""
dongsheng@627 3745 "Divergent recent histories of the <filename class=\"directory\">my-hello</"
dongsheng@627 3746 "filename> and <filename class=\"directory\">my-new-hello</filename> "
dongsheng@627 3747 "repositories"
dongsheng@627 3748 msgstr ""
dongsheng@660 3749 "<filename class=\"directory\">my-hello</filename> 与 <filename class="
dongsheng@660 3750 "\"directory\">my-new-hello</filename> 最新的历史分叉"
dongsheng@627 3751
songdongsheng@658 3752 #. type: Content of: <book><chapter><sect1><figure><mediaobject>
songdongsheng@658 3753 #: ../en/ch02-tour-merge.xml:51
songdongsheng@658 3754 msgid ""
songdongsheng@658 3755 "<imageobject><imagedata fileref=\"figs/tour-merge-sep-repos.png\"/></"
songdongsheng@658 3756 "imageobject>"
songdongsheng@658 3757 msgstr ""
songdongsheng@658 3758
songdongsheng@658 3759 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3760 #: ../en/ch02-tour-merge.xml:56
dongsheng@627 3761 msgid ""
dongsheng@627 3762 "We already know that pulling changes from our <filename class=\"directory"
dongsheng@627 3763 "\">my-hello</filename> repository will have no effect on the working "
dongsheng@627 3764 "directory."
dongsheng@627 3765 msgstr ""
dongsheng@627 3766
dongsheng@627 3767 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3768 #: ../en/ch02-tour-merge.xml:62
dongsheng@627 3769 msgid ""
dongsheng@627 3770 "However, the <command role=\"hg-cmd\">hg pull</command> command says "
dongsheng@627 3771 "something about <quote>heads</quote>."
dongsheng@627 3772 msgstr ""
dongsheng@627 3773
dongsheng@627 3774 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3775 #: ../en/ch02-tour-merge.xml:66
dongsheng@627 3776 msgid "Head changesets"
songdongsheng@665 3777 msgstr "顶点修改集"
dongsheng@627 3778
dongsheng@627 3779 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3780 #: ../en/ch02-tour-merge.xml:68
dongsheng@627 3781 msgid ""
dongsheng@627 3782 "A head is a change that has no descendants, or children, as they're also "
dongsheng@627 3783 "known. The tip revision is thus a head, because the newest revision in a "
dongsheng@627 3784 "repository doesn't have any children, but a repository can contain more than "
dongsheng@627 3785 "one head."
dongsheng@627 3786 msgstr ""
dongsheng@627 3787
songdongsheng@658 3788 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 3789 #: ../en/ch02-tour-merge.xml:75
dongsheng@627 3790 msgid ""
dongsheng@627 3791 "Repository contents after pulling from <filename class=\"directory\">my-"
dongsheng@627 3792 "hello</filename> into <filename class=\"directory\">my-new-hello</filename>"
dongsheng@627 3793 msgstr ""
dongsheng@660 3794 "从 <filename class=\"directory\">my-hello</filename> 拉到 <filename class="
dongsheng@660 3795 "\"directory\">my-new-hello</filename> 之后版本库的内容"
dongsheng@627 3796
songdongsheng@658 3797 #. type: Content of: <book><chapter><sect1><sect2><figure>
songdongsheng@658 3798 #: ../en/ch02-tour-merge.xml:78 ../en/ch02-tour-merge.xml:125
songdongsheng@658 3799 #: ../en/ch02-tour-merge.xml:250 ../en/ch03-concepts.xml:55
songdongsheng@658 3800 #: ../en/ch03-concepts.xml:104 ../en/ch03-concepts.xml:189
songdongsheng@658 3801 #: ../en/ch03-concepts.xml:344 ../en/ch03-concepts.xml:359
songdongsheng@658 3802 #: ../en/ch03-concepts.xml:400 ../en/ch03-concepts.xml:420
songdongsheng@658 3803 #: ../en/ch03-concepts.xml:461 ../en/ch05-collab.xml:274
songdongsheng@658 3804 #: ../en/ch08-undo.xml:363 ../en/ch08-undo.xml:410 ../en/ch08-undo.xml:475
songdongsheng@658 3805 #: ../en/ch08-undo.xml:513 ../en/ch11-mq.xml:410
songdongsheng@658 3806 msgid " <placeholder type=\"mediaobject\" id=\"0\"/>"
songdongsheng@658 3807 msgstr ""
songdongsheng@658 3808
songdongsheng@658 3809 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 3810 #: ../en/ch02-tour-merge.xml:79
songdongsheng@658 3811 msgid ""
songdongsheng@658 3812 "<imageobject> <imagedata fileref=\"figs/tour-merge-pull.png\"/> </imageobject>"
songdongsheng@658 3813 msgstr ""
songdongsheng@658 3814
songdongsheng@658 3815 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3816 #: ../en/ch02-tour-merge.xml:86
songdongsheng@658 3817 msgid ""
songdongsheng@658 3818 "In <xref linkend=\"fig:tour-merge:pull\"/>, you can see the effect of the "
songdongsheng@658 3819 "pull from <filename class=\"directory\">my-hello</filename> into <filename "
songdongsheng@658 3820 "class=\"directory\">my-new-hello</filename>. The history that was already "
songdongsheng@658 3821 "present in <filename class=\"directory\">my-new-hello</filename> is "
songdongsheng@658 3822 "untouched, but a new revision has been added. By referring to <xref linkend="
songdongsheng@658 3823 "\"fig:tour-merge:sep-repos\"/>, we can see that the <emphasis>changeset ID</"
songdongsheng@658 3824 "emphasis> remains the same in the new repository, but the <emphasis>revision "
songdongsheng@658 3825 "number</emphasis> has changed. (This, incidentally, is a fine example of why "
songdongsheng@658 3826 "it's not safe to use revision numbers when discussing changesets.) We can "
songdongsheng@658 3827 "view the heads in a repository using the <command role=\"hg-cmd\">hg heads</"
songdongsheng@658 3828 "command> command."
dongsheng@627 3829 msgstr ""
dongsheng@627 3830
dongsheng@627 3831 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3832 #: ../en/ch02-tour-merge.xml:105
dongsheng@627 3833 msgid "Performing the merge"
dongsheng@627 3834 msgstr "执行合并"
dongsheng@627 3835
dongsheng@627 3836 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3837 #: ../en/ch02-tour-merge.xml:107
dongsheng@627 3838 msgid ""
dongsheng@627 3839 "What happens if we try to use the normal <command role=\"hg-cmd\">hg update</"
dongsheng@627 3840 "command> command to update to the new tip?"
dongsheng@627 3841 msgstr ""
dongsheng@627 3842
dongsheng@627 3843 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3844 #: ../en/ch02-tour-merge.xml:113
dongsheng@627 3845 msgid ""
dongsheng@627 3846 "Mercurial is telling us that the <command role=\"hg-cmd\">hg update</command> "
dongsheng@627 3847 "command won't do a merge; it won't update the working directory when it "
dongsheng@627 3848 "thinks we might be wanting to do a merge, unless we force it to do so. "
dongsheng@627 3849 "Instead, we use the <command role=\"hg-cmd\">hg merge</command> command to "
dongsheng@627 3850 "merge the two heads."
dongsheng@627 3851 msgstr ""
dongsheng@627 3852
songdongsheng@658 3853 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 3854 #: ../en/ch02-tour-merge.xml:123
songdongsheng@658 3855 msgid "Working directory and repository during merge, and following commit"
dongsheng@660 3856 msgstr "在合并期间,以及提交之后的工作目录与版本库"
songdongsheng@658 3857
songdongsheng@658 3858 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 3859 #: ../en/ch02-tour-merge.xml:126
songdongsheng@658 3860 msgid ""
songdongsheng@658 3861 "<imageobject> <imagedata fileref=\"figs/tour-merge-merge.png\"/> </"
dongsheng@627 3862 "imageobject>"
dongsheng@627 3863 msgstr ""
dongsheng@627 3864
songdongsheng@658 3865 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3866 #: ../en/ch02-tour-merge.xml:133
dongsheng@627 3867 msgid ""
dongsheng@627 3868 "This updates the working directory so that it contains changes from "
dongsheng@627 3869 "<emphasis>both</emphasis> heads, which is reflected in both the output of "
dongsheng@627 3870 "<command role=\"hg-cmd\">hg parents</command> and the contents of "
dongsheng@627 3871 "<filename>hello.c</filename>."
dongsheng@627 3872 msgstr ""
dongsheng@627 3873
dongsheng@627 3874 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3875 #: ../en/ch02-tour-merge.xml:143
dongsheng@627 3876 msgid "Committing the results of the merge"
dongsheng@627 3877 msgstr "提交合并结果"
dongsheng@627 3878
dongsheng@627 3879 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3880 #: ../en/ch02-tour-merge.xml:145
dongsheng@627 3881 msgid ""
dongsheng@627 3882 "Whenever we've done a merge, <command role=\"hg-cmd\">hg parents</command> "
dongsheng@627 3883 "will display two parents until we <command role=\"hg-cmd\">hg commit</"
dongsheng@627 3884 "command> the results of the merge."
dongsheng@627 3885 msgstr ""
dongsheng@627 3886
dongsheng@627 3887 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3888 #: ../en/ch02-tour-merge.xml:152
dongsheng@627 3889 msgid ""
dongsheng@627 3890 "We now have a new tip revision; notice that it has <emphasis>both</emphasis> "
dongsheng@627 3891 "of our former heads as its parents. These are the same revisions that were "
dongsheng@627 3892 "previously displayed by <command role=\"hg-cmd\">hg parents</command>."
dongsheng@627 3893 msgstr ""
dongsheng@627 3894
dongsheng@627 3895 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3896 #: ../en/ch02-tour-merge.xml:159
songdongsheng@658 3897 msgid ""
songdongsheng@658 3898 "In <xref linkend=\"fig:tour-merge:merge\"/>, you can see a representation of "
songdongsheng@658 3899 "what happens to the working directory during the merge, and how this affects "
songdongsheng@658 3900 "the repository when the commit happens. During the merge, the working "
songdongsheng@658 3901 "directory has two parent changesets, and these become the parents of the new "
songdongsheng@658 3902 "changeset."
dongsheng@627 3903 msgstr ""
dongsheng@627 3904
dongsheng@627 3905 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 3906 #: ../en/ch02-tour-merge.xml:170
dongsheng@627 3907 msgid "Merging conflicting changes"
dongsheng@627 3908 msgstr "合并有冲突的改变"
dongsheng@627 3909
dongsheng@627 3910 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3911 #: ../en/ch02-tour-merge.xml:172
dongsheng@627 3912 msgid ""
dongsheng@627 3913 "Most merges are simple affairs, but sometimes you'll find yourself merging "
dongsheng@627 3914 "changes where each modifies the same portions of the same files. Unless both "
dongsheng@627 3915 "modifications are identical, this results in a <emphasis>conflict</emphasis>, "
dongsheng@627 3916 "where you have to decide how to reconcile the different changes into "
dongsheng@627 3917 "something coherent."
dongsheng@627 3918 msgstr ""
dongsheng@627 3919
songdongsheng@658 3920 #. type: Content of: <book><chapter><sect1><figure><title>
dongsheng@650 3921 #: ../en/ch02-tour-merge.xml:180
songdongsheng@658 3922 msgid "Conflicting changes to a document"
dongsheng@660 3923 msgstr "冲突的修改"
songdongsheng@658 3924
songdongsheng@658 3925 #. type: Content of: <book><chapter><sect1><figure><mediaobject>
songdongsheng@658 3926 #: ../en/ch02-tour-merge.xml:182
songdongsheng@658 3927 msgid ""
songdongsheng@658 3928 "<imageobject><imagedata fileref=\"figs/tour-merge-conflict.png\"/></"
dongsheng@627 3929 "imageobject>"
dongsheng@627 3930 msgstr ""
dongsheng@627 3931
songdongsheng@658 3932 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3933 #: ../en/ch02-tour-merge.xml:187
songdongsheng@658 3934 msgid ""
songdongsheng@658 3935 "<xref linkend=\"fig:tour-merge:conflict\"/> illustrates an instance of two "
songdongsheng@658 3936 "conflicting changes to a document. We started with a single version of the "
songdongsheng@658 3937 "file; then we made some changes; while someone else made different changes to "
songdongsheng@658 3938 "the same text. Our task in resolving the conflicting changes is to decide "
songdongsheng@658 3939 "what the file should look like."
songdongsheng@658 3940 msgstr ""
songdongsheng@658 3941
songdongsheng@658 3942 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3943 #: ../en/ch02-tour-merge.xml:194
dongsheng@627 3944 msgid ""
dongsheng@627 3945 "Mercurial doesn't have a built-in facility for handling conflicts. Instead, "
dongsheng@627 3946 "it runs an external program called <command>hgmerge</command>. This is a "
dongsheng@627 3947 "shell script that is bundled with Mercurial; you can change it to behave "
dongsheng@627 3948 "however you please. What it does by default is try to find one of several "
dongsheng@627 3949 "different merging tools that are likely to be installed on your system. It "
dongsheng@627 3950 "first tries a few fully automatic merging tools; if these don't succeed "
dongsheng@627 3951 "(because the resolution process requires human guidance) or aren't present, "
dongsheng@627 3952 "the script tries a few different graphical merging tools."
dongsheng@627 3953 msgstr ""
dongsheng@627 3954
dongsheng@627 3955 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 3956 #: ../en/ch02-tour-merge.xml:205
dongsheng@627 3957 msgid ""
dongsheng@627 3958 "It's also possible to get Mercurial to run another program or script instead "
dongsheng@627 3959 "of <command>hgmerge</command>, by setting the <envar>HGMERGE</envar> "
dongsheng@627 3960 "environment variable to the name of your preferred program."
dongsheng@627 3961 msgstr ""
dongsheng@627 3962
dongsheng@627 3963 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 3964 #: ../en/ch02-tour-merge.xml:211
dongsheng@627 3965 msgid "Using a graphical merge tool"
dongsheng@627 3966 msgstr "使用图形合并工具"
dongsheng@627 3967
dongsheng@627 3968 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 3969 #: ../en/ch02-tour-merge.xml:213
dongsheng@627 3970 msgid ""
dongsheng@627 3971 "My preferred graphical merge tool is <command>kdiff3</command>, which I'll "
dongsheng@627 3972 "use to describe the features that are common to graphical file merging "
dongsheng@627 3973 "tools. You can see a screenshot of <command>kdiff3</command> in action in "
songdongsheng@658 3974 "<xref linkend=\"fig:tour-merge:kdiff3\"/>. The kind of merge it is "
songdongsheng@658 3975 "performing is called a <emphasis>three-way merge</emphasis>, because there "
songdongsheng@658 3976 "are three different versions of the file of interest to us. The tool thus "
songdongsheng@658 3977 "splits the upper portion of the window into three panes:"
dongsheng@627 3978 msgstr ""
dongsheng@627 3979
dongsheng@627 3980 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 3981 #: ../en/ch02-tour-merge.xml:223
dongsheng@627 3982 msgid ""
dongsheng@627 3983 "At the left is the <emphasis>base</emphasis> version of the file, i.e. the "
dongsheng@627 3984 "most recent version from which the two versions we're trying to merge are "
dongsheng@627 3985 "descended."
dongsheng@627 3986 msgstr ""
dongsheng@627 3987
dongsheng@627 3988 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 3989 #: ../en/ch02-tour-merge.xml:228
dongsheng@627 3990 msgid ""
dongsheng@627 3991 "In the middle is <quote>our</quote> version of the file, with the contents "
dongsheng@627 3992 "that we modified."
dongsheng@627 3993 msgstr ""
dongsheng@627 3994
dongsheng@627 3995 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 3996 #: ../en/ch02-tour-merge.xml:231
dongsheng@627 3997 msgid ""
dongsheng@627 3998 "On the right is <quote>their</quote> version of the file, the one that from "
dongsheng@627 3999 "the changeset that we're trying to merge with."
dongsheng@627 4000 msgstr ""
dongsheng@627 4001
dongsheng@627 4002 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4003 #: ../en/ch02-tour-merge.xml:235
dongsheng@627 4004 msgid ""
dongsheng@627 4005 "In the pane below these is the current <emphasis>result</emphasis> of the "
dongsheng@627 4006 "merge. Our task is to replace all of the red text, which indicates unresolved "
dongsheng@627 4007 "conflicts, with some sensible merger of the <quote>ours</quote> and "
dongsheng@627 4008 "<quote>theirs</quote> versions of the file."
dongsheng@627 4009 msgstr ""
dongsheng@627 4010
dongsheng@627 4011 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4012 #: ../en/ch02-tour-merge.xml:242
dongsheng@627 4013 msgid ""
dongsheng@627 4014 "All four of these panes are <emphasis>locked together</emphasis>; if we "
dongsheng@627 4015 "scroll vertically or horizontally in any of them, the others are updated to "
dongsheng@627 4016 "display the corresponding sections of their respective files."
dongsheng@627 4017 msgstr ""
dongsheng@627 4018
songdongsheng@658 4019 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4020 #: ../en/ch02-tour-merge.xml:248
songdongsheng@658 4021 msgid "Using <command>kdiff3</command> to merge versions of a file"
dongsheng@660 4022 msgstr "使用 <command>kdiff3</command> 合并文件的不同版本"
songdongsheng@658 4023
songdongsheng@658 4024 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4025 #: ../en/ch02-tour-merge.xml:251
songdongsheng@658 4026 msgid ""
songdongsheng@658 4027 "<imageobject> <imagedata width=\"100%\" fileref=\"figs/kdiff3.png\"/></"
dongsheng@630 4028 "imageobject>"
dongsheng@627 4029 msgstr ""
dongsheng@627 4030
songdongsheng@658 4031 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4032 #: ../en/ch02-tour-merge.xml:259
dongsheng@627 4033 msgid ""
dongsheng@627 4034 "For each conflicting portion of the file, we can choose to resolve the "
dongsheng@627 4035 "conflict using some combination of text from the base version, ours, or "
dongsheng@627 4036 "theirs. We can also manually edit the merged file at any time, in case we "
dongsheng@627 4037 "need to make further modifications."
dongsheng@627 4038 msgstr ""
dongsheng@627 4039
dongsheng@627 4040 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4041 #: ../en/ch02-tour-merge.xml:265
dongsheng@627 4042 msgid ""
dongsheng@627 4043 "There are <emphasis>many</emphasis> file merging tools available, too many to "
dongsheng@627 4044 "cover here. They vary in which platforms they are available for, and in "
dongsheng@627 4045 "their particular strengths and weaknesses. Most are tuned for merging files "
dongsheng@627 4046 "containing plain text, while a few are aimed at specialised file formats "
dongsheng@627 4047 "(generally XML)."
dongsheng@627 4048 msgstr ""
dongsheng@627 4049
dongsheng@627 4050 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4051 #: ../en/ch02-tour-merge.xml:274
dongsheng@627 4052 msgid "A worked example"
dongsheng@627 4053 msgstr "合并实例"
dongsheng@627 4054
dongsheng@627 4055 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4056 #: ../en/ch02-tour-merge.xml:276
songdongsheng@658 4057 msgid ""
songdongsheng@658 4058 "In this example, we will reproduce the file modification history of <xref "
songdongsheng@658 4059 "linkend=\"fig:tour-merge:conflict\"/> above. Let's begin by creating a "
songdongsheng@658 4060 "repository with a base version of our document."
songdongsheng@658 4061 msgstr ""
songdongsheng@658 4062
songdongsheng@658 4063 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4064 #: ../en/ch02-tour-merge.xml:283
dongsheng@627 4065 msgid "We'll clone the repository and make a change to the file."
dongsheng@627 4066 msgstr ""
dongsheng@627 4067
dongsheng@627 4068 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4069 #: ../en/ch02-tour-merge.xml:288
dongsheng@627 4070 msgid ""
dongsheng@627 4071 "And another clone, to simulate someone else making a change to the file. "
dongsheng@627 4072 "(This hints at the idea that it's not all that unusual to merge with yourself "
dongsheng@627 4073 "when you isolate tasks in separate repositories, and indeed to find and "
dongsheng@627 4074 "resolve conflicts while doing so.)"
dongsheng@627 4075 msgstr ""
dongsheng@627 4076
dongsheng@627 4077 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4078 #: ../en/ch02-tour-merge.xml:296
dongsheng@627 4079 msgid ""
dongsheng@627 4080 "Having created two different versions of the file, we'll set up an "
dongsheng@627 4081 "environment suitable for running our merge."
dongsheng@627 4082 msgstr ""
dongsheng@627 4083
dongsheng@627 4084 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4085 #: ../en/ch02-tour-merge.xml:302
dongsheng@627 4086 msgid ""
dongsheng@627 4087 "In this example, I won't use Mercurial's normal <command>hgmerge</command> "
dongsheng@627 4088 "program to do the merge, because it would drop my nice automated example-"
dongsheng@627 4089 "running tool into a graphical user interface. Instead, I'll set "
dongsheng@627 4090 "<envar>HGMERGE</envar> to tell Mercurial to use the non-interactive "
dongsheng@627 4091 "<command>merge</command> command. This is bundled with many Unix-like "
dongsheng@627 4092 "systems. If you're following this example on your computer, don't bother "
dongsheng@627 4093 "setting <envar>HGMERGE</envar>."
dongsheng@627 4094 msgstr ""
dongsheng@627 4095
dongsheng@627 4096 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4097 #: ../en/ch02-tour-merge.xml:312
dongsheng@627 4098 msgid "<emphasis role=\"bold\">XXX FIX THIS EXAMPLE.</emphasis>"
dongsheng@627 4099 msgstr ""
dongsheng@627 4100
dongsheng@627 4101 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4102 #: ../en/ch02-tour-merge.xml:317
dongsheng@627 4103 msgid ""
dongsheng@627 4104 "Because <command>merge</command> can't resolve the conflicting changes, it "
dongsheng@627 4105 "leaves <emphasis>merge markers</emphasis> inside the file that has conflicts, "
dongsheng@627 4106 "indicating which lines have conflicts, and whether they came from our version "
dongsheng@627 4107 "of the file or theirs."
dongsheng@627 4108 msgstr ""
dongsheng@627 4109
dongsheng@627 4110 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4111 #: ../en/ch02-tour-merge.xml:323
dongsheng@627 4112 msgid ""
dongsheng@627 4113 "Mercurial can tell from the way <command>merge</command> exits that it wasn't "
dongsheng@627 4114 "able to merge successfully, so it tells us what commands we'll need to run if "
dongsheng@627 4115 "we want to redo the merging operation. This could be useful if, for example, "
dongsheng@627 4116 "we were running a graphical merge tool and quit because we were confused or "
dongsheng@627 4117 "realised we had made a mistake."
dongsheng@627 4118 msgstr ""
dongsheng@627 4119
dongsheng@627 4120 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4121 #: ../en/ch02-tour-merge.xml:330
dongsheng@627 4122 msgid ""
dongsheng@627 4123 "If automatic or manual merges fail, there's nothing to prevent us from "
dongsheng@627 4124 "<quote>fixing up</quote> the affected files ourselves, and committing the "
dongsheng@627 4125 "results of our merge:"
dongsheng@627 4126 msgstr ""
dongsheng@627 4127
dongsheng@627 4128 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 4129 #: ../en/ch02-tour-merge.xml:339
dongsheng@627 4130 msgid "Simplifying the pull-merge-commit sequence"
dongsheng@627 4131 msgstr "简化拉-合并-提交程序"
dongsheng@627 4132
dongsheng@627 4133 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4134 #: ../en/ch02-tour-merge.xml:341
dongsheng@627 4135 msgid ""
dongsheng@627 4136 "The process of merging changes as outlined above is straightforward, but "
dongsheng@627 4137 "requires running three commands in sequence."
dongsheng@627 4138 msgstr ""
dongsheng@627 4139
dongsheng@627 4140 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4141 #: ../en/ch02-tour-merge.xml:347
dongsheng@627 4142 msgid ""
dongsheng@627 4143 "In the case of the final commit, you also need to enter a commit message, "
dongsheng@627 4144 "which is almost always going to be a piece of uninteresting "
dongsheng@627 4145 "<quote>boilerplate</quote> text."
dongsheng@627 4146 msgstr ""
dongsheng@627 4147
dongsheng@627 4148 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4149 #: ../en/ch02-tour-merge.xml:351
dongsheng@627 4150 msgid ""
dongsheng@627 4151 "It would be nice to reduce the number of steps needed, if this were "
dongsheng@627 4152 "possible. Indeed, Mercurial is distributed with an extension called <literal "
dongsheng@627 4153 "role=\"hg-ext\">fetch</literal> that does just this."
dongsheng@627 4154 msgstr ""
dongsheng@627 4155
dongsheng@627 4156 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4157 #: ../en/ch02-tour-merge.xml:356
dongsheng@627 4158 msgid ""
dongsheng@627 4159 "Mercurial provides a flexible extension mechanism that lets people extend its "
dongsheng@627 4160 "functionality, while keeping the core of Mercurial small and easy to deal "
dongsheng@627 4161 "with. Some extensions add new commands that you can use from the command "
dongsheng@627 4162 "line, while others work <quote>behind the scenes,</quote> for example adding "
dongsheng@627 4163 "capabilities to the server."
dongsheng@627 4164 msgstr ""
dongsheng@627 4165
dongsheng@627 4166 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4167 #: ../en/ch02-tour-merge.xml:363
dongsheng@627 4168 msgid ""
dongsheng@627 4169 "The <literal role=\"hg-ext\">fetch</literal> extension adds a new command "
dongsheng@627 4170 "called, not surprisingly, <command role=\"hg-cmd\">hg fetch</command>. This "
dongsheng@627 4171 "extension acts as a combination of <command role=\"hg-cmd\">hg pull</"
dongsheng@627 4172 "command>, <command role=\"hg-cmd\">hg update</command> and <command role=\"hg-"
dongsheng@627 4173 "cmd\">hg merge</command>. It begins by pulling changes from another "
dongsheng@627 4174 "repository into the current repository. If it finds that the changes added a "
dongsheng@627 4175 "new head to the repository, it begins a merge, then commits the result of the "
dongsheng@627 4176 "merge with an automatically-generated commit message. If no new heads were "
dongsheng@627 4177 "added, it updates the working directory to the new tip changeset."
dongsheng@627 4178 msgstr ""
dongsheng@627 4179
dongsheng@627 4180 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4181 #: ../en/ch02-tour-merge.xml:376
dongsheng@627 4182 msgid ""
dongsheng@627 4183 "Enabling the <literal role=\"hg-ext\">fetch</literal> extension is easy. "
dongsheng@627 4184 "Edit your <filename role=\"special\">.hgrc</filename>, and either go to the "
dongsheng@627 4185 "<literal role=\"rc-extensions\">extensions</literal> section or create an "
dongsheng@627 4186 "<literal role=\"rc-extensions\">extensions</literal> section. Then add a line "
dongsheng@627 4187 "that simply reads <quote><literal>fetch </literal></quote>."
dongsheng@627 4188 msgstr ""
dongsheng@627 4189
dongsheng@627 4190 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4191 #: ../en/ch02-tour-merge.xml:385
dongsheng@627 4192 msgid ""
dongsheng@627 4193 "(Normally, on the right-hand side of the <quote><literal>=</literal></quote> "
dongsheng@627 4194 "would appear the location of the extension, but since the <literal role=\"hg-"
dongsheng@627 4195 "ext\">fetch</literal> extension is in the standard distribution, Mercurial "
dongsheng@627 4196 "knows where to search for it.)"
dongsheng@627 4197 msgstr ""
dongsheng@627 4198
dongsheng@627 4199 #. type: Content of: <book><chapter><title>
dongsheng@650 4200 #: ../en/ch03-concepts.xml:5
dongsheng@627 4201 msgid "Behind the scenes"
dongsheng@627 4202 msgstr "Mercurial 内幕"
dongsheng@627 4203
dongsheng@627 4204 #. type: Content of: <book><chapter><para>
dongsheng@650 4205 #: ../en/ch03-concepts.xml:7
dongsheng@627 4206 msgid ""
dongsheng@627 4207 "Unlike many revision control systems, the concepts upon which Mercurial is "
dongsheng@627 4208 "built are simple enough that it's easy to understand how the software really "
dongsheng@627 4209 "works. Knowing this certainly isn't necessary, but I find it useful to have "
dongsheng@627 4210 "a <quote>mental model</quote> of what's going on."
dongsheng@627 4211 msgstr ""
dongsheng@627 4212
dongsheng@627 4213 #. type: Content of: <book><chapter><para>
dongsheng@650 4214 #: ../en/ch03-concepts.xml:13
dongsheng@627 4215 msgid ""
dongsheng@627 4216 "This understanding gives me confidence that Mercurial has been carefully "
dongsheng@627 4217 "designed to be both <emphasis>safe</emphasis> and <emphasis>efficient</"
dongsheng@627 4218 "emphasis>. And just as importantly, if it's easy for me to retain a good "
dongsheng@627 4219 "idea of what the software is doing when I perform a revision control task, "
dongsheng@627 4220 "I'm less likely to be surprised by its behaviour."
dongsheng@627 4221 msgstr ""
dongsheng@627 4222
dongsheng@627 4223 #. type: Content of: <book><chapter><para>
dongsheng@650 4224 #: ../en/ch03-concepts.xml:20
dongsheng@627 4225 msgid ""
dongsheng@627 4226 "In this chapter, we'll initially cover the core concepts behind Mercurial's "
dongsheng@627 4227 "design, then continue to discuss some of the interesting details of its "
dongsheng@627 4228 "implementation."
dongsheng@627 4229 msgstr ""
dongsheng@627 4230
dongsheng@627 4231 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 4232 #: ../en/ch03-concepts.xml:25
dongsheng@627 4233 msgid "Mercurial's historical record"
dongsheng@627 4234 msgstr "Mercurial 的历史记录"
dongsheng@627 4235
dongsheng@627 4236 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 4237 #: ../en/ch03-concepts.xml:28
dongsheng@627 4238 msgid "Tracking the history of a single file"
dongsheng@627 4239 msgstr "跟踪单一文件的历史"
dongsheng@627 4240
dongsheng@627 4241 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 4242 #: ../en/ch03-concepts.xml:30
dongsheng@627 4243 msgid ""
dongsheng@627 4244 "When Mercurial tracks modifications to a file, it stores the history of that "
dongsheng@627 4245 "file in a metadata object called a <emphasis>filelog</emphasis>. Each entry "
dongsheng@627 4246 "in the filelog contains enough information to reconstruct one revision of the "
dongsheng@627 4247 "file that is being tracked. Filelogs are stored as files in the <filename "
dongsheng@627 4248 "role=\"special\" class=\"directory\">.hg/store/data</filename> directory. A "
dongsheng@627 4249 "filelog contains two kinds of information: revision data, and an index to "
dongsheng@627 4250 "help Mercurial to find a revision efficiently."
dongsheng@627 4251 msgstr ""
dongsheng@627 4252
dongsheng@627 4253 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 4254 #: ../en/ch03-concepts.xml:41
dongsheng@627 4255 msgid ""
dongsheng@627 4256 "A file that is large, or has a lot of history, has its filelog stored in "
dongsheng@627 4257 "separate data (<quote><literal>.d</literal></quote> suffix) and index "
dongsheng@627 4258 "(<quote><literal>.i</literal></quote> suffix) files. For small files without "
dongsheng@627 4259 "much history, the revision data and index are combined in a single "
dongsheng@627 4260 "<quote><literal>.i</literal></quote> file. The correspondence between a file "
dongsheng@627 4261 "in the working directory and the filelog that tracks its history in the "
songdongsheng@658 4262 "repository is illustrated in <xref linkend=\"fig:concepts:filelog\"/>."
songdongsheng@658 4263 msgstr ""
songdongsheng@658 4264
songdongsheng@658 4265 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4266 #: ../en/ch03-concepts.xml:53
dongsheng@627 4267 msgid ""
dongsheng@627 4268 "Relationships between files in working directory and filelogs in repository"
dongsheng@660 4269 msgstr "工作目录中的文件与版本库中的文件日志之间的关系"
dongsheng@627 4270
songdongsheng@658 4271 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4272 #: ../en/ch03-concepts.xml:56
songdongsheng@658 4273 msgid "<imageobject><imagedata fileref=\"figs/filelog.png\"/></imageobject>"
songdongsheng@658 4274 msgstr ""
songdongsheng@658 4275
dongsheng@627 4276 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4277 #: ../en/ch03-concepts.xml:63
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>
songdongsheng@658 4282 #: ../en/ch03-concepts.xml:65
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>
songdongsheng@658 4292 #: ../en/ch03-concepts.xml:75
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>
songdongsheng@658 4297 #: ../en/ch03-concepts.xml:77
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>
songdongsheng@658 4306 #: ../en/ch03-concepts.xml:85
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>
songdongsheng@658 4311 #: ../en/ch03-concepts.xml:87
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>
songdongsheng@658 4321 #: ../en/ch03-concepts.xml:94
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. "
songdongsheng@658 4327 "These relationships are illustrated in <xref linkend=\"fig:concepts:metadata"
songdongsheng@658 4328 "\"/>."
songdongsheng@658 4329 msgstr ""
songdongsheng@658 4330
songdongsheng@658 4331 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4332 #: ../en/ch03-concepts.xml:103
dongsheng@627 4333 msgid "Metadata relationships"
dongsheng@660 4334 msgstr "元数据之间的关系"
dongsheng@627 4335
songdongsheng@658 4336 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4337 #: ../en/ch03-concepts.xml:105
songdongsheng@658 4338 msgid "<imageobject><imagedata fileref=\"figs/metadata.png\"/></imageobject>"
songdongsheng@658 4339 msgstr ""
songdongsheng@658 4340
songdongsheng@658 4341 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4342 #: ../en/ch03-concepts.xml:110
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>
songdongsheng@658 4354 #: ../en/ch03-concepts.xml:123
dongsheng@627 4355 msgid "Safe, efficient storage"
dongsheng@627 4356 msgstr "安全,高效的存储"
dongsheng@627 4357
dongsheng@627 4358 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4359 #: ../en/ch03-concepts.xml:125
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>
songdongsheng@658 4366 #: ../en/ch03-concepts.xml:130
dongsheng@627 4367 msgid "Efficient storage"
dongsheng@627 4368 msgstr "高效存储"
dongsheng@627 4369
dongsheng@627 4370 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4371 #: ../en/ch03-concepts.xml:132
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>
songdongsheng@658 4381 #: ../en/ch03-concepts.xml:140
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>
songdongsheng@658 4391 #: ../en/ch03-concepts.xml:149
dongsheng@627 4392 msgid "Safe operation"
dongsheng@627 4393 msgstr "安全操作"
dongsheng@627 4394
dongsheng@627 4395 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4396 #: ../en/ch03-concepts.xml:151
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>
songdongsheng@658 4405 #: ../en/ch03-concepts.xml:157
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>
songdongsheng@658 4417 #: ../en/ch03-concepts.xml:167
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>
songdongsheng@658 4425 #: ../en/ch03-concepts.xml:174
dongsheng@627 4426 msgid "Fast retrieval"
dongsheng@627 4427 msgstr "快速检索"
dongsheng@627 4428
dongsheng@627 4429 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4430 #: ../en/ch03-concepts.xml:176
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
songdongsheng@658 4442 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4443 #: ../en/ch03-concepts.xml:188
songdongsheng@658 4444 msgid "Snapshot of a revlog, with incremental deltas"
dongsheng@660 4445 msgstr "版本日志的快照,以及增量差异"
songdongsheng@658 4446
songdongsheng@658 4447 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4448 #: ../en/ch03-concepts.xml:190
songdongsheng@658 4449 msgid "<imageobject><imagedata fileref=\"figs/snapshot.png\"/></imageobject>"
songdongsheng@658 4450 msgstr ""
songdongsheng@658 4451
songdongsheng@658 4452 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 4453 #: ../en/ch03-concepts.xml:195
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>
songdongsheng@658 4465 #: ../en/ch03-concepts.xml:204
songdongsheng@658 4466 msgid ""
songdongsheng@658 4467 "<xref linkend=\"fig:concepts:snapshot\"/> illustrates the idea. In an entry "
songdongsheng@658 4468 "in a revlog's index file, Mercurial stores the range of entries from the data "
songdongsheng@658 4469 "file that it must read to reconstruct a particular revision."
dongsheng@627 4470 msgstr ""
dongsheng@627 4471
dongsheng@627 4472 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 4473 #: ../en/ch03-concepts.xml:210
dongsheng@627 4474 msgid "Aside: the influence of video compression"
dongsheng@660 4475 msgstr "旁白: 视频压缩的影响"
dongsheng@627 4476
dongsheng@627 4477 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 4478 #: ../en/ch03-concepts.xml:212
dongsheng@627 4479 msgid ""
dongsheng@627 4480 "If you're familiar with video compression or have ever watched a TV feed "
dongsheng@627 4481 "through a digital cable or satellite service, you may know that most video "
dongsheng@627 4482 "compression schemes store each frame of video as a delta against its "
dongsheng@627 4483 "predecessor frame. In addition, these schemes use <quote>lossy</quote> "
dongsheng@627 4484 "compression techniques to increase the compression ratio, so visual errors "
dongsheng@627 4485 "accumulate over the course of a number of inter-frame deltas."
dongsheng@627 4486 msgstr ""
dongsheng@627 4487
dongsheng@627 4488 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 4489 #: ../en/ch03-concepts.xml:221
dongsheng@627 4490 msgid ""
dongsheng@627 4491 "Because it's possible for a video stream to <quote>drop out</quote> "
dongsheng@627 4492 "occasionally due to signal glitches, and to limit the accumulation of "
dongsheng@627 4493 "artefacts introduced by the lossy compression process, video encoders "
dongsheng@627 4494 "periodically insert a complete frame (called a <quote>key frame</quote>) into "
dongsheng@627 4495 "the video stream; the next delta is generated against that frame. This means "
dongsheng@627 4496 "that if the video signal gets interrupted, it will resume once the next key "
dongsheng@627 4497 "frame is received. Also, the accumulation of encoding errors restarts anew "
dongsheng@627 4498 "with each key frame."
dongsheng@627 4499 msgstr ""
dongsheng@627 4500
dongsheng@627 4501 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4502 #: ../en/ch03-concepts.xml:235
dongsheng@627 4503 msgid "Identification and strong integrity"
dongsheng@627 4504 msgstr "鉴别和强完整性"
dongsheng@627 4505
dongsheng@627 4506 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4507 #: ../en/ch03-concepts.xml:237
dongsheng@627 4508 msgid ""
dongsheng@627 4509 "Along with delta or snapshot information, a revlog entry contains a "
dongsheng@627 4510 "cryptographic hash of the data that it represents. This makes it difficult "
dongsheng@627 4511 "to forge the contents of a revision, and easy to detect accidental corruption."
dongsheng@627 4512 msgstr ""
dongsheng@627 4513
dongsheng@627 4514 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4515 #: ../en/ch03-concepts.xml:242
dongsheng@627 4516 msgid ""
dongsheng@627 4517 "Hashes provide more than a mere check against corruption; they are used as "
dongsheng@627 4518 "the identifiers for revisions. The changeset identification hashes that you "
dongsheng@627 4519 "see as an end user are from revisions of the changelog. Although filelogs "
dongsheng@627 4520 "and the manifest also use hashes, Mercurial only uses these behind the scenes."
dongsheng@627 4521 msgstr ""
dongsheng@627 4522
dongsheng@627 4523 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4524 #: ../en/ch03-concepts.xml:249
dongsheng@627 4525 msgid ""
dongsheng@627 4526 "Mercurial verifies that hashes are correct when it retrieves file revisions "
dongsheng@627 4527 "and when it pulls changes from another repository. If it encounters an "
dongsheng@627 4528 "integrity problem, it will complain and stop whatever it's doing."
dongsheng@627 4529 msgstr ""
dongsheng@627 4530
dongsheng@627 4531 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4532 #: ../en/ch03-concepts.xml:254
dongsheng@627 4533 msgid ""
dongsheng@627 4534 "In addition to the effect it has on retrieval efficiency, Mercurial's use of "
dongsheng@627 4535 "periodic snapshots makes it more robust against partial data corruption. If "
dongsheng@627 4536 "a revlog becomes partly corrupted due to a hardware error or system bug, it's "
dongsheng@627 4537 "often possible to reconstruct some or most revisions from the uncorrupted "
dongsheng@627 4538 "sections of the revlog, both before and after the corrupted section. This "
dongsheng@627 4539 "would not be possible with a delta-only storage model."
dongsheng@627 4540 msgstr ""
dongsheng@627 4541
dongsheng@627 4542 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 4543 #: ../en/ch03-concepts.xml:266
dongsheng@627 4544 msgid "Revision history, branching, and merging"
dongsheng@627 4545 msgstr "修订历史,分支与合并"
dongsheng@627 4546
dongsheng@627 4547 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4548 #: ../en/ch03-concepts.xml:268
dongsheng@627 4549 msgid ""
dongsheng@627 4550 "Every entry in a Mercurial revlog knows the identity of its immediate "
dongsheng@627 4551 "ancestor revision, usually referred to as its <emphasis>parent</emphasis>. "
dongsheng@627 4552 "In fact, a revision contains room for not one parent, but two. Mercurial "
dongsheng@627 4553 "uses a special hash, called the <quote>null ID</quote>, to represent the idea "
dongsheng@627 4554 "<quote>there is no parent here</quote>. This hash is simply a string of "
dongsheng@627 4555 "zeroes."
dongsheng@627 4556 msgstr ""
dongsheng@627 4557
dongsheng@627 4558 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4559 #: ../en/ch03-concepts.xml:276
songdongsheng@658 4560 msgid ""
songdongsheng@658 4561 "In <xref linkend=\"fig:concepts:revlog\"/>, you can see an example of the "
songdongsheng@658 4562 "conceptual structure of a revlog. Filelogs, manifests, and changelogs all "
songdongsheng@658 4563 "have this same structure; they differ only in the kind of data stored in each "
songdongsheng@658 4564 "delta or snapshot."
songdongsheng@658 4565 msgstr ""
songdongsheng@658 4566
songdongsheng@658 4567 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 4568 #: ../en/ch03-concepts.xml:282
dongsheng@627 4569 msgid ""
dongsheng@627 4570 "The first revision in a revlog (at the bottom of the image) has the null ID "
dongsheng@627 4571 "in both of its parent slots. For a <quote>normal</quote> revision, its first "
dongsheng@627 4572 "parent slot contains the ID of its parent revision, and its second contains "
dongsheng@627 4573 "the null ID, indicating that the revision has only one real parent. Any two "
dongsheng@627 4574 "revisions that have the same parent ID are branches. A revision that "
dongsheng@627 4575 "represents a merge between branches has two normal revision IDs in its parent "
dongsheng@627 4576 "slots."
dongsheng@627 4577 msgstr ""
dongsheng@627 4578
songdongsheng@658 4579 #. type: Content of: <book><chapter><sect1><figure><title>
songdongsheng@658 4580 #: ../en/ch03-concepts.xml:292
songdongsheng@658 4581 msgid "The conceptual structure of a revlog"
dongsheng@660 4582 msgstr "版本日志的设计结构"
songdongsheng@658 4583
songdongsheng@658 4584 #. type: Content of: <book><chapter><sect1><figure><mediaobject>
songdongsheng@658 4585 #: ../en/ch03-concepts.xml:294
songdongsheng@658 4586 msgid "<imageobject><imagedata fileref=\"figs/revlog.png\"/></imageobject>"
dongsheng@641 4587 msgstr ""
dongsheng@641 4588
dongsheng@627 4589 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 4590 #: ../en/ch03-concepts.xml:301
dongsheng@627 4591 msgid "The working directory"
dongsheng@627 4592 msgstr "工作目录"
dongsheng@627 4593
dongsheng@627 4594 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4595 #: ../en/ch03-concepts.xml:303
dongsheng@627 4596 msgid ""
dongsheng@627 4597 "In the working directory, Mercurial stores a snapshot of the files from the "
dongsheng@627 4598 "repository as of a particular changeset."
dongsheng@627 4599 msgstr ""
dongsheng@627 4600
dongsheng@627 4601 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4602 #: ../en/ch03-concepts.xml:306
dongsheng@627 4603 msgid ""
dongsheng@627 4604 "The working directory <quote>knows</quote> which changeset it contains. When "
dongsheng@627 4605 "you update the working directory to contain a particular changeset, Mercurial "
dongsheng@627 4606 "looks up the appropriate revision of the manifest to find out which files it "
dongsheng@627 4607 "was tracking at the time that changeset was committed, and which revision of "
dongsheng@627 4608 "each file was then current. It then recreates a copy of each of those files, "
dongsheng@627 4609 "with the same contents it had when the changeset was committed."
dongsheng@627 4610 msgstr ""
dongsheng@627 4611
dongsheng@627 4612 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4613 #: ../en/ch03-concepts.xml:315
dongsheng@627 4614 msgid ""
dongsheng@627 4615 "The <emphasis>dirstate</emphasis> contains Mercurial's knowledge of the "
dongsheng@627 4616 "working directory. This details which changeset the working directory is "
dongsheng@627 4617 "updated to, and all of the files that Mercurial is tracking in the working "
dongsheng@627 4618 "directory."
dongsheng@627 4619 msgstr ""
dongsheng@627 4620
dongsheng@627 4621 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4622 #: ../en/ch03-concepts.xml:321
dongsheng@627 4623 msgid ""
dongsheng@627 4624 "Just as a revision of a revlog has room for two parents, so that it can "
dongsheng@627 4625 "represent either a normal revision (with one parent) or a merge of two "
dongsheng@627 4626 "earlier revisions, the dirstate has slots for two parents. When you use the "
dongsheng@627 4627 "<command role=\"hg-cmd\">hg update</command> command, the changeset that you "
dongsheng@627 4628 "update to is stored in the <quote>first parent</quote> slot, and the null ID "
dongsheng@627 4629 "in the second. When you <command role=\"hg-cmd\">hg merge</command> with "
dongsheng@627 4630 "another changeset, the first parent remains unchanged, and the second parent "
dongsheng@627 4631 "is filled in with the changeset you're merging with. The <command role=\"hg-"
dongsheng@627 4632 "cmd\">hg parents</command> command tells you what the parents of the dirstate "
dongsheng@627 4633 "are."
dongsheng@627 4634 msgstr ""
dongsheng@627 4635
dongsheng@627 4636 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4637 #: ../en/ch03-concepts.xml:335
dongsheng@627 4638 msgid "What happens when you commit"
dongsheng@627 4639 msgstr "当你提交时发生的事情"
dongsheng@627 4640
dongsheng@627 4641 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4642 #: ../en/ch03-concepts.xml:337
dongsheng@627 4643 msgid ""
dongsheng@627 4644 "The dirstate stores parent information for more than just book-keeping "
dongsheng@627 4645 "purposes. Mercurial uses the parents of the dirstate as <emphasis>the "
dongsheng@627 4646 "parents of a new changeset</emphasis> when you perform a commit."
dongsheng@627 4647 msgstr ""
dongsheng@627 4648
songdongsheng@658 4649 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4650 #: ../en/ch03-concepts.xml:343
dongsheng@627 4651 msgid "The working directory can have two parents"
dongsheng@660 4652 msgstr "工作目录可以有两个父亲"
dongsheng@627 4653
songdongsheng@658 4654 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4655 #: ../en/ch03-concepts.xml:345
songdongsheng@658 4656 msgid "<imageobject><imagedata fileref=\"figs/wdir.png\"/></imageobject>"
songdongsheng@658 4657 msgstr ""
songdongsheng@658 4658
songdongsheng@658 4659 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4660 #: ../en/ch03-concepts.xml:350
songdongsheng@658 4661 msgid ""
songdongsheng@658 4662 "<xref linkend=\"fig:concepts:wdir\"/> shows the normal state of the working "
songdongsheng@658 4663 "directory, where it has a single changeset as parent. That changeset is the "
songdongsheng@658 4664 "<emphasis>tip</emphasis>, the newest changeset in the repository that has no "
songdongsheng@658 4665 "children."
songdongsheng@658 4666 msgstr ""
songdongsheng@658 4667
songdongsheng@658 4668 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4669 #: ../en/ch03-concepts.xml:357
dongsheng@627 4670 msgid "The working directory gains new parents after a commit"
dongsheng@660 4671 msgstr "提交之后,工作目录的父亲就改变了"
dongsheng@627 4672
songdongsheng@658 4673 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4674 #: ../en/ch03-concepts.xml:360
songdongsheng@658 4675 msgid ""
songdongsheng@658 4676 "<imageobject><imagedata fileref=\"figs/wdir-after-commit.png\"/></imageobject>"
songdongsheng@658 4677 msgstr ""
songdongsheng@658 4678
songdongsheng@658 4679 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4680 #: ../en/ch03-concepts.xml:365
dongsheng@627 4681 msgid ""
dongsheng@627 4682 "It's useful to think of the working directory as <quote>the changeset I'm "
dongsheng@627 4683 "about to commit</quote>. Any files that you tell Mercurial that you've "
dongsheng@627 4684 "added, removed, renamed, or copied will be reflected in that changeset, as "
dongsheng@627 4685 "will modifications to any files that Mercurial is already tracking; the new "
dongsheng@627 4686 "changeset will have the parents of the working directory as its parents."
dongsheng@627 4687 msgstr ""
dongsheng@627 4688
dongsheng@627 4689 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4690 #: ../en/ch03-concepts.xml:373
dongsheng@627 4691 msgid ""
dongsheng@627 4692 "After a commit, Mercurial will update the parents of the working directory, "
dongsheng@627 4693 "so that the first parent is the ID of the new changeset, and the second is "
songdongsheng@658 4694 "the null ID. This is shown in <xref linkend=\"fig:concepts:wdir-after-commit"
songdongsheng@658 4695 "\"/>. Mercurial doesn't touch any of the files in the working directory when "
songdongsheng@658 4696 "you commit; it just modifies the dirstate to note its new parents."
dongsheng@641 4697 msgstr ""
dongsheng@641 4698
dongsheng@641 4699 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4700 #: ../en/ch03-concepts.xml:384
dongsheng@627 4701 msgid "Creating a new head"
dongsheng@627 4702 msgstr "创建新顶点"
dongsheng@627 4703
dongsheng@627 4704 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4705 #: ../en/ch03-concepts.xml:386
dongsheng@627 4706 msgid ""
dongsheng@627 4707 "It's perfectly normal to update the working directory to a changeset other "
dongsheng@627 4708 "than the current tip. For example, you might want to know what your project "
dongsheng@627 4709 "looked like last Tuesday, or you could be looking through changesets to see "
dongsheng@627 4710 "which one introduced a bug. In cases like this, the natural thing to do is "
dongsheng@627 4711 "update the working directory to the changeset you're interested in, and then "
dongsheng@627 4712 "examine the files in the working directory directly to see their contents as "
dongsheng@627 4713 "they were when you committed that changeset. The effect of this is shown in "
songdongsheng@658 4714 "<xref linkend=\"fig:concepts:wdir-pre-branch\"/>."
songdongsheng@658 4715 msgstr ""
songdongsheng@658 4716
songdongsheng@658 4717 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4718 #: ../en/ch03-concepts.xml:398
dongsheng@627 4719 msgid "The working directory, updated to an older changeset"
dongsheng@660 4720 msgstr "同步到旧修改集的工作目录"
dongsheng@627 4721
songdongsheng@658 4722 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4723 #: ../en/ch03-concepts.xml:401
songdongsheng@658 4724 msgid ""
songdongsheng@658 4725 "<imageobject><imagedata fileref=\"figs/wdir-pre-branch.png\"/></imageobject>"
songdongsheng@658 4726 msgstr ""
songdongsheng@658 4727
songdongsheng@658 4728 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4729 #: ../en/ch03-concepts.xml:406
dongsheng@627 4730 msgid ""
dongsheng@627 4731 "Having updated the working directory to an older changeset, what happens if "
dongsheng@627 4732 "you make some changes, and then commit? Mercurial behaves in the same way as "
dongsheng@627 4733 "I outlined above. The parents of the working directory become the parents of "
dongsheng@627 4734 "the new changeset. This new changeset has no children, so it becomes the new "
dongsheng@627 4735 "tip. And the repository now contains two changesets that have no children; "
dongsheng@627 4736 "we call these <emphasis>heads</emphasis>. You can see the structure that "
songdongsheng@658 4737 "this creates in <xref linkend=\"fig:concepts:wdir-branch\"/>."
songdongsheng@658 4738 msgstr ""
songdongsheng@658 4739
songdongsheng@658 4740 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4741 #: ../en/ch03-concepts.xml:418
dongsheng@627 4742 msgid "After a commit made while synced to an older changeset"
dongsheng@660 4743 msgstr "对同步到旧修改集的工作目录提交之后"
dongsheng@627 4744
songdongsheng@658 4745 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4746 #: ../en/ch03-concepts.xml:421
songdongsheng@658 4747 msgid "<imageobject><imagedata fileref=\"figs/wdir-branch.png\"/></imageobject>"
songdongsheng@658 4748 msgstr ""
songdongsheng@658 4749
dongsheng@627 4750 #. type: Content of: <book><chapter><sect1><sect2><note><para>
songdongsheng@658 4751 #: ../en/ch03-concepts.xml:427
dongsheng@627 4752 msgid ""
dongsheng@627 4753 "If you're new to Mercurial, you should keep in mind a common <quote>error</"
dongsheng@627 4754 "quote>, which is to use the <command role=\"hg-cmd\">hg pull</command> "
dongsheng@627 4755 "command without any options. By default, the <command role=\"hg-cmd\">hg "
dongsheng@627 4756 "pull</command> command <emphasis>does not</emphasis> update the working "
dongsheng@627 4757 "directory, so you'll bring new changesets into your repository, but the "
dongsheng@627 4758 "working directory will stay synced at the same changeset as before the pull. "
dongsheng@627 4759 "If you make some changes and commit afterwards, you'll thus create a new "
dongsheng@627 4760 "head, because your working directory isn't synced to whatever the current tip "
dongsheng@627 4761 "is."
dongsheng@627 4762 msgstr ""
dongsheng@627 4763
dongsheng@627 4764 #. type: Content of: <book><chapter><sect1><sect2><note><para>
songdongsheng@658 4765 #: ../en/ch03-concepts.xml:439
dongsheng@627 4766 msgid ""
dongsheng@627 4767 "I put the word <quote>error</quote> in quotes because all that you need to do "
dongsheng@627 4768 "to rectify this situation is <command role=\"hg-cmd\">hg merge</command>, "
dongsheng@627 4769 "then <command role=\"hg-cmd\">hg commit</command>. In other words, this "
dongsheng@627 4770 "almost never has negative consequences; it just surprises people. I'll "
dongsheng@627 4771 "discuss other ways to avoid this behaviour, and why Mercurial behaves in this "
dongsheng@627 4772 "initially surprising way, later on."
dongsheng@627 4773 msgstr ""
dongsheng@627 4774
dongsheng@627 4775 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4776 #: ../en/ch03-concepts.xml:451
dongsheng@627 4777 msgid "Merging heads"
dongsheng@627 4778 msgstr "合并顶点"
dongsheng@627 4779
dongsheng@627 4780 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4781 #: ../en/ch03-concepts.xml:453
dongsheng@627 4782 msgid ""
dongsheng@627 4783 "When you run the <command role=\"hg-cmd\">hg merge</command> command, "
dongsheng@627 4784 "Mercurial leaves the first parent of the working directory unchanged, and "
dongsheng@627 4785 "sets the second parent to the changeset you're merging with, as shown in "
songdongsheng@658 4786 "<xref linkend=\"fig:concepts:wdir-merge\"/>."
songdongsheng@658 4787 msgstr ""
songdongsheng@658 4788
songdongsheng@658 4789 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 4790 #: ../en/ch03-concepts.xml:460
dongsheng@627 4791 msgid "Merging two heads"
dongsheng@660 4792 msgstr "合并两个顶点"
dongsheng@627 4793
songdongsheng@658 4794 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 4795 #: ../en/ch03-concepts.xml:462
songdongsheng@658 4796 msgid ""
songdongsheng@658 4797 "<imageobject> <imagedata fileref=\"figs/wdir-merge.png\"/> </imageobject>"
songdongsheng@658 4798 msgstr ""
songdongsheng@658 4799
songdongsheng@658 4800 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4801 #: ../en/ch03-concepts.xml:469
dongsheng@627 4802 msgid ""
dongsheng@627 4803 "Mercurial also has to modify the working directory, to merge the files "
dongsheng@627 4804 "managed in the two changesets. Simplified a little, the merging process goes "
dongsheng@627 4805 "like this, for every file in the manifests of both changesets."
dongsheng@627 4806 msgstr ""
dongsheng@627 4807
dongsheng@627 4808 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 4809 #: ../en/ch03-concepts.xml:474
dongsheng@627 4810 msgid "If neither changeset has modified a file, do nothing with that file."
dongsheng@627 4811 msgstr ""
dongsheng@627 4812
dongsheng@627 4813 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 4814 #: ../en/ch03-concepts.xml:477
dongsheng@627 4815 msgid ""
dongsheng@627 4816 "If one changeset has modified a file, and the other hasn't, create the "
dongsheng@627 4817 "modified copy of the file in the working directory."
dongsheng@627 4818 msgstr ""
dongsheng@627 4819
dongsheng@627 4820 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 4821 #: ../en/ch03-concepts.xml:481
dongsheng@627 4822 msgid ""
dongsheng@627 4823 "If one changeset has removed a file, and the other hasn't (or has also "
dongsheng@627 4824 "deleted it), delete the file from the working directory."
dongsheng@627 4825 msgstr ""
dongsheng@627 4826
dongsheng@627 4827 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 4828 #: ../en/ch03-concepts.xml:485
dongsheng@627 4829 msgid ""
dongsheng@627 4830 "If one changeset has removed a file, but the other has modified the file, ask "
dongsheng@627 4831 "the user what to do: keep the modified file, or remove it?"
dongsheng@627 4832 msgstr ""
dongsheng@627 4833
dongsheng@627 4834 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 4835 #: ../en/ch03-concepts.xml:489
dongsheng@627 4836 msgid ""
dongsheng@627 4837 "If both changesets have modified a file, invoke an external merge program to "
dongsheng@627 4838 "choose the new contents for the merged file. This may require input from the "
dongsheng@627 4839 "user."
dongsheng@627 4840 msgstr ""
dongsheng@627 4841
dongsheng@627 4842 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 4843 #: ../en/ch03-concepts.xml:494
dongsheng@627 4844 msgid ""
dongsheng@627 4845 "If one changeset has modified a file, and the other has renamed or copied the "
dongsheng@627 4846 "file, make sure that the changes follow the new name of the file."
dongsheng@627 4847 msgstr ""
dongsheng@627 4848
dongsheng@627 4849 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4850 #: ../en/ch03-concepts.xml:498
dongsheng@627 4851 msgid ""
dongsheng@661 4852 "There are more details—merging has plenty of corner cases&emdash;but these "
dongsheng@661 4853 "are the most common choices that are involved in a merge. As you can see, "
dongsheng@661 4854 "most cases are completely automatic, and indeed most merges finish "
dongsheng@627 4855 "automatically, without requiring your input to resolve any conflicts."
dongsheng@627 4856 msgstr ""
dongsheng@627 4857
dongsheng@627 4858 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4859 #: ../en/ch03-concepts.xml:505
dongsheng@627 4860 msgid ""
dongsheng@627 4861 "When you're thinking about what happens when you commit after a merge, once "
dongsheng@627 4862 "again the working directory is <quote>the changeset I'm about to commit</"
dongsheng@627 4863 "quote>. After the <command role=\"hg-cmd\">hg merge</command> command "
dongsheng@627 4864 "completes, the working directory has two parents; these will become the "
dongsheng@627 4865 "parents of the new changeset."
dongsheng@627 4866 msgstr ""
dongsheng@627 4867
dongsheng@627 4868 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4869 #: ../en/ch03-concepts.xml:512
dongsheng@627 4870 msgid ""
dongsheng@627 4871 "Mercurial lets you perform multiple merges, but you must commit the results "
dongsheng@627 4872 "of each individual merge as you go. This is necessary because Mercurial only "
dongsheng@627 4873 "tracks two parents for both revisions and the working directory. While it "
dongsheng@627 4874 "would be technically possible to merge multiple changesets at once, the "
dongsheng@627 4875 "prospect of user confusion and making a terrible mess of a merge immediately "
dongsheng@627 4876 "becomes overwhelming."
dongsheng@627 4877 msgstr ""
dongsheng@627 4878
dongsheng@627 4879 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 4880 #: ../en/ch03-concepts.xml:523
dongsheng@627 4881 msgid "Other interesting design features"
dongsheng@627 4882 msgstr "其它有趣的设计特性"
dongsheng@627 4883
dongsheng@627 4884 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 4885 #: ../en/ch03-concepts.xml:525
dongsheng@627 4886 msgid ""
dongsheng@627 4887 "In the sections above, I've tried to highlight some of the most important "
dongsheng@627 4888 "aspects of Mercurial's design, to illustrate that it pays careful attention "
dongsheng@627 4889 "to reliability and performance. However, the attention to detail doesn't "
dongsheng@627 4890 "stop there. There are a number of other aspects of Mercurial's construction "
dongsheng@627 4891 "that I personally find interesting. I'll detail a few of them here, separate "
dongsheng@627 4892 "from the <quote>big ticket</quote> items above, so that if you're interested, "
dongsheng@627 4893 "you can gain a better idea of the amount of thinking that goes into a well-"
dongsheng@627 4894 "designed system."
dongsheng@627 4895 msgstr ""
dongsheng@627 4896
dongsheng@627 4897 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4898 #: ../en/ch03-concepts.xml:536
dongsheng@627 4899 msgid "Clever compression"
dongsheng@627 4900 msgstr "智能压缩"
dongsheng@627 4901
dongsheng@627 4902 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4903 #: ../en/ch03-concepts.xml:538
dongsheng@627 4904 msgid ""
dongsheng@627 4905 "When appropriate, Mercurial will store both snapshots and deltas in "
dongsheng@627 4906 "compressed form. It does this by always <emphasis>trying to</emphasis> "
dongsheng@627 4907 "compress a snapshot or delta, but only storing the compressed version if it's "
dongsheng@627 4908 "smaller than the uncompressed version."
dongsheng@627 4909 msgstr ""
dongsheng@627 4910
dongsheng@627 4911 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4912 #: ../en/ch03-concepts.xml:544
dongsheng@627 4913 msgid ""
dongsheng@627 4914 "This means that Mercurial does <quote>the right thing</quote> when storing a "
dongsheng@627 4915 "file whose native form is compressed, such as a <literal>zip</literal> "
dongsheng@627 4916 "archive or a JPEG image. When these types of files are compressed a second "
dongsheng@627 4917 "time, the resulting file is usually bigger than the once-compressed form, and "
dongsheng@627 4918 "so Mercurial will store the plain <literal>zip</literal> or JPEG."
dongsheng@627 4919 msgstr ""
dongsheng@627 4920
dongsheng@627 4921 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4922 #: ../en/ch03-concepts.xml:552
dongsheng@627 4923 msgid ""
dongsheng@627 4924 "Deltas between revisions of a compressed file are usually larger than "
dongsheng@627 4925 "snapshots of the file, and Mercurial again does <quote>the right thing</"
dongsheng@627 4926 "quote> in these cases. It finds that such a delta exceeds the threshold at "
dongsheng@627 4927 "which it should store a complete snapshot of the file, so it stores the "
dongsheng@627 4928 "snapshot, again saving space compared to a naive delta-only approach."
dongsheng@627 4929 msgstr ""
dongsheng@627 4930
dongsheng@627 4931 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 4932 #: ../en/ch03-concepts.xml:561
dongsheng@627 4933 msgid "Network recompression"
dongsheng@627 4934 msgstr "网络重新压缩"
dongsheng@627 4935
dongsheng@627 4936 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 4937 #: ../en/ch03-concepts.xml:563
dongsheng@627 4938 msgid ""
dongsheng@627 4939 "When storing revisions on disk, Mercurial uses the <quote>deflate</quote> "
dongsheng@627 4940 "compression algorithm (the same one used by the popular <literal>zip</"
dongsheng@627 4941 "literal> archive format), which balances good speed with a respectable "
dongsheng@627 4942 "compression ratio. However, when transmitting revision data over a network "
dongsheng@627 4943 "connection, Mercurial uncompresses the compressed revision data."
dongsheng@627 4944 msgstr ""
dongsheng@627 4945
dongsheng@627 4946 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 4947 #: ../en/ch03-concepts.xml:571
dongsheng@627 4948 msgid ""
dongsheng@627 4949 "If the connection is over HTTP, Mercurial recompresses the entire stream of "
dongsheng@627 4950 "data using a compression algorithm that gives a better compression ratio (the "
dongsheng@627 4951 "Burrows-Wheeler algorithm from the widely used <literal>bzip2</literal> "
dongsheng@627 4952 "compression package). This combination of algorithm and compression of the "
dongsheng@627 4953 "entire stream (instead of a revision at a time) substantially reduces the "
dongsheng@627 4954 "number of bytes to be transferred, yielding better network performance over "
dongsheng@627 4955 "almost all kinds of network."
dongsheng@627 4956 msgstr ""
dongsheng@627 4957
dongsheng@627 4958 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 4959 #: ../en/ch03-concepts.xml:581
dongsheng@627 4960 msgid ""
dongsheng@627 4961 "(If the connection is over <command>ssh</command>, Mercurial "
dongsheng@627 4962 "<emphasis>doesn't</emphasis> recompress the stream, because <command>ssh</"
dongsheng@627 4963 "command> can already do this itself.)"
dongsheng@627 4964 msgstr ""
dongsheng@627 4965
dongsheng@627 4966 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4967 #: ../en/ch03-concepts.xml:589
dongsheng@627 4968 msgid "Read/write ordering and atomicity"
dongsheng@627 4969 msgstr "读写顺序与原子性"
dongsheng@627 4970
dongsheng@627 4971 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4972 #: ../en/ch03-concepts.xml:591
dongsheng@627 4973 msgid ""
dongsheng@627 4974 "Appending to files isn't the whole story when it comes to guaranteeing that a "
songdongsheng@658 4975 "reader won't see a partial write. If you recall <xref linkend=\"fig:concepts:"
songdongsheng@658 4976 "metadata\"/>, revisions in the changelog point to revisions in the manifest, "
songdongsheng@658 4977 "and revisions in the manifest point to revisions in filelogs. This hierarchy "
songdongsheng@658 4978 "is deliberate."
songdongsheng@658 4979 msgstr ""
songdongsheng@658 4980
songdongsheng@658 4981 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4982 #: ../en/ch03-concepts.xml:599
dongsheng@627 4983 msgid ""
dongsheng@627 4984 "A writer starts a transaction by writing filelog and manifest data, and "
dongsheng@627 4985 "doesn't write any changelog data until those are finished. A reader starts "
dongsheng@627 4986 "by reading changelog data, then manifest data, followed by filelog data."
dongsheng@627 4987 msgstr ""
dongsheng@627 4988
dongsheng@627 4989 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 4990 #: ../en/ch03-concepts.xml:604
dongsheng@627 4991 msgid ""
dongsheng@627 4992 "Since the writer has always finished writing filelog and manifest data before "
dongsheng@627 4993 "it writes to the changelog, a reader will never read a pointer to a partially "
dongsheng@627 4994 "written manifest revision from the changelog, and it will never read a "
dongsheng@627 4995 "pointer to a partially written filelog revision from the manifest."
dongsheng@627 4996 msgstr ""
dongsheng@627 4997
dongsheng@627 4998 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 4999 #: ../en/ch03-concepts.xml:612
dongsheng@627 5000 msgid "Concurrent access"
dongsheng@627 5001 msgstr "并发访问"
dongsheng@627 5002
dongsheng@627 5003 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5004 #: ../en/ch03-concepts.xml:614
dongsheng@627 5005 msgid ""
dongsheng@627 5006 "The read/write ordering and atomicity guarantees mean that Mercurial never "
dongsheng@627 5007 "needs to <emphasis>lock</emphasis> a repository when it's reading data, even "
dongsheng@627 5008 "if the repository is being written to while the read is occurring. This has a "
dongsheng@627 5009 "big effect on scalability; you can have an arbitrary number of Mercurial "
dongsheng@627 5010 "processes safely reading data from a repository safely all at once, no matter "
dongsheng@627 5011 "whether it's being written to or not."
dongsheng@627 5012 msgstr ""
dongsheng@627 5013
dongsheng@627 5014 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5015 #: ../en/ch03-concepts.xml:623
dongsheng@627 5016 msgid ""
dongsheng@627 5017 "The lockless nature of reading means that if you're sharing a repository on a "
dongsheng@627 5018 "multi-user system, you don't need to grant other local users permission to "
dongsheng@627 5019 "<emphasis>write</emphasis> to your repository in order for them to be able to "
dongsheng@627 5020 "clone it or pull changes from it; they only need <emphasis>read</emphasis> "
dongsheng@627 5021 "permission. (This is <emphasis>not</emphasis> a common feature among "
dongsheng@627 5022 "revision control systems, so don't take it for granted! Most require readers "
dongsheng@627 5023 "to be able to lock a repository to access it safely, and this requires write "
dongsheng@627 5024 "permission on at least one directory, which of course makes for all kinds of "
dongsheng@627 5025 "nasty and annoying security and administrative problems.)"
dongsheng@627 5026 msgstr ""
dongsheng@627 5027
dongsheng@627 5028 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5029 #: ../en/ch03-concepts.xml:636
dongsheng@627 5030 msgid ""
dongsheng@627 5031 "Mercurial uses locks to ensure that only one process can write to a "
dongsheng@627 5032 "repository at a time (the locking mechanism is safe even over filesystems "
dongsheng@627 5033 "that are notoriously hostile to locking, such as NFS). If a repository is "
dongsheng@627 5034 "locked, a writer will wait for a while to retry if the repository becomes "
dongsheng@627 5035 "unlocked, but if the repository remains locked for too long, the process "
dongsheng@627 5036 "attempting to write will time out after a while. This means that your daily "
dongsheng@627 5037 "automated scripts won't get stuck forever and pile up if a system crashes "
dongsheng@627 5038 "unnoticed, for example. (Yes, the timeout is configurable, from zero to "
dongsheng@627 5039 "infinity.)"
dongsheng@627 5040 msgstr ""
dongsheng@627 5041
dongsheng@627 5042 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 5043 #: ../en/ch03-concepts.xml:648
dongsheng@627 5044 msgid "Safe dirstate access"
dongsheng@627 5045 msgstr "安全的目录状态访问"
dongsheng@627 5046
dongsheng@627 5047 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 5048 #: ../en/ch03-concepts.xml:650
dongsheng@627 5049 msgid ""
dongsheng@627 5050 "As with revision data, Mercurial doesn't take a lock to read the dirstate "
dongsheng@627 5051 "file; it does acquire a lock to write it. To avoid the possibility of "
dongsheng@627 5052 "reading a partially written copy of the dirstate file, Mercurial writes to a "
dongsheng@627 5053 "file with a unique name in the same directory as the dirstate file, then "
dongsheng@627 5054 "renames the temporary file atomically to <filename>dirstate</filename>. The "
dongsheng@627 5055 "file named <filename>dirstate</filename> is thus guaranteed to be complete, "
dongsheng@627 5056 "not partially written."
dongsheng@627 5057 msgstr ""
dongsheng@627 5058
dongsheng@627 5059 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 5060 #: ../en/ch03-concepts.xml:663
dongsheng@627 5061 msgid "Avoiding seeks"
dongsheng@627 5062 msgstr "避免查找"
dongsheng@627 5063
dongsheng@627 5064 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5065 #: ../en/ch03-concepts.xml:665
dongsheng@627 5066 msgid ""
dongsheng@627 5067 "Critical to Mercurial's performance is the avoidance of seeks of the disk "
dongsheng@627 5068 "head, since any seek is far more expensive than even a comparatively large "
dongsheng@627 5069 "read operation."
dongsheng@627 5070 msgstr ""
dongsheng@627 5071
dongsheng@627 5072 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5073 #: ../en/ch03-concepts.xml:669
dongsheng@627 5074 msgid ""
dongsheng@627 5075 "This is why, for example, the dirstate is stored in a single file. If there "
dongsheng@627 5076 "were a dirstate file per directory that Mercurial tracked, the disk would "
dongsheng@627 5077 "seek once per directory. Instead, Mercurial reads the entire single dirstate "
dongsheng@627 5078 "file in one step."
dongsheng@627 5079 msgstr ""
dongsheng@627 5080
dongsheng@627 5081 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5082 #: ../en/ch03-concepts.xml:675
dongsheng@627 5083 msgid ""
dongsheng@627 5084 "Mercurial also uses a <quote>copy on write</quote> scheme when cloning a "
dongsheng@627 5085 "repository on local storage. Instead of copying every revlog file from the "
dongsheng@627 5086 "old repository into the new repository, it makes a <quote>hard link</quote>, "
dongsheng@627 5087 "which is a shorthand way to say <quote>these two names point to the same "
dongsheng@627 5088 "file</quote>. When Mercurial is about to write to one of a revlog's files, "
dongsheng@627 5089 "it checks to see if the number of names pointing at the file is greater than "
dongsheng@627 5090 "one. If it is, more than one repository is using the file, so Mercurial "
dongsheng@627 5091 "makes a new copy of the file that is private to this repository."
dongsheng@627 5092 msgstr ""
dongsheng@627 5093
dongsheng@627 5094 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5095 #: ../en/ch03-concepts.xml:686
dongsheng@627 5096 msgid ""
dongsheng@627 5097 "A few revision control developers have pointed out that this idea of making a "
dongsheng@627 5098 "complete private copy of a file is not very efficient in its use of storage. "
dongsheng@627 5099 "While this is true, storage is cheap, and this method gives the highest "
dongsheng@627 5100 "performance while deferring most book-keeping to the operating system. An "
dongsheng@627 5101 "alternative scheme would most likely reduce performance and increase the "
dongsheng@627 5102 "complexity of the software, each of which is much more important to the "
dongsheng@627 5103 "<quote>feel</quote> of day-to-day use."
dongsheng@627 5104 msgstr ""
dongsheng@627 5105
dongsheng@627 5106 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 5107 #: ../en/ch03-concepts.xml:698
dongsheng@627 5108 msgid "Other contents of the dirstate"
dongsheng@627 5109 msgstr "目录状态的其它内容"
dongsheng@627 5110
dongsheng@627 5111 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5112 #: ../en/ch03-concepts.xml:700
dongsheng@627 5113 msgid ""
dongsheng@627 5114 "Because Mercurial doesn't force you to tell it when you're modifying a file, "
dongsheng@627 5115 "it uses the dirstate to store some extra information so it can determine "
dongsheng@627 5116 "efficiently whether you have modified a file. For each file in the working "
dongsheng@627 5117 "directory, it stores the time that it last modified the file itself, and the "
dongsheng@627 5118 "size of the file at that time."
dongsheng@627 5119 msgstr ""
dongsheng@627 5120
dongsheng@627 5121 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5122 #: ../en/ch03-concepts.xml:707
dongsheng@627 5123 msgid ""
dongsheng@627 5124 "When you explicitly <command role=\"hg-cmd\">hg add</command>, <command role="
dongsheng@627 5125 "\"hg-cmd\">hg remove</command>, <command role=\"hg-cmd\">hg rename</command> "
dongsheng@627 5126 "or <command role=\"hg-cmd\">hg copy</command> files, Mercurial updates the "
dongsheng@627 5127 "dirstate so that it knows what to do with those files when you commit."
dongsheng@627 5128 msgstr ""
dongsheng@627 5129
dongsheng@627 5130 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 5131 #: ../en/ch03-concepts.xml:714
dongsheng@627 5132 msgid ""
dongsheng@627 5133 "When Mercurial is checking the states of files in the working directory, it "
dongsheng@627 5134 "first checks a file's modification time. If that has not changed, the file "
dongsheng@627 5135 "must not have been modified. If the file's size has changed, the file must "
dongsheng@627 5136 "have been modified. If the modification time has changed, but the size has "
dongsheng@627 5137 "not, only then does Mercurial need to read the actual contents of the file to "
dongsheng@627 5138 "see if they've changed. Storing these few extra pieces of information "
dongsheng@627 5139 "dramatically reduces the amount of data that Mercurial needs to read, which "
dongsheng@627 5140 "yields large performance improvements compared to other revision control "
dongsheng@627 5141 "systems."
dongsheng@627 5142 msgstr ""
dongsheng@627 5143
dongsheng@627 5144 #. type: Content of: <book><chapter><title>
dongsheng@650 5145 #: ../en/ch04-daily.xml:5
dongsheng@627 5146 msgid "Mercurial in daily use"
dongsheng@627 5147 msgstr "Mercurial 的日常使用"
dongsheng@627 5148
dongsheng@627 5149 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 5150 #: ../en/ch04-daily.xml:8
dongsheng@627 5151 msgid "Telling Mercurial which files to track"
dongsheng@627 5152 msgstr "告诉 Mercurial 要跟踪哪些文件"
dongsheng@627 5153
dongsheng@627 5154 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5155 #: ../en/ch04-daily.xml:10
dongsheng@627 5156 msgid ""
dongsheng@627 5157 "Mercurial does not work with files in your repository unless you tell it to "
dongsheng@627 5158 "manage them. The <command role=\"hg-cmd\">hg status</command> command will "
dongsheng@627 5159 "tell you which files Mercurial doesn't know about; it uses a <quote><literal>?"
dongsheng@627 5160 "</literal></quote> to display such files."
dongsheng@627 5161 msgstr ""
dongsheng@627 5162
dongsheng@627 5163 #
dongsheng@627 5164 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5165 #: ../en/ch04-daily.xml:17
dongsheng@627 5166 msgid ""
dongsheng@627 5167 "To tell Mercurial to track a file, use the <command role=\"hg-cmd\">hg add</"
dongsheng@627 5168 "command> command. Once you have added a file, the entry in the output of "
dongsheng@627 5169 "<command role=\"hg-cmd\">hg status</command> for that file changes from "
dongsheng@627 5170 "<quote><literal>?</literal></quote> to <quote><literal>A</literal></quote>."
dongsheng@627 5171 msgstr ""
dongsheng@627 5172
dongsheng@627 5173 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5174 #: ../en/ch04-daily.xml:26
dongsheng@627 5175 msgid ""
dongsheng@627 5176 "After you run a <command role=\"hg-cmd\">hg commit</command>, the files that "
dongsheng@627 5177 "you added before the commit will no longer be listed in the output of "
dongsheng@627 5178 "<command role=\"hg-cmd\">hg status</command>. The reason for this is that "
dongsheng@627 5179 "<command role=\"hg-cmd\">hg status</command> only tells you about "
dongsheng@661 5180 "<quote>interesting</quote> files—those that you have modified or told "
dongsheng@661 5181 "Mercurial to do something with—by default. If you have a repository that "
dongsheng@661 5182 "contains thousands of files, you will rarely want to know about files that "
dongsheng@661 5183 "Mercurial is tracking, but that have not changed. (You can still get this "
dongsheng@661 5184 "information; we'll return to this later.)"
dongsheng@627 5185 msgstr ""
dongsheng@627 5186
dongsheng@627 5187 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5188 #: ../en/ch04-daily.xml:38
dongsheng@627 5189 msgid ""
dongsheng@627 5190 "Once you add a file, Mercurial doesn't do anything with it immediately. "
dongsheng@627 5191 "Instead, it will take a snapshot of the file's state the next time you "
dongsheng@627 5192 "perform a commit. It will then continue to track the changes you make to the "
dongsheng@627 5193 "file every time you commit, until you remove the file."
dongsheng@627 5194 msgstr ""
dongsheng@627 5195
dongsheng@627 5196 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5197 #: ../en/ch04-daily.xml:45
dongsheng@627 5198 msgid "Explicit versus implicit file naming"
dongsheng@627 5199 msgstr "明确与隐含文件命名"
dongsheng@627 5200
dongsheng@627 5201 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5202 #: ../en/ch04-daily.xml:47
dongsheng@627 5203 msgid ""
dongsheng@627 5204 "A useful behaviour that Mercurial has is that if you pass the name of a "
dongsheng@627 5205 "directory to a command, every Mercurial command will treat this as <quote>I "
dongsheng@627 5206 "want to operate on every file in this directory and its subdirectories</"
dongsheng@627 5207 "quote>."
dongsheng@627 5208 msgstr ""
dongsheng@627 5209
dongsheng@627 5210 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5211 #: ../en/ch04-daily.xml:54
dongsheng@627 5212 msgid ""
dongsheng@627 5213 "Notice in this example that Mercurial printed the names of the files it "
dongsheng@627 5214 "added, whereas it didn't do so when we added the file named <filename>a</"
dongsheng@627 5215 "filename> in the earlier example."
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:59
dongsheng@627 5220 msgid ""
dongsheng@627 5221 "What's going on is that in the former case, we explicitly named the file to "
dongsheng@627 5222 "add on the command line, so the assumption that Mercurial makes in such cases "
dongsheng@627 5223 "is that you know what you were doing, and it doesn't print any output."
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:64
dongsheng@627 5228 msgid ""
dongsheng@627 5229 "However, when we <emphasis>imply</emphasis> the names of files by giving the "
dongsheng@627 5230 "name of a directory, Mercurial takes the extra step of printing the name of "
dongsheng@627 5231 "each file that it does something with. This makes it more clear what is "
dongsheng@627 5232 "happening, and reduces the likelihood of a silent and nasty surprise. This "
dongsheng@627 5233 "behaviour is common to most Mercurial commands."
dongsheng@627 5234 msgstr ""
dongsheng@627 5235
dongsheng@627 5236 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5237 #: ../en/ch04-daily.xml:73
dongsheng@627 5238 msgid "Aside: Mercurial tracks files, not directories"
dongsheng@627 5239 msgstr "旁白: Mercurial 只跟踪文件,不跟踪目录"
dongsheng@627 5240
dongsheng@627 5241 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5242 #: ../en/ch04-daily.xml:75
dongsheng@627 5243 msgid ""
dongsheng@627 5244 "Mercurial does not track directory information. Instead, it tracks the path "
dongsheng@627 5245 "to a file. Before creating a file, it first creates any missing directory "
dongsheng@627 5246 "components of the path. After it deletes a file, it then deletes any empty "
dongsheng@627 5247 "directories that were in the deleted file's path. This sounds like a trivial "
dongsheng@627 5248 "distinction, but it has one minor practical consequence: it is not possible "
dongsheng@627 5249 "to represent a completely empty directory in Mercurial."
dongsheng@627 5250 msgstr ""
dongsheng@627 5251
dongsheng@627 5252 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5253 #: ../en/ch04-daily.xml:84
dongsheng@627 5254 msgid ""
dongsheng@627 5255 "Empty directories are rarely useful, and there are unintrusive workarounds "
dongsheng@627 5256 "that you can use to achieve an appropriate effect. The developers of "
dongsheng@627 5257 "Mercurial thus felt that the complexity that would be required to manage "
dongsheng@627 5258 "empty directories was not worth the limited benefit this feature would bring."
dongsheng@627 5259 msgstr ""
dongsheng@627 5260
dongsheng@627 5261 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5262 #: ../en/ch04-daily.xml:91
dongsheng@627 5263 msgid ""
dongsheng@627 5264 "If you need an empty directory in your repository, there are a few ways to "
dongsheng@627 5265 "achieve this. One is to create a directory, then <command role=\"hg-cmd\">hg "
dongsheng@627 5266 "add</command> a <quote>hidden</quote> file to that directory. On Unix-like "
dongsheng@627 5267 "systems, any file name that begins with a period (<quote><literal>.</"
dongsheng@627 5268 "literal></quote>) is treated as hidden by most commands and GUI tools. This "
dongsheng@627 5269 "approach is illustrated below."
dongsheng@627 5270 msgstr ""
dongsheng@627 5271
dongsheng@627 5272 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5273 #: ../en/ch04-daily.xml:102
dongsheng@627 5274 msgid ""
dongsheng@627 5275 "Another way to tackle a need for an empty directory is to simply create one "
dongsheng@627 5276 "in your automated build scripts before they will need it."
dongsheng@627 5277 msgstr ""
dongsheng@627 5278
dongsheng@627 5279 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 5280 #: ../en/ch04-daily.xml:109
dongsheng@627 5281 msgid "How to stop tracking a file"
dongsheng@627 5282 msgstr "如何停止跟踪文件"
dongsheng@627 5283
dongsheng@627 5284 #
dongsheng@627 5285 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5286 #: ../en/ch04-daily.xml:111
dongsheng@627 5287 msgid ""
dongsheng@627 5288 "Once you decide that a file no longer belongs in your repository, use the "
dongsheng@627 5289 "<command role=\"hg-cmd\">hg remove</command> command; this deletes the file, "
dongsheng@627 5290 "and tells Mercurial to stop tracking it. A removed file is represented in "
dongsheng@627 5291 "the output of <command role=\"hg-cmd\">hg status</command> with a "
dongsheng@627 5292 "<quote><literal>R</literal></quote>."
dongsheng@627 5293 msgstr ""
dongsheng@627 5294
dongsheng@627 5295 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5296 #: ../en/ch04-daily.xml:120
dongsheng@627 5297 msgid ""
dongsheng@627 5298 "After you <command role=\"hg-cmd\">hg remove</command> a file, Mercurial will "
dongsheng@627 5299 "no longer track changes to that file, even if you recreate a file with the "
dongsheng@627 5300 "same name in your working directory. If you do recreate a file with the same "
dongsheng@627 5301 "name and want Mercurial to track the new file, simply <command role=\"hg-cmd"
dongsheng@627 5302 "\">hg add</command> it. Mercurial will know that the newly added file is not "
dongsheng@627 5303 "related to the old file of the same name."
dongsheng@627 5304 msgstr ""
dongsheng@627 5305
dongsheng@627 5306 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5307 #: ../en/ch04-daily.xml:129
dongsheng@627 5308 msgid "Removing a file does not affect its history"
dongsheng@627 5309 msgstr "删除文件不影响历史"
dongsheng@627 5310
dongsheng@627 5311 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5312 #: ../en/ch04-daily.xml:131
dongsheng@627 5313 msgid "It is important to understand that removing a file has only two effects."
dongsheng@627 5314 msgstr ""
dongsheng@627 5315
dongsheng@627 5316 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 5317 #: ../en/ch04-daily.xml:134
dongsheng@627 5318 msgid "It removes the current version of the file from the working directory."
dongsheng@627 5319 msgstr ""
dongsheng@627 5320
dongsheng@627 5321 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 5322 #: ../en/ch04-daily.xml:137
dongsheng@627 5323 msgid ""
dongsheng@627 5324 "It stops Mercurial from tracking changes to the file, from the time of the "
dongsheng@627 5325 "next commit."
dongsheng@627 5326 msgstr ""
dongsheng@627 5327
dongsheng@627 5328 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5329 #: ../en/ch04-daily.xml:140
dongsheng@627 5330 msgid ""
dongsheng@627 5331 "Removing a file <emphasis>does not</emphasis> in any way alter the "
dongsheng@627 5332 "<emphasis>history</emphasis> of the file."
dongsheng@627 5333 msgstr ""
dongsheng@627 5334
dongsheng@627 5335 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5336 #: ../en/ch04-daily.xml:143
dongsheng@627 5337 msgid ""
dongsheng@627 5338 "If you update the working directory to a changeset in which a file that you "
dongsheng@627 5339 "have removed was still tracked, it will reappear in the working directory, "
dongsheng@627 5340 "with the contents it had when you committed that changeset. If you then "
dongsheng@627 5341 "update the working directory to a later changeset, in which the file had been "
dongsheng@627 5342 "removed, Mercurial will once again remove the file from the working directory."
dongsheng@627 5343 msgstr ""
dongsheng@627 5344
dongsheng@627 5345 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5346 #: ../en/ch04-daily.xml:153
dongsheng@627 5347 msgid "Missing files"
dongsheng@627 5348 msgstr "丢失的文件"
dongsheng@627 5349
dongsheng@627 5350 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5351 #: ../en/ch04-daily.xml:155
dongsheng@627 5352 msgid ""
dongsheng@627 5353 "Mercurial considers a file that you have deleted, but not used <command role="
dongsheng@627 5354 "\"hg-cmd\">hg remove</command> to delete, to be <emphasis>missing</"
dongsheng@627 5355 "emphasis>. A missing file is represented with <quote><literal>!</literal></"
dongsheng@627 5356 "quote> in the output of <command role=\"hg-cmd\">hg status</command>. "
dongsheng@627 5357 "Mercurial commands will not generally do anything with missing files."
dongsheng@627 5358 msgstr ""
dongsheng@627 5359
dongsheng@627 5360 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5361 #: ../en/ch04-daily.xml:165
dongsheng@627 5362 msgid ""
dongsheng@627 5363 "If your repository contains a file that <command role=\"hg-cmd\">hg status</"
dongsheng@627 5364 "command> reports as missing, and you want the file to stay gone, you can run "
dongsheng@627 5365 "<command role=\"hg-cmd\">hg remove <option role=\"hg-opt-remove\">--after</"
dongsheng@627 5366 "option></command> at any time later on, to tell Mercurial that you really did "
dongsheng@627 5367 "mean to remove the file."
dongsheng@627 5368 msgstr ""
dongsheng@627 5369
dongsheng@627 5370 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5371 #: ../en/ch04-daily.xml:175
dongsheng@627 5372 msgid ""
dongsheng@627 5373 "On the other hand, if you deleted the missing file by accident, give <command "
dongsheng@627 5374 "role=\"hg-cmd\">hg revert</command> the name of the file to recover. It will "
dongsheng@627 5375 "reappear, in unmodified form."
dongsheng@627 5376 msgstr ""
dongsheng@627 5377
dongsheng@627 5378 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5379 #: ../en/ch04-daily.xml:184
dongsheng@627 5380 msgid "Aside: why tell Mercurial explicitly to remove a file?"
dongsheng@627 5381 msgstr "旁白: 为什么要明确告诉 Mercurial 删除文件?"
dongsheng@627 5382
dongsheng@627 5383 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5384 #: ../en/ch04-daily.xml:187
dongsheng@627 5385 msgid ""
dongsheng@627 5386 "You might wonder why Mercurial requires you to explicitly tell it that you "
dongsheng@627 5387 "are deleting a file. Early during the development of Mercurial, it let you "
dongsheng@627 5388 "delete a file however you pleased; Mercurial would notice the absence of the "
dongsheng@627 5389 "file automatically when you next ran a <command role=\"hg-cmd\">hg commit</"
dongsheng@627 5390 "command>, and stop tracking the file. In practice, this made it too easy to "
dongsheng@627 5391 "accidentally remove a file without noticing."
dongsheng@627 5392 msgstr ""
dongsheng@627 5393
dongsheng@627 5394 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5395 #: ../en/ch04-daily.xml:198
dongsheng@661 5396 msgid "Useful shorthand—adding and removing files in one step"
dongsheng@661 5397 msgstr "有用的速记—一个步骤添加和删除文件"
dongsheng@627 5398
dongsheng@627 5399 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5400 #: ../en/ch04-daily.xml:201
dongsheng@627 5401 msgid ""
dongsheng@627 5402 "Mercurial offers a combination command, <command role=\"hg-cmd\">hg "
dongsheng@627 5403 "addremove</command>, that adds untracked files and marks missing files as "
dongsheng@627 5404 "removed."
dongsheng@627 5405 msgstr ""
dongsheng@627 5406
dongsheng@627 5407 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5408 #: ../en/ch04-daily.xml:207
dongsheng@627 5409 msgid ""
dongsheng@627 5410 "The <command role=\"hg-cmd\">hg commit</command> command also provides a "
dongsheng@627 5411 "<option role=\"hg-opt-commit\">-A</option> option that performs this same add-"
dongsheng@627 5412 "and-remove, immediately followed by a commit."
dongsheng@627 5413 msgstr ""
dongsheng@627 5414
dongsheng@627 5415 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 5416 #: ../en/ch04-daily.xml:217
dongsheng@627 5417 msgid "Copying files"
dongsheng@627 5418 msgstr "复制文件"
dongsheng@627 5419
dongsheng@627 5420 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5421 #: ../en/ch04-daily.xml:219
dongsheng@627 5422 msgid ""
dongsheng@627 5423 "Mercurial provides a <command role=\"hg-cmd\">hg copy</command> command that "
dongsheng@627 5424 "lets you make a new copy of a file. When you copy a file using this command, "
dongsheng@627 5425 "Mercurial makes a record of the fact that the new file is a copy of the "
dongsheng@627 5426 "original file. It treats these copied files specially when you merge your "
dongsheng@627 5427 "work with someone else's."
dongsheng@627 5428 msgstr ""
dongsheng@627 5429
dongsheng@627 5430 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5431 #: ../en/ch04-daily.xml:227
dongsheng@627 5432 msgid "The results of copying during a merge"
dongsheng@627 5433 msgstr "合并期间的复制结果"
dongsheng@627 5434
dongsheng@627 5435 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5436 #: ../en/ch04-daily.xml:229
dongsheng@627 5437 msgid ""
dongsheng@627 5438 "What happens during a merge is that changes <quote>follow</quote> a copy. To "
dongsheng@627 5439 "best illustrate what this means, let's create an example. We'll start with "
dongsheng@627 5440 "the usual tiny repository that contains a single file."
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:236
dongsheng@627 5445 msgid ""
dongsheng@627 5446 "We need to do some work in parallel, so that we'll have something to merge. "
dongsheng@627 5447 "So let's clone our repository."
dongsheng@627 5448 msgstr ""
dongsheng@627 5449
dongsheng@627 5450 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5451 #: ../en/ch04-daily.xml:242
dongsheng@627 5452 msgid ""
dongsheng@627 5453 "Back in our initial repository, let's use the <command role=\"hg-cmd\">hg "
dongsheng@627 5454 "copy</command> command to make a copy of the first file we created."
dongsheng@627 5455 msgstr ""
dongsheng@627 5456
dongsheng@627 5457 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5458 #: ../en/ch04-daily.xml:248
dongsheng@627 5459 msgid ""
dongsheng@627 5460 "If we look at the output of the <command role=\"hg-cmd\">hg status</command> "
dongsheng@627 5461 "command afterwards, the copied file looks just like a normal added file."
dongsheng@627 5462 msgstr ""
dongsheng@627 5463
dongsheng@627 5464 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5465 #: ../en/ch04-daily.xml:254
dongsheng@627 5466 msgid ""
dongsheng@627 5467 "But if we pass the <option role=\"hg-opt-status\">-C</option> option to "
dongsheng@627 5468 "<command role=\"hg-cmd\">hg status</command>, it prints another line of "
dongsheng@627 5469 "output: this is the file that our newly-added file was copied <emphasis>from</"
dongsheng@627 5470 "emphasis>."
dongsheng@627 5471 msgstr ""
dongsheng@627 5472
dongsheng@627 5473 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5474 #: ../en/ch04-daily.xml:262
dongsheng@627 5475 msgid ""
dongsheng@627 5476 "Now, back in the repository we cloned, let's make a change in parallel. "
dongsheng@627 5477 "We'll add a line of content to the original file that we created."
dongsheng@627 5478 msgstr ""
dongsheng@627 5479
dongsheng@627 5480 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5481 #: ../en/ch04-daily.xml:268
dongsheng@627 5482 msgid ""
dongsheng@627 5483 "Now we have a modified <filename>file</filename> in this repository. When we "
dongsheng@627 5484 "pull the changes from the first repository, and merge the two heads, "
dongsheng@627 5485 "Mercurial will propagate the changes that we made locally to <filename>file</"
dongsheng@627 5486 "filename> into its copy, <filename>new-file</filename>."
dongsheng@627 5487 msgstr ""
dongsheng@627 5488
dongsheng@627 5489 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5490 #: ../en/ch04-daily.xml:278
dongsheng@627 5491 msgid "Why should changes follow copies?"
dongsheng@627 5492 msgstr "为什么复制后需要后续修改?"
dongsheng@627 5493
dongsheng@627 5494 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5495 #: ../en/ch04-daily.xml:280
dongsheng@627 5496 msgid ""
dongsheng@627 5497 "This behaviour, of changes to a file propagating out to copies of the file, "
dongsheng@627 5498 "might seem esoteric, but in most cases it's highly desirable."
dongsheng@627 5499 msgstr ""
dongsheng@627 5500
dongsheng@627 5501 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5502 #: ../en/ch04-daily.xml:284
dongsheng@627 5503 msgid ""
dongsheng@627 5504 "First of all, remember that this propagation <emphasis>only</emphasis> "
dongsheng@627 5505 "happens when you merge. So if you <command role=\"hg-cmd\">hg copy</command> "
dongsheng@627 5506 "a file, and subsequently modify the original file during the normal course of "
dongsheng@627 5507 "your work, nothing will happen."
dongsheng@627 5508 msgstr ""
dongsheng@627 5509
dongsheng@627 5510 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5511 #: ../en/ch04-daily.xml:290
dongsheng@627 5512 msgid ""
dongsheng@627 5513 "The second thing to know is that modifications will only propagate across a "
dongsheng@627 5514 "copy as long as the repository that you're pulling changes from "
dongsheng@627 5515 "<emphasis>doesn't know</emphasis> about the copy."
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:295
dongsheng@627 5520 msgid ""
dongsheng@627 5521 "The reason that Mercurial does this is as follows. Let's say I make an "
dongsheng@627 5522 "important bug fix in a source file, and commit my changes. Meanwhile, you've "
dongsheng@627 5523 "decided to <command role=\"hg-cmd\">hg copy</command> the file in your "
dongsheng@627 5524 "repository, without knowing about the bug or having seen the fix, and you "
dongsheng@627 5525 "have started hacking on your copy of the file."
dongsheng@627 5526 msgstr ""
dongsheng@627 5527
dongsheng@627 5528 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5529 #: ../en/ch04-daily.xml:302
dongsheng@627 5530 msgid ""
dongsheng@627 5531 "If you pulled and merged my changes, and Mercurial <emphasis>didn't</"
dongsheng@627 5532 "emphasis> propagate changes across copies, your source file would now contain "
dongsheng@627 5533 "the bug, and unless you remembered to propagate the bug fix by hand, the bug "
dongsheng@627 5534 "would <emphasis>remain</emphasis> in your copy of the file."
dongsheng@627 5535 msgstr ""
dongsheng@627 5536
dongsheng@627 5537 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5538 #: ../en/ch04-daily.xml:308
dongsheng@627 5539 msgid ""
dongsheng@627 5540 "By automatically propagating the change that fixed the bug from the original "
dongsheng@627 5541 "file to the copy, Mercurial prevents this class of problem. To my knowledge, "
dongsheng@627 5542 "Mercurial is the <emphasis>only</emphasis> revision control system that "
dongsheng@627 5543 "propagates changes across copies like this."
dongsheng@627 5544 msgstr ""
dongsheng@627 5545
dongsheng@627 5546 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5547 #: ../en/ch04-daily.xml:314
dongsheng@627 5548 msgid ""
dongsheng@627 5549 "Once your change history has a record that the copy and subsequent merge "
dongsheng@627 5550 "occurred, there's usually no further need to propagate changes from the "
dongsheng@627 5551 "original file to the copied file, and that's why Mercurial only propagates "
dongsheng@627 5552 "changes across copies until this point, and no further."
dongsheng@627 5553 msgstr ""
dongsheng@627 5554
dongsheng@627 5555 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5556 #: ../en/ch04-daily.xml:322
dongsheng@627 5557 msgid "How to make changes <emphasis>not</emphasis> follow a copy"
dongsheng@627 5558 msgstr "如何让复制后<emphasis>不</emphasis>修改?"
dongsheng@627 5559
dongsheng@627 5560 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5561 #: ../en/ch04-daily.xml:325
dongsheng@627 5562 msgid ""
dongsheng@627 5563 "If, for some reason, you decide that this business of automatically "
dongsheng@627 5564 "propagating changes across copies is not for you, simply use your system's "
dongsheng@627 5565 "normal file copy command (on Unix-like systems, that's <command>cp</command>) "
dongsheng@627 5566 "to make a copy of a file, then <command role=\"hg-cmd\">hg add</command> the "
songdongsheng@658 5567 "new copy by hand. Before you do so, though, please do reread <xref linkend="
songdongsheng@658 5568 "\"sec:daily:why-copy\"/>, and make an informed decision that this behaviour "
songdongsheng@658 5569 "is not appropriate to your specific case."
dongsheng@627 5570 msgstr ""
dongsheng@627 5571
dongsheng@627 5572 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5573 #: ../en/ch04-daily.xml:338
dongsheng@627 5574 msgid "Behaviour of the <command role=\"hg-cmd\">hg copy</command> command"
dongsheng@627 5575 msgstr "命令 <command role=\"hg-cmd\">hg copy</command> 的特性"
dongsheng@627 5576
dongsheng@627 5577 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5578 #: ../en/ch04-daily.xml:341
dongsheng@627 5579 msgid ""
dongsheng@627 5580 "When you use the <command role=\"hg-cmd\">hg copy</command> command, "
dongsheng@627 5581 "Mercurial makes a copy of each source file as it currently stands in the "
dongsheng@627 5582 "working directory. This means that if you make some modifications to a file, "
dongsheng@627 5583 "then <command role=\"hg-cmd\">hg copy</command> it without first having "
dongsheng@627 5584 "committed those changes, the new copy will also contain the modifications you "
dongsheng@627 5585 "have made up until that point. (I find this behaviour a little "
dongsheng@627 5586 "counterintuitive, which is why I mention it here.)"
dongsheng@627 5587 msgstr ""
dongsheng@627 5588
dongsheng@627 5589 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5590 #: ../en/ch04-daily.xml:351
dongsheng@627 5591 msgid ""
dongsheng@627 5592 "The <command role=\"hg-cmd\">hg copy</command> command acts similarly to the "
dongsheng@627 5593 "Unix <command>cp</command> command (you can use the <command role=\"hg-cmd"
dongsheng@627 5594 "\">hg cp</command> alias if you prefer). The last argument is the "
dongsheng@627 5595 "<emphasis>destination</emphasis>, and all prior arguments are "
dongsheng@627 5596 "<emphasis>sources</emphasis>. If you pass it a single file as the source, "
dongsheng@627 5597 "and the destination does not exist, it creates a new file with that name."
dongsheng@627 5598 msgstr ""
dongsheng@627 5599
dongsheng@627 5600 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5601 #: ../en/ch04-daily.xml:362
dongsheng@627 5602 msgid ""
dongsheng@627 5603 "If the destination is a directory, Mercurial copies its sources into that "
dongsheng@627 5604 "directory."
dongsheng@627 5605 msgstr ""
dongsheng@627 5606
dongsheng@627 5607 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5608 #: ../en/ch04-daily.xml:367
dongsheng@627 5609 msgid ""
dongsheng@627 5610 "Copying a directory is recursive, and preserves the directory structure of "
dongsheng@627 5611 "the source."
dongsheng@627 5612 msgstr ""
dongsheng@627 5613
dongsheng@627 5614 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5615 #: ../en/ch04-daily.xml:373
dongsheng@627 5616 msgid ""
dongsheng@627 5617 "If the source and destination are both directories, the source tree is "
dongsheng@627 5618 "recreated in the destination directory."
dongsheng@627 5619 msgstr ""
dongsheng@627 5620
dongsheng@627 5621 #
dongsheng@627 5622 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5623 #: ../en/ch04-daily.xml:378
dongsheng@627 5624 msgid ""
dongsheng@627 5625 "As with the <command role=\"hg-cmd\">hg rename</command> command, if you copy "
dongsheng@627 5626 "a file manually and then want Mercurial to know that you've copied the file, "
dongsheng@627 5627 "simply use the <option role=\"hg-opt-copy\">--after</option> option to "
dongsheng@627 5628 "<command role=\"hg-cmd\">hg copy</command>."
dongsheng@627 5629 msgstr ""
dongsheng@627 5630
dongsheng@627 5631 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 5632 #: ../en/ch04-daily.xml:389
dongsheng@627 5633 msgid "Renaming files"
dongsheng@627 5634 msgstr "改名文件"
dongsheng@627 5635
dongsheng@627 5636 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5637 #: ../en/ch04-daily.xml:391
dongsheng@627 5638 msgid ""
dongsheng@627 5639 "It's rather more common to need to rename a file than to make a copy of it. "
dongsheng@627 5640 "The reason I discussed the <command role=\"hg-cmd\">hg copy</command> command "
dongsheng@627 5641 "before talking about renaming files is that Mercurial treats a rename in "
dongsheng@627 5642 "essentially the same way as a copy. Therefore, knowing what Mercurial does "
dongsheng@627 5643 "when you copy a file tells you what to expect when you rename a file."
dongsheng@627 5644 msgstr ""
dongsheng@627 5645
dongsheng@627 5646 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5647 #: ../en/ch04-daily.xml:399
dongsheng@627 5648 msgid ""
dongsheng@627 5649 "When you use the <command role=\"hg-cmd\">hg rename</command> command, "
dongsheng@627 5650 "Mercurial makes a copy of each source file, then deletes it and marks the "
dongsheng@627 5651 "file as removed."
dongsheng@627 5652 msgstr ""
dongsheng@627 5653
dongsheng@627 5654 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5655 #: ../en/ch04-daily.xml:405
dongsheng@627 5656 msgid ""
dongsheng@627 5657 "The <command role=\"hg-cmd\">hg status</command> command shows the newly "
dongsheng@627 5658 "copied file as added, and the copied-from file as removed."
dongsheng@627 5659 msgstr ""
dongsheng@627 5660
dongsheng@627 5661 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5662 #: ../en/ch04-daily.xml:411
dongsheng@627 5663 msgid ""
dongsheng@627 5664 "As with the results of a <command role=\"hg-cmd\">hg copy</command>, we must "
dongsheng@627 5665 "use the <option role=\"hg-opt-status\">-C</option> option to <command role="
dongsheng@627 5666 "\"hg-cmd\">hg status</command> to see that the added file is really being "
dongsheng@627 5667 "tracked by Mercurial as a copy of the original, now removed, file."
dongsheng@627 5668 msgstr ""
dongsheng@627 5669
dongsheng@627 5670 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5671 #: ../en/ch04-daily.xml:420
dongsheng@627 5672 msgid ""
dongsheng@627 5673 "As with <command role=\"hg-cmd\">hg remove</command> and <command role=\"hg-"
dongsheng@627 5674 "cmd\">hg copy</command>, you can tell Mercurial about a rename after the fact "
dongsheng@627 5675 "using the <option role=\"hg-opt-rename\">--after</option> option. In most "
dongsheng@627 5676 "other respects, the behaviour of the <command role=\"hg-cmd\">hg rename</"
dongsheng@627 5677 "command> command, and the options it accepts, are similar to the <command "
dongsheng@627 5678 "role=\"hg-cmd\">hg copy</command> command."
dongsheng@627 5679 msgstr ""
dongsheng@627 5680
dongsheng@627 5681 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5682 #: ../en/ch04-daily.xml:430
dongsheng@627 5683 msgid "Renaming files and merging changes"
dongsheng@627 5684 msgstr "改名文件与合并修改"
dongsheng@627 5685
dongsheng@627 5686 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5687 #: ../en/ch04-daily.xml:432
dongsheng@627 5688 msgid ""
dongsheng@627 5689 "Since Mercurial's rename is implemented as copy-and-remove, the same "
dongsheng@627 5690 "propagation of changes happens when you merge after a rename as after a copy."
dongsheng@627 5691 msgstr ""
dongsheng@627 5692
dongsheng@627 5693 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5694 #: ../en/ch04-daily.xml:436
dongsheng@627 5695 msgid ""
dongsheng@627 5696 "If I modify a file, and you rename it to a new name, and then we merge our "
dongsheng@627 5697 "respective changes, my modifications to the file under its original name will "
dongsheng@627 5698 "be propagated into the file under its new name. (This is something you might "
dongsheng@627 5699 "expect to <quote>simply work,</quote> but not all revision control systems "
dongsheng@627 5700 "actually do this.)"
dongsheng@627 5701 msgstr ""
dongsheng@627 5702
dongsheng@627 5703 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5704 #: ../en/ch04-daily.xml:443
dongsheng@627 5705 msgid ""
dongsheng@627 5706 "Whereas having changes follow a copy is a feature where you can perhaps nod "
dongsheng@627 5707 "and say <quote>yes, that might be useful,</quote> it should be clear that "
dongsheng@627 5708 "having them follow a rename is definitely important. Without this facility, "
dongsheng@627 5709 "it would simply be too easy for changes to become orphaned when files are "
dongsheng@627 5710 "renamed."
dongsheng@627 5711 msgstr ""
dongsheng@627 5712
dongsheng@627 5713 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5714 #: ../en/ch04-daily.xml:452
dongsheng@627 5715 msgid "Divergent renames and merging"
dongsheng@627 5716 msgstr "改名与合并的分歧"
dongsheng@627 5717
dongsheng@627 5718 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5719 #: ../en/ch04-daily.xml:454
dongsheng@627 5720 msgid ""
dongsheng@661 5721 "The case of diverging names occurs when two developers start with a file—"
dongsheng@661 5722 "let's call it <filename>foo</filename>&emdash;in their respective "
dongsheng@627 5723 "repositories."
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:461
dongsheng@627 5728 msgid "Anne renames the file to <filename>bar</filename>."
dongsheng@627 5729 msgstr ""
dongsheng@627 5730
dongsheng@627 5731 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5732 #: ../en/ch04-daily.xml:465
dongsheng@627 5733 msgid "Meanwhile, Bob renames it to <filename>quux</filename>."
dongsheng@627 5734 msgstr ""
dongsheng@627 5735
dongsheng@627 5736 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5737 #: ../en/ch04-daily.xml:470
dongsheng@627 5738 msgid ""
dongsheng@627 5739 "I like to think of this as a conflict because each developer has expressed "
dongsheng@627 5740 "different intentions about what the file ought to be named."
dongsheng@627 5741 msgstr ""
dongsheng@627 5742
dongsheng@627 5743 #
dongsheng@627 5744 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5745 #: ../en/ch04-daily.xml:474
dongsheng@627 5746 msgid ""
dongsheng@627 5747 "What do you think should happen when they merge their work? Mercurial's "
dongsheng@627 5748 "actual behaviour is that it always preserves <emphasis>both</emphasis> names "
dongsheng@627 5749 "when it merges changesets that contain divergent renames."
dongsheng@627 5750 msgstr ""
dongsheng@627 5751
dongsheng@627 5752 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5753 #: ../en/ch04-daily.xml:481
dongsheng@627 5754 msgid ""
dongsheng@627 5755 "Notice that Mercurial does warn about the divergent renames, but it leaves it "
dongsheng@627 5756 "up to you to do something about the divergence after the merge."
dongsheng@627 5757 msgstr ""
dongsheng@627 5758
dongsheng@627 5759 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5760 #: ../en/ch04-daily.xml:487
dongsheng@627 5761 msgid "Convergent renames and merging"
dongsheng@627 5762 msgstr "收敛改名与合并"
dongsheng@627 5763
dongsheng@627 5764 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5765 #: ../en/ch04-daily.xml:489
dongsheng@627 5766 msgid ""
dongsheng@627 5767 "Another kind of rename conflict occurs when two people choose to rename "
dongsheng@627 5768 "different <emphasis>source</emphasis> files to the same "
dongsheng@627 5769 "<emphasis>destination</emphasis>. In this case, Mercurial runs its normal "
dongsheng@627 5770 "merge machinery, and lets you guide it to a suitable resolution."
dongsheng@627 5771 msgstr ""
dongsheng@627 5772
dongsheng@627 5773 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5774 #: ../en/ch04-daily.xml:497
dongsheng@627 5775 msgid "Other name-related corner cases"
dongsheng@627 5776 msgstr "其它名称相关的角落"
dongsheng@627 5777
dongsheng@627 5778 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5779 #: ../en/ch04-daily.xml:499
dongsheng@627 5780 msgid ""
dongsheng@627 5781 "Mercurial has a longstanding bug in which it fails to handle a merge where "
dongsheng@627 5782 "one side has a file with a given name, while another has a directory with the "
dongsheng@627 5783 "same name. This is documented as <ulink role=\"hg-bug\" url=\"http://www."
dongsheng@627 5784 "selenic.com/mercurial/bts/issue29\">issue 29</ulink>."
dongsheng@627 5785 msgstr ""
dongsheng@627 5786
dongsheng@627 5787 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 5788 #: ../en/ch04-daily.xml:511
dongsheng@627 5789 msgid "Recovering from mistakes"
dongsheng@627 5790 msgstr "从错误恢复"
dongsheng@627 5791
dongsheng@627 5792 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5793 #: ../en/ch04-daily.xml:513
dongsheng@627 5794 msgid ""
dongsheng@627 5795 "Mercurial has some useful commands that will help you to recover from some "
dongsheng@627 5796 "common mistakes."
dongsheng@627 5797 msgstr ""
dongsheng@627 5798
dongsheng@627 5799 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5800 #: ../en/ch04-daily.xml:516
dongsheng@627 5801 msgid ""
dongsheng@627 5802 "The <command role=\"hg-cmd\">hg revert</command> command lets you undo "
dongsheng@627 5803 "changes that you have made to your working directory. For example, if you "
dongsheng@627 5804 "<command role=\"hg-cmd\">hg add</command> a file by accident, just run "
dongsheng@627 5805 "<command role=\"hg-cmd\">hg revert</command> with the name of the file you "
dongsheng@627 5806 "added, and while the file won't be touched in any way, it won't be tracked "
dongsheng@627 5807 "for adding by Mercurial any longer, either. You can also use <command role="
dongsheng@627 5808 "\"hg-cmd\">hg revert</command> to get rid of erroneous changes to a file."
dongsheng@627 5809 msgstr ""
dongsheng@627 5810
dongsheng@627 5811 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5812 #: ../en/ch04-daily.xml:526
dongsheng@627 5813 msgid ""
dongsheng@627 5814 "It's useful to remember that the <command role=\"hg-cmd\">hg revert</command> "
dongsheng@627 5815 "command is useful for changes that you have not yet committed. Once you've "
dongsheng@627 5816 "committed a change, if you decide it was a mistake, you can still do "
dongsheng@627 5817 "something about it, though your options may be more limited."
dongsheng@627 5818 msgstr ""
dongsheng@627 5819
dongsheng@627 5820 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5821 #: ../en/ch04-daily.xml:532
dongsheng@627 5822 msgid ""
dongsheng@627 5823 "For more information about the <command role=\"hg-cmd\">hg revert</command> "
dongsheng@627 5824 "command, and details about how to deal with changes you have already "
songdongsheng@658 5825 "committed, see <xref linkend=\"chap:undo\"/>."
dongsheng@627 5826 msgstr ""
dongsheng@627 5827
dongsheng@627 5828 #. type: Content of: <book><chapter><title>
dongsheng@650 5829 #: ../en/ch05-collab.xml:5
dongsheng@627 5830 msgid "Collaborating with other people"
dongsheng@627 5831 msgstr "团体协作"
dongsheng@627 5832
dongsheng@627 5833 #. type: Content of: <book><chapter><para>
dongsheng@650 5834 #: ../en/ch05-collab.xml:7
dongsheng@627 5835 msgid ""
dongsheng@627 5836 "As a completely decentralised tool, Mercurial doesn't impose any policy on "
dongsheng@627 5837 "how people ought to work with each other. However, if you're new to "
dongsheng@627 5838 "distributed revision control, it helps to have some tools and examples in "
dongsheng@627 5839 "mind when you're thinking about possible workflow models."
dongsheng@627 5840 msgstr ""
dongsheng@627 5841
dongsheng@627 5842 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 5843 #: ../en/ch05-collab.xml:14
dongsheng@627 5844 msgid "Mercurial's web interface"
dongsheng@630 5845 msgstr "Mercurial 的 web 接口"
dongsheng@627 5846
dongsheng@627 5847 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5848 #: ../en/ch05-collab.xml:16
dongsheng@627 5849 msgid ""
dongsheng@627 5850 "Mercurial has a powerful web interface that provides several useful "
dongsheng@627 5851 "capabilities."
dongsheng@627 5852 msgstr ""
dongsheng@627 5853
dongsheng@627 5854 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5855 #: ../en/ch05-collab.xml:19
dongsheng@627 5856 msgid ""
dongsheng@627 5857 "For interactive use, the web interface lets you browse a single repository or "
dongsheng@627 5858 "a collection of repositories. You can view the history of a repository, "
dongsheng@627 5859 "examine each change (comments and diffs), and view the contents of each "
dongsheng@627 5860 "directory and file."
dongsheng@627 5861 msgstr ""
dongsheng@627 5862
dongsheng@627 5863 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5864 #: ../en/ch05-collab.xml:24
dongsheng@627 5865 msgid ""
dongsheng@627 5866 "Also for human consumption, the web interface provides an RSS feed of the "
dongsheng@627 5867 "changes in a repository. This lets you <quote>subscribe</quote> to a "
dongsheng@627 5868 "repository using your favourite feed reader, and be automatically notified of "
dongsheng@627 5869 "activity in that repository as soon as it happens. I find this capability "
dongsheng@627 5870 "much more convenient than the model of subscribing to a mailing list to which "
dongsheng@627 5871 "notifications are sent, as it requires no additional configuration on the "
dongsheng@627 5872 "part of whoever is serving the repository."
dongsheng@627 5873 msgstr ""
dongsheng@627 5874
dongsheng@627 5875 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5876 #: ../en/ch05-collab.xml:34
dongsheng@627 5877 msgid ""
dongsheng@627 5878 "The web interface also lets remote users clone a repository, pull changes "
dongsheng@627 5879 "from it, and (when the server is configured to permit it) push changes back "
dongsheng@627 5880 "to it. Mercurial's HTTP tunneling protocol aggressively compresses data, so "
dongsheng@627 5881 "that it works efficiently even over low-bandwidth network connections."
dongsheng@627 5882 msgstr ""
dongsheng@627 5883
dongsheng@627 5884 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5885 #: ../en/ch05-collab.xml:40
dongsheng@627 5886 msgid ""
dongsheng@627 5887 "The easiest way to get started with the web interface is to use your web "
dongsheng@627 5888 "browser to visit an existing repository, such as the master Mercurial "
dongsheng@627 5889 "repository at <ulink url=\"http://www.selenic.com/repo/hg?style=gitweb"
dongsheng@627 5890 "\">http://www.selenic.com/repo/hg?style=gitweb</ulink>."
dongsheng@627 5891 msgstr ""
dongsheng@627 5892
dongsheng@627 5893 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5894 #: ../en/ch05-collab.xml:45
dongsheng@627 5895 msgid ""
dongsheng@627 5896 "If you're interested in providing a web interface to your own repositories, "
dongsheng@627 5897 "Mercurial provides two ways to do this. The first is using the <command role="
dongsheng@627 5898 "\"hg-cmd\">hg serve</command> command, which is best suited to short-term "
songdongsheng@658 5899 "<quote>lightweight</quote> serving. See <xref linkend=\"sec:collab:serve\"/> "
songdongsheng@658 5900 "below for details of how to use this command. If you have a long-lived "
songdongsheng@658 5901 "repository that you'd like to make permanently available, Mercurial has built-"
songdongsheng@658 5902 "in support for the CGI (Common Gateway Interface) standard, which all common "
songdongsheng@658 5903 "web servers support. See <xref linkend=\"sec:collab:cgi\"/> for details of "
songdongsheng@658 5904 "CGI configuration."
dongsheng@627 5905 msgstr ""
dongsheng@627 5906
dongsheng@627 5907 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 5908 #: ../en/ch05-collab.xml:60
dongsheng@627 5909 msgid "Collaboration models"
dongsheng@630 5910 msgstr "协作模型"
dongsheng@627 5911
dongsheng@627 5912 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 5913 #: ../en/ch05-collab.xml:62
dongsheng@627 5914 msgid ""
dongsheng@627 5915 "With a suitably flexible tool, making decisions about workflow is much more "
dongsheng@627 5916 "of a social engineering challenge than a technical one. Mercurial imposes few "
dongsheng@627 5917 "limitations on how you can structure the flow of work in a project, so it's "
dongsheng@627 5918 "up to you and your group to set up and live with a model that matches your "
dongsheng@627 5919 "own particular needs."
dongsheng@627 5920 msgstr ""
dongsheng@627 5921
dongsheng@627 5922 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5923 #: ../en/ch05-collab.xml:70
dongsheng@627 5924 msgid "Factors to keep in mind"
dongsheng@630 5925 msgstr "要牢记的因素"
dongsheng@627 5926
dongsheng@627 5927 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5928 #: ../en/ch05-collab.xml:72
dongsheng@627 5929 msgid ""
dongsheng@627 5930 "The most important aspect of any model that you must keep in mind is how well "
dongsheng@627 5931 "it matches the needs and capabilities of the people who will be using it. "
dongsheng@627 5932 "This might seem self-evident; even so, you still can't afford to forget it "
dongsheng@627 5933 "for a moment."
dongsheng@627 5934 msgstr ""
dongsheng@627 5935
dongsheng@627 5936 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5937 #: ../en/ch05-collab.xml:78
dongsheng@627 5938 msgid ""
dongsheng@627 5939 "I once put together a workflow model that seemed to make perfect sense to me, "
dongsheng@627 5940 "but that caused a considerable amount of consternation and strife within my "
dongsheng@627 5941 "development team. In spite of my attempts to explain why we needed a complex "
dongsheng@627 5942 "set of branches, and how changes ought to flow between them, a few team "
dongsheng@627 5943 "members revolted. Even though they were smart people, they didn't want to "
dongsheng@627 5944 "pay attention to the constraints we were operating under, or face the "
dongsheng@627 5945 "consequences of those constraints in the details of the model that I was "
dongsheng@627 5946 "advocating."
dongsheng@627 5947 msgstr ""
dongsheng@627 5948
dongsheng@627 5949 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5950 #: ../en/ch05-collab.xml:88
dongsheng@627 5951 msgid ""
dongsheng@627 5952 "Don't sweep foreseeable social or technical problems under the rug. Whatever "
dongsheng@627 5953 "scheme you put into effect, you should plan for mistakes and problem "
dongsheng@627 5954 "scenarios. Consider adding automated machinery to prevent, or quickly "
dongsheng@627 5955 "recover from, trouble that you can anticipate. As an example, if you intend "
dongsheng@627 5956 "to have a branch with not-for-release changes in it, you'd do well to think "
dongsheng@627 5957 "early about the possibility that someone might accidentally merge those "
dongsheng@627 5958 "changes into a release branch. You could avoid this particular problem by "
dongsheng@627 5959 "writing a hook that prevents changes from being merged from an inappropriate "
dongsheng@627 5960 "branch."
dongsheng@627 5961 msgstr ""
dongsheng@627 5962
dongsheng@627 5963 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 5964 #: ../en/ch05-collab.xml:102
dongsheng@627 5965 msgid "Informal anarchy"
dongsheng@630 5966 msgstr "无政府状态"
dongsheng@627 5967
dongsheng@627 5968 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5969 #: ../en/ch05-collab.xml:104
dongsheng@627 5970 msgid ""
dongsheng@627 5971 "I wouldn't suggest an <quote>anything goes</quote> approach as something "
dongsheng@627 5972 "sustainable, but it's a model that's easy to grasp, and it works perfectly "
dongsheng@627 5973 "well in a few unusual situations."
dongsheng@627 5974 msgstr ""
dongsheng@627 5975
dongsheng@627 5976 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5977 #: ../en/ch05-collab.xml:109
dongsheng@627 5978 msgid ""
dongsheng@627 5979 "As one example, many projects have a loose-knit group of collaborators who "
dongsheng@627 5980 "rarely physically meet each other. Some groups like to overcome the "
dongsheng@627 5981 "isolation of working at a distance by organising occasional <quote>sprints</"
dongsheng@627 5982 "quote>. In a sprint, a number of people get together in a single location (a "
dongsheng@627 5983 "company's conference room, a hotel meeting room, that kind of place) and "
dongsheng@627 5984 "spend several days more or less locked in there, hacking intensely on a "
dongsheng@627 5985 "handful of projects."
dongsheng@627 5986 msgstr ""
dongsheng@627 5987
dongsheng@627 5988 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 5989 #: ../en/ch05-collab.xml:118
dongsheng@627 5990 msgid ""
dongsheng@627 5991 "A sprint is the perfect place to use the <command role=\"hg-cmd\">hg serve</"
dongsheng@627 5992 "command> command, since <command role=\"hg-cmd\">hg serve</command> does not "
dongsheng@627 5993 "require any fancy server infrastructure. You can get started with <command "
songdongsheng@658 5994 "role=\"hg-cmd\">hg serve</command> in moments, by reading <xref linkend=\"sec:"
songdongsheng@658 5995 "collab:serve\"/> below. Then simply tell the person next to you that you're "
songdongsheng@658 5996 "running a server, send the URL to them in an instant message, and you "
songdongsheng@658 5997 "immediately have a quick-turnaround way to work together. They can type your "
songdongsheng@658 5998 "URL into their web browser and quickly review your changes; or they can pull "
songdongsheng@658 5999 "a bugfix from you and verify it; or they can clone a branch containing a new "
songdongsheng@658 6000 "feature and try it out."
dongsheng@627 6001 msgstr ""
dongsheng@627 6002
dongsheng@627 6003 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 6004 #: ../en/ch05-collab.xml:132
dongsheng@627 6005 msgid ""
dongsheng@627 6006 "The charm, and the problem, with doing things in an ad hoc fashion like this "
dongsheng@627 6007 "is that only people who know about your changes, and where they are, can see "
dongsheng@627 6008 "them. Such an informal approach simply doesn't scale beyond a handful "
dongsheng@627 6009 "people, because each individual needs to know about $n$ different "
dongsheng@627 6010 "repositories to pull from."
dongsheng@627 6011 msgstr ""
dongsheng@627 6012
dongsheng@627 6013 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 6014 #: ../en/ch05-collab.xml:141
dongsheng@627 6015 msgid "A single central repository"
dongsheng@630 6016 msgstr "单一中央版本库"
dongsheng@627 6017
dongsheng@627 6018 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 6019 #: ../en/ch05-collab.xml:143
dongsheng@627 6020 msgid ""
dongsheng@627 6021 "For smaller projects migrating from a centralised revision control tool, "
dongsheng@627 6022 "perhaps the easiest way to get started is to have changes flow through a "
dongsheng@627 6023 "single shared central repository. This is also the most common "
dongsheng@627 6024 "<quote>building block</quote> for more ambitious workflow schemes."
dongsheng@627 6025 msgstr ""
dongsheng@627 6026
dongsheng@627 6027 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 6028 #: ../en/ch05-collab.xml:149
dongsheng@627 6029 msgid ""
dongsheng@627 6030 "Contributors start by cloning a copy of this repository. They can pull "
dongsheng@627 6031 "changes from it whenever they need to, and some (perhaps all) developers have "
dongsheng@627 6032 "permission to push a change back when they're ready for other people to see "
dongsheng@627 6033 "it."
dongsheng@627 6034 msgstr ""
dongsheng@627 6035
dongsheng@627 6036 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 6037 #: ../en/ch05-collab.xml:154
dongsheng@627 6038 msgid ""
dongsheng@627 6039 "Under this model, it can still often make sense for people to pull changes "
dongsheng@627 6040 "directly from each other, without going through the central repository. "
dongsheng@627 6041 "Consider a case in which I have a tentative bug fix, but I am worried that if "
dongsheng@627 6042 "I were to publish it to the central repository, it might subsequently break "
dongsheng@627 6043 "everyone else's trees as they pull it. To reduce the potential for damage, I "
dongsheng@627 6044 "can ask you to clone my repository into a temporary repository of your own "
dongsheng@627 6045 "and test it. This lets us put off publishing the potentially unsafe change "
dongsheng@627 6046 "until it has had a little testing."
dongsheng@627 6047 msgstr ""
dongsheng@627 6048
dongsheng@627 6049 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 6050 #: ../en/ch05-collab.xml:165
dongsheng@627 6051 msgid ""
dongsheng@627 6052 "In this kind of scenario, people usually use the <command>ssh</command> "
dongsheng@627 6053 "protocol to securely push changes to the central repository, as documented in "
songdongsheng@658 6054 "<xref linkend=\"sec:collab:ssh\"/>. It's also usual to publish a read-only "
songdongsheng@658 6055 "copy of the repository over HTTP using CGI, as in <xref linkend=\"sec:collab:"
songdongsheng@658 6056 "cgi\"/>. Publishing over HTTP satisfies the needs of people who don't have "
songdongsheng@658 6057 "push access, and those who want to use web browsers to browse the "
songdongsheng@658 6058 "repository's history."
dongsheng@627 6059 msgstr ""
dongsheng@627 6060
dongsheng@627 6061 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6062 #: ../en/ch05-collab.xml:177
dongsheng@627 6063 msgid "Working with multiple branches"
dongsheng@630 6064 msgstr "使用多个分支工作"
dongsheng@627 6065
dongsheng@627 6066 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6067 #: ../en/ch05-collab.xml:179
dongsheng@627 6068 msgid ""
dongsheng@627 6069 "Projects of any significant size naturally tend to make progress on several "
dongsheng@627 6070 "fronts simultaneously. In the case of software, it's common for a project to "
dongsheng@627 6071 "go through periodic official releases. A release might then go into "
dongsheng@627 6072 "<quote>maintenance mode</quote> for a while after its first publication; "
dongsheng@627 6073 "maintenance releases tend to contain only bug fixes, not new features. In "
dongsheng@627 6074 "parallel with these maintenance releases, one or more future releases may be "
dongsheng@627 6075 "under development. People normally use the word <quote>branch</quote> to "
dongsheng@627 6076 "refer to one of these many slightly different directions in which development "
dongsheng@627 6077 "is proceeding."
dongsheng@627 6078 msgstr ""
dongsheng@627 6079
dongsheng@627 6080 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6081 #: ../en/ch05-collab.xml:192
dongsheng@627 6082 msgid ""
dongsheng@627 6083 "Mercurial is particularly well suited to managing a number of simultaneous, "
dongsheng@627 6084 "but not identical, branches. Each <quote>development direction</quote> can "
dongsheng@627 6085 "live in its own central repository, and you can merge changes from one to "
dongsheng@627 6086 "another as the need arises. Because repositories are independent of each "
dongsheng@627 6087 "other, unstable changes in a development branch will never affect a stable "
dongsheng@627 6088 "branch unless someone explicitly merges those changes in."
dongsheng@627 6089 msgstr ""
dongsheng@627 6090
dongsheng@627 6091 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6092 #: ../en/ch05-collab.xml:201
dongsheng@627 6093 msgid ""
dongsheng@627 6094 "Here's an example of how this can work in practice. Let's say you have one "
dongsheng@627 6095 "<quote>main branch</quote> on a central server."
dongsheng@627 6096 msgstr ""
dongsheng@627 6097
dongsheng@627 6098 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6099 #: ../en/ch05-collab.xml:207
dongsheng@627 6100 msgid "People clone it, make changes locally, test them, and push them back."
dongsheng@627 6101 msgstr ""
dongsheng@627 6102
dongsheng@627 6103 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6104 #: ../en/ch05-collab.xml:210
dongsheng@627 6105 msgid ""
dongsheng@627 6106 "Once the main branch reaches a release milestone, you can use the <command "
dongsheng@627 6107 "role=\"hg-cmd\">hg tag</command> command to give a permanent name to the "
dongsheng@627 6108 "milestone revision."
dongsheng@627 6109 msgstr ""
dongsheng@627 6110
dongsheng@627 6111 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6112 #: ../en/ch05-collab.xml:216
dongsheng@627 6113 msgid "Let's say some ongoing development occurs on the main branch."
dongsheng@627 6114 msgstr ""
dongsheng@627 6115
dongsheng@627 6116 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6117 #: ../en/ch05-collab.xml:221
dongsheng@627 6118 msgid ""
dongsheng@627 6119 "Using the tag that was recorded at the milestone, people who clone that "
dongsheng@627 6120 "repository at any time in the future can use <command role=\"hg-cmd\">hg "
dongsheng@627 6121 "update</command> to get a copy of the working directory exactly as it was "
dongsheng@627 6122 "when that tagged revision was committed."
dongsheng@627 6123 msgstr ""
dongsheng@627 6124
dongsheng@627 6125 #
dongsheng@627 6126 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6127 #: ../en/ch05-collab.xml:229
dongsheng@627 6128 msgid ""
dongsheng@627 6129 "In addition, immediately after the main branch is tagged, someone can then "
dongsheng@627 6130 "clone the main branch on the server to a new <quote>stable</quote> branch, "
dongsheng@627 6131 "also on the server."
dongsheng@627 6132 msgstr ""
dongsheng@627 6133
dongsheng@627 6134 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6135 #: ../en/ch05-collab.xml:235
dongsheng@627 6136 msgid ""
dongsheng@627 6137 "Someone who needs to make a change to the stable branch can then clone "
dongsheng@627 6138 "<emphasis>that</emphasis> repository, make their changes, commit, and push "
dongsheng@627 6139 "their changes back there."
dongsheng@627 6140 msgstr ""
dongsheng@627 6141
dongsheng@627 6142 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6143 #: ../en/ch05-collab.xml:241
dongsheng@627 6144 msgid ""
dongsheng@627 6145 "Because Mercurial repositories are independent, and Mercurial doesn't move "
dongsheng@627 6146 "changes around automatically, the stable and main branches are "
dongsheng@627 6147 "<emphasis>isolated</emphasis> from each other. The changes that you made on "
dongsheng@627 6148 "the main branch don't <quote>leak</quote> to the stable branch, and vice "
dongsheng@627 6149 "versa."
dongsheng@627 6150 msgstr ""
dongsheng@627 6151
dongsheng@627 6152 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6153 #: ../en/ch05-collab.xml:248
dongsheng@627 6154 msgid ""
dongsheng@627 6155 "You'll often want all of your bugfixes on the stable branch to show up on the "
dongsheng@627 6156 "main branch, too. Rather than rewrite a bugfix on the main branch, you can "
dongsheng@627 6157 "simply pull and merge changes from the stable to the main branch, and "
dongsheng@627 6158 "Mercurial will bring those bugfixes in for you."
dongsheng@627 6159 msgstr ""
dongsheng@627 6160
dongsheng@627 6161 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6162 #: ../en/ch05-collab.xml:256
dongsheng@627 6163 msgid ""
dongsheng@627 6164 "The main branch will still contain changes that are not on the stable branch, "
dongsheng@627 6165 "but it will also contain all of the bugfixes from the stable branch. The "
dongsheng@627 6166 "stable branch remains unaffected by these changes."
dongsheng@627 6167 msgstr ""
dongsheng@627 6168
songdongsheng@658 6169 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 6170 #: ../en/ch05-collab.xml:263 ../en/ch05-collab.xml:273
dongsheng@627 6171 msgid "Feature branches"
dongsheng@630 6172 msgstr "特性分支"
dongsheng@627 6173
dongsheng@627 6174 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6175 #: ../en/ch05-collab.xml:265
dongsheng@627 6176 msgid ""
dongsheng@627 6177 "For larger projects, an effective way to manage change is to break up a team "
dongsheng@627 6178 "into smaller groups. Each group has a shared branch of its own, cloned from "
dongsheng@627 6179 "a single <quote>master</quote> branch used by the entire project. People "
dongsheng@627 6180 "working on an individual branch are typically quite isolated from "
dongsheng@627 6181 "developments on other branches."
dongsheng@627 6182 msgstr ""
dongsheng@627 6183
songdongsheng@658 6184 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
dongsheng@650 6185 #: ../en/ch05-collab.xml:275
dongsheng@641 6186 msgid ""
songdongsheng@658 6187 "<imageobject><imagedata width=\"100%\" fileref=\"figs/feature-branches.png\"/"
songdongsheng@658 6188 "></imageobject>"
songdongsheng@658 6189 msgstr ""
songdongsheng@658 6190
songdongsheng@658 6191 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6192 #: ../en/ch05-collab.xml:280
dongsheng@627 6193 msgid ""
dongsheng@627 6194 "When a particular feature is deemed to be in suitable shape, someone on that "
dongsheng@627 6195 "feature team pulls and merges from the master branch into the feature branch, "
dongsheng@627 6196 "then pushes back up to the master branch."
dongsheng@627 6197 msgstr ""
dongsheng@627 6198
dongsheng@627 6199 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6200 #: ../en/ch05-collab.xml:287
dongsheng@627 6201 msgid "The release train"
dongsheng@630 6202 msgstr "发布列车"
dongsheng@627 6203
dongsheng@627 6204 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6205 #: ../en/ch05-collab.xml:289
dongsheng@627 6206 msgid ""
dongsheng@627 6207 "Some projects are organised on a <quote>train</quote> basis: a release is "
dongsheng@627 6208 "scheduled to happen every few months, and whatever features are ready when "
dongsheng@627 6209 "the <quote>train</quote> is ready to leave are allowed in."
dongsheng@627 6210 msgstr ""
dongsheng@627 6211
dongsheng@627 6212 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6213 #: ../en/ch05-collab.xml:294
dongsheng@627 6214 msgid ""
dongsheng@627 6215 "This model resembles working with feature branches. The difference is that "
dongsheng@627 6216 "when a feature branch misses a train, someone on the feature team pulls and "
dongsheng@627 6217 "merges the changes that went out on that train release into the feature "
dongsheng@627 6218 "branch, and the team continues its work on top of that release so that their "
dongsheng@627 6219 "feature can make the next release."
dongsheng@627 6220 msgstr ""
dongsheng@627 6221
dongsheng@627 6222 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6223 #: ../en/ch05-collab.xml:303
dongsheng@627 6224 msgid "The Linux kernel model"
dongsheng@630 6225 msgstr "Linux 内核模型"
dongsheng@627 6226
dongsheng@627 6227 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6228 #: ../en/ch05-collab.xml:305
dongsheng@627 6229 msgid ""
dongsheng@627 6230 "The development of the Linux kernel has a shallow hierarchical structure, "
dongsheng@627 6231 "surrounded by a cloud of apparent chaos. Because most Linux developers use "
dongsheng@627 6232 "<command>git</command>, a distributed revision control tool with capabilities "
dongsheng@627 6233 "similar to Mercurial, it's useful to describe the way work flows in that "
dongsheng@627 6234 "environment; if you like the ideas, the approach translates well across tools."
dongsheng@627 6235 msgstr ""
dongsheng@627 6236
dongsheng@627 6237 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6238 #: ../en/ch05-collab.xml:313
dongsheng@627 6239 msgid ""
dongsheng@627 6240 "At the center of the community sits Linus Torvalds, the creator of Linux. He "
dongsheng@627 6241 "publishes a single source repository that is considered the "
dongsheng@627 6242 "<quote>authoritative</quote> current tree by the entire developer community. "
dongsheng@627 6243 "Anyone can clone Linus's tree, but he is very choosy about whose trees he "
dongsheng@627 6244 "pulls from."
dongsheng@627 6245 msgstr ""
dongsheng@627 6246
dongsheng@627 6247 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6248 #: ../en/ch05-collab.xml:320
dongsheng@627 6249 msgid ""
dongsheng@627 6250 "Linus has a number of <quote>trusted lieutenants</quote>. As a general rule, "
dongsheng@627 6251 "he pulls whatever changes they publish, in most cases without even reviewing "
dongsheng@627 6252 "those changes. Some of those lieutenants are generally agreed to be "
dongsheng@627 6253 "<quote>maintainers</quote>, responsible for specific subsystems within the "
dongsheng@627 6254 "kernel. If a random kernel hacker wants to make a change to a subsystem that "
dongsheng@627 6255 "they want to end up in Linus's tree, they must find out who the subsystem's "
dongsheng@627 6256 "maintainer is, and ask that maintainer to take their change. If the "
dongsheng@627 6257 "maintainer reviews their changes and agrees to take them, they'll pass them "
dongsheng@627 6258 "along to Linus in due course."
dongsheng@627 6259 msgstr ""
dongsheng@627 6260
dongsheng@627 6261 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6262 #: ../en/ch05-collab.xml:332
dongsheng@627 6263 msgid ""
dongsheng@627 6264 "Individual lieutenants have their own approaches to reviewing, accepting, and "
dongsheng@627 6265 "publishing changes; and for deciding when to feed them to Linus. In "
dongsheng@627 6266 "addition, there are several well known branches that people use for different "
dongsheng@627 6267 "purposes. For example, a few people maintain <quote>stable</quote> "
dongsheng@627 6268 "repositories of older versions of the kernel, to which they apply critical "
dongsheng@627 6269 "fixes as needed. Some maintainers publish multiple trees: one for "
dongsheng@627 6270 "experimental changes; one for changes that they are about to feed upstream; "
dongsheng@627 6271 "and so on. Others just publish a single tree."
dongsheng@627 6272 msgstr ""
dongsheng@627 6273
dongsheng@627 6274 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6275 #: ../en/ch05-collab.xml:343
dongsheng@627 6276 msgid ""
dongsheng@627 6277 "This model has two notable features. The first is that it's <quote>pull "
dongsheng@627 6278 "only</quote>. You have to ask, convince, or beg another developer to take a "
dongsheng@627 6279 "change from you, because there are almost no trees to which more than one "
dongsheng@627 6280 "person can push, and there's no way to push changes into a tree that someone "
dongsheng@627 6281 "else controls."
dongsheng@627 6282 msgstr ""
dongsheng@627 6283
dongsheng@627 6284 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6285 #: ../en/ch05-collab.xml:350
dongsheng@627 6286 msgid ""
dongsheng@627 6287 "The second is that it's based on reputation and acclaim. If you're an "
dongsheng@627 6288 "unknown, Linus will probably ignore changes from you without even "
dongsheng@627 6289 "responding. But a subsystem maintainer will probably review them, and will "
dongsheng@627 6290 "likely take them if they pass their criteria for suitability. The more "
dongsheng@627 6291 "<quote>good</quote> changes you contribute to a maintainer, the more likely "
dongsheng@627 6292 "they are to trust your judgment and accept your changes. If you're well-"
dongsheng@627 6293 "known and maintain a long-lived branch for something Linus hasn't yet "
dongsheng@627 6294 "accepted, people with similar interests may pull your changes regularly to "
dongsheng@627 6295 "keep up with your work."
dongsheng@627 6296 msgstr ""
dongsheng@627 6297
dongsheng@627 6298 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6299 #: ../en/ch05-collab.xml:361
dongsheng@627 6300 msgid ""
dongsheng@627 6301 "Reputation and acclaim don't necessarily cross subsystem or <quote>people</"
dongsheng@627 6302 "quote> boundaries. If you're a respected but specialised storage hacker, and "
dongsheng@627 6303 "you try to fix a networking bug, that change will receive a level of scrutiny "
dongsheng@627 6304 "from a network maintainer comparable to a change from a complete stranger."
dongsheng@627 6305 msgstr ""
dongsheng@627 6306
dongsheng@627 6307 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6308 #: ../en/ch05-collab.xml:368
dongsheng@627 6309 msgid ""
dongsheng@627 6310 "To people who come from more orderly project backgrounds, the comparatively "
dongsheng@627 6311 "chaotic Linux kernel development process often seems completely insane. It's "
dongsheng@627 6312 "subject to the whims of individuals; people make sweeping changes whenever "
dongsheng@627 6313 "they deem it appropriate; and the pace of development is astounding. And yet "
dongsheng@627 6314 "Linux is a highly successful, well-regarded piece of software."
dongsheng@627 6315 msgstr ""
dongsheng@627 6316
dongsheng@627 6317 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6318 #: ../en/ch05-collab.xml:378
dongsheng@627 6319 msgid "Pull-only versus shared-push collaboration"
dongsheng@630 6320 msgstr "只读与共享写协作"
dongsheng@627 6321
dongsheng@627 6322 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6323 #: ../en/ch05-collab.xml:380
dongsheng@627 6324 msgid ""
dongsheng@627 6325 "A perpetual source of heat in the open source community is whether a "
dongsheng@627 6326 "development model in which people only ever pull changes from others is "
dongsheng@627 6327 "<quote>better than</quote> one in which multiple people can push changes to a "
dongsheng@627 6328 "shared repository."
dongsheng@627 6329 msgstr ""
dongsheng@627 6330
dongsheng@627 6331 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6332 #: ../en/ch05-collab.xml:386
dongsheng@627 6333 msgid ""
dongsheng@627 6334 "Typically, the backers of the shared-push model use tools that actively "
dongsheng@627 6335 "enforce this approach. If you're using a centralised revision control tool "
dongsheng@627 6336 "such as Subversion, there's no way to make a choice over which model you'll "
dongsheng@627 6337 "use: the tool gives you shared-push, and if you want to do anything else, "
dongsheng@627 6338 "you'll have to roll your own approach on top (such as applying a patch by "
dongsheng@627 6339 "hand)."
dongsheng@627 6340 msgstr ""
dongsheng@627 6341
dongsheng@627 6342 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6343 #: ../en/ch05-collab.xml:394
dongsheng@627 6344 msgid ""
dongsheng@627 6345 "A good distributed revision control tool, such as Mercurial, will support "
dongsheng@627 6346 "both models. You and your collaborators can then structure how you work "
dongsheng@627 6347 "together based on your own needs and preferences, not on what contortions "
dongsheng@627 6348 "your tools force you into."
dongsheng@627 6349 msgstr ""
dongsheng@627 6350
dongsheng@627 6351 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6352 #: ../en/ch05-collab.xml:402
dongsheng@627 6353 msgid "Where collaboration meets branch management"
dongsheng@630 6354 msgstr "协作与分支管理"
dongsheng@627 6355
dongsheng@627 6356 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6357 #: ../en/ch05-collab.xml:404
dongsheng@627 6358 msgid ""
dongsheng@627 6359 "Once you and your team set up some shared repositories and start propagating "
dongsheng@627 6360 "changes back and forth between local and shared repos, you begin to face a "
dongsheng@627 6361 "related, but slightly different challenge: that of managing the multiple "
dongsheng@627 6362 "directions in which your team may be moving at once. Even though this "
dongsheng@627 6363 "subject is intimately related to how your team collaborates, it's dense "
songdongsheng@658 6364 "enough to merit treatment of its own, in <xref linkend=\"chap:branch\"/>."
dongsheng@627 6365 msgstr ""
dongsheng@627 6366
dongsheng@627 6367 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 6368 #: ../en/ch05-collab.xml:416
dongsheng@627 6369 msgid "The technical side of sharing"
dongsheng@630 6370 msgstr "共享的技术因素"
dongsheng@627 6371
dongsheng@627 6372 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6373 #: ../en/ch05-collab.xml:418
dongsheng@627 6374 msgid ""
dongsheng@627 6375 "The remainder of this chapter is devoted to the question of serving data to "
dongsheng@627 6376 "your collaborators."
dongsheng@627 6377 msgstr ""
dongsheng@627 6378
dongsheng@627 6379 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 6380 #: ../en/ch05-collab.xml:423
dongsheng@627 6381 msgid "Informal sharing with <command role=\"hg-cmd\">hg serve</command>"
dongsheng@630 6382 msgstr "使用 <command role=\"hg-cmd\">hg serve</command> 进行非正式共享"
dongsheng@627 6383
dongsheng@627 6384 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6385 #: ../en/ch05-collab.xml:426
dongsheng@627 6386 msgid ""
dongsheng@627 6387 "Mercurial's <command role=\"hg-cmd\">hg serve</command> command is "
dongsheng@627 6388 "wonderfully suited to small, tight-knit, and fast-paced group environments. "
dongsheng@627 6389 "It also provides a great way to get a feel for using Mercurial commands over "
dongsheng@627 6390 "a network."
dongsheng@627 6391 msgstr ""
dongsheng@627 6392
dongsheng@627 6393 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6394 #: ../en/ch05-collab.xml:431
dongsheng@627 6395 msgid ""
dongsheng@627 6396 "Run <command role=\"hg-cmd\">hg serve</command> inside a repository, and in "
dongsheng@627 6397 "under a second it will bring up a specialised HTTP server; this will accept "
dongsheng@627 6398 "connections from any client, and serve up data for that repository until you "
dongsheng@627 6399 "terminate it. Anyone who knows the URL of the server you just started, and "
dongsheng@627 6400 "can talk to your computer over the network, can then use a web browser or "
dongsheng@627 6401 "Mercurial to read data from that repository. A URL for a <command role=\"hg-"
dongsheng@627 6402 "cmd\">hg serve</command> instance running on a laptop is likely to look "
dongsheng@627 6403 "something like <literal>http://my-laptop.local:8000/</literal>."
dongsheng@627 6404 msgstr ""
dongsheng@627 6405
dongsheng@627 6406 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6407 #: ../en/ch05-collab.xml:442
dongsheng@627 6408 msgid ""
dongsheng@627 6409 "The <command role=\"hg-cmd\">hg serve</command> command is <emphasis>not</"
dongsheng@627 6410 "emphasis> a general-purpose web server. It can do only two things:"
dongsheng@627 6411 msgstr ""
dongsheng@627 6412
dongsheng@627 6413 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 6414 #: ../en/ch05-collab.xml:446
dongsheng@627 6415 msgid ""
dongsheng@627 6416 "Allow people to browse the history of the repository it's serving, from their "
dongsheng@627 6417 "normal web browsers."
dongsheng@627 6418 msgstr ""
dongsheng@627 6419
dongsheng@627 6420 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 6421 #: ../en/ch05-collab.xml:450
dongsheng@627 6422 msgid ""
dongsheng@627 6423 "Speak Mercurial's wire protocol, so that people can <command role=\"hg-cmd"
dongsheng@627 6424 "\">hg clone</command> or <command role=\"hg-cmd\">hg pull</command> changes "
dongsheng@627 6425 "from that repository."
dongsheng@627 6426 msgstr ""
dongsheng@627 6427
dongsheng@627 6428 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6429 #: ../en/ch05-collab.xml:455
dongsheng@627 6430 msgid ""
dongsheng@627 6431 "In particular, <command role=\"hg-cmd\">hg serve</command> won't allow remote "
dongsheng@627 6432 "users to <emphasis>modify</emphasis> your repository. It's intended for read-"
dongsheng@627 6433 "only use."
dongsheng@627 6434 msgstr ""
dongsheng@627 6435
dongsheng@627 6436 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6437 #: ../en/ch05-collab.xml:459
dongsheng@627 6438 msgid ""
dongsheng@627 6439 "If you're getting started with Mercurial, there's nothing to prevent you from "
dongsheng@627 6440 "using <command role=\"hg-cmd\">hg serve</command> to serve up a repository on "
dongsheng@627 6441 "your own computer, then use commands like <command role=\"hg-cmd\">hg clone</"
dongsheng@627 6442 "command>, <command role=\"hg-cmd\">hg incoming</command>, and so on to talk "
dongsheng@627 6443 "to that server as if the repository was hosted remotely. This can help you to "
dongsheng@627 6444 "quickly get acquainted with using commands on network-hosted repositories."
dongsheng@627 6445 msgstr ""
dongsheng@627 6446
dongsheng@627 6447 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6448 #: ../en/ch05-collab.xml:469
dongsheng@627 6449 msgid "A few things to keep in mind"
dongsheng@630 6450 msgstr "要牢记的几件事"
dongsheng@627 6451
dongsheng@627 6452 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6453 #: ../en/ch05-collab.xml:471
dongsheng@627 6454 msgid ""
dongsheng@627 6455 "Because it provides unauthenticated read access to all clients, you should "
dongsheng@627 6456 "only use <command role=\"hg-cmd\">hg serve</command> in an environment where "
dongsheng@627 6457 "you either don't care, or have complete control over, who can access your "
dongsheng@627 6458 "network and pull data from your repository."
dongsheng@627 6459 msgstr ""
dongsheng@627 6460
dongsheng@627 6461 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6462 #: ../en/ch05-collab.xml:477
dongsheng@627 6463 msgid ""
dongsheng@627 6464 "The <command role=\"hg-cmd\">hg serve</command> command knows nothing about "
dongsheng@627 6465 "any firewall software you might have installed on your system or network. It "
dongsheng@627 6466 "cannot detect or control your firewall software. If other people are unable "
dongsheng@627 6467 "to talk to a running <command role=\"hg-cmd\">hg serve</command> instance, "
dongsheng@627 6468 "the second thing you should do (<emphasis>after</emphasis> you make sure that "
dongsheng@627 6469 "they're using the correct URL) is check your firewall configuration."
dongsheng@627 6470 msgstr ""
dongsheng@627 6471
dongsheng@627 6472 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6473 #: ../en/ch05-collab.xml:486
dongsheng@627 6474 msgid ""
dongsheng@627 6475 "By default, <command role=\"hg-cmd\">hg serve</command> listens for incoming "
dongsheng@627 6476 "connections on port 8000. If another process is already listening on the "
dongsheng@627 6477 "port you want to use, you can specify a different port to listen on using the "
dongsheng@627 6478 "<option role=\"hg-opt-serve\">-p</option> option."
dongsheng@627 6479 msgstr ""
dongsheng@627 6480
dongsheng@627 6481 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6482 #: ../en/ch05-collab.xml:492
dongsheng@627 6483 msgid ""
dongsheng@627 6484 "Normally, when <command role=\"hg-cmd\">hg serve</command> starts, it prints "
dongsheng@627 6485 "no output, which can be a bit unnerving. If you'd like to confirm that it is "
dongsheng@627 6486 "indeed running correctly, and find out what URL you should send to your "
dongsheng@627 6487 "collaborators, start it with the <option role=\"hg-opt-global\">-v</option> "
dongsheng@627 6488 "option."
dongsheng@627 6489 msgstr ""
dongsheng@627 6490
dongsheng@627 6491 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 6492 #: ../en/ch05-collab.xml:502
dongsheng@627 6493 msgid "Using the Secure Shell (ssh) protocol"
dongsheng@630 6494 msgstr "使用 ssh 协议"
dongsheng@627 6495
dongsheng@627 6496 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6497 #: ../en/ch05-collab.xml:504
dongsheng@627 6498 msgid ""
dongsheng@627 6499 "You can pull and push changes securely over a network connection using the "
dongsheng@627 6500 "Secure Shell (<literal>ssh</literal>) protocol. To use this successfully, "
dongsheng@627 6501 "you may have to do a little bit of configuration on the client or server "
dongsheng@627 6502 "sides."
dongsheng@627 6503 msgstr ""
dongsheng@627 6504
dongsheng@627 6505 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6506 #: ../en/ch05-collab.xml:509
dongsheng@627 6507 msgid ""
dongsheng@627 6508 "If you're not familiar with ssh, it's a network protocol that lets you "
dongsheng@627 6509 "securely communicate with another computer. To use it with Mercurial, you'll "
dongsheng@627 6510 "be setting up one or more user accounts on a server so that remote users can "
dongsheng@627 6511 "log in and execute commands."
dongsheng@627 6512 msgstr ""
dongsheng@627 6513
dongsheng@627 6514 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 6515 #: ../en/ch05-collab.xml:515
dongsheng@627 6516 msgid ""
dongsheng@627 6517 "(If you <emphasis>are</emphasis> familiar with ssh, you'll probably find some "
dongsheng@627 6518 "of the material that follows to be elementary in nature.)"
dongsheng@627 6519 msgstr ""
dongsheng@627 6520
dongsheng@627 6521 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6522 #: ../en/ch05-collab.xml:520
dongsheng@627 6523 msgid "How to read and write ssh URLs"
dongsheng@630 6524 msgstr "如何读写 ssh 路径"
dongsheng@627 6525
dongsheng@627 6526 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6527 #: ../en/ch05-collab.xml:522
songdongsheng@658 6528 msgid "An ssh URL tends to look like this:"
songdongsheng@658 6529 msgstr ""
songdongsheng@658 6530
songdongsheng@658 6531 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
dongsheng@650 6532 #: ../en/ch05-collab.xml:525
songdongsheng@658 6533 msgid ""
songdongsheng@658 6534 "The <quote><literal>ssh://</literal></quote> part tells Mercurial to use the "
songdongsheng@658 6535 "ssh protocol."
dongsheng@627 6536 msgstr ""
dongsheng@627 6537
dongsheng@627 6538 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
dongsheng@650 6539 #: ../en/ch05-collab.xml:528
dongsheng@627 6540 msgid ""
dongsheng@627 6541 "The <quote><literal>bos@</literal></quote> component indicates what username "
dongsheng@627 6542 "to log into the server as. You can leave this out if the remote username is "
dongsheng@627 6543 "the same as your local username."
dongsheng@627 6544 msgstr ""
dongsheng@627 6545
dongsheng@627 6546 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 6547 #: ../en/ch05-collab.xml:533
dongsheng@627 6548 msgid ""
dongsheng@627 6549 "The <quote><literal>hg.serpentine.com</literal></quote> gives the hostname of "
dongsheng@627 6550 "the server to log into."
dongsheng@627 6551 msgstr ""
dongsheng@627 6552
dongsheng@627 6553 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 6554 #: ../en/ch05-collab.xml:537
dongsheng@627 6555 msgid ""
dongsheng@627 6556 "The <quote>:22</quote> identifies the port number to connect to the server "
dongsheng@650 6557 "on. The default port is 22, so you only need to specify a colon and port "
dongsheng@650 6558 "number if you're <emphasis>not</emphasis> using port 22."
dongsheng@627 6559 msgstr ""
dongsheng@627 6560
dongsheng@627 6561 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 6562 #: ../en/ch05-collab.xml:542
dongsheng@627 6563 msgid ""
dongsheng@627 6564 "The remainder of the URL is the local path to the repository on the server."
dongsheng@627 6565 msgstr ""
dongsheng@627 6566
dongsheng@627 6567 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6568 #: ../en/ch05-collab.xml:546
dongsheng@627 6569 msgid ""
dongsheng@627 6570 "There's plenty of scope for confusion with the path component of ssh URLs, as "
dongsheng@627 6571 "there is no standard way for tools to interpret it. Some programs behave "
dongsheng@627 6572 "differently than others when dealing with these paths. This isn't an ideal "
dongsheng@627 6573 "situation, but it's unlikely to change. Please read the following paragraphs "
dongsheng@627 6574 "carefully."
dongsheng@627 6575 msgstr ""
dongsheng@627 6576
dongsheng@627 6577 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6578 #: ../en/ch05-collab.xml:553
dongsheng@627 6579 msgid ""
dongsheng@627 6580 "Mercurial treats the path to a repository on the server as relative to the "
dongsheng@627 6581 "remote user's home directory. For example, if user <literal>foo</literal> on "
dongsheng@627 6582 "the server has a home directory of <filename class=\"directory\">/home/foo</"
dongsheng@627 6583 "filename>, then an ssh URL that contains a path component of <filename class="
dongsheng@627 6584 "\"directory\">bar</filename> <emphasis>really</emphasis> refers to the "
dongsheng@627 6585 "directory <filename class=\"directory\">/home/foo/bar</filename>."
dongsheng@627 6586 msgstr ""
dongsheng@627 6587
dongsheng@627 6588 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6589 #: ../en/ch05-collab.xml:562
dongsheng@627 6590 msgid ""
dongsheng@627 6591 "If you want to specify a path relative to another user's home directory, you "
dongsheng@627 6592 "can use a path that starts with a tilde character followed by the user's name "
dongsheng@627 6593 "(let's call them <literal>otheruser</literal>), like this."
dongsheng@627 6594 msgstr ""
dongsheng@627 6595
dongsheng@627 6596 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6597 #: ../en/ch05-collab.xml:568
dongsheng@627 6598 msgid ""
dongsheng@627 6599 "And if you really want to specify an <emphasis>absolute</emphasis> path on "
dongsheng@627 6600 "the server, begin the path component with two slashes, as in this example."
dongsheng@627 6601 msgstr ""
dongsheng@627 6602
dongsheng@627 6603 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6604 #: ../en/ch05-collab.xml:575
dongsheng@627 6605 msgid "Finding an ssh client for your system"
dongsheng@630 6606 msgstr "为你的系统寻找 ssh 客户端"
dongsheng@627 6607
dongsheng@627 6608 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6609 #: ../en/ch05-collab.xml:577
dongsheng@627 6610 msgid ""
dongsheng@627 6611 "Almost every Unix-like system comes with OpenSSH preinstalled. If you're "
dongsheng@627 6612 "using such a system, run <literal>which ssh</literal> to find out if the "
dongsheng@627 6613 "<command>ssh</command> command is installed (it's usually in <filename class="
dongsheng@627 6614 "\"directory\">/usr/bin</filename>). In the unlikely event that it isn't "
dongsheng@627 6615 "present, take a look at your system documentation to figure out how to "
dongsheng@627 6616 "install it."
dongsheng@627 6617 msgstr ""
dongsheng@627 6618
dongsheng@627 6619 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6620 #: ../en/ch05-collab.xml:585
dongsheng@627 6621 msgid ""
dongsheng@627 6622 "On Windows, you'll first need to download a suitable ssh client. There are "
dongsheng@627 6623 "two alternatives."
dongsheng@627 6624 msgstr ""
dongsheng@627 6625
dongsheng@627 6626 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6627 #: ../en/ch05-collab.xml:588
dongsheng@627 6628 msgid ""
dongsheng@627 6629 "Simon Tatham's excellent PuTTY package <citation>web:putty</citation> "
dongsheng@627 6630 "provides a complete suite of ssh client commands."
dongsheng@627 6631 msgstr ""
dongsheng@627 6632
dongsheng@627 6633 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6634 #: ../en/ch05-collab.xml:592
songdongsheng@658 6635 msgid ""
songdongsheng@658 6636 "If you have a high tolerance for pain, you can use the Cygwin port of OpenSSH."
songdongsheng@658 6637 msgstr ""
songdongsheng@658 6638
songdongsheng@658 6639 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 6640 #: ../en/ch05-collab.xml:595
dongsheng@627 6641 msgid ""
dongsheng@650 6642 "In either case, you'll need to edit your <filename role=\"special\">hg.ini</"
dongsheng@650 6643 "filename> file to tell Mercurial where to find the actual client command. "
dongsheng@650 6644 "For example, if you're using PuTTY, you'll need to use the <command>plink</"
dongsheng@650 6645 "command> command as a command-line ssh client."
dongsheng@627 6646 msgstr ""
dongsheng@627 6647
dongsheng@627 6648 #. type: Content of: <book><chapter><sect1><sect2><note><para>
songdongsheng@658 6649 #: ../en/ch05-collab.xml:605
dongsheng@627 6650 msgid ""
dongsheng@627 6651 "The path to <command>plink</command> shouldn't contain any whitespace "
dongsheng@627 6652 "characters, or Mercurial may not be able to run it correctly (so putting it "
dongsheng@650 6653 "in <filename class=\"directory\">C:\\Program Files</filename> is probably not "
dongsheng@650 6654 "a good idea)."
dongsheng@650 6655 msgstr ""
dongsheng@650 6656
dongsheng@650 6657 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6658 #: ../en/ch05-collab.xml:614
dongsheng@627 6659 msgid "Generating a key pair"
dongsheng@630 6660 msgstr "产生密钥对"
dongsheng@627 6661
dongsheng@627 6662 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6663 #: ../en/ch05-collab.xml:616
dongsheng@627 6664 msgid ""
dongsheng@627 6665 "To avoid the need to repetitively type a password every time you need to use "
dongsheng@627 6666 "your ssh client, I recommend generating a key pair. On a Unix-like system, "
dongsheng@627 6667 "the <command>ssh-keygen</command> command will do the trick. On Windows, if "
dongsheng@627 6668 "you're using PuTTY, the <command>puttygen</command> command is what you'll "
dongsheng@627 6669 "need."
dongsheng@627 6670 msgstr ""
dongsheng@627 6671
dongsheng@627 6672 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6673 #: ../en/ch05-collab.xml:624
dongsheng@627 6674 msgid ""
dongsheng@627 6675 "When you generate a key pair, it's usually <emphasis>highly</emphasis> "
dongsheng@627 6676 "advisable to protect it with a passphrase. (The only time that you might not "
dongsheng@627 6677 "want to do this is when you're using the ssh protocol for automated tasks on "
dongsheng@627 6678 "a secure network.)"
dongsheng@627 6679 msgstr ""
dongsheng@627 6680
dongsheng@627 6681 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6682 #: ../en/ch05-collab.xml:630
dongsheng@627 6683 msgid ""
dongsheng@627 6684 "Simply generating a key pair isn't enough, however. You'll need to add the "
dongsheng@627 6685 "public key to the set of authorised keys for whatever user you're logging in "
dongsheng@627 6686 "remotely as. For servers using OpenSSH (the vast majority), this will mean "
dongsheng@627 6687 "adding the public key to a list in a file called <filename role=\"special"
dongsheng@627 6688 "\">authorized_keys</filename> in their <filename role=\"special\" class="
dongsheng@627 6689 "\"directory\">.ssh</filename> directory."
dongsheng@627 6690 msgstr ""
dongsheng@627 6691
dongsheng@627 6692 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6693 #: ../en/ch05-collab.xml:639
dongsheng@627 6694 msgid ""
dongsheng@627 6695 "On a Unix-like system, your public key will have a <filename>.pub</filename> "
dongsheng@627 6696 "extension. If you're using <command>puttygen</command> on Windows, you can "
dongsheng@627 6697 "save the public key to a file of your choosing, or paste it from the window "
dongsheng@627 6698 "it's displayed in straight into the <filename role=\"special"
dongsheng@627 6699 "\">authorized_keys</filename> file."
dongsheng@627 6700 msgstr ""
dongsheng@627 6701
dongsheng@627 6702 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6703 #: ../en/ch05-collab.xml:648
dongsheng@627 6704 msgid "Using an authentication agent"
dongsheng@630 6705 msgstr "使用认证代理"
dongsheng@627 6706
dongsheng@627 6707 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6708 #: ../en/ch05-collab.xml:650
dongsheng@627 6709 msgid ""
dongsheng@627 6710 "An authentication agent is a daemon that stores passphrases in memory (so it "
dongsheng@627 6711 "will forget passphrases if you log out and log back in again). An ssh client "
dongsheng@627 6712 "will notice if it's running, and query it for a passphrase. If there's no "
dongsheng@627 6713 "authentication agent running, or the agent doesn't store the necessary "
dongsheng@627 6714 "passphrase, you'll have to type your passphrase every time Mercurial tries to "
dongsheng@627 6715 "communicate with a server on your behalf (e.g. whenever you pull or push "
dongsheng@627 6716 "changes)."
dongsheng@627 6717 msgstr ""
dongsheng@627 6718
dongsheng@627 6719 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6720 #: ../en/ch05-collab.xml:659
dongsheng@627 6721 msgid ""
dongsheng@627 6722 "The downside of storing passphrases in an agent is that it's possible for a "
dongsheng@627 6723 "well-prepared attacker to recover the plain text of your passphrases, in some "
dongsheng@627 6724 "cases even if your system has been power-cycled. You should make your own "
dongsheng@627 6725 "judgment as to whether this is an acceptable risk. It certainly saves a lot "
dongsheng@627 6726 "of repeated typing."
dongsheng@627 6727 msgstr ""
dongsheng@627 6728
dongsheng@627 6729 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6730 #: ../en/ch05-collab.xml:666
dongsheng@627 6731 msgid ""
dongsheng@627 6732 "On Unix-like systems, the agent is called <command>ssh-agent</command>, and "
dongsheng@627 6733 "it's often run automatically for you when you log in. You'll need to use the "
dongsheng@627 6734 "<command>ssh-add</command> command to add passphrases to the agent's store. "
dongsheng@627 6735 "On Windows, if you're using PuTTY, the <command>pageant</command> command "
dongsheng@627 6736 "acts as the agent. It adds an icon to your system tray that will let you "
dongsheng@627 6737 "manage stored passphrases."
dongsheng@627 6738 msgstr ""
dongsheng@627 6739
dongsheng@627 6740 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6741 #: ../en/ch05-collab.xml:677
dongsheng@627 6742 msgid "Configuring the server side properly"
dongsheng@630 6743 msgstr "正确配置服务器端"
dongsheng@627 6744
dongsheng@627 6745 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6746 #: ../en/ch05-collab.xml:679
dongsheng@627 6747 msgid ""
dongsheng@627 6748 "Because ssh can be fiddly to set up if you're new to it, there's a variety of "
dongsheng@627 6749 "things that can go wrong. Add Mercurial on top, and there's plenty more "
dongsheng@627 6750 "scope for head-scratching. Most of these potential problems occur on the "
dongsheng@627 6751 "server side, not the client side. The good news is that once you've gotten a "
dongsheng@627 6752 "configuration working, it will usually continue to work indefinitely."
dongsheng@627 6753 msgstr ""
dongsheng@627 6754
dongsheng@627 6755 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6756 #: ../en/ch05-collab.xml:687
dongsheng@627 6757 msgid ""
dongsheng@627 6758 "Before you try using Mercurial to talk to an ssh server, it's best to make "
dongsheng@627 6759 "sure that you can use the normal <command>ssh</command> or <command>putty</"
dongsheng@627 6760 "command> command to talk to the server first. If you run into problems with "
dongsheng@627 6761 "using these commands directly, Mercurial surely won't work. Worse, it will "
dongsheng@627 6762 "obscure the underlying problem. Any time you want to debug ssh-related "
dongsheng@627 6763 "Mercurial problems, you should drop back to making sure that plain ssh client "
dongsheng@627 6764 "commands work first, <emphasis>before</emphasis> you worry about whether "
dongsheng@627 6765 "there's a problem with Mercurial."
dongsheng@627 6766 msgstr ""
dongsheng@627 6767
dongsheng@627 6768 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6769 #: ../en/ch05-collab.xml:698
dongsheng@627 6770 msgid ""
dongsheng@627 6771 "The first thing to be sure of on the server side is that you can actually log "
dongsheng@627 6772 "in from another machine at all. If you can't use <command>ssh</command> or "
dongsheng@627 6773 "<command>putty</command> to log in, the error message you get may give you a "
dongsheng@627 6774 "few hints as to what's wrong. The most common problems are as follows."
dongsheng@627 6775 msgstr ""
dongsheng@627 6776
dongsheng@627 6777 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6778 #: ../en/ch05-collab.xml:705
dongsheng@627 6779 msgid ""
dongsheng@627 6780 "If you get a <quote>connection refused</quote> error, either there isn't an "
dongsheng@627 6781 "SSH daemon running on the server at all, or it's inaccessible due to firewall "
dongsheng@627 6782 "configuration."
dongsheng@627 6783 msgstr ""
dongsheng@627 6784
dongsheng@627 6785 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6786 #: ../en/ch05-collab.xml:710
dongsheng@627 6787 msgid ""
dongsheng@627 6788 "If you get a <quote>no route to host</quote> error, you either have an "
dongsheng@627 6789 "incorrect address for the server or a seriously locked down firewall that "
dongsheng@627 6790 "won't admit its existence at all."
dongsheng@627 6791 msgstr ""
dongsheng@627 6792
dongsheng@627 6793 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6794 #: ../en/ch05-collab.xml:715
dongsheng@627 6795 msgid ""
dongsheng@627 6796 "If you get a <quote>permission denied</quote> error, you may have mistyped "
dongsheng@627 6797 "the username on the server, or you could have mistyped your key's passphrase "
dongsheng@627 6798 "or the remote user's password."
dongsheng@627 6799 msgstr ""
dongsheng@627 6800
dongsheng@627 6801 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6802 #: ../en/ch05-collab.xml:720
dongsheng@627 6803 msgid ""
dongsheng@627 6804 "In summary, if you're having trouble talking to the server's ssh daemon, "
dongsheng@627 6805 "first make sure that one is running at all. On many systems it will be "
dongsheng@627 6806 "installed, but disabled, by default. Once you're done with this step, you "
dongsheng@627 6807 "should then check that the server's firewall is configured to allow incoming "
dongsheng@627 6808 "connections on the port the ssh daemon is listening on (usually 22). Don't "
dongsheng@627 6809 "worry about more exotic possibilities for misconfiguration until you've "
dongsheng@627 6810 "checked these two first."
dongsheng@627 6811 msgstr ""
dongsheng@627 6812
dongsheng@627 6813 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6814 #: ../en/ch05-collab.xml:730
dongsheng@627 6815 msgid ""
dongsheng@627 6816 "If you're using an authentication agent on the client side to store "
dongsheng@627 6817 "passphrases for your keys, you ought to be able to log into the server "
dongsheng@627 6818 "without being prompted for a passphrase or a password. If you're prompted "
dongsheng@627 6819 "for a passphrase, there are a few possible culprits."
dongsheng@627 6820 msgstr ""
dongsheng@627 6821
dongsheng@627 6822 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6823 #: ../en/ch05-collab.xml:736
dongsheng@627 6824 msgid ""
dongsheng@627 6825 "You might have forgotten to use <command>ssh-add</command> or "
dongsheng@627 6826 "<command>pageant</command> to store the passphrase."
dongsheng@627 6827 msgstr ""
dongsheng@627 6828
dongsheng@627 6829 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6830 #: ../en/ch05-collab.xml:740
songdongsheng@658 6831 msgid "You might have stored the passphrase for the wrong key."
songdongsheng@658 6832 msgstr ""
songdongsheng@658 6833
songdongsheng@658 6834 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 6835 #: ../en/ch05-collab.xml:743
dongsheng@627 6836 msgid ""
dongsheng@627 6837 "If you're being prompted for the remote user's password, there are another "
dongsheng@627 6838 "few possible problems to check."
dongsheng@627 6839 msgstr ""
dongsheng@627 6840
dongsheng@627 6841 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6842 #: ../en/ch05-collab.xml:746
dongsheng@627 6843 msgid ""
dongsheng@627 6844 "Either the user's home directory or their <filename role=\"special\" class="
dongsheng@627 6845 "\"directory\">.ssh</filename> directory might have excessively liberal "
dongsheng@627 6846 "permissions. As a result, the ssh daemon will not trust or read their "
dongsheng@627 6847 "<filename role=\"special\">authorized_keys</filename> file. For example, a "
dongsheng@627 6848 "group-writable home or <filename role=\"special\" class=\"directory\">.ssh</"
dongsheng@627 6849 "filename> directory will often cause this symptom."
dongsheng@627 6850 msgstr ""
dongsheng@627 6851
dongsheng@627 6852 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6853 #: ../en/ch05-collab.xml:755
dongsheng@627 6854 msgid ""
dongsheng@627 6855 "The user's <filename role=\"special\">authorized_keys</filename> file may "
dongsheng@627 6856 "have a problem. If anyone other than the user owns or can write to that file, "
dongsheng@627 6857 "the ssh daemon will not trust or read it."
dongsheng@627 6858 msgstr ""
dongsheng@627 6859
dongsheng@627 6860 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6861 #: ../en/ch05-collab.xml:762
dongsheng@627 6862 msgid ""
dongsheng@627 6863 "In the ideal world, you should be able to run the following command "
dongsheng@627 6864 "successfully, and it should print exactly one line of output, the current "
dongsheng@627 6865 "date and time."
dongsheng@627 6866 msgstr ""
dongsheng@627 6867
dongsheng@627 6868 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6869 #: ../en/ch05-collab.xml:767
dongsheng@627 6870 msgid ""
dongsheng@627 6871 "If, on your server, you have login scripts that print banners or other junk "
dongsheng@627 6872 "even when running non-interactive commands like this, you should fix them "
dongsheng@627 6873 "before you continue, so that they only print output if they're run "
dongsheng@627 6874 "interactively. Otherwise these banners will at least clutter up Mercurial's "
dongsheng@627 6875 "output. Worse, they could potentially cause problems with running Mercurial "
dongsheng@627 6876 "commands remotely. Mercurial makes tries to detect and ignore banners in non-"
dongsheng@627 6877 "interactive <command>ssh</command> sessions, but it is not foolproof. (If "
dongsheng@627 6878 "you're editing your login scripts on your server, the usual way to see if a "
dongsheng@627 6879 "login script is running in an interactive shell is to check the return code "
dongsheng@627 6880 "from the command <literal>tty -s</literal>.)"
dongsheng@627 6881 msgstr ""
dongsheng@627 6882
dongsheng@627 6883 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6884 #: ../en/ch05-collab.xml:781
dongsheng@627 6885 msgid ""
dongsheng@627 6886 "Once you've verified that plain old ssh is working with your server, the next "
dongsheng@627 6887 "step is to ensure that Mercurial runs on the server. The following command "
dongsheng@627 6888 "should run successfully:"
dongsheng@627 6889 msgstr ""
dongsheng@627 6890
dongsheng@627 6891 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6892 #: ../en/ch05-collab.xml:788
dongsheng@627 6893 msgid ""
dongsheng@627 6894 "If you see an error message instead of normal <command role=\"hg-cmd\">hg "
dongsheng@627 6895 "version</command> output, this is usually because you haven't installed "
dongsheng@627 6896 "Mercurial to <filename class=\"directory\">/usr/bin</filename>. Don't worry "
dongsheng@627 6897 "if this is the case; you don't need to do that. But you should check for a "
dongsheng@627 6898 "few possible problems."
dongsheng@627 6899 msgstr ""
dongsheng@627 6900
dongsheng@627 6901 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6902 #: ../en/ch05-collab.xml:795
dongsheng@627 6903 msgid ""
dongsheng@627 6904 "Is Mercurial really installed on the server at all? I know this sounds "
dongsheng@627 6905 "trivial, but it's worth checking!"
dongsheng@627 6906 msgstr ""
dongsheng@627 6907
dongsheng@627 6908 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6909 #: ../en/ch05-collab.xml:799
dongsheng@627 6910 msgid ""
dongsheng@627 6911 "Maybe your shell's search path (usually set via the <envar>PATH</envar> "
dongsheng@627 6912 "environment variable) is simply misconfigured."
dongsheng@627 6913 msgstr ""
dongsheng@627 6914
dongsheng@627 6915 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6916 #: ../en/ch05-collab.xml:803
dongsheng@627 6917 msgid ""
dongsheng@627 6918 "Perhaps your <envar>PATH</envar> environment variable is only being set to "
dongsheng@627 6919 "point to the location of the <command>hg</command> executable if the login "
dongsheng@627 6920 "session is interactive. This can happen if you're setting the path in the "
dongsheng@627 6921 "wrong shell login script. See your shell's documentation for details."
dongsheng@627 6922 msgstr ""
dongsheng@627 6923
dongsheng@627 6924 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 6925 #: ../en/ch05-collab.xml:810
dongsheng@627 6926 msgid ""
dongsheng@627 6927 "The <envar>PYTHONPATH</envar> environment variable may need to contain the "
dongsheng@627 6928 "path to the Mercurial Python modules. It might not be set at all; it could "
dongsheng@627 6929 "be incorrect; or it may be set only if the login is interactive."
dongsheng@627 6930 msgstr ""
dongsheng@627 6931
dongsheng@627 6932 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6933 #: ../en/ch05-collab.xml:817
dongsheng@627 6934 msgid ""
dongsheng@627 6935 "If you can run <command role=\"hg-cmd\">hg version</command> over an ssh "
dongsheng@627 6936 "connection, well done! You've got the server and client sorted out. You "
dongsheng@627 6937 "should now be able to use Mercurial to access repositories hosted by that "
dongsheng@627 6938 "username on that server. If you run into problems with Mercurial and ssh at "
dongsheng@627 6939 "this point, try using the <option role=\"hg-opt-global\">--debug</option> "
dongsheng@627 6940 "option to get a clearer picture of what's going on."
dongsheng@627 6941 msgstr ""
dongsheng@627 6942
dongsheng@627 6943 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 6944 #: ../en/ch05-collab.xml:827
dongsheng@627 6945 msgid "Using compression with ssh"
dongsheng@630 6946 msgstr "通过 ssh 使用压缩"
dongsheng@627 6947
dongsheng@627 6948 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6949 #: ../en/ch05-collab.xml:829
dongsheng@627 6950 msgid ""
dongsheng@627 6951 "Mercurial does not compress data when it uses the ssh protocol, because the "
dongsheng@627 6952 "ssh protocol can transparently compress data. However, the default behaviour "
dongsheng@627 6953 "of ssh clients is <emphasis>not</emphasis> to request compression."
dongsheng@627 6954 msgstr ""
dongsheng@627 6955
dongsheng@627 6956 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6957 #: ../en/ch05-collab.xml:834
dongsheng@627 6958 msgid ""
dongsheng@627 6959 "Over any network other than a fast LAN (even a wireless network), using "
dongsheng@627 6960 "compression is likely to significantly speed up Mercurial's network "
dongsheng@627 6961 "operations. For example, over a WAN, someone measured compression as "
dongsheng@627 6962 "reducing the amount of time required to clone a particularly large repository "
dongsheng@627 6963 "from 51 minutes to 17 minutes."
dongsheng@627 6964 msgstr ""
dongsheng@627 6965
dongsheng@627 6966 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6967 #: ../en/ch05-collab.xml:841
dongsheng@627 6968 msgid ""
dongsheng@627 6969 "Both <command>ssh</command> and <command>plink</command> accept a <option "
dongsheng@627 6970 "role=\"cmd-opt-ssh\">-C</option> option which turns on compression. You can "
dongsheng@650 6971 "easily edit your <filename role=\"special\">~/.hgrc</filename> to enable "
dongsheng@627 6972 "compression for all of Mercurial's uses of the ssh protocol."
dongsheng@627 6973 msgstr ""
dongsheng@627 6974
dongsheng@627 6975 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6976 #: ../en/ch05-collab.xml:849
dongsheng@627 6977 msgid ""
dongsheng@627 6978 "If you use <command>ssh</command>, you can configure it to always use "
dongsheng@627 6979 "compression when talking to your server. To do this, edit your <filename "
dongsheng@627 6980 "role=\"special\">.ssh/config</filename> file (which may not yet exist), as "
dongsheng@627 6981 "follows."
dongsheng@627 6982 msgstr ""
dongsheng@627 6983
dongsheng@627 6984 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 6985 #: ../en/ch05-collab.xml:857
dongsheng@627 6986 msgid ""
dongsheng@627 6987 "This defines an alias, <literal>hg</literal>. When you use it on the "
dongsheng@627 6988 "<command>ssh</command> command line or in a Mercurial <literal>ssh</literal>-"
dongsheng@627 6989 "protocol URL, it will cause <command>ssh</command> to connect to <literal>hg."
dongsheng@627 6990 "example.com</literal> and use compression. This gives you both a shorter "
dongsheng@627 6991 "name to type and compression, each of which is a good thing in its own right."
dongsheng@627 6992 msgstr ""
dongsheng@627 6993
dongsheng@627 6994 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 6995 #: ../en/ch05-collab.xml:868
dongsheng@627 6996 msgid "Serving over HTTP using CGI"
dongsheng@630 6997 msgstr "使用 CGI 通过 HTTP 提供服务"
dongsheng@627 6998
dongsheng@627 6999 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 7000 #: ../en/ch05-collab.xml:870
dongsheng@627 7001 msgid ""
dongsheng@627 7002 "Depending on how ambitious you are, configuring Mercurial's CGI interface can "
dongsheng@627 7003 "take anything from a few moments to several hours."
dongsheng@627 7004 msgstr ""
dongsheng@627 7005
dongsheng@627 7006 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 7007 #: ../en/ch05-collab.xml:874
dongsheng@627 7008 msgid ""
dongsheng@627 7009 "We'll begin with the simplest of examples, and work our way towards a more "
dongsheng@627 7010 "complex configuration. Even for the most basic case, you're almost certainly "
dongsheng@627 7011 "going to need to read and modify your web server's configuration."
dongsheng@627 7012 msgstr ""
dongsheng@627 7013
dongsheng@627 7014 #. type: Content of: <book><chapter><sect1><note><para>
songdongsheng@658 7015 #: ../en/ch05-collab.xml:880
dongsheng@627 7016 msgid ""
dongsheng@627 7017 "Configuring a web server is a complex, fiddly, and highly system-dependent "
dongsheng@627 7018 "activity. I can't possibly give you instructions that will cover anything "
dongsheng@627 7019 "like all of the cases you will encounter. Please use your discretion and "
dongsheng@627 7020 "judgment in following the sections below. Be prepared to make plenty of "
dongsheng@627 7021 "mistakes, and to spend a lot of time reading your server's error logs."
dongsheng@627 7022 msgstr ""
dongsheng@627 7023
dongsheng@627 7024 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 7025 #: ../en/ch05-collab.xml:890
dongsheng@627 7026 msgid "Web server configuration checklist"
dongsheng@630 7027 msgstr "Web 服务器配置检查表"
dongsheng@627 7028
dongsheng@627 7029 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7030 #: ../en/ch05-collab.xml:892
dongsheng@627 7031 msgid ""
dongsheng@627 7032 "Before you continue, do take a few moments to check a few aspects of your "
dongsheng@627 7033 "system's setup."
dongsheng@627 7034 msgstr ""
dongsheng@627 7035
dongsheng@627 7036 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 7037 #: ../en/ch05-collab.xml:896
dongsheng@627 7038 msgid ""
dongsheng@627 7039 "Do you have a web server installed at all? Mac OS X ships with Apache, but "
dongsheng@627 7040 "many other systems may not have a web server installed."
dongsheng@627 7041 msgstr ""
dongsheng@627 7042
dongsheng@627 7043 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 7044 #: ../en/ch05-collab.xml:900
dongsheng@627 7045 msgid ""
dongsheng@627 7046 "If you have a web server installed, is it actually running? On most systems, "
dongsheng@627 7047 "even if one is present, it will be disabled by default."
dongsheng@627 7048 msgstr ""
dongsheng@627 7049
dongsheng@627 7050 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 7051 #: ../en/ch05-collab.xml:904
dongsheng@627 7052 msgid ""
dongsheng@627 7053 "Is your server configured to allow you to run CGI programs in the directory "
dongsheng@627 7054 "where you plan to do so? Most servers default to explicitly disabling the "
dongsheng@627 7055 "ability to run CGI programs."
dongsheng@627 7056 msgstr ""
dongsheng@627 7057
dongsheng@627 7058 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7059 #: ../en/ch05-collab.xml:910
dongsheng@627 7060 msgid ""
dongsheng@627 7061 "If you don't have a web server installed, and don't have substantial "
dongsheng@627 7062 "experience configuring Apache, you should consider using the "
dongsheng@627 7063 "<literal>lighttpd</literal> web server instead of Apache. Apache has a well-"
dongsheng@627 7064 "deserved reputation for baroque and confusing configuration. While "
dongsheng@627 7065 "<literal>lighttpd</literal> is less capable in some ways than Apache, most of "
dongsheng@627 7066 "these capabilities are not relevant to serving Mercurial repositories. And "
dongsheng@627 7067 "<literal>lighttpd</literal> is undeniably <emphasis>much</emphasis> easier to "
dongsheng@627 7068 "get started with than Apache."
dongsheng@627 7069 msgstr ""
dongsheng@627 7070
dongsheng@627 7071 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 7072 #: ../en/ch05-collab.xml:923
dongsheng@627 7073 msgid "Basic CGI configuration"
dongsheng@630 7074 msgstr "基本 CGI 配置"
dongsheng@627 7075
dongsheng@627 7076 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7077 #: ../en/ch05-collab.xml:925
dongsheng@627 7078 msgid ""
dongsheng@627 7079 "On Unix-like systems, it's common for users to have a subdirectory named "
dongsheng@627 7080 "something like <filename class=\"directory\">public_html</filename> in their "
dongsheng@627 7081 "home directory, from which they can serve up web pages. A file named "
dongsheng@627 7082 "<filename>foo</filename> in this directory will be accessible at a URL of the "
dongsheng@650 7083 "form <literal>http://www.example.com/username/foo</literal>."
dongsheng@650 7084 msgstr ""
dongsheng@650 7085
dongsheng@650 7086 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7087 #: ../en/ch05-collab.xml:933
dongsheng@627 7088 msgid ""
dongsheng@627 7089 "To get started, find the <filename role=\"special\">hgweb.cgi</filename> "
dongsheng@627 7090 "script that should be present in your Mercurial installation. If you can't "
dongsheng@627 7091 "quickly find a local copy on your system, simply download one from the master "
dongsheng@627 7092 "Mercurial repository at <ulink url=\"http://www.selenic.com/repo/hg/raw-file/"
dongsheng@627 7093 "tip/hgweb.cgi\">http://www.selenic.com/repo/hg/raw-file/tip/hgweb.cgi</ulink>."
dongsheng@627 7094 msgstr ""
dongsheng@627 7095
dongsheng@627 7096 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7097 #: ../en/ch05-collab.xml:940 ../en/ch05-collab.xml:1109
dongsheng@627 7098 msgid ""
dongsheng@627 7099 "You'll need to copy this script into your <filename class=\"directory"
dongsheng@627 7100 "\">public_html</filename> directory, and ensure that it's executable."
dongsheng@627 7101 msgstr ""
dongsheng@627 7102
dongsheng@627 7103 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7104 #: ../en/ch05-collab.xml:945
dongsheng@627 7105 msgid ""
dongsheng@627 7106 "The <literal>755</literal> argument to <command>chmod</command> is a little "
dongsheng@627 7107 "more general than just making the script executable: it ensures that the "
dongsheng@627 7108 "script is executable by anyone, and that <quote>group</quote> and "
dongsheng@627 7109 "<quote>other</quote> write permissions are <emphasis>not</emphasis> set. If "
dongsheng@627 7110 "you were to leave those write permissions enabled, Apache's <literal>suexec</"
dongsheng@627 7111 "literal> subsystem would likely refuse to execute the script. In fact, "
dongsheng@627 7112 "<literal>suexec</literal> also insists that the <emphasis>directory</"
dongsheng@627 7113 "emphasis> in which the script resides must not be writable by others."
dongsheng@627 7114 msgstr ""
dongsheng@627 7115
dongsheng@627 7116 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 7117 #: ../en/ch05-collab.xml:959
dongsheng@627 7118 msgid "What could <emphasis>possibly</emphasis> go wrong?"
dongsheng@630 7119 msgstr "什么<emphasis>可能</emphasis>会出错?"
dongsheng@627 7120
dongsheng@627 7121 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7122 #: ../en/ch05-collab.xml:962
dongsheng@627 7123 msgid ""
dongsheng@627 7124 "Once you've copied the CGI script into place, go into a web browser, and try "
dongsheng@627 7125 "to open the URL <ulink url=\"http://myhostname/ myuser/hgweb.cgi\">http://"
dongsheng@627 7126 "myhostname/ myuser/hgweb.cgi</ulink>, <emphasis>but</emphasis> brace yourself "
dongsheng@627 7127 "for instant failure. There's a high probability that trying to visit this "
dongsheng@627 7128 "URL will fail, and there are many possible reasons for this. In fact, you're "
dongsheng@627 7129 "likely to stumble over almost every one of the possible errors below, so "
dongsheng@627 7130 "please read carefully. The following are all of the problems I ran into on a "
dongsheng@627 7131 "system running Fedora 7, with a fresh installation of Apache, and a user "
dongsheng@627 7132 "account that I created specially to perform this exercise."
dongsheng@627 7133 msgstr ""
dongsheng@627 7134
dongsheng@627 7135 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7136 #: ../en/ch05-collab.xml:976
dongsheng@627 7137 msgid ""
dongsheng@627 7138 "Your web server may have per-user directories disabled. If you're using "
dongsheng@627 7139 "Apache, search your config file for a <literal>UserDir</literal> directive. "
dongsheng@627 7140 "If there's none present, per-user directories will be disabled. If one "
dongsheng@627 7141 "exists, but its value is <literal>disabled</literal>, then per-user "
dongsheng@627 7142 "directories will be disabled. Otherwise, the string after <literal>UserDir</"
dongsheng@627 7143 "literal> gives the name of the subdirectory that Apache will look in under "
dongsheng@627 7144 "your home directory, for example <filename class=\"directory\">public_html</"
dongsheng@627 7145 "filename>."
dongsheng@627 7146 msgstr ""
dongsheng@627 7147
dongsheng@627 7148 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7149 #: ../en/ch05-collab.xml:987
dongsheng@627 7150 msgid ""
dongsheng@627 7151 "Your file access permissions may be too restrictive. The web server must be "
dongsheng@627 7152 "able to traverse your home directory and directories under your <filename "
dongsheng@627 7153 "class=\"directory\">public_html</filename> directory, and read files under "
dongsheng@627 7154 "the latter too. Here's a quick recipe to help you to make your permissions "
dongsheng@627 7155 "more appropriate."
dongsheng@627 7156 msgstr ""
dongsheng@627 7157
dongsheng@627 7158 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7159 #: ../en/ch05-collab.xml:997
dongsheng@627 7160 msgid ""
dongsheng@627 7161 "The other possibility with permissions is that you might get a completely "
dongsheng@627 7162 "empty window when you try to load the script. In this case, it's likely that "
dongsheng@627 7163 "your access permissions are <emphasis>too permissive</emphasis>. Apache's "
dongsheng@627 7164 "<literal>suexec</literal> subsystem won't execute a script that's group- or "
dongsheng@627 7165 "world-writable, for example."
dongsheng@627 7166 msgstr ""
dongsheng@627 7167
dongsheng@627 7168 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7169 #: ../en/ch05-collab.xml:1004
dongsheng@627 7170 msgid ""
dongsheng@627 7171 "Your web server may be configured to disallow execution of CGI programs in "
dongsheng@627 7172 "your per-user web directory. Here's Apache's default per-user configuration "
dongsheng@627 7173 "from my Fedora system."
dongsheng@627 7174 msgstr ""
dongsheng@627 7175
dongsheng@627 7176 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7177 #: ../en/ch05-collab.xml:1011
dongsheng@627 7178 msgid ""
dongsheng@627 7179 "If you find a similar-looking <literal>Directory</literal> group in your "
dongsheng@627 7180 "Apache configuration, the directive to look at inside it is <literal>Options</"
dongsheng@627 7181 "literal>. Add <literal>ExecCGI</literal> to the end of this list if it's "
dongsheng@627 7182 "missing, and restart the web server."
dongsheng@627 7183 msgstr ""
dongsheng@627 7184
dongsheng@627 7185 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7186 #: ../en/ch05-collab.xml:1018
dongsheng@627 7187 msgid ""
dongsheng@627 7188 "If you find that Apache serves you the text of the CGI script instead of "
dongsheng@627 7189 "executing it, you may need to either uncomment (if already present) or add a "
dongsheng@627 7190 "directive like this."
dongsheng@627 7191 msgstr ""
dongsheng@627 7192
dongsheng@627 7193 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7194 #: ../en/ch05-collab.xml:1024
dongsheng@627 7195 msgid ""
dongsheng@627 7196 "The next possibility is that you might be served with a colourful Python "
dongsheng@627 7197 "backtrace claiming that it can't import a <literal>mercurial</literal>-"
dongsheng@627 7198 "related module. This is actually progress! The server is now capable of "
dongsheng@627 7199 "executing your CGI script. This error is only likely to occur if you're "
dongsheng@627 7200 "running a private installation of Mercurial, instead of a system-wide "
dongsheng@627 7201 "version. Remember that the web server runs the CGI program without any of "
dongsheng@627 7202 "the environment variables that you take for granted in an interactive "
dongsheng@627 7203 "session. If this error happens to you, edit your copy of <filename role="
dongsheng@627 7204 "\"special\">hgweb.cgi</filename> and follow the directions inside it to "
dongsheng@627 7205 "correctly set your <envar>PYTHONPATH</envar> environment variable."
dongsheng@627 7206 msgstr ""
dongsheng@627 7207
dongsheng@627 7208 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7209 #: ../en/ch05-collab.xml:1038
dongsheng@627 7210 msgid ""
dongsheng@627 7211 "Finally, you are <emphasis>certain</emphasis> to by served with another "
dongsheng@627 7212 "colourful Python backtrace: this one will complain that it can't find "
dongsheng@627 7213 "<filename class=\"directory\">/path/to/repository</filename>. Edit your "
dongsheng@627 7214 "<filename role=\"special\">hgweb.cgi</filename> script and replace the "
dongsheng@627 7215 "<filename class=\"directory\">/path/to/repository</filename> string with the "
dongsheng@627 7216 "complete path to the repository you want to serve up."
dongsheng@627 7217 msgstr ""
dongsheng@627 7218
dongsheng@627 7219 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7220 #: ../en/ch05-collab.xml:1048
dongsheng@627 7221 msgid ""
dongsheng@627 7222 "At this point, when you try to reload the page, you should be presented with "
dongsheng@627 7223 "a nice HTML view of your repository's history. Whew!"
dongsheng@627 7224 msgstr ""
dongsheng@627 7225
dongsheng@627 7226 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 7227 #: ../en/ch05-collab.xml:1054
dongsheng@627 7228 msgid "Configuring lighttpd"
dongsheng@630 7229 msgstr "配置 lighttpd"
dongsheng@627 7230
dongsheng@627 7231 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7232 #: ../en/ch05-collab.xml:1056
dongsheng@627 7233 msgid ""
dongsheng@627 7234 "To be exhaustive in my experiments, I tried configuring the increasingly "
dongsheng@627 7235 "popular <literal>lighttpd</literal> web server to serve the same repository "
dongsheng@627 7236 "as I described with Apache above. I had already overcome all of the problems "
dongsheng@627 7237 "I outlined with Apache, many of which are not server-specific. As a result, "
dongsheng@627 7238 "I was fairly sure that my file and directory permissions were good, and that "
dongsheng@627 7239 "my <filename role=\"special\">hgweb.cgi</filename> script was properly edited."
dongsheng@627 7240 msgstr ""
dongsheng@627 7241
dongsheng@627 7242 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7243 #: ../en/ch05-collab.xml:1066
dongsheng@627 7244 msgid ""
dongsheng@627 7245 "Once I had Apache running, getting <literal>lighttpd</literal> to serve the "
dongsheng@627 7246 "repository was a snap (in other words, even if you're trying to use "
dongsheng@627 7247 "<literal>lighttpd</literal>, you should read the Apache section). I first "
dongsheng@627 7248 "had to edit the <literal>mod_access</literal> section of its config file to "
dongsheng@627 7249 "enable <literal>mod_cgi</literal> and <literal>mod_userdir</literal>, both of "
dongsheng@627 7250 "which were disabled by default on my system. I then added a few lines to the "
dongsheng@627 7251 "end of the config file, to configure these modules."
dongsheng@627 7252 msgstr ""
dongsheng@627 7253
dongsheng@627 7254 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7255 #: ../en/ch05-collab.xml:1078
dongsheng@627 7256 msgid ""
dongsheng@627 7257 "With this done, <literal>lighttpd</literal> ran immediately for me. If I had "
dongsheng@627 7258 "configured <literal>lighttpd</literal> before Apache, I'd almost certainly "
dongsheng@627 7259 "have run into many of the same system-level configuration problems as I did "
dongsheng@627 7260 "with Apache. However, I found <literal>lighttpd</literal> to be noticeably "
dongsheng@627 7261 "easier to configure than Apache, even though I've used Apache for over a "
dongsheng@627 7262 "decade, and this was my first exposure to <literal>lighttpd</literal>."
dongsheng@627 7263 msgstr ""
dongsheng@627 7264
dongsheng@627 7265 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 7266 #: ../en/ch05-collab.xml:1091
dongsheng@627 7267 msgid "Sharing multiple repositories with one CGI script"
dongsheng@630 7268 msgstr "使用一个 CGI 脚本共享多个版本库"
dongsheng@627 7269
dongsheng@627 7270 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7271 #: ../en/ch05-collab.xml:1093
dongsheng@627 7272 msgid ""
dongsheng@627 7273 "The <filename role=\"special\">hgweb.cgi</filename> script only lets you "
dongsheng@627 7274 "publish a single repository, which is an annoying restriction. If you want "
dongsheng@627 7275 "to publish more than one without wracking yourself with multiple copies of "
dongsheng@627 7276 "the same script, each with different names, a better choice is to use the "
dongsheng@627 7277 "<filename role=\"special\">hgwebdir.cgi</filename> script."
dongsheng@627 7278 msgstr ""
dongsheng@627 7279
dongsheng@627 7280 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7281 #: ../en/ch05-collab.xml:1101
dongsheng@627 7282 msgid ""
dongsheng@627 7283 "The procedure to configure <filename role=\"special\">hgwebdir.cgi</filename> "
dongsheng@627 7284 "is only a little more involved than for <filename role=\"special\">hgweb.cgi</"
dongsheng@627 7285 "filename>. First, you must obtain a copy of the script. If you don't have "
dongsheng@627 7286 "one handy, you can download a copy from the master Mercurial repository at "
dongsheng@627 7287 "<ulink url=\"http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi"
dongsheng@627 7288 "\">http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi</ulink>."
dongsheng@627 7289 msgstr ""
dongsheng@627 7290
dongsheng@627 7291 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7292 #: ../en/ch05-collab.xml:1116
dongsheng@627 7293 msgid ""
dongsheng@627 7294 "With basic configuration out of the way, try to visit <ulink url=\"http://"
dongsheng@627 7295 "myhostname/ myuser/hgwebdir.cgi\">http://myhostname/ myuser/hgwebdir.cgi</"
dongsheng@627 7296 "ulink> in your browser. It should display an empty list of repositories. If "
dongsheng@627 7297 "you get a blank window or error message, try walking through the list of "
songdongsheng@658 7298 "potential problems in <xref linkend=\"sec:collab:wtf\"/>."
songdongsheng@658 7299 msgstr ""
songdongsheng@658 7300
songdongsheng@658 7301 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7302 #: ../en/ch05-collab.xml:1125
dongsheng@627 7303 msgid ""
dongsheng@627 7304 "The <filename role=\"special\">hgwebdir.cgi</filename> script relies on an "
dongsheng@627 7305 "external configuration file. By default, it searches for a file named "
dongsheng@627 7306 "<filename role=\"special\">hgweb.config</filename> in the same directory as "
dongsheng@627 7307 "itself. You'll need to create this file, and make it world-readable. The "
dongsheng@627 7308 "format of the file is similar to a Windows <quote>ini</quote> file, as "
dongsheng@627 7309 "understood by Python's <literal>ConfigParser</literal> <citation>web:"
dongsheng@627 7310 "configparser</citation> module."
dongsheng@627 7311 msgstr ""
dongsheng@627 7312
dongsheng@627 7313 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7314 #: ../en/ch05-collab.xml:1135
dongsheng@627 7315 msgid ""
dongsheng@627 7316 "The easiest way to configure <filename role=\"special\">hgwebdir.cgi</"
dongsheng@627 7317 "filename> is with a section named <literal>collections</literal>. This will "
dongsheng@627 7318 "automatically publish <emphasis>every</emphasis> repository under the "
dongsheng@627 7319 "directories you name. The section should look like this:"
dongsheng@627 7320 msgstr ""
dongsheng@627 7321
dongsheng@627 7322 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7323 #: ../en/ch05-collab.xml:1143
dongsheng@627 7324 msgid ""
dongsheng@627 7325 "Mercurial interprets this by looking at the directory name on the "
dongsheng@627 7326 "<emphasis>right</emphasis> hand side of the <quote><literal>=</literal></"
dongsheng@627 7327 "quote> sign; finding repositories in that directory hierarchy; and using the "
dongsheng@627 7328 "text on the <emphasis>left</emphasis> to strip off matching text from the "
dongsheng@627 7329 "names it will actually list in the web interface. The remaining component of "
dongsheng@627 7330 "a path after this stripping has occurred is called a <quote>virtual path</"
dongsheng@627 7331 "quote>."
dongsheng@627 7332 msgstr ""
dongsheng@627 7333
dongsheng@627 7334 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7335 #: ../en/ch05-collab.xml:1152
dongsheng@627 7336 msgid ""
dongsheng@627 7337 "Given the example above, if we have a repository whose local path is "
dongsheng@627 7338 "<filename class=\"directory\">/my/root/this/repo</filename>, the CGI script "
dongsheng@627 7339 "will strip the leading <filename class=\"directory\">/my/root</filename> from "
dongsheng@627 7340 "the name, and publish the repository with a virtual path of <filename class="
dongsheng@627 7341 "\"directory\">this/repo</filename>. If the base URL for our CGI script is "
dongsheng@627 7342 "<ulink url=\"http://myhostname/ myuser/hgwebdir.cgi\">http://myhostname/ "
dongsheng@627 7343 "myuser/hgwebdir.cgi</ulink>, the complete URL for that repository will be "
dongsheng@627 7344 "<ulink url=\"http://myhostname/ myuser/hgwebdir.cgi/this/repo\">http://"
dongsheng@627 7345 "myhostname/ myuser/hgwebdir.cgi/this/repo</ulink>."
dongsheng@627 7346 msgstr ""
dongsheng@627 7347
dongsheng@627 7348 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7349 #: ../en/ch05-collab.xml:1166
dongsheng@627 7350 msgid ""
dongsheng@627 7351 "If we replace <filename class=\"directory\">/my/root</filename> on the left "
dongsheng@627 7352 "hand side of this example with <filename class=\"directory\">/my</filename>, "
dongsheng@627 7353 "then <filename role=\"special\">hgwebdir.cgi</filename> will only strip off "
dongsheng@627 7354 "<filename class=\"directory\">/my</filename> from the repository name, and "
dongsheng@627 7355 "will give us a virtual path of <filename class=\"directory\">root/this/repo</"
dongsheng@627 7356 "filename> instead of <filename class=\"directory\">this/repo</filename>."
dongsheng@627 7357 msgstr ""
dongsheng@627 7358
dongsheng@627 7359 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7360 #: ../en/ch05-collab.xml:1176
dongsheng@627 7361 msgid ""
dongsheng@627 7362 "The <filename role=\"special\">hgwebdir.cgi</filename> script will "
dongsheng@627 7363 "recursively search each directory listed in the <literal>collections</"
dongsheng@627 7364 "literal> section of its configuration file, but it will <literal>not</"
dongsheng@627 7365 "literal> recurse into the repositories it finds."
dongsheng@627 7366 msgstr ""
dongsheng@627 7367
dongsheng@627 7368 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7369 #: ../en/ch05-collab.xml:1182
dongsheng@627 7370 msgid ""
dongsheng@627 7371 "The <literal>collections</literal> mechanism makes it easy to publish many "
dongsheng@627 7372 "repositories in a <quote>fire and forget</quote> manner. You only need to "
dongsheng@627 7373 "set up the CGI script and configuration file one time. Afterwards, you can "
dongsheng@627 7374 "publish or unpublish a repository at any time by simply moving it into, or "
dongsheng@627 7375 "out of, the directory hierarchy in which you've configured <filename role="
dongsheng@627 7376 "\"special\">hgwebdir.cgi</filename> to look."
dongsheng@627 7377 msgstr ""
dongsheng@627 7378
dongsheng@627 7379 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 7380 #: ../en/ch05-collab.xml:1192
dongsheng@627 7381 msgid "Explicitly specifying which repositories to publish"
dongsheng@630 7382 msgstr "明确指出要发布的版本库"
dongsheng@627 7383
dongsheng@627 7384 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7385 #: ../en/ch05-collab.xml:1195
dongsheng@627 7386 msgid ""
dongsheng@627 7387 "In addition to the <literal>collections</literal> mechanism, the <filename "
dongsheng@627 7388 "role=\"special\">hgwebdir.cgi</filename> script allows you to publish a "
dongsheng@627 7389 "specific list of repositories. To do so, create a <literal>paths</literal> "
dongsheng@627 7390 "section, with contents of the following form."
dongsheng@627 7391 msgstr ""
dongsheng@627 7392
dongsheng@627 7393 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7394 #: ../en/ch05-collab.xml:1204
dongsheng@627 7395 msgid ""
dongsheng@627 7396 "In this case, the virtual path (the component that will appear in a URL) is "
dongsheng@627 7397 "on the left hand side of each definition, while the path to the repository is "
dongsheng@627 7398 "on the right. Notice that there does not need to be any relationship between "
dongsheng@627 7399 "the virtual path you choose and the location of a repository in your "
dongsheng@627 7400 "filesystem."
dongsheng@627 7401 msgstr ""
dongsheng@627 7402
dongsheng@627 7403 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 7404 #: ../en/ch05-collab.xml:1211
dongsheng@627 7405 msgid ""
dongsheng@627 7406 "If you wish, you can use both the <literal>collections</literal> and "
dongsheng@627 7407 "<literal>paths</literal> mechanisms simultaneously in a single configuration "
dongsheng@627 7408 "file."
dongsheng@627 7409 msgstr ""
dongsheng@627 7410
dongsheng@627 7411 #. type: Content of: <book><chapter><sect1><sect2><sect3><note><para>
songdongsheng@658 7412 #: ../en/ch05-collab.xml:1217
dongsheng@627 7413 msgid ""
dongsheng@627 7414 "If multiple repositories have the same virtual path, <filename role=\"special"
dongsheng@627 7415 "\">hgwebdir.cgi</filename> will not report an error. Instead, it will behave "
dongsheng@627 7416 "unpredictably."
dongsheng@627 7417 msgstr ""
dongsheng@627 7418
dongsheng@627 7419 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 7420 #: ../en/ch05-collab.xml:1226
dongsheng@627 7421 msgid "Downloading source archives"
dongsheng@630 7422 msgstr "下载源代码档案包"
dongsheng@627 7423
dongsheng@627 7424 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7425 #: ../en/ch05-collab.xml:1228
dongsheng@627 7426 msgid ""
dongsheng@627 7427 "Mercurial's web interface lets users download an archive of any revision. "
dongsheng@627 7428 "This archive will contain a snapshot of the working directory as of that "
dongsheng@627 7429 "revision, but it will not contain a copy of the repository data."
dongsheng@627 7430 msgstr ""
dongsheng@627 7431
dongsheng@627 7432 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7433 #: ../en/ch05-collab.xml:1233
dongsheng@627 7434 msgid ""
dongsheng@627 7435 "By default, this feature is not enabled. To enable it, you'll need to add an "
dongsheng@627 7436 "<envar role=\"rc-item-web\">allow_archive</envar> item to the <literal role="
dongsheng@650 7437 "\"rc-web\">web</literal> section of your <filename role=\"special\">~/.hgrc</"
dongsheng@627 7438 "filename>."
dongsheng@627 7439 msgstr ""
dongsheng@627 7440
dongsheng@627 7441 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 7442 #: ../en/ch05-collab.xml:1241
dongsheng@627 7443 msgid "Web configuration options"
dongsheng@630 7444 msgstr "Web 配置选项"
dongsheng@627 7445
dongsheng@627 7446 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 7447 #: ../en/ch05-collab.xml:1243
dongsheng@627 7448 msgid ""
dongsheng@627 7449 "Mercurial's web interfaces (the <command role=\"hg-cmd\">hg serve</command> "
dongsheng@627 7450 "command, and the <filename role=\"special\">hgweb.cgi</filename> and "
dongsheng@627 7451 "<filename role=\"special\">hgwebdir.cgi</filename> scripts) have a number of "
dongsheng@627 7452 "configuration options that you can set. These belong in a section named "
dongsheng@627 7453 "<literal role=\"rc-web\">web</literal>."
dongsheng@627 7454 msgstr ""
dongsheng@627 7455
dongsheng@627 7456 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7457 #: ../en/ch05-collab.xml:1251
dongsheng@627 7458 msgid ""
dongsheng@627 7459 "<envar role=\"rc-item-web\">allow_archive</envar>: Determines which (if any) "
dongsheng@627 7460 "archive download mechanisms Mercurial supports. If you enable this feature, "
dongsheng@627 7461 "users of the web interface will be able to download an archive of whatever "
dongsheng@627 7462 "revision of a repository they are viewing. To enable the archive feature, "
dongsheng@627 7463 "this item must take the form of a sequence of words drawn from the list below."
dongsheng@627 7464 msgstr ""
dongsheng@627 7465
dongsheng@627 7466 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><itemizedlist><listitem><para>
songdongsheng@658 7467 #: ../en/ch05-collab.xml:1260
dongsheng@627 7468 msgid ""
dongsheng@627 7469 "<literal>bz2</literal>: A <command>tar</command> archive, compressed using "
dongsheng@627 7470 "<literal>bzip2</literal> compression. This has the best compression ratio, "
dongsheng@627 7471 "but uses the most CPU time on the server."
dongsheng@627 7472 msgstr ""
dongsheng@627 7473
dongsheng@627 7474 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><itemizedlist><listitem><para>
songdongsheng@658 7475 #: ../en/ch05-collab.xml:1266
dongsheng@627 7476 msgid ""
dongsheng@627 7477 "<literal>gz</literal>: A <command>tar</command> archive, compressed using "
dongsheng@627 7478 "<literal>gzip</literal> compression."
dongsheng@627 7479 msgstr ""
dongsheng@627 7480
dongsheng@627 7481 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><itemizedlist><listitem><para>
songdongsheng@658 7482 #: ../en/ch05-collab.xml:1270
dongsheng@627 7483 msgid ""
dongsheng@627 7484 "<literal>zip</literal>: A <command>zip</command> archive, compressed using "
dongsheng@627 7485 "LZW compression. This format has the worst compression ratio, but is widely "
dongsheng@627 7486 "used in the Windows world."
dongsheng@627 7487 msgstr ""
dongsheng@627 7488
dongsheng@627 7489 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7490 #: ../en/ch05-collab.xml:1276
dongsheng@627 7491 msgid ""
dongsheng@627 7492 "If you provide an empty list, or don't have an <envar role=\"rc-item-web"
dongsheng@627 7493 "\">allow_archive</envar> entry at all, this feature will be disabled. Here "
dongsheng@627 7494 "is an example of how to enable all three supported formats."
dongsheng@627 7495 msgstr ""
dongsheng@627 7496
dongsheng@627 7497 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7498 #: ../en/ch05-collab.xml:1283
dongsheng@627 7499 msgid ""
dongsheng@627 7500 "<envar role=\"rc-item-web\">allowpull</envar>: Boolean. Determines whether "
dongsheng@627 7501 "the web interface allows remote users to <command role=\"hg-cmd\">hg pull</"
dongsheng@627 7502 "command> and <command role=\"hg-cmd\">hg clone</command> this repository over "
dongsheng@627 7503 "HTTP. If set to <literal>no</literal> or <literal>false</literal>, only the "
dongsheng@627 7504 "<quote>human-oriented</quote> portion of the web interface is available."
dongsheng@627 7505 msgstr ""
dongsheng@627 7506
dongsheng@627 7507 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7508 #: ../en/ch05-collab.xml:1292
dongsheng@627 7509 msgid ""
dongsheng@627 7510 "<envar role=\"rc-item-web\">contact</envar>: String. A free-form (but "
dongsheng@627 7511 "preferably brief) string identifying the person or group in charge of the "
dongsheng@627 7512 "repository. This often contains the name and email address of a person or "
dongsheng@627 7513 "mailing list. It often makes sense to place this entry in a repository's own "
dongsheng@627 7514 "<filename role=\"special\">.hg/hgrc</filename> file, but it can make sense to "
dongsheng@650 7515 "use in a global <filename role=\"special\">~/.hgrc</filename> if every "
dongsheng@627 7516 "repository has a single maintainer."
dongsheng@627 7517 msgstr ""
dongsheng@627 7518
dongsheng@627 7519 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7520 #: ../en/ch05-collab.xml:1303
dongsheng@627 7521 msgid ""
dongsheng@627 7522 "<envar role=\"rc-item-web\">maxchanges</envar>: Integer. The default maximum "
dongsheng@627 7523 "number of changesets to display in a single page of output."
dongsheng@627 7524 msgstr ""
dongsheng@627 7525
dongsheng@627 7526 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7527 #: ../en/ch05-collab.xml:1307
dongsheng@627 7528 msgid ""
dongsheng@627 7529 "<envar role=\"rc-item-web\">maxfiles</envar>: Integer. The default maximum "
dongsheng@627 7530 "number of modified files to display in a single page of output."
dongsheng@627 7531 msgstr ""
dongsheng@627 7532
dongsheng@627 7533 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7534 #: ../en/ch05-collab.xml:1311
dongsheng@627 7535 msgid ""
dongsheng@627 7536 "<envar role=\"rc-item-web\">stripes</envar>: Integer. If the web interface "
dongsheng@627 7537 "displays alternating <quote>stripes</quote> to make it easier to visually "
dongsheng@627 7538 "align rows when you are looking at a table, this number controls the number "
dongsheng@627 7539 "of rows in each stripe."
dongsheng@627 7540 msgstr ""
dongsheng@627 7541
dongsheng@627 7542 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 7543 #: ../en/ch05-collab.xml:1317
dongsheng@627 7544 msgid ""
dongsheng@627 7545 "<envar role=\"rc-item-web\">style</envar>: Controls the template Mercurial "
dongsheng@627 7546 "uses to display the web interface. Mercurial ships with two web templates, "
dongsheng@627 7547 "named <literal>default</literal> and <literal>gitweb</literal> (the latter is "
dongsheng@627 7548 "much more visually attractive). You can also specify a custom template of "
songdongsheng@658 7549 "your own; see <xref linkend=\"chap:template\"/> for details. Here, you can "
songdongsheng@658 7550 "see how to enable the <literal>gitweb</literal> style."
dongsheng@627 7551 msgstr ""
dongsheng@627 7552
dongsheng@627 7553 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 7554 #: ../en/ch05-collab.xml:1330
dongsheng@627 7555 msgid ""
dongsheng@627 7556 "<envar role=\"rc-item-web\">templates</envar>: Path. The directory in which "
dongsheng@627 7557 "to search for template files. By default, Mercurial searches in the "
dongsheng@627 7558 "directory in which it was installed."
dongsheng@627 7559 msgstr ""
dongsheng@627 7560
dongsheng@627 7561 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7562 #: ../en/ch05-collab.xml:1335
dongsheng@627 7563 msgid ""
dongsheng@627 7564 "If you are using <filename role=\"special\">hgwebdir.cgi</filename>, you can "
dongsheng@627 7565 "place a few configuration items in a <literal role=\"rc-web\">web</literal> "
dongsheng@627 7566 "section of the <filename role=\"special\">hgweb.config</filename> file "
dongsheng@650 7567 "instead of a <filename role=\"special\">~/.hgrc</filename> file, for "
dongsheng@627 7568 "convenience. These items are <envar role=\"rc-item-web\">motd</envar> and "
dongsheng@627 7569 "<envar role=\"rc-item-web\">style</envar>."
dongsheng@627 7570 msgstr ""
dongsheng@627 7571
dongsheng@627 7572 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 7573 #: ../en/ch05-collab.xml:1346
dongsheng@627 7574 msgid "Options specific to an individual repository"
dongsheng@630 7575 msgstr "针对单个版本库的选项"
dongsheng@627 7576
dongsheng@627 7577 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 7578 #: ../en/ch05-collab.xml:1348
dongsheng@627 7579 msgid ""
dongsheng@627 7580 "A few <literal role=\"rc-web\">web</literal> configuration items ought to be "
dongsheng@627 7581 "placed in a repository's local <filename role=\"special\">.hg/hgrc</"
dongsheng@650 7582 "filename>, rather than a user's or global <filename role=\"special\">~/.hgrc</"
dongsheng@627 7583 "filename>."
dongsheng@627 7584 msgstr ""
dongsheng@627 7585
dongsheng@627 7586 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 7587 #: ../en/ch05-collab.xml:1353
dongsheng@627 7588 msgid ""
dongsheng@627 7589 "<envar role=\"rc-item-web\">description</envar>: String. A free-form (but "
dongsheng@627 7590 "preferably brief) string that describes the contents or purpose of the "
dongsheng@627 7591 "repository."
dongsheng@627 7592 msgstr ""
dongsheng@627 7593
dongsheng@627 7594 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 7595 #: ../en/ch05-collab.xml:1358
dongsheng@627 7596 msgid ""
dongsheng@627 7597 "<envar role=\"rc-item-web\">name</envar>: String. The name to use for the "
dongsheng@627 7598 "repository in the web interface. This overrides the default name, which is "
dongsheng@627 7599 "the last component of the repository's path."
dongsheng@627 7600 msgstr ""
dongsheng@627 7601
dongsheng@627 7602 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 7603 #: ../en/ch05-collab.xml:1366
dongsheng@627 7604 msgid ""
dongsheng@627 7605 "Options specific to the <command role=\"hg-cmd\">hg serve</command> command"
dongsheng@630 7606 msgstr "命令 <command role=\"hg-cmd\">hg serve</command> 的选项"
dongsheng@627 7607
dongsheng@627 7608 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 7609 #: ../en/ch05-collab.xml:1369
dongsheng@627 7610 msgid ""
dongsheng@627 7611 "Some of the items in the <literal role=\"rc-web\">web</literal> section of a "
dongsheng@650 7612 "<filename role=\"special\">~/.hgrc</filename> file are only for use with the "
dongsheng@650 7613 "<command role=\"hg-cmd\">hg serve</command> command."
dongsheng@627 7614 msgstr ""
dongsheng@627 7615
dongsheng@627 7616 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 7617 #: ../en/ch05-collab.xml:1375
dongsheng@627 7618 msgid ""
dongsheng@627 7619 "<envar role=\"rc-item-web\">accesslog</envar>: Path. The name of a file into "
dongsheng@627 7620 "which to write an access log. By default, the <command role=\"hg-cmd\">hg "
dongsheng@627 7621 "serve</command> command writes this information to standard output, not to a "
dongsheng@627 7622 "file. Log entries are written in the standard <quote>combined</quote> file "
dongsheng@627 7623 "format used by almost all web servers."
dongsheng@627 7624 msgstr ""
dongsheng@627 7625
dongsheng@627 7626 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 7627 #: ../en/ch05-collab.xml:1383
dongsheng@627 7628 msgid ""
dongsheng@627 7629 "<envar role=\"rc-item-web\">address</envar>: String. The local address on "
dongsheng@627 7630 "which the server should listen for incoming connections. By default, the "
dongsheng@627 7631 "server listens on all addresses."
dongsheng@627 7632 msgstr ""
dongsheng@627 7633
dongsheng@627 7634 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 7635 #: ../en/ch05-collab.xml:1388
dongsheng@627 7636 msgid ""
dongsheng@627 7637 "<envar role=\"rc-item-web\">errorlog</envar>: Path. The name of a file into "
dongsheng@627 7638 "which to write an error log. By default, the <command role=\"hg-cmd\">hg "
dongsheng@627 7639 "serve</command> command writes this information to standard error, not to a "
dongsheng@627 7640 "file."
dongsheng@627 7641 msgstr ""
dongsheng@627 7642
dongsheng@627 7643 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 7644 #: ../en/ch05-collab.xml:1394
dongsheng@627 7645 msgid ""
dongsheng@627 7646 "<envar role=\"rc-item-web\">ipv6</envar>: Boolean. Whether to use the IPv6 "
dongsheng@627 7647 "protocol. By default, IPv6 is not used."
dongsheng@627 7648 msgstr ""
dongsheng@627 7649
dongsheng@627 7650 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 7651 #: ../en/ch05-collab.xml:1398
dongsheng@627 7652 msgid ""
dongsheng@627 7653 "<envar role=\"rc-item-web\">port</envar>: Integer. The TCP port number on "
dongsheng@627 7654 "which the server should listen. The default port number used is 8000."
dongsheng@627 7655 msgstr ""
dongsheng@627 7656
dongsheng@627 7657 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 7658 #: ../en/ch05-collab.xml:1405
dongsheng@650 7659 msgid ""
dongsheng@650 7660 "Choosing the right <filename role=\"special\">~/.hgrc</filename> file to add "
dongsheng@650 7661 "<literal role=\"rc-web\">web</literal> items to"
dongsheng@627 7662 msgstr ""
dongsheng@653 7663 "选择正确的 <filename role=\"special\"> ~/.hgrc</filename> 文件增加到 <literal "
dongsheng@630 7664 "role=\"rc-web\">web</literal> 条目"
dongsheng@627 7665
dongsheng@627 7666 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 7667 #: ../en/ch05-collab.xml:1409
dongsheng@627 7668 msgid ""
dongsheng@627 7669 "It is important to remember that a web server like Apache or "
dongsheng@627 7670 "<literal>lighttpd</literal> will run under a user ID that is different to "
dongsheng@627 7671 "yours. CGI scripts run by your server, such as <filename role=\"special"
dongsheng@627 7672 "\">hgweb.cgi</filename>, will usually also run under that user ID."
dongsheng@627 7673 msgstr ""
dongsheng@627 7674
dongsheng@627 7675 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 7676 #: ../en/ch05-collab.xml:1416
dongsheng@627 7677 msgid ""
dongsheng@627 7678 "If you add <literal role=\"rc-web\">web</literal> items to your own personal "
dongsheng@650 7679 "<filename role=\"special\">~/.hgrc</filename> file, CGI scripts won't read "
dongsheng@650 7680 "that <filename role=\"special\">~/.hgrc</filename> file. Those settings will "
dongsheng@650 7681 "thus only affect the behaviour of the <command role=\"hg-cmd\">hg serve</"
dongsheng@627 7682 "command> command when you run it. To cause CGI scripts to see your settings, "
dongsheng@650 7683 "either create a <filename role=\"special\">~/.hgrc</filename> file in the "
dongsheng@627 7684 "home directory of the user ID that runs your web server, or add those "
dongsheng@650 7685 "settings to a system-wide <filename role=\"special\">~/.hgrc</filename> file."
dongsheng@627 7686 msgstr ""
dongsheng@627 7687
dongsheng@627 7688 #. type: Content of: <book><chapter><title>
dongsheng@650 7689 #: ../en/ch06-filenames.xml:5
dongsheng@627 7690 msgid "File names and pattern matching"
dongsheng@627 7691 msgstr "文件名称与模式匹配"
dongsheng@627 7692
dongsheng@627 7693 #. type: Content of: <book><chapter><para>
dongsheng@650 7694 #: ../en/ch06-filenames.xml:7
dongsheng@627 7695 msgid ""
dongsheng@627 7696 "Mercurial provides mechanisms that let you work with file names in a "
dongsheng@627 7697 "consistent and expressive way."
dongsheng@627 7698 msgstr ""
dongsheng@627 7699
dongsheng@627 7700 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 7701 #: ../en/ch06-filenames.xml:11
dongsheng@627 7702 msgid "Simple file naming"
dongsheng@630 7703 msgstr "简单文件名称"
dongsheng@627 7704
dongsheng@627 7705 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7706 #: ../en/ch06-filenames.xml:13
dongsheng@627 7707 msgid ""
dongsheng@627 7708 "Mercurial uses a unified piece of machinery <quote>under the hood</quote> to "
dongsheng@627 7709 "handle file names. Every command behaves uniformly with respect to file "
dongsheng@627 7710 "names. The way in which commands work with file names is as follows."
dongsheng@627 7711 msgstr ""
dongsheng@627 7712
dongsheng@627 7713 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7714 #: ../en/ch06-filenames.xml:18
dongsheng@627 7715 msgid ""
dongsheng@627 7716 "If you explicitly name real files on the command line, Mercurial works with "
dongsheng@627 7717 "exactly those files, as you would expect. &interaction.filenames.files;"
dongsheng@627 7718 msgstr ""
dongsheng@627 7719
dongsheng@627 7720 #
dongsheng@627 7721 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7722 #: ../en/ch06-filenames.xml:22
dongsheng@627 7723 msgid ""
dongsheng@627 7724 "When you provide a directory name, Mercurial will interpret this as "
dongsheng@627 7725 "<quote>operate on every file in this directory and its subdirectories</"
dongsheng@627 7726 "quote>. Mercurial traverses the files and subdirectories in a directory in "
dongsheng@627 7727 "alphabetical order. When it encounters a subdirectory, it will traverse that "
dongsheng@627 7728 "subdirectory before continuing with the current directory."
dongsheng@627 7729 msgstr ""
dongsheng@627 7730
dongsheng@627 7731 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 7732 #: ../en/ch06-filenames.xml:33
dongsheng@627 7733 msgid "Running commands without any file names"
dongsheng@630 7734 msgstr "不提供文件名称的执行命令"
dongsheng@627 7735
dongsheng@627 7736 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7737 #: ../en/ch06-filenames.xml:35
dongsheng@627 7738 msgid ""
dongsheng@627 7739 "Mercurial's commands that work with file names have useful default behaviours "
dongsheng@627 7740 "when you invoke them without providing any file names or patterns. What kind "
dongsheng@627 7741 "of behaviour you should expect depends on what the command does. Here are a "
dongsheng@627 7742 "few rules of thumb you can use to predict what a command is likely to do if "
dongsheng@627 7743 "you don't give it any names to work with."
dongsheng@627 7744 msgstr ""
dongsheng@627 7745
dongsheng@627 7746 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 7747 #: ../en/ch06-filenames.xml:42
dongsheng@627 7748 msgid ""
dongsheng@627 7749 "Most commands will operate on the entire working directory. This is what the "
dongsheng@627 7750 "<command role=\"hg-cmd\">hg add</command> command does, for example."
dongsheng@627 7751 msgstr ""
dongsheng@627 7752
dongsheng@627 7753 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 7754 #: ../en/ch06-filenames.xml:46
dongsheng@627 7755 msgid ""
dongsheng@627 7756 "If the command has effects that are difficult or impossible to reverse, it "
dongsheng@627 7757 "will force you to explicitly provide at least one name or pattern (see "
dongsheng@627 7758 "below). This protects you from accidentally deleting files by running "
dongsheng@627 7759 "<command role=\"hg-cmd\">hg remove</command> with no arguments, for example."
dongsheng@627 7760 msgstr ""
dongsheng@627 7761
dongsheng@627 7762 #
dongsheng@627 7763 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7764 #: ../en/ch06-filenames.xml:54
dongsheng@627 7765 msgid ""
dongsheng@627 7766 "It's easy to work around these default behaviours if they don't suit you. If "
dongsheng@627 7767 "a command normally operates on the whole working directory, you can invoke it "
dongsheng@627 7768 "on just the current directory and its subdirectories by giving it the name "
dongsheng@627 7769 "<quote><filename class=\"directory\">.</filename></quote>."
dongsheng@627 7770 msgstr ""
dongsheng@627 7771
dongsheng@627 7772 #
dongsheng@627 7773 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7774 #: ../en/ch06-filenames.xml:62
dongsheng@627 7775 msgid ""
dongsheng@627 7776 "Along the same lines, some commands normally print file names relative to the "
dongsheng@627 7777 "root of the repository, even if you're invoking them from a subdirectory. "
dongsheng@627 7778 "Such a command will print file names relative to your subdirectory if you "
dongsheng@627 7779 "give it explicit names. Here, we're going to run <command role=\"hg-cmd\">hg "
dongsheng@627 7780 "status</command> from a subdirectory, and get it to operate on the entire "
dongsheng@627 7781 "working directory while printing file names relative to our subdirectory, by "
dongsheng@627 7782 "passing it the output of the <command role=\"hg-cmd\">hg root</command> "
dongsheng@627 7783 "command."
dongsheng@627 7784 msgstr ""
dongsheng@627 7785
dongsheng@627 7786 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 7787 #: ../en/ch06-filenames.xml:76
dongsheng@627 7788 msgid "Telling you what's going on"
dongsheng@630 7789 msgstr "告诉你正在做什么"
dongsheng@627 7790
dongsheng@627 7791 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7792 #: ../en/ch06-filenames.xml:78
dongsheng@627 7793 msgid ""
dongsheng@627 7794 "The <command role=\"hg-cmd\">hg add</command> example in the preceding "
dongsheng@627 7795 "section illustrates something else that's helpful about Mercurial commands. "
dongsheng@627 7796 "If a command operates on a file that you didn't name explicitly on the "
dongsheng@627 7797 "command line, it will usually print the name of the file, so that you will "
dongsheng@627 7798 "not be surprised what's going on."
dongsheng@627 7799 msgstr ""
dongsheng@627 7800
dongsheng@627 7801 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7802 #: ../en/ch06-filenames.xml:85
dongsheng@627 7803 msgid ""
dongsheng@627 7804 "The principle here is of <emphasis>least surprise</emphasis>. If you've "
dongsheng@627 7805 "exactly named a file on the command line, there's no point in repeating it "
dongsheng@627 7806 "back at you. If Mercurial is acting on a file <emphasis>implicitly</"
dongsheng@627 7807 "emphasis>, because you provided no names, or a directory, or a pattern (see "
dongsheng@627 7808 "below), it's safest to tell you what it's doing."
dongsheng@627 7809 msgstr ""
dongsheng@627 7810
dongsheng@627 7811 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7812 #: ../en/ch06-filenames.xml:92
dongsheng@627 7813 msgid ""
dongsheng@627 7814 "For commands that behave this way, you can silence them using the <option "
dongsheng@627 7815 "role=\"hg-opt-global\">-q</option> option. You can also get them to print "
dongsheng@627 7816 "the name of every file, even those you've named explicitly, using the <option "
dongsheng@627 7817 "role=\"hg-opt-global\">-v</option> option."
dongsheng@627 7818 msgstr ""
dongsheng@627 7819
dongsheng@627 7820 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 7821 #: ../en/ch06-filenames.xml:100
dongsheng@627 7822 msgid "Using patterns to identify files"
dongsheng@630 7823 msgstr "使用模式标识文件"
dongsheng@627 7824
dongsheng@627 7825 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7826 #: ../en/ch06-filenames.xml:102
dongsheng@627 7827 msgid ""
dongsheng@627 7828 "In addition to working with file and directory names, Mercurial lets you use "
dongsheng@627 7829 "<emphasis>patterns</emphasis> to identify files. Mercurial's pattern "
dongsheng@627 7830 "handling is expressive."
dongsheng@627 7831 msgstr ""
dongsheng@627 7832
dongsheng@627 7833 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7834 #: ../en/ch06-filenames.xml:106
dongsheng@627 7835 msgid ""
dongsheng@627 7836 "On Unix-like systems (Linux, MacOS, etc.), the job of matching file names to "
dongsheng@627 7837 "patterns normally falls to the shell. On these systems, you must explicitly "
dongsheng@627 7838 "tell Mercurial that a name is a pattern. On Windows, the shell does not "
dongsheng@627 7839 "expand patterns, so Mercurial will automatically identify names that are "
dongsheng@627 7840 "patterns, and expand them for you."
dongsheng@627 7841 msgstr ""
dongsheng@627 7842
dongsheng@627 7843 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7844 #: ../en/ch06-filenames.xml:113
dongsheng@627 7845 msgid ""
dongsheng@627 7846 "To provide a pattern in place of a regular name on the command line, the "
dongsheng@627 7847 "mechanism is simple:"
dongsheng@627 7848 msgstr ""
dongsheng@627 7849
dongsheng@627 7850 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7851 #: ../en/ch06-filenames.xml:116
dongsheng@627 7852 msgid ""
dongsheng@627 7853 "That is, a pattern is identified by a short text string that says what kind "
dongsheng@627 7854 "of pattern this is, followed by a colon, followed by the actual pattern."
dongsheng@627 7855 msgstr ""
dongsheng@627 7856
dongsheng@627 7857 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7858 #: ../en/ch06-filenames.xml:120
dongsheng@627 7859 msgid ""
dongsheng@627 7860 "Mercurial supports two kinds of pattern syntax. The most frequently used is "
dongsheng@627 7861 "called <literal>glob</literal>; this is the same kind of pattern matching "
dongsheng@627 7862 "used by the Unix shell, and should be familiar to Windows command prompt "
dongsheng@627 7863 "users, too."
dongsheng@627 7864 msgstr ""
dongsheng@627 7865
dongsheng@627 7866 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7867 #: ../en/ch06-filenames.xml:125
dongsheng@627 7868 msgid ""
dongsheng@627 7869 "When Mercurial does automatic pattern matching on Windows, it uses "
dongsheng@627 7870 "<literal>glob</literal> syntax. You can thus omit the <quote><literal>glob:</"
dongsheng@627 7871 "literal></quote> prefix on Windows, but it's safe to use it, too."
dongsheng@627 7872 msgstr ""
dongsheng@627 7873
dongsheng@627 7874 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7875 #: ../en/ch06-filenames.xml:130
dongsheng@627 7876 msgid ""
dongsheng@627 7877 "The <literal>re</literal> syntax is more powerful; it lets you specify "
dongsheng@627 7878 "patterns using regular expressions, also known as regexps."
dongsheng@627 7879 msgstr ""
dongsheng@627 7880
dongsheng@627 7881 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 7882 #: ../en/ch06-filenames.xml:134
dongsheng@627 7883 msgid ""
dongsheng@627 7884 "By the way, in the examples that follow, notice that I'm careful to wrap all "
dongsheng@627 7885 "of my patterns in quote characters, so that they won't get expanded by the "
dongsheng@627 7886 "shell before Mercurial sees them."
dongsheng@627 7887 msgstr ""
dongsheng@627 7888
dongsheng@627 7889 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 7890 #: ../en/ch06-filenames.xml:140
dongsheng@627 7891 msgid "Shell-style <literal>glob</literal> patterns"
dongsheng@630 7892 msgstr "外壳风格的 <literal>glob</literal> 模式"
dongsheng@627 7893
dongsheng@627 7894 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7895 #: ../en/ch06-filenames.xml:142
dongsheng@627 7896 msgid ""
dongsheng@627 7897 "This is an overview of the kinds of patterns you can use when you're matching "
dongsheng@627 7898 "on glob patterns."
dongsheng@627 7899 msgstr ""
dongsheng@627 7900
dongsheng@627 7901 #
dongsheng@627 7902 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7903 #: ../en/ch06-filenames.xml:145
dongsheng@627 7904 msgid ""
dongsheng@627 7905 "The <quote><literal>*</literal></quote> character matches any string, within "
dongsheng@627 7906 "a single directory."
dongsheng@627 7907 msgstr ""
dongsheng@627 7908
dongsheng@627 7909 #
dongsheng@627 7910 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7911 #: ../en/ch06-filenames.xml:150
dongsheng@627 7912 msgid ""
dongsheng@627 7913 "The <quote><literal>**</literal></quote> pattern matches any string, and "
dongsheng@627 7914 "crosses directory boundaries. It's not a standard Unix glob token, but it's "
dongsheng@627 7915 "accepted by several popular Unix shells, and is very useful."
dongsheng@627 7916 msgstr ""
dongsheng@627 7917
dongsheng@627 7918 #
dongsheng@627 7919 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7920 #: ../en/ch06-filenames.xml:157
dongsheng@627 7921 msgid ""
dongsheng@627 7922 "The <quote><literal>?</literal></quote> pattern matches any single character."
dongsheng@627 7923 msgstr ""
dongsheng@627 7924
dongsheng@627 7925 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7926 #: ../en/ch06-filenames.xml:162
dongsheng@627 7927 msgid ""
dongsheng@627 7928 "The <quote><literal>[</literal></quote> character begins a "
dongsheng@627 7929 "<emphasis>character class</emphasis>. This matches any single character "
dongsheng@627 7930 "within the class. The class ends with a <quote><literal>]</literal></quote> "
dongsheng@627 7931 "character. A class may contain multiple <emphasis>range</emphasis>s of the "
dongsheng@627 7932 "form <quote><literal>a-f</literal></quote>, which is shorthand for "
dongsheng@627 7933 "<quote><literal>abcdef</literal></quote>."
dongsheng@627 7934 msgstr ""
dongsheng@627 7935
dongsheng@627 7936 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7937 #: ../en/ch06-filenames.xml:172
dongsheng@627 7938 msgid ""
dongsheng@627 7939 "If the first character after the <quote><literal>[</literal></quote> in a "
dongsheng@627 7940 "character class is a <quote><literal>!</literal></quote>, it "
dongsheng@627 7941 "<emphasis>negates</emphasis> the class, making it match any single character "
dongsheng@627 7942 "not in the class."
dongsheng@627 7943 msgstr ""
dongsheng@627 7944
dongsheng@627 7945 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7946 #: ../en/ch06-filenames.xml:178
dongsheng@627 7947 msgid ""
dongsheng@627 7948 "A <quote><literal>{</literal></quote> begins a group of subpatterns, where "
dongsheng@627 7949 "the whole group matches if any subpattern in the group matches. The "
dongsheng@627 7950 "<quote><literal>,</literal></quote> character separates subpatterns, and "
dongsheng@627 7951 "<quote><literal>}</literal></quote> ends the group."
dongsheng@627 7952 msgstr ""
dongsheng@627 7953
dongsheng@627 7954 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 7955 #: ../en/ch06-filenames.xml:187
dongsheng@627 7956 msgid "Watch out!"
dongsheng@630 7957 msgstr "千万小心!"
dongsheng@627 7958
dongsheng@627 7959 #
dongsheng@627 7960 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 7961 #: ../en/ch06-filenames.xml:189
dongsheng@627 7962 msgid ""
dongsheng@627 7963 "Don't forget that if you want to match a pattern in any directory, you should "
dongsheng@627 7964 "not be using the <quote><literal>*</literal></quote> match-any token, as this "
dongsheng@627 7965 "will only match within one directory. Instead, use the <quote><literal>**</"
dongsheng@627 7966 "literal></quote> token. This small example illustrates the difference "
dongsheng@627 7967 "between the two."
dongsheng@627 7968 msgstr ""
dongsheng@627 7969
dongsheng@627 7970 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 7971 #: ../en/ch06-filenames.xml:201
dongsheng@627 7972 msgid "Regular expression matching with <literal>re</literal> patterns"
dongsheng@630 7973 msgstr "使用 <literal>re</literal> 模式的正则表达式匹配"
dongsheng@627 7974
dongsheng@627 7975 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7976 #: ../en/ch06-filenames.xml:204
dongsheng@627 7977 msgid ""
dongsheng@627 7978 "Mercurial accepts the same regular expression syntax as the Python "
dongsheng@627 7979 "programming language (it uses Python's regexp engine internally). This is "
dongsheng@627 7980 "based on the Perl language's regexp syntax, which is the most popular dialect "
dongsheng@627 7981 "in use (it's also used in Java, for example)."
dongsheng@627 7982 msgstr ""
dongsheng@627 7983
dongsheng@627 7984 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7985 #: ../en/ch06-filenames.xml:210
dongsheng@627 7986 msgid ""
dongsheng@627 7987 "I won't discuss Mercurial's regexp dialect in any detail here, as regexps are "
dongsheng@627 7988 "not often used. Perl-style regexps are in any case already exhaustively "
dongsheng@627 7989 "documented on a multitude of web sites, and in many books. Instead, I will "
dongsheng@627 7990 "focus here on a few things you should know if you find yourself needing to "
dongsheng@627 7991 "use regexps with Mercurial."
dongsheng@627 7992 msgstr ""
dongsheng@627 7993
dongsheng@627 7994 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 7995 #: ../en/ch06-filenames.xml:217
dongsheng@627 7996 msgid ""
dongsheng@627 7997 "A regexp is matched against an entire file name, relative to the root of the "
dongsheng@627 7998 "repository. In other words, even if you're already in subbdirectory "
dongsheng@627 7999 "<filename class=\"directory\">foo</filename>, if you want to match files "
dongsheng@627 8000 "under this directory, your pattern must start with <quote><literal>foo/</"
dongsheng@627 8001 "literal></quote>."
dongsheng@627 8002 msgstr ""
dongsheng@627 8003
dongsheng@627 8004 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8005 #: ../en/ch06-filenames.xml:224
dongsheng@627 8006 msgid ""
dongsheng@627 8007 "One thing to note, if you're familiar with Perl-style regexps, is that "
dongsheng@627 8008 "Mercurial's are <emphasis>rooted</emphasis>. That is, a regexp starts "
dongsheng@627 8009 "matching against the beginning of a string; it doesn't look for a match "
dongsheng@627 8010 "anywhere within the string. To match anywhere in a string, start your "
dongsheng@627 8011 "pattern with <quote><literal>.*</literal></quote>."
dongsheng@627 8012 msgstr ""
dongsheng@627 8013
dongsheng@627 8014 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8015 #: ../en/ch06-filenames.xml:234
dongsheng@627 8016 msgid "Filtering files"
dongsheng@630 8017 msgstr "过滤文件"
dongsheng@627 8018
dongsheng@627 8019 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8020 #: ../en/ch06-filenames.xml:236
dongsheng@627 8021 msgid ""
dongsheng@627 8022 "Not only does Mercurial give you a variety of ways to specify files; it lets "
dongsheng@627 8023 "you further winnow those files using <emphasis>filters</emphasis>. Commands "
dongsheng@627 8024 "that work with file names accept two filtering options."
dongsheng@627 8025 msgstr ""
dongsheng@627 8026
dongsheng@627 8027 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8028 #: ../en/ch06-filenames.xml:241
dongsheng@627 8029 msgid ""
dongsheng@627 8030 "<option role=\"hg-opt-global\">-I</option>, or <option role=\"hg-opt-global"
dongsheng@627 8031 "\">--include</option>, lets you specify a pattern that file names must match "
dongsheng@627 8032 "in order to be processed."
dongsheng@627 8033 msgstr ""
dongsheng@627 8034
dongsheng@627 8035 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8036 #: ../en/ch06-filenames.xml:246
dongsheng@627 8037 msgid ""
dongsheng@627 8038 "<option role=\"hg-opt-global\">-X</option>, or <option role=\"hg-opt-global"
dongsheng@627 8039 "\">--exclude</option>, gives you a way to <emphasis>avoid</emphasis> "
dongsheng@627 8040 "processing files, if they match this pattern."
dongsheng@627 8041 msgstr ""
dongsheng@627 8042
dongsheng@627 8043 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8044 #: ../en/ch06-filenames.xml:251
dongsheng@627 8045 msgid ""
dongsheng@627 8046 "You can provide multiple <option role=\"hg-opt-global\">-I</option> and "
dongsheng@627 8047 "<option role=\"hg-opt-global\">-X</option> options on the command line, and "
dongsheng@627 8048 "intermix them as you please. Mercurial interprets the patterns you provide "
dongsheng@627 8049 "using glob syntax by default (but you can use regexps if you need to)."
dongsheng@627 8050 msgstr ""
dongsheng@627 8051
dongsheng@627 8052 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8053 #: ../en/ch06-filenames.xml:258
dongsheng@627 8054 msgid ""
dongsheng@627 8055 "You can read a <option role=\"hg-opt-global\">-I</option> filter as "
dongsheng@627 8056 "<quote>process only the files that match this filter</quote>."
dongsheng@627 8057 msgstr ""
dongsheng@627 8058
dongsheng@627 8059 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8060 #: ../en/ch06-filenames.xml:264
dongsheng@627 8061 msgid ""
dongsheng@627 8062 "The <option role=\"hg-opt-global\">-X</option> filter is best read as "
dongsheng@627 8063 "<quote>process only the files that don't match this pattern</quote>."
dongsheng@627 8064 msgstr ""
dongsheng@627 8065
dongsheng@627 8066 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8067 #: ../en/ch06-filenames.xml:272
dongsheng@627 8068 msgid "Ignoring unwanted files and directories"
dongsheng@630 8069 msgstr "忽略不需要的文件和目录"
dongsheng@627 8070
dongsheng@627 8071 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8072 #: ../en/ch06-filenames.xml:274
dongsheng@627 8073 msgid "XXX."
dongsheng@627 8074 msgstr ""
dongsheng@627 8075
dongsheng@627 8076 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8077 #: ../en/ch06-filenames.xml:278
dongsheng@627 8078 msgid "Case sensitivity"
dongsheng@630 8079 msgstr "大小写敏感性"
dongsheng@627 8080
dongsheng@627 8081 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8082 #: ../en/ch06-filenames.xml:280
dongsheng@627 8083 msgid ""
dongsheng@627 8084 "If you're working in a mixed development environment that contains both Linux "
dongsheng@627 8085 "(or other Unix) systems and Macs or Windows systems, you should keep in the "
dongsheng@627 8086 "back of your mind the knowledge that they treat the case (<quote>N</quote> "
dongsheng@627 8087 "versus <quote>n</quote>) of file names in incompatible ways. This is not "
dongsheng@627 8088 "very likely to affect you, and it's easy to deal with if it does, but it "
dongsheng@627 8089 "could surprise you if you don't know about it."
dongsheng@627 8090 msgstr ""
dongsheng@627 8091
dongsheng@627 8092 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8093 #: ../en/ch06-filenames.xml:289
dongsheng@627 8094 msgid ""
dongsheng@627 8095 "Operating systems and filesystems differ in the way they handle the "
dongsheng@627 8096 "<emphasis>case</emphasis> of characters in file and directory names. There "
dongsheng@627 8097 "are three common ways to handle case in names."
dongsheng@627 8098 msgstr ""
dongsheng@627 8099
dongsheng@627 8100 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8101 #: ../en/ch06-filenames.xml:294
dongsheng@627 8102 msgid ""
dongsheng@627 8103 "Completely case insensitive. Uppercase and lowercase versions of a letter "
dongsheng@627 8104 "are treated as identical, both when creating a file and during subsequent "
dongsheng@627 8105 "accesses. This is common on older DOS-based systems."
dongsheng@627 8106 msgstr ""
dongsheng@627 8107
dongsheng@627 8108 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8109 #: ../en/ch06-filenames.xml:299
dongsheng@627 8110 msgid ""
dongsheng@627 8111 "Case preserving, but insensitive. When a file or directory is created, the "
dongsheng@627 8112 "case of its name is stored, and can be retrieved and displayed by the "
dongsheng@627 8113 "operating system. When an existing file is being looked up, its case is "
dongsheng@627 8114 "ignored. This is the standard arrangement on Windows and MacOS. The names "
dongsheng@627 8115 "<filename>foo</filename> and <filename>FoO</filename> identify the same "
dongsheng@627 8116 "file. This treatment of uppercase and lowercase letters as interchangeable "
dongsheng@627 8117 "is also referred to as <emphasis>case folding</emphasis>."
dongsheng@627 8118 msgstr ""
dongsheng@627 8119
dongsheng@627 8120 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8121 #: ../en/ch06-filenames.xml:310
dongsheng@627 8122 msgid ""
dongsheng@627 8123 "Case sensitive. The case of a name is significant at all times. The names "
dongsheng@627 8124 "<filename>foo</filename> and {FoO} identify different files. This is the way "
dongsheng@627 8125 "Linux and Unix systems normally work."
dongsheng@627 8126 msgstr ""
dongsheng@627 8127
dongsheng@627 8128 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8129 #: ../en/ch06-filenames.xml:316
dongsheng@627 8130 msgid ""
dongsheng@627 8131 "On Unix-like systems, it is possible to have any or all of the above ways of "
dongsheng@627 8132 "handling case in action at once. For example, if you use a USB thumb drive "
dongsheng@627 8133 "formatted with a FAT32 filesystem on a Linux system, Linux will handle names "
dongsheng@627 8134 "on that filesystem in a case preserving, but insensitive, way."
dongsheng@627 8135 msgstr ""
dongsheng@627 8136
dongsheng@627 8137 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8138 #: ../en/ch06-filenames.xml:323
dongsheng@627 8139 msgid "Safe, portable repository storage"
dongsheng@630 8140 msgstr "安全,可移植的版本库存储"
dongsheng@627 8141
dongsheng@627 8142 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8143 #: ../en/ch06-filenames.xml:325
dongsheng@627 8144 msgid ""
dongsheng@627 8145 "Mercurial's repository storage mechanism is <emphasis>case safe</emphasis>. "
dongsheng@627 8146 "It translates file names so that they can be safely stored on both case "
dongsheng@627 8147 "sensitive and case insensitive filesystems. This means that you can use "
dongsheng@627 8148 "normal file copying tools to transfer a Mercurial repository onto, for "
dongsheng@627 8149 "example, a USB thumb drive, and safely move that drive and repository back "
dongsheng@627 8150 "and forth between a Mac, a PC running Windows, and a Linux box."
dongsheng@627 8151 msgstr ""
dongsheng@627 8152
dongsheng@627 8153 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8154 #: ../en/ch06-filenames.xml:336
dongsheng@627 8155 msgid "Detecting case conflicts"
dongsheng@630 8156 msgstr "检测大小写冲突"
dongsheng@627 8157
dongsheng@627 8158 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8159 #: ../en/ch06-filenames.xml:338
dongsheng@627 8160 msgid ""
dongsheng@627 8161 "When operating in the working directory, Mercurial honours the naming policy "
dongsheng@627 8162 "of the filesystem where the working directory is located. If the filesystem "
dongsheng@627 8163 "is case preserving, but insensitive, Mercurial will treat names that differ "
dongsheng@627 8164 "only in case as the same."
dongsheng@627 8165 msgstr ""
dongsheng@627 8166
dongsheng@627 8167 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8168 #: ../en/ch06-filenames.xml:344
dongsheng@627 8169 msgid ""
dongsheng@627 8170 "An important aspect of this approach is that it is possible to commit a "
dongsheng@627 8171 "changeset on a case sensitive (typically Linux or Unix) filesystem that will "
dongsheng@627 8172 "cause trouble for users on case insensitive (usually Windows and MacOS) "
dongsheng@627 8173 "users. If a Linux user commits changes to two files, one named "
dongsheng@627 8174 "<filename>myfile.c</filename> and the other named <filename>MyFile.C</"
dongsheng@627 8175 "filename>, they will be stored correctly in the repository. And in the "
dongsheng@627 8176 "working directories of other Linux users, they will be correctly represented "
dongsheng@627 8177 "as separate files."
dongsheng@627 8178 msgstr ""
dongsheng@627 8179
dongsheng@627 8180 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8181 #: ../en/ch06-filenames.xml:355
dongsheng@627 8182 msgid ""
dongsheng@627 8183 "If a Windows or Mac user pulls this change, they will not initially have a "
dongsheng@627 8184 "problem, because Mercurial's repository storage mechanism is case safe. "
dongsheng@627 8185 "However, once they try to <command role=\"hg-cmd\">hg update</command> the "
dongsheng@627 8186 "working directory to that changeset, or <command role=\"hg-cmd\">hg merge</"
dongsheng@627 8187 "command> with that changeset, Mercurial will spot the conflict between the "
dongsheng@627 8188 "two file names that the filesystem would treat as the same, and forbid the "
dongsheng@627 8189 "update or merge from occurring."
dongsheng@627 8190 msgstr ""
dongsheng@627 8191
dongsheng@627 8192 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8193 #: ../en/ch06-filenames.xml:367
dongsheng@627 8194 msgid "Fixing a case conflict"
dongsheng@630 8195 msgstr "修正大小写冲突"
dongsheng@627 8196
dongsheng@627 8197 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8198 #: ../en/ch06-filenames.xml:369
dongsheng@627 8199 msgid ""
dongsheng@627 8200 "If you are using Windows or a Mac in a mixed environment where some of your "
dongsheng@627 8201 "collaborators are using Linux or Unix, and Mercurial reports a case folding "
dongsheng@627 8202 "conflict when you try to <command role=\"hg-cmd\">hg update</command> or "
dongsheng@627 8203 "<command role=\"hg-cmd\">hg merge</command>, the procedure to fix the problem "
dongsheng@627 8204 "is simple."
dongsheng@627 8205 msgstr ""
dongsheng@627 8206
dongsheng@627 8207 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8208 #: ../en/ch06-filenames.xml:376
dongsheng@627 8209 msgid ""
dongsheng@627 8210 "Just find a nearby Linux or Unix box, clone the problem repository onto it, "
dongsheng@627 8211 "and use Mercurial's <command role=\"hg-cmd\">hg rename</command> command to "
dongsheng@627 8212 "change the names of any offending files or directories so that they will no "
dongsheng@627 8213 "longer cause case folding conflicts. Commit this change, <command role=\"hg-"
dongsheng@627 8214 "cmd\">hg pull</command> or <command role=\"hg-cmd\">hg push</command> it "
dongsheng@627 8215 "across to your Windows or MacOS system, and <command role=\"hg-cmd\">hg "
dongsheng@627 8216 "update</command> to the revision with the non-conflicting names."
dongsheng@627 8217 msgstr ""
dongsheng@627 8218
dongsheng@627 8219 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8220 #: ../en/ch06-filenames.xml:386
dongsheng@627 8221 msgid ""
dongsheng@627 8222 "The changeset with case-conflicting names will remain in your project's "
dongsheng@627 8223 "history, and you still won't be able to <command role=\"hg-cmd\">hg update</"
dongsheng@627 8224 "command> your working directory to that changeset on a Windows or MacOS "
dongsheng@627 8225 "system, but you can continue development unimpeded."
dongsheng@627 8226 msgstr ""
dongsheng@627 8227
dongsheng@627 8228 #. type: Content of: <book><chapter><sect1><sect2><note><para>
dongsheng@650 8229 #: ../en/ch06-filenames.xml:393
dongsheng@627 8230 msgid ""
dongsheng@627 8231 "Prior to version 0.9.3, Mercurial did not use a case safe repository storage "
dongsheng@627 8232 "mechanism, and did not detect case folding conflicts. If you are using an "
dongsheng@627 8233 "older version of Mercurial on Windows or MacOS, I strongly recommend that you "
dongsheng@627 8234 "upgrade."
dongsheng@627 8235 msgstr ""
dongsheng@627 8236
dongsheng@627 8237 #. type: Content of: <book><chapter><title>
dongsheng@650 8238 #: ../en/ch07-branch.xml:5
dongsheng@627 8239 msgid "Managing releases and branchy development"
dongsheng@627 8240 msgstr "发布管理与分支开发"
dongsheng@627 8241
dongsheng@627 8242 #. type: Content of: <book><chapter><para>
dongsheng@650 8243 #: ../en/ch07-branch.xml:7
dongsheng@627 8244 msgid ""
dongsheng@627 8245 "Mercurial provides several mechanisms for you to manage a project that is "
dongsheng@627 8246 "making progress on multiple fronts at once. To understand these mechanisms, "
dongsheng@627 8247 "let's first take a brief look at a fairly normal software project structure."
dongsheng@627 8248 msgstr ""
dongsheng@627 8249
dongsheng@627 8250 #. type: Content of: <book><chapter><para>
dongsheng@650 8251 #: ../en/ch07-branch.xml:12
dongsheng@627 8252 msgid ""
dongsheng@627 8253 "Many software projects issue periodic <quote>major</quote> releases that "
dongsheng@627 8254 "contain substantial new features. In parallel, they may issue <quote>minor</"
dongsheng@627 8255 "quote> releases. These are usually identical to the major releases off which "
dongsheng@627 8256 "they're based, but with a few bugs fixed."
dongsheng@627 8257 msgstr ""
dongsheng@627 8258
dongsheng@627 8259 #. type: Content of: <book><chapter><para>
dongsheng@650 8260 #: ../en/ch07-branch.xml:18
dongsheng@627 8261 msgid ""
dongsheng@627 8262 "In this chapter, we'll start by talking about how to keep records of project "
dongsheng@627 8263 "milestones such as releases. We'll then continue on to talk about the flow "
dongsheng@627 8264 "of work between different phases of a project, and how Mercurial can help you "
dongsheng@627 8265 "to isolate and manage this work."
dongsheng@627 8266 msgstr ""
dongsheng@627 8267
dongsheng@627 8268 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8269 #: ../en/ch07-branch.xml:25
dongsheng@627 8270 msgid "Giving a persistent name to a revision"
dongsheng@635 8271 msgstr "给版本指定一个永久的名称"
dongsheng@627 8272
dongsheng@627 8273 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8274 #: ../en/ch07-branch.xml:27
dongsheng@627 8275 msgid ""
dongsheng@627 8276 "Once you decide that you'd like to call a particular revision a "
dongsheng@627 8277 "<quote>release</quote>, it's a good idea to record the identity of that "
dongsheng@627 8278 "revision. This will let you reproduce that release at a later date, for "
dongsheng@627 8279 "whatever purpose you might need at the time (reproducing a bug, porting to a "
dongsheng@627 8280 "new platform, etc). &interaction.tag.init;"
dongsheng@627 8281 msgstr ""
dongsheng@627 8282
dongsheng@627 8283 #
dongsheng@627 8284 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8285 #: ../en/ch07-branch.xml:34
dongsheng@627 8286 msgid ""
dongsheng@627 8287 "Mercurial lets you give a permanent name to any revision using the <command "
dongsheng@627 8288 "role=\"hg-cmd\">hg tag</command> command. Not surprisingly, these names are "
dongsheng@627 8289 "called <quote>tags</quote>."
dongsheng@627 8290 msgstr ""
dongsheng@627 8291
dongsheng@627 8292 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8293 #: ../en/ch07-branch.xml:40
dongsheng@627 8294 msgid ""
dongsheng@627 8295 "A tag is nothing more than a <quote>symbolic name</quote> for a revision. "
dongsheng@627 8296 "Tags exist purely for your convenience, so that you have a handy permanent "
dongsheng@627 8297 "way to refer to a revision; Mercurial doesn't interpret the tag names you use "
dongsheng@627 8298 "in any way. Neither does Mercurial place any restrictions on the name of a "
dongsheng@627 8299 "tag, beyond a few that are necessary to ensure that a tag can be parsed "
dongsheng@627 8300 "unambiguously. A tag name cannot contain any of the following characters:"
dongsheng@627 8301 msgstr ""
dongsheng@627 8302
dongsheng@627 8303 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8304 #: ../en/ch07-branch.xml:49
dongsheng@627 8305 msgid "Colon (ASCII 58, <quote><literal>:</literal></quote>)"
dongsheng@627 8306 msgstr ""
dongsheng@627 8307
dongsheng@627 8308 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8309 #: ../en/ch07-branch.xml:52
dongsheng@627 8310 msgid "Carriage return (ASCII 13, <quote><literal>\\r</literal></quote>)"
dongsheng@627 8311 msgstr ""
dongsheng@627 8312
dongsheng@627 8313 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8314 #: ../en/ch07-branch.xml:55
dongsheng@627 8315 msgid "Newline (ASCII 10, <quote><literal>\\n</literal></quote>)"
dongsheng@627 8316 msgstr ""
dongsheng@627 8317
dongsheng@627 8318 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8319 #: ../en/ch07-branch.xml:59
dongsheng@627 8320 msgid ""
dongsheng@627 8321 "You can use the <command role=\"hg-cmd\">hg tags</command> command to display "
dongsheng@627 8322 "the tags present in your repository. In the output, each tagged revision is "
dongsheng@627 8323 "identified first by its name, then by revision number, and finally by the "
dongsheng@627 8324 "unique hash of the revision."
dongsheng@627 8325 msgstr ""
dongsheng@627 8326
dongsheng@627 8327 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8328 #: ../en/ch07-branch.xml:67
dongsheng@627 8329 msgid ""
dongsheng@627 8330 "Notice that <literal>tip</literal> is listed in the output of <command role="
dongsheng@627 8331 "\"hg-cmd\">hg tags</command>. The <literal>tip</literal> tag is a special "
dongsheng@627 8332 "<quote>floating</quote> tag, which always identifies the newest revision in "
dongsheng@627 8333 "the repository."
dongsheng@627 8334 msgstr ""
dongsheng@627 8335
dongsheng@627 8336 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8337 #: ../en/ch07-branch.xml:73
dongsheng@627 8338 msgid ""
dongsheng@627 8339 "In the output of the <command role=\"hg-cmd\">hg tags</command> command, tags "
dongsheng@627 8340 "are listed in reverse order, by revision number. This usually means that "
dongsheng@627 8341 "recent tags are listed before older tags. It also means that <literal>tip</"
dongsheng@627 8342 "literal> is always going to be the first tag listed in the output of <command "
dongsheng@627 8343 "role=\"hg-cmd\">hg tags</command>."
dongsheng@627 8344 msgstr ""
dongsheng@627 8345
dongsheng@627 8346 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8347 #: ../en/ch07-branch.xml:80
dongsheng@627 8348 msgid ""
dongsheng@627 8349 "When you run <command role=\"hg-cmd\">hg log</command>, if it displays a "
dongsheng@627 8350 "revision that has tags associated with it, it will print those tags."
dongsheng@627 8351 msgstr ""
dongsheng@627 8352
dongsheng@627 8353 #
dongsheng@627 8354 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8355 #: ../en/ch07-branch.xml:86
dongsheng@627 8356 msgid ""
dongsheng@627 8357 "Any time you need to provide a revision ID to a Mercurial command, the "
dongsheng@627 8358 "command will accept a tag name in its place. Internally, Mercurial will "
dongsheng@627 8359 "translate your tag name into the corresponding revision ID, then use that."
dongsheng@627 8360 msgstr ""
dongsheng@627 8361
dongsheng@627 8362 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8363 #: ../en/ch07-branch.xml:93
dongsheng@627 8364 msgid ""
dongsheng@627 8365 "There's no limit on the number of tags you can have in a repository, or on "
dongsheng@627 8366 "the number of tags that a single revision can have. As a practical matter, "
dongsheng@627 8367 "it's not a great idea to have <quote>too many</quote> (a number which will "
dongsheng@627 8368 "vary from project to project), simply because tags are supposed to help you "
dongsheng@627 8369 "to find revisions. If you have lots of tags, the ease of using them to "
dongsheng@627 8370 "identify revisions diminishes rapidly."
dongsheng@627 8371 msgstr ""
dongsheng@627 8372
dongsheng@627 8373 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8374 #: ../en/ch07-branch.xml:101
dongsheng@627 8375 msgid ""
dongsheng@627 8376 "For example, if your project has milestones as frequent as every few days, "
dongsheng@627 8377 "it's perfectly reasonable to tag each one of those. But if you have a "
dongsheng@627 8378 "continuous build system that makes sure every revision can be built cleanly, "
dongsheng@627 8379 "you'd be introducing a lot of noise if you were to tag every clean build. "
dongsheng@627 8380 "Instead, you could tag failed builds (on the assumption that they're rare!), "
dongsheng@627 8381 "or simply not use tags to track buildability."
dongsheng@627 8382 msgstr ""
dongsheng@627 8383
dongsheng@627 8384 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8385 #: ../en/ch07-branch.xml:109
dongsheng@627 8386 msgid ""
dongsheng@627 8387 "If you want to remove a tag that you no longer want, use <command role=\"hg-"
dongsheng@627 8388 "cmd\">hg tag --remove</command>."
dongsheng@627 8389 msgstr ""
dongsheng@627 8390
dongsheng@627 8391 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8392 #: ../en/ch07-branch.xml:114
dongsheng@627 8393 msgid ""
dongsheng@627 8394 "You can also modify a tag at any time, so that it identifies a different "
dongsheng@627 8395 "revision, by simply issuing a new <command role=\"hg-cmd\">hg tag</command> "
dongsheng@627 8396 "command. You'll have to use the <option role=\"hg-opt-tag\">-f</option> "
dongsheng@627 8397 "option to tell Mercurial that you <emphasis>really</emphasis> want to update "
dongsheng@627 8398 "the tag."
dongsheng@627 8399 msgstr ""
dongsheng@627 8400
dongsheng@627 8401 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8402 #: ../en/ch07-branch.xml:123
dongsheng@627 8403 msgid ""
dongsheng@627 8404 "There will still be a permanent record of the previous identity of the tag, "
dongsheng@627 8405 "but Mercurial will no longer use it. There's thus no penalty to tagging the "
dongsheng@627 8406 "wrong revision; all you have to do is turn around and tag the correct "
dongsheng@627 8407 "revision once you discover your error."
dongsheng@627 8408 msgstr ""
dongsheng@627 8409
dongsheng@627 8410 #
dongsheng@627 8411 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8412 #: ../en/ch07-branch.xml:129
dongsheng@627 8413 msgid ""
dongsheng@627 8414 "Mercurial stores tags in a normal revision-controlled file in your "
dongsheng@627 8415 "repository. If you've created any tags, you'll find them in a file named "
dongsheng@627 8416 "<filename role=\"special\">.hgtags</filename>. When you run the <command "
dongsheng@627 8417 "role=\"hg-cmd\">hg tag</command> command, Mercurial modifies this file, then "
dongsheng@627 8418 "automatically commits the change to it. This means that every time you run "
dongsheng@627 8419 "<command role=\"hg-cmd\">hg tag</command>, you'll see a corresponding "
dongsheng@627 8420 "changeset in the output of <command role=\"hg-cmd\">hg log</command>."
dongsheng@627 8421 msgstr ""
dongsheng@627 8422
dongsheng@627 8423 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8424 #: ../en/ch07-branch.xml:142
dongsheng@627 8425 msgid "Handling tag conflicts during a merge"
dongsheng@635 8426 msgstr "在合并期间处理标签冲突"
dongsheng@627 8427
dongsheng@627 8428 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8429 #: ../en/ch07-branch.xml:144
dongsheng@627 8430 msgid ""
dongsheng@627 8431 "You won't often need to care about the <filename role=\"special\">.hgtags</"
dongsheng@627 8432 "filename> file, but it sometimes makes its presence known during a merge. "
dongsheng@627 8433 "The format of the file is simple: it consists of a series of lines. Each "
dongsheng@627 8434 "line starts with a changeset hash, followed by a space, followed by the name "
dongsheng@627 8435 "of a tag."
dongsheng@627 8436 msgstr ""
dongsheng@627 8437
dongsheng@627 8438 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8439 #: ../en/ch07-branch.xml:151
dongsheng@627 8440 msgid ""
dongsheng@627 8441 "If you're resolving a conflict in the <filename role=\"special\">.hgtags</"
dongsheng@627 8442 "filename> file during a merge, there's one twist to modifying the <filename "
dongsheng@627 8443 "role=\"special\">.hgtags</filename> file: when Mercurial is parsing the tags "
dongsheng@627 8444 "in a repository, it <emphasis>never</emphasis> reads the working copy of the "
dongsheng@627 8445 "<filename role=\"special\">.hgtags</filename> file. Instead, it reads the "
dongsheng@627 8446 "<emphasis>most recently committed</emphasis> revision of the file."
dongsheng@627 8447 msgstr ""
dongsheng@627 8448
dongsheng@627 8449 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8450 #: ../en/ch07-branch.xml:161
dongsheng@627 8451 msgid ""
dongsheng@627 8452 "An unfortunate consequence of this design is that you can't actually verify "
dongsheng@627 8453 "that your merged <filename role=\"special\">.hgtags</filename> file is "
dongsheng@627 8454 "correct until <emphasis>after</emphasis> you've committed a change. So if "
dongsheng@627 8455 "you find yourself resolving a conflict on <filename role=\"special\">.hgtags</"
dongsheng@627 8456 "filename> during a merge, be sure to run <command role=\"hg-cmd\">hg tags</"
dongsheng@627 8457 "command> after you commit. If it finds an error in the <filename role="
dongsheng@627 8458 "\"special\">.hgtags</filename> file, it will report the location of the "
dongsheng@627 8459 "error, which you can then fix and commit. You should then run <command role="
dongsheng@627 8460 "\"hg-cmd\">hg tags</command> again, just to be sure that your fix is correct."
dongsheng@627 8461 msgstr ""
dongsheng@627 8462
dongsheng@627 8463 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8464 #: ../en/ch07-branch.xml:176
dongsheng@627 8465 msgid "Tags and cloning"
dongsheng@635 8466 msgstr "标签与克隆"
dongsheng@627 8467
dongsheng@627 8468 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8469 #: ../en/ch07-branch.xml:178
dongsheng@627 8470 msgid ""
dongsheng@627 8471 "You may have noticed that the <command role=\"hg-cmd\">hg clone</command> "
dongsheng@627 8472 "command has a <option role=\"hg-opt-clone\">-r</option> option that lets you "
dongsheng@627 8473 "clone an exact copy of the repository as of a particular changeset. The new "
dongsheng@627 8474 "clone will not contain any project history that comes after the revision you "
dongsheng@627 8475 "specified. This has an interaction with tags that can surprise the unwary."
dongsheng@627 8476 msgstr ""
dongsheng@627 8477
dongsheng@627 8478 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8479 #: ../en/ch07-branch.xml:186
dongsheng@627 8480 msgid ""
dongsheng@627 8481 "Recall that a tag is stored as a revision to the <filename role=\"special\">."
dongsheng@627 8482 "hgtags</filename> file, so that when you create a tag, the changeset in which "
dongsheng@627 8483 "it's recorded necessarily refers to an older changeset. When you run "
dongsheng@627 8484 "<command role=\"hg-cmd\">hg clone -r foo</command> to clone a repository as "
dongsheng@627 8485 "of tag <literal>foo</literal>, the new clone <emphasis>will not contain the "
dongsheng@627 8486 "history that created the tag</emphasis> that you used to clone the "
dongsheng@627 8487 "repository. The result is that you'll get exactly the right subset of the "
dongsheng@627 8488 "project's history in the new repository, but <emphasis>not</emphasis> the tag "
dongsheng@627 8489 "you might have expected."
dongsheng@627 8490 msgstr ""
dongsheng@627 8491
dongsheng@627 8492 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8493 #: ../en/ch07-branch.xml:201
dongsheng@627 8494 msgid "When permanent tags are too much"
dongsheng@635 8495 msgstr "当永久标签太多的时候"
dongsheng@627 8496
dongsheng@627 8497 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8498 #: ../en/ch07-branch.xml:203
dongsheng@627 8499 msgid ""
dongsheng@627 8500 "Since Mercurial's tags are revision controlled and carried around with a "
dongsheng@627 8501 "project's history, everyone you work with will see the tags you create. But "
dongsheng@627 8502 "giving names to revisions has uses beyond simply noting that revision "
dongsheng@627 8503 "<literal>4237e45506ee</literal> is really <literal>v2.0.2</literal>. If "
dongsheng@627 8504 "you're trying to track down a subtle bug, you might want a tag to remind you "
dongsheng@627 8505 "of something like <quote>Anne saw the symptoms with this revision</quote>."
dongsheng@627 8506 msgstr ""
dongsheng@627 8507
dongsheng@627 8508 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8509 #: ../en/ch07-branch.xml:213
dongsheng@627 8510 msgid ""
dongsheng@627 8511 "For cases like this, what you might want to use are <emphasis>local</"
dongsheng@627 8512 "emphasis> tags. You can create a local tag with the <option role=\"hg-opt-tag"
dongsheng@627 8513 "\">-l</option> option to the <command role=\"hg-cmd\">hg tag</command> "
dongsheng@627 8514 "command. This will store the tag in a file called <filename role=\"special"
dongsheng@627 8515 "\">.hg/localtags</filename>. Unlike <filename role=\"special\">.hgtags</"
dongsheng@627 8516 "filename>, <filename role=\"special\">.hg/localtags</filename> is not "
dongsheng@627 8517 "revision controlled. Any tags you create using <option role=\"hg-opt-tag\">-"
dongsheng@627 8518 "l</option> remain strictly local to the repository you're currently working "
dongsheng@627 8519 "in."
dongsheng@627 8520 msgstr ""
dongsheng@627 8521
dongsheng@627 8522 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8523 #: ../en/ch07-branch.xml:228
dongsheng@661 8524 msgid "The flow of changes—big picture vs. little"
dongsheng@661 8525 msgstr "修改流程—宏观与微观"
dongsheng@627 8526
dongsheng@627 8527 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8528 #: ../en/ch07-branch.xml:230
dongsheng@627 8529 msgid ""
dongsheng@627 8530 "To return to the outline I sketched at the beginning of a chapter, let's "
dongsheng@627 8531 "think about a project that has multiple concurrent pieces of work under "
dongsheng@627 8532 "development at once."
dongsheng@627 8533 msgstr ""
dongsheng@627 8534
dongsheng@627 8535 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8536 #: ../en/ch07-branch.xml:234
dongsheng@627 8537 msgid ""
dongsheng@627 8538 "There might be a push for a new <quote>main</quote> release; a new minor "
dongsheng@627 8539 "bugfix release to the last main release; and an unexpected <quote>hot fix</"
dongsheng@627 8540 "quote> to an old release that is now in maintenance mode."
dongsheng@627 8541 msgstr ""
dongsheng@627 8542
dongsheng@627 8543 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8544 #: ../en/ch07-branch.xml:239
dongsheng@627 8545 msgid ""
dongsheng@627 8546 "The usual way people refer to these different concurrent directions of "
dongsheng@627 8547 "development is as <quote>branches</quote>. However, we've already seen "
dongsheng@627 8548 "numerous times that Mercurial treats <emphasis>all of history</emphasis> as a "
dongsheng@627 8549 "series of branches and merges. Really, what we have here is two ideas that "
dongsheng@627 8550 "are peripherally related, but which happen to share a name."
dongsheng@627 8551 msgstr ""
dongsheng@627 8552
dongsheng@627 8553 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8554 #: ../en/ch07-branch.xml:246
dongsheng@627 8555 msgid ""
dongsheng@627 8556 "<quote>Big picture</quote> branches represent the sweep of a project's "
dongsheng@627 8557 "evolution; people give them names, and talk about them in conversation."
dongsheng@627 8558 msgstr ""
dongsheng@627 8559
dongsheng@627 8560 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 8561 #: ../en/ch07-branch.xml:250
dongsheng@627 8562 msgid ""
dongsheng@627 8563 "<quote>Little picture</quote> branches are artefacts of the day-to-day "
dongsheng@627 8564 "activity of developing and merging changes. They expose the narrative of how "
dongsheng@627 8565 "the code was developed."
dongsheng@627 8566 msgstr ""
dongsheng@627 8567
dongsheng@627 8568 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8569 #: ../en/ch07-branch.xml:258
dongsheng@627 8570 msgid "Managing big-picture branches in repositories"
dongsheng@635 8571 msgstr "在版本库中管理分支"
dongsheng@627 8572
dongsheng@627 8573 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8574 #: ../en/ch07-branch.xml:260
dongsheng@627 8575 msgid ""
dongsheng@627 8576 "The easiest way to isolate a <quote>big picture</quote> branch in Mercurial "
dongsheng@661 8577 "is in a dedicated repository. If you have an existing shared repository—"
dongsheng@661 8578 "let's call it <literal>myproject</literal>&emdash;that reaches a <quote>1.0</"
dongsheng@661 8579 "quote> milestone, you can start to prepare for future maintenance releases on "
dongsheng@661 8580 "top of version 1.0 by tagging the revision from which you prepared the 1.0 "
dongsheng@661 8581 "release."
dongsheng@627 8582 msgstr ""
dongsheng@627 8583
dongsheng@627 8584 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8585 #: ../en/ch07-branch.xml:270
dongsheng@627 8586 msgid ""
dongsheng@627 8587 "You can then clone a new shared <literal>myproject-1.0.1</literal> repository "
dongsheng@627 8588 "as of that tag."
dongsheng@627 8589 msgstr ""
dongsheng@627 8590
dongsheng@627 8591 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8592 #: ../en/ch07-branch.xml:276
dongsheng@627 8593 msgid ""
dongsheng@627 8594 "Afterwards, if someone needs to work on a bug fix that ought to go into an "
dongsheng@627 8595 "upcoming 1.0.1 minor release, they clone the <literal>myproject-1.0.1</"
dongsheng@627 8596 "literal> repository, make their changes, and push them back."
dongsheng@627 8597 msgstr ""
dongsheng@627 8598
dongsheng@627 8599 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8600 #: ../en/ch07-branch.xml:283
dongsheng@627 8601 msgid ""
dongsheng@627 8602 "Meanwhile, development for the next major release can continue, isolated and "
dongsheng@627 8603 "unabated, in the <literal>myproject</literal> repository."
dongsheng@627 8604 msgstr ""
dongsheng@627 8605
dongsheng@627 8606 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8607 #: ../en/ch07-branch.xml:291
dongsheng@627 8608 msgid "Don't repeat yourself: merging across branches"
dongsheng@635 8609 msgstr "不要重复劳动:在分支间合并"
dongsheng@627 8610
dongsheng@627 8611 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8612 #: ../en/ch07-branch.xml:293
dongsheng@627 8613 msgid ""
dongsheng@627 8614 "In many cases, if you have a bug to fix on a maintenance branch, the chances "
dongsheng@627 8615 "are good that the bug exists on your project's main branch (and possibly "
dongsheng@627 8616 "other maintenance branches, too). It's a rare developer who wants to fix the "
dongsheng@627 8617 "same bug multiple times, so let's look at a few ways that Mercurial can help "
dongsheng@627 8618 "you to manage these bugfixes without duplicating your work."
dongsheng@627 8619 msgstr ""
dongsheng@627 8620
dongsheng@627 8621 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8622 #: ../en/ch07-branch.xml:301
dongsheng@627 8623 msgid ""
dongsheng@627 8624 "In the simplest instance, all you need to do is pull changes from your "
dongsheng@627 8625 "maintenance branch into your local clone of the target branch."
dongsheng@627 8626 msgstr ""
dongsheng@627 8627
dongsheng@627 8628 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8629 #: ../en/ch07-branch.xml:307
dongsheng@627 8630 msgid ""
dongsheng@627 8631 "You'll then need to merge the heads of the two branches, and push back to the "
dongsheng@627 8632 "main branch."
dongsheng@627 8633 msgstr ""
dongsheng@627 8634
dongsheng@627 8635 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8636 #: ../en/ch07-branch.xml:314
dongsheng@627 8637 msgid "Naming branches within one repository"
dongsheng@635 8638 msgstr "版本库中的命名分支"
dongsheng@627 8639
dongsheng@627 8640 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8641 #: ../en/ch07-branch.xml:316
dongsheng@627 8642 msgid ""
dongsheng@627 8643 "In most instances, isolating branches in repositories is the right approach. "
dongsheng@627 8644 "Its simplicity makes it easy to understand; and so it's hard to make "
dongsheng@627 8645 "mistakes. There's a one-to-one relationship between branches you're working "
dongsheng@627 8646 "in and directories on your system. This lets you use normal (non-Mercurial-"
dongsheng@627 8647 "aware) tools to work on files within a branch/repository."
dongsheng@627 8648 msgstr ""
dongsheng@627 8649
dongsheng@627 8650 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8651 #: ../en/ch07-branch.xml:323
dongsheng@627 8652 msgid ""
dongsheng@627 8653 "If you're more in the <quote>power user</quote> category (<emphasis>and</"
dongsheng@627 8654 "emphasis> your collaborators are too), there is an alternative way of "
dongsheng@627 8655 "handling branches that you can consider. I've already mentioned the human-"
dongsheng@627 8656 "level distinction between <quote>small picture</quote> and <quote>big "
dongsheng@627 8657 "picture</quote> branches. While Mercurial works with multiple <quote>small "
dongsheng@627 8658 "picture</quote> branches in a repository all the time (for example after you "
dongsheng@627 8659 "pull changes in, but before you merge them), it can <emphasis>also</emphasis> "
dongsheng@627 8660 "work with multiple <quote>big picture</quote> branches."
dongsheng@627 8661 msgstr ""
dongsheng@627 8662
dongsheng@627 8663 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8664 #: ../en/ch07-branch.xml:334
dongsheng@627 8665 msgid ""
dongsheng@627 8666 "The key to working this way is that Mercurial lets you assign a persistent "
dongsheng@627 8667 "<emphasis>name</emphasis> to a branch. There always exists a branch named "
dongsheng@627 8668 "<literal>default</literal>. Even before you start naming branches yourself, "
dongsheng@627 8669 "you can find traces of the <literal>default</literal> branch if you look for "
dongsheng@627 8670 "them."
dongsheng@627 8671 msgstr ""
dongsheng@627 8672
dongsheng@627 8673 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8674 #: ../en/ch07-branch.xml:341
dongsheng@627 8675 msgid ""
dongsheng@627 8676 "As an example, when you run the <command role=\"hg-cmd\">hg commit</command> "
dongsheng@627 8677 "command, and it pops up your editor so that you can enter a commit message, "
dongsheng@627 8678 "look for a line that contains the text <quote><literal>HG: branch default</"
dongsheng@627 8679 "literal></quote> at the bottom. This is telling you that your commit will "
dongsheng@627 8680 "occur on the branch named <literal>default</literal>."
dongsheng@627 8681 msgstr ""
dongsheng@627 8682
dongsheng@627 8683 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8684 #: ../en/ch07-branch.xml:348
dongsheng@627 8685 msgid ""
dongsheng@627 8686 "To start working with named branches, use the <command role=\"hg-cmd\">hg "
dongsheng@627 8687 "branches</command> command. This command lists the named branches already "
dongsheng@627 8688 "present in your repository, telling you which changeset is the tip of each."
dongsheng@627 8689 msgstr ""
dongsheng@627 8690
dongsheng@627 8691 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8692 #: ../en/ch07-branch.xml:355
dongsheng@627 8693 msgid ""
dongsheng@627 8694 "Since you haven't created any named branches yet, the only one that exists is "
dongsheng@627 8695 "<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:358
dongsheng@627 8700 msgid ""
dongsheng@627 8701 "To find out what the <quote>current</quote> branch is, run the <command role="
dongsheng@627 8702 "\"hg-cmd\">hg branch</command> command, giving it no arguments. This tells "
dongsheng@627 8703 "you what branch the parent of the current changeset is on."
dongsheng@627 8704 msgstr ""
dongsheng@627 8705
dongsheng@627 8706 #
dongsheng@627 8707 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8708 #: ../en/ch07-branch.xml:365
dongsheng@627 8709 msgid ""
dongsheng@627 8710 "To create a new branch, run the <command role=\"hg-cmd\">hg branch</command> "
dongsheng@627 8711 "command again. This time, give it one argument: the name of the branch you "
dongsheng@627 8712 "want to create."
dongsheng@627 8713 msgstr ""
dongsheng@627 8714
dongsheng@627 8715 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8716 #: ../en/ch07-branch.xml:371
dongsheng@627 8717 msgid ""
dongsheng@627 8718 "After you've created a branch, you might wonder what effect the <command role="
dongsheng@627 8719 "\"hg-cmd\">hg branch</command> command has had. What do the <command role="
dongsheng@627 8720 "\"hg-cmd\">hg status</command> and <command role=\"hg-cmd\">hg tip</command> "
dongsheng@627 8721 "commands report?"
dongsheng@627 8722 msgstr ""
dongsheng@627 8723
dongsheng@627 8724 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8725 #: ../en/ch07-branch.xml:378
dongsheng@627 8726 msgid ""
dongsheng@627 8727 "Nothing has changed in the working directory, and there's been no new history "
dongsheng@627 8728 "created. As this suggests, running the <command role=\"hg-cmd\">hg branch</"
dongsheng@627 8729 "command> command has no permanent effect; it only tells Mercurial what branch "
dongsheng@627 8730 "name to use the <emphasis>next</emphasis> time you commit a changeset."
dongsheng@627 8731 msgstr ""
dongsheng@627 8732
dongsheng@627 8733 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8734 #: ../en/ch07-branch.xml:385
dongsheng@627 8735 msgid ""
dongsheng@627 8736 "When you commit a change, Mercurial records the name of the branch on which "
dongsheng@627 8737 "you committed. Once you've switched from the <literal>default</literal> "
dongsheng@627 8738 "branch to another and committed, you'll see the name of the new branch show "
dongsheng@627 8739 "up in the output of <command role=\"hg-cmd\">hg log</command>, <command role="
dongsheng@627 8740 "\"hg-cmd\">hg tip</command>, and other commands that display the same kind of "
dongsheng@627 8741 "output."
dongsheng@627 8742 msgstr ""
dongsheng@627 8743
dongsheng@627 8744 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8745 #: ../en/ch07-branch.xml:395
dongsheng@627 8746 msgid ""
dongsheng@627 8747 "The <command role=\"hg-cmd\">hg log</command>-like commands will print the "
dongsheng@627 8748 "branch name of every changeset that's not on the <literal>default</literal> "
dongsheng@627 8749 "branch. As a result, if you never use named branches, you'll never see this "
dongsheng@627 8750 "information."
dongsheng@627 8751 msgstr ""
dongsheng@627 8752
dongsheng@627 8753 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8754 #: ../en/ch07-branch.xml:400
dongsheng@627 8755 msgid ""
dongsheng@627 8756 "Once you've named a branch and committed a change with that name, every "
dongsheng@627 8757 "subsequent commit that descends from that change will inherit the same branch "
dongsheng@627 8758 "name. You can change the name of a branch at any time, using the <command "
dongsheng@627 8759 "role=\"hg-cmd\">hg branch</command> command."
dongsheng@627 8760 msgstr ""
dongsheng@627 8761
dongsheng@627 8762 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8763 #: ../en/ch07-branch.xml:408
dongsheng@627 8764 msgid ""
dongsheng@627 8765 "In practice, this is something you won't do very often, as branch names tend "
dongsheng@627 8766 "to have fairly long lifetimes. (This isn't a rule, just an observation.)"
dongsheng@627 8767 msgstr ""
dongsheng@627 8768
dongsheng@627 8769 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8770 #: ../en/ch07-branch.xml:414
dongsheng@627 8771 msgid "Dealing with multiple named branches in a repository"
dongsheng@635 8772 msgstr "在版本库中处理多个命名分支"
dongsheng@627 8773
dongsheng@627 8774 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8775 #: ../en/ch07-branch.xml:417
dongsheng@627 8776 msgid ""
dongsheng@627 8777 "If you have more than one named branch in a repository, Mercurial will "
dongsheng@627 8778 "remember the branch that your working directory on when you start a command "
dongsheng@627 8779 "like <command role=\"hg-cmd\">hg update</command> or <command role=\"hg-cmd"
dongsheng@627 8780 "\">hg pull -u</command>. It will update the working directory to the tip of "
dongsheng@627 8781 "this branch, no matter what the <quote>repo-wide</quote> tip is. To update "
dongsheng@627 8782 "to a revision that's on a different named branch, you may need to use the "
dongsheng@627 8783 "<option role=\"hg-opt-update\">-C</option> option to <command role=\"hg-cmd"
dongsheng@627 8784 "\">hg update</command>."
dongsheng@627 8785 msgstr ""
dongsheng@627 8786
dongsheng@627 8787 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8788 #: ../en/ch07-branch.xml:427
dongsheng@627 8789 msgid ""
dongsheng@627 8790 "This behaviour is a little subtle, so let's see it in action. First, let's "
dongsheng@627 8791 "remind ourselves what branch we're currently on, and what branches are in our "
dongsheng@627 8792 "repository."
dongsheng@627 8793 msgstr ""
dongsheng@627 8794
dongsheng@627 8795 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8796 #: ../en/ch07-branch.xml:433
dongsheng@627 8797 msgid ""
dongsheng@627 8798 "We're on the <literal>bar</literal> branch, but there also exists an older "
dongsheng@627 8799 "<command role=\"hg-cmd\">hg foo</command> branch."
dongsheng@627 8800 msgstr ""
dongsheng@627 8801
dongsheng@627 8802 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8803 #: ../en/ch07-branch.xml:437
dongsheng@627 8804 msgid ""
dongsheng@627 8805 "We can <command role=\"hg-cmd\">hg update</command> back and forth between "
dongsheng@627 8806 "the tips of the <literal>foo</literal> and <literal>bar</literal> branches "
dongsheng@627 8807 "without needing to use the <option role=\"hg-opt-update\">-C</option> option, "
dongsheng@627 8808 "because this only involves going backwards and forwards linearly through our "
dongsheng@627 8809 "change history."
dongsheng@627 8810 msgstr ""
dongsheng@627 8811
dongsheng@627 8812 #
dongsheng@627 8813 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8814 #: ../en/ch07-branch.xml:446
dongsheng@627 8815 msgid ""
dongsheng@627 8816 "If we go back to the <literal>foo</literal> branch and then run <command role="
dongsheng@627 8817 "\"hg-cmd\">hg update</command>, it will keep us on <literal>foo</literal>, "
dongsheng@627 8818 "not move us to the tip of <literal>bar</literal>."
dongsheng@627 8819 msgstr ""
dongsheng@627 8820
dongsheng@627 8821 #
dongsheng@627 8822 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8823 #: ../en/ch07-branch.xml:453
dongsheng@627 8824 msgid ""
dongsheng@627 8825 "Committing a new change on the <literal>foo</literal> branch introduces a new "
dongsheng@627 8826 "head."
dongsheng@627 8827 msgstr ""
dongsheng@627 8828
dongsheng@627 8829 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8830 #: ../en/ch07-branch.xml:460
dongsheng@627 8831 msgid "Branch names and merging"
dongsheng@635 8832 msgstr "分支名称与合并"
dongsheng@627 8833
dongsheng@627 8834 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8835 #: ../en/ch07-branch.xml:462
dongsheng@627 8836 msgid ""
dongsheng@627 8837 "As you've probably noticed, merges in Mercurial are not symmetrical. Let's "
dongsheng@627 8838 "say our repository has two heads, 17 and 23. If I <command role=\"hg-cmd"
dongsheng@627 8839 "\">hg update</command> to 17 and then <command role=\"hg-cmd\">hg merge</"
dongsheng@627 8840 "command> with 23, Mercurial records 17 as the first parent of the merge, and "
dongsheng@627 8841 "23 as the second. Whereas if I <command role=\"hg-cmd\">hg update</command> "
dongsheng@627 8842 "to 23 and then <command role=\"hg-cmd\">hg merge</command> with 17, it "
dongsheng@627 8843 "records 23 as the first parent, and 17 as the second."
dongsheng@627 8844 msgstr ""
dongsheng@627 8845
dongsheng@627 8846 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8847 #: ../en/ch07-branch.xml:472
dongsheng@627 8848 msgid ""
dongsheng@627 8849 "This affects Mercurial's choice of branch name when you merge. After a "
dongsheng@627 8850 "merge, Mercurial will retain the branch name of the first parent when you "
dongsheng@627 8851 "commit the result of the merge. If your first parent's branch name is "
dongsheng@627 8852 "<literal>foo</literal>, and you merge with <literal>bar</literal>, the branch "
dongsheng@627 8853 "name will still be <literal>foo</literal> after you merge."
dongsheng@627 8854 msgstr ""
dongsheng@627 8855
dongsheng@627 8856 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8857 #: ../en/ch07-branch.xml:479
dongsheng@627 8858 msgid ""
dongsheng@627 8859 "It's not unusual for a repository to contain multiple heads, each with the "
dongsheng@627 8860 "same branch name. Let's say I'm working on the <literal>foo</literal> "
dongsheng@627 8861 "branch, and so are you. We commit different changes; I pull your changes; I "
dongsheng@627 8862 "now have two heads, each claiming to be on the <literal>foo</literal> "
dongsheng@627 8863 "branch. The result of a merge will be a single head on the <literal>foo</"
dongsheng@627 8864 "literal> branch, as you might hope."
dongsheng@627 8865 msgstr ""
dongsheng@627 8866
dongsheng@627 8867 #
dongsheng@627 8868 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8869 #: ../en/ch07-branch.xml:487
dongsheng@627 8870 msgid ""
dongsheng@627 8871 "But if I'm working on the <literal>bar</literal> branch, and I merge work "
dongsheng@627 8872 "from the <literal>foo</literal> branch, the result will remain on the "
dongsheng@627 8873 "<literal>bar</literal> branch."
dongsheng@627 8874 msgstr ""
dongsheng@627 8875
dongsheng@627 8876 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8877 #: ../en/ch07-branch.xml:493
dongsheng@627 8878 msgid ""
dongsheng@627 8879 "To give a more concrete example, if I'm working on the <literal>bleeding-"
dongsheng@627 8880 "edge</literal> branch, and I want to bring in the latest fixes from the "
dongsheng@627 8881 "<literal>stable</literal> branch, Mercurial will choose the <quote>right</"
dongsheng@627 8882 "quote> (<literal>bleeding-edge</literal>) branch name when I pull and merge "
dongsheng@627 8883 "from <literal>stable</literal>."
dongsheng@627 8884 msgstr ""
dongsheng@627 8885
dongsheng@627 8886 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8887 #: ../en/ch07-branch.xml:502
dongsheng@627 8888 msgid "Branch naming is generally useful"
dongsheng@635 8889 msgstr "分支名称通常都很有用"
dongsheng@627 8890
dongsheng@627 8891 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8892 #: ../en/ch07-branch.xml:504
dongsheng@627 8893 msgid ""
dongsheng@627 8894 "You shouldn't think of named branches as applicable only to situations where "
dongsheng@627 8895 "you have multiple long-lived branches cohabiting in a single repository. "
dongsheng@627 8896 "They're very useful even in the one-branch-per-repository case."
dongsheng@627 8897 msgstr ""
dongsheng@627 8898
dongsheng@627 8899 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8900 #: ../en/ch07-branch.xml:509
dongsheng@627 8901 msgid ""
dongsheng@627 8902 "In the simplest case, giving a name to each branch gives you a permanent "
dongsheng@627 8903 "record of which branch a changeset originated on. This gives you more "
dongsheng@627 8904 "context when you're trying to follow the history of a long-lived branchy "
dongsheng@627 8905 "project."
dongsheng@627 8906 msgstr ""
dongsheng@627 8907
dongsheng@627 8908 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 8909 #: ../en/ch07-branch.xml:514
dongsheng@627 8910 msgid ""
dongsheng@627 8911 "If you're working with shared repositories, you can set up a <literal role="
dongsheng@627 8912 "\"hook\">pretxnchangegroup</literal> hook on each that will block incoming "
dongsheng@627 8913 "changes that have the <quote>wrong</quote> branch name. This provides a "
dongsheng@627 8914 "simple, but effective, defence against people accidentally pushing changes "
dongsheng@627 8915 "from a <quote>bleeding edge</quote> branch to a <quote>stable</quote> "
dongsheng@627 8916 "branch. Such a hook might look like this inside the shared repo's <filename "
dongsheng@627 8917 "role=\"special\"> /.hgrc</filename>."
dongsheng@627 8918 msgstr ""
dongsheng@627 8919
dongsheng@627 8920 #. type: Content of: <book><chapter><title>
dongsheng@650 8921 #: ../en/ch08-undo.xml:5
dongsheng@627 8922 msgid "Finding and fixing mistakes"
dongsheng@627 8923 msgstr "查找和修改错误"
dongsheng@627 8924
dongsheng@627 8925 #. type: Content of: <book><chapter><para>
dongsheng@650 8926 #: ../en/ch08-undo.xml:7
dongsheng@627 8927 msgid ""
dongsheng@627 8928 "To err might be human, but to really handle the consequences well takes a top-"
dongsheng@627 8929 "notch revision control system. In this chapter, we'll discuss some of the "
dongsheng@627 8930 "techniques you can use when you find that a problem has crept into your "
dongsheng@627 8931 "project. Mercurial has some highly capable features that will help you to "
dongsheng@627 8932 "isolate the sources of problems, and to handle them appropriately."
dongsheng@627 8933 msgstr ""
dongsheng@627 8934
dongsheng@627 8935 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 8936 #: ../en/ch08-undo.xml:15
dongsheng@627 8937 msgid "Erasing local history"
dongsheng@635 8938 msgstr "销毁本地历史"
dongsheng@627 8939
dongsheng@627 8940 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8941 #: ../en/ch08-undo.xml:18
dongsheng@627 8942 msgid "The accidental commit"
dongsheng@635 8943 msgstr "意外的提交"
dongsheng@627 8944
dongsheng@627 8945 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8946 #: ../en/ch08-undo.xml:20
dongsheng@627 8947 msgid ""
dongsheng@627 8948 "I have the occasional but persistent problem of typing rather more quickly "
dongsheng@627 8949 "than I can think, which sometimes results in me committing a changeset that "
dongsheng@627 8950 "is either incomplete or plain wrong. In my case, the usual kind of "
dongsheng@627 8951 "incomplete changeset is one in which I've created a new source file, but "
dongsheng@627 8952 "forgotten to <command role=\"hg-cmd\">hg add</command> it. A <quote>plain "
dongsheng@627 8953 "wrong</quote> changeset is not as common, but no less annoying."
dongsheng@627 8954 msgstr ""
dongsheng@627 8955
dongsheng@627 8956 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 8957 #: ../en/ch08-undo.xml:31
dongsheng@627 8958 msgid "Rolling back a transaction"
dongsheng@635 8959 msgstr "回滚一个事务"
dongsheng@627 8960
dongsheng@627 8961 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8962 #: ../en/ch08-undo.xml:33
dongsheng@627 8963 msgid ""
songdongsheng@658 8964 "In <xref linkend=\"sec:concepts:txn\"/>, I mentioned that Mercurial treats "
songdongsheng@658 8965 "each modification of a repository as a <emphasis>transaction</emphasis>. "
songdongsheng@658 8966 "Every time you commit a changeset or pull changes from another repository, "
songdongsheng@658 8967 "Mercurial remembers what you did. You can undo, or <emphasis>roll back</"
songdongsheng@658 8968 "emphasis>, exactly one of these actions using the <command role=\"hg-cmd\">hg "
songdongsheng@658 8969 "rollback</command> command. (See <xref linkend=\"sec:undo:rollback-after-push"
songdongsheng@658 8970 "\"/> for an important caveat about the use of this command.)"
dongsheng@627 8971 msgstr ""
dongsheng@627 8972
dongsheng@627 8973 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8974 #: ../en/ch08-undo.xml:43
dongsheng@627 8975 msgid ""
dongsheng@627 8976 "Here's a mistake that I often find myself making: committing a change in "
dongsheng@627 8977 "which I've created a new file, but forgotten to <command role=\"hg-cmd\">hg "
dongsheng@627 8978 "add</command> it."
dongsheng@627 8979 msgstr ""
dongsheng@627 8980
dongsheng@627 8981 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8982 #: ../en/ch08-undo.xml:50
dongsheng@627 8983 msgid ""
dongsheng@627 8984 "Looking at the output of <command role=\"hg-cmd\">hg status</command> after "
dongsheng@627 8985 "the commit immediately confirms the error."
dongsheng@627 8986 msgstr ""
dongsheng@627 8987
dongsheng@627 8988 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 8989 #: ../en/ch08-undo.xml:56
dongsheng@627 8990 msgid ""
dongsheng@627 8991 "The commit captured the changes to the file <filename>a</filename>, but not "
dongsheng@627 8992 "the new file <filename>b</filename>. If I were to push this changeset to a "
dongsheng@627 8993 "repository that I shared with a colleague, the chances are high that "
dongsheng@627 8994 "something in <filename>a</filename> would refer to <filename>b</filename>, "
dongsheng@627 8995 "which would not be present in their repository when they pulled my changes. "
dongsheng@627 8996 "I would thus become the object of some indignation."
dongsheng@627 8997 msgstr ""
dongsheng@627 8998
dongsheng@627 8999 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9000 #: ../en/ch08-undo.xml:65
dongsheng@627 9001 msgid ""
dongsheng@661 9002 "However, luck is with me—I've caught my error before I pushed the changeset. "
dongsheng@661 9003 "I use the <command role=\"hg-cmd\">hg rollback</command> command, and "
dongsheng@661 9004 "Mercurial makes that last changeset vanish."
dongsheng@627 9005 msgstr ""
dongsheng@627 9006
dongsheng@627 9007 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9008 #: ../en/ch08-undo.xml:72
dongsheng@627 9009 msgid ""
dongsheng@627 9010 "Notice that the changeset is no longer present in the repository's history, "
dongsheng@627 9011 "and the working directory once again thinks that the file <filename>a</"
dongsheng@627 9012 "filename> is modified. The commit and rollback have left the working "
dongsheng@627 9013 "directory exactly as it was prior to the commit; the changeset has been "
dongsheng@627 9014 "completely erased. I can now safely <command role=\"hg-cmd\">hg add</"
dongsheng@627 9015 "command> the file <filename>b</filename>, and rerun my commit."
dongsheng@627 9016 msgstr ""
dongsheng@627 9017
dongsheng@627 9018 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 9019 #: ../en/ch08-undo.xml:85
dongsheng@627 9020 msgid "The erroneous pull"
dongsheng@635 9021 msgstr "错误的抓取"
dongsheng@627 9022
dongsheng@627 9023 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9024 #: ../en/ch08-undo.xml:87
dongsheng@627 9025 msgid ""
dongsheng@627 9026 "It's common practice with Mercurial to maintain separate development branches "
dongsheng@627 9027 "of a project in different repositories. Your development team might have one "
dongsheng@627 9028 "shared repository for your project's <quote>0.9</quote> release, and another, "
dongsheng@627 9029 "containing different changes, for the <quote>1.0</quote> release."
dongsheng@627 9030 msgstr ""
dongsheng@627 9031
dongsheng@627 9032 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9033 #: ../en/ch08-undo.xml:94
dongsheng@627 9034 msgid ""
dongsheng@627 9035 "Given this, you can imagine that the consequences could be messy if you had a "
dongsheng@627 9036 "local <quote>0.9</quote> repository, and accidentally pulled changes from the "
dongsheng@627 9037 "shared <quote>1.0</quote> repository into it. At worst, you could be paying "
dongsheng@627 9038 "insufficient attention, and push those changes into the shared <quote>0.9</"
dongsheng@627 9039 "quote> tree, confusing your entire team (but don't worry, we'll return to "
dongsheng@627 9040 "this horror scenario later). However, it's more likely that you'll notice "
dongsheng@627 9041 "immediately, because Mercurial will display the URL it's pulling from, or you "
dongsheng@627 9042 "will see it pull a suspiciously large number of changes into the repository."
dongsheng@627 9043 msgstr ""
dongsheng@627 9044
dongsheng@627 9045 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9046 #: ../en/ch08-undo.xml:106
dongsheng@627 9047 msgid ""
dongsheng@627 9048 "The <command role=\"hg-cmd\">hg rollback</command> command will work nicely "
dongsheng@627 9049 "to expunge all of the changesets that you just pulled. Mercurial groups all "
dongsheng@627 9050 "changes from one <command role=\"hg-cmd\">hg pull</command> into a single "
dongsheng@627 9051 "transaction, so one <command role=\"hg-cmd\">hg rollback</command> is all you "
dongsheng@627 9052 "need to undo this mistake."
dongsheng@627 9053 msgstr ""
dongsheng@627 9054
dongsheng@627 9055 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 9056 #: ../en/ch08-undo.xml:115
dongsheng@627 9057 msgid "Rolling back is useless once you've pushed"
dongsheng@635 9058 msgstr "当完成推送后,回滚是无效的"
dongsheng@627 9059
dongsheng@627 9060 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9061 #: ../en/ch08-undo.xml:117
dongsheng@627 9062 msgid ""
dongsheng@627 9063 "The value of the <command role=\"hg-cmd\">hg rollback</command> command drops "
dongsheng@627 9064 "to zero once you've pushed your changes to another repository. Rolling back "
dongsheng@627 9065 "a change makes it disappear entirely, but <emphasis>only</emphasis> in the "
dongsheng@627 9066 "repository in which you perform the <command role=\"hg-cmd\">hg rollback</"
dongsheng@627 9067 "command>. Because a rollback eliminates history, there's no way for the "
dongsheng@627 9068 "disappearance of a change to propagate between repositories."
dongsheng@627 9069 msgstr ""
dongsheng@627 9070
dongsheng@627 9071 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9072 #: ../en/ch08-undo.xml:126
dongsheng@627 9073 msgid ""
dongsheng@661 9074 "If you've pushed a change to another repository—particularly if it's a shared "
dongsheng@661 9075 "repository—it has essentially <quote>escaped into the wild,</quote> and "
dongsheng@661 9076 "you'll have to recover from your mistake in a different way. What will "
dongsheng@661 9077 "happen if you push a changeset somewhere, then roll it back, then pull from "
dongsheng@661 9078 "the repository you pushed to, is that the changeset will reappear in your "
dongsheng@661 9079 "repository."
dongsheng@627 9080 msgstr ""
dongsheng@627 9081
dongsheng@627 9082 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9083 #: ../en/ch08-undo.xml:135
dongsheng@627 9084 msgid ""
dongsheng@627 9085 "(If you absolutely know for sure that the change you want to roll back is the "
dongsheng@627 9086 "most recent change in the repository that you pushed to, <emphasis>and</"
dongsheng@627 9087 "emphasis> you know that nobody else could have pulled it from that "
dongsheng@627 9088 "repository, you can roll back the changeset there, too, but you really should "
dongsheng@627 9089 "really not rely on this working reliably. If you do this, sooner or later a "
dongsheng@627 9090 "change really will make it into a repository that you don't directly control "
dongsheng@627 9091 "(or have forgotten about), and come back to bite you.)"
dongsheng@627 9092 msgstr ""
dongsheng@627 9093
dongsheng@627 9094 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 9095 #: ../en/ch08-undo.xml:147
dongsheng@627 9096 msgid "You can only roll back once"
dongsheng@635 9097 msgstr "你只能回滚一次"
dongsheng@627 9098
dongsheng@627 9099 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9100 #: ../en/ch08-undo.xml:149
dongsheng@627 9101 msgid ""
dongsheng@627 9102 "Mercurial stores exactly one transaction in its transaction log; that "
dongsheng@627 9103 "transaction is the most recent one that occurred in the repository. This "
dongsheng@627 9104 "means that you can only roll back one transaction. If you expect to be able "
dongsheng@627 9105 "to roll back one transaction, then its predecessor, this is not the behaviour "
dongsheng@627 9106 "you will get."
dongsheng@627 9107 msgstr ""
dongsheng@627 9108
dongsheng@627 9109 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9110 #: ../en/ch08-undo.xml:158
dongsheng@627 9111 msgid ""
dongsheng@627 9112 "Once you've rolled back one transaction in a repository, you can't roll back "
dongsheng@627 9113 "again in that repository until you perform another commit or pull."
dongsheng@627 9114 msgstr ""
dongsheng@627 9115
dongsheng@627 9116 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 9117 #: ../en/ch08-undo.xml:165
dongsheng@627 9118 msgid "Reverting the mistaken change"
dongsheng@635 9119 msgstr "撤销错误的修改"
dongsheng@627 9120
dongsheng@627 9121 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 9122 #: ../en/ch08-undo.xml:167
dongsheng@627 9123 msgid ""
dongsheng@627 9124 "If you make a modification to a file, and decide that you really didn't want "
dongsheng@627 9125 "to change the file at all, and you haven't yet committed your changes, the "
dongsheng@627 9126 "<command role=\"hg-cmd\">hg revert</command> command is the one you'll need. "
dongsheng@627 9127 "It looks at the changeset that's the parent of the working directory, and "
dongsheng@627 9128 "restores the contents of the file to their state as of that changeset. "
dongsheng@627 9129 "(That's a long-winded way of saying that, in the normal case, it undoes your "
dongsheng@627 9130 "modifications.)"
dongsheng@627 9131 msgstr ""
dongsheng@627 9132
dongsheng@627 9133 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 9134 #: ../en/ch08-undo.xml:176
dongsheng@627 9135 msgid ""
dongsheng@627 9136 "Let's illustrate how the <command role=\"hg-cmd\">hg revert</command> command "
dongsheng@627 9137 "works with yet another small example. We'll begin by modifying a file that "
dongsheng@627 9138 "Mercurial is already tracking."
dongsheng@627 9139 msgstr ""
dongsheng@627 9140
dongsheng@627 9141 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 9142 #: ../en/ch08-undo.xml:183
dongsheng@627 9143 msgid ""
dongsheng@627 9144 "If we don't want that change, we can simply <command role=\"hg-cmd\">hg "
dongsheng@627 9145 "revert</command> the file."
dongsheng@627 9146 msgstr ""
dongsheng@627 9147
dongsheng@627 9148 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 9149 #: ../en/ch08-undo.xml:189
dongsheng@627 9150 msgid ""
dongsheng@627 9151 "The <command role=\"hg-cmd\">hg revert</command> command provides us with an "
dongsheng@627 9152 "extra degree of safety by saving our modified file with a <filename>.orig</"
dongsheng@627 9153 "filename> extension."
dongsheng@627 9154 msgstr ""
dongsheng@627 9155
dongsheng@627 9156 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 9157 #: ../en/ch08-undo.xml:196
dongsheng@627 9158 msgid ""
dongsheng@627 9159 "Here is a summary of the cases that the <command role=\"hg-cmd\">hg revert</"
dongsheng@627 9160 "command> command can deal with. We will describe each of these in more "
dongsheng@627 9161 "detail in the section that follows."
dongsheng@627 9162 msgstr ""
dongsheng@627 9163
dongsheng@627 9164 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 9165 #: ../en/ch08-undo.xml:201
dongsheng@627 9166 msgid "If you modify a file, it will restore the file to its unmodified state."
dongsheng@627 9167 msgstr ""
dongsheng@627 9168
dongsheng@627 9169 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 9170 #: ../en/ch08-undo.xml:204
dongsheng@627 9171 msgid ""
dongsheng@627 9172 "If you <command role=\"hg-cmd\">hg add</command> a file, it will undo the "
dongsheng@627 9173 "<quote>added</quote> state of the file, but leave the file itself untouched."
dongsheng@627 9174 msgstr ""
dongsheng@627 9175
dongsheng@627 9176 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 9177 #: ../en/ch08-undo.xml:208
dongsheng@627 9178 msgid ""
dongsheng@627 9179 "If you delete a file without telling Mercurial, it will restore the file to "
dongsheng@627 9180 "its unmodified contents."
dongsheng@627 9181 msgstr ""
dongsheng@627 9182
dongsheng@627 9183 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 9184 #: ../en/ch08-undo.xml:211
dongsheng@627 9185 msgid ""
dongsheng@627 9186 "If you use the <command role=\"hg-cmd\">hg remove</command> command to remove "
dongsheng@627 9187 "a file, it will undo the <quote>removed</quote> state of the file, and "
dongsheng@627 9188 "restore the file to its unmodified contents."
dongsheng@627 9189 msgstr ""
dongsheng@627 9190
dongsheng@627 9191 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 9192 #: ../en/ch08-undo.xml:218
dongsheng@627 9193 msgid "File management errors"
dongsheng@635 9194 msgstr "文件管理错误"
dongsheng@627 9195
dongsheng@627 9196 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9197 #: ../en/ch08-undo.xml:220
dongsheng@627 9198 msgid ""
dongsheng@627 9199 "The <command role=\"hg-cmd\">hg revert</command> command is useful for more "
dongsheng@627 9200 "than just modified files. It lets you reverse the results of all of "
dongsheng@661 9201 "Mercurial's file management commands—<command role=\"hg-cmd\">hg add</"
dongsheng@627 9202 "command>, <command role=\"hg-cmd\">hg remove</command>, and so on."
dongsheng@627 9203 msgstr ""
dongsheng@627 9204
dongsheng@627 9205 #
dongsheng@627 9206 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9207 #: ../en/ch08-undo.xml:226
dongsheng@627 9208 msgid ""
dongsheng@627 9209 "If you <command role=\"hg-cmd\">hg add</command> a file, then decide that in "
dongsheng@627 9210 "fact you don't want Mercurial to track it, use <command role=\"hg-cmd\">hg "
dongsheng@627 9211 "revert</command> to undo the add. Don't worry; Mercurial will not modify the "
dongsheng@627 9212 "file in any way. It will just <quote>unmark</quote> the file."
dongsheng@627 9213 msgstr ""
dongsheng@627 9214
dongsheng@627 9215 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9216 #: ../en/ch08-undo.xml:234
dongsheng@627 9217 msgid ""
dongsheng@627 9218 "Similarly, if you ask Mercurial to <command role=\"hg-cmd\">hg remove</"
dongsheng@627 9219 "command> a file, you can use <command role=\"hg-cmd\">hg revert</command> to "
dongsheng@627 9220 "restore it to the contents it had as of the parent of the working directory. "
dongsheng@627 9221 "&interaction.daily.revert.remove; This works just as well for a file that you "
dongsheng@627 9222 "deleted by hand, without telling Mercurial (recall that in Mercurial "
dongsheng@627 9223 "terminology, this kind of file is called <quote>missing</quote>)."
dongsheng@627 9224 msgstr ""
dongsheng@627 9225
dongsheng@627 9226 #
dongsheng@627 9227 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9228 #: ../en/ch08-undo.xml:245
dongsheng@627 9229 msgid ""
dongsheng@627 9230 "If you revert a <command role=\"hg-cmd\">hg copy</command>, the copied-to "
dongsheng@627 9231 "file remains in your working directory afterwards, untracked. Since a copy "
dongsheng@627 9232 "doesn't affect the copied-from file in any way, Mercurial doesn't do anything "
dongsheng@627 9233 "with the copied-from file."
dongsheng@627 9234 msgstr ""
dongsheng@627 9235
dongsheng@627 9236 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 9237 #: ../en/ch08-undo.xml:254
dongsheng@627 9238 msgid "A slightly special case: reverting a rename"
dongsheng@635 9239 msgstr "一个稍微特别的案例:撤销改名"
dongsheng@627 9240
dongsheng@627 9241 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 9242 #: ../en/ch08-undo.xml:256
dongsheng@627 9243 msgid ""
dongsheng@627 9244 "If you <command role=\"hg-cmd\">hg rename</command> a file, there is one "
dongsheng@627 9245 "small detail that you should remember. When you <command role=\"hg-cmd\">hg "
dongsheng@627 9246 "revert</command> a rename, it's not enough to provide the name of the renamed-"
dongsheng@627 9247 "to file, as you can see here."
dongsheng@627 9248 msgstr ""
dongsheng@627 9249
dongsheng@627 9250 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 9251 #: ../en/ch08-undo.xml:264
dongsheng@627 9252 msgid ""
dongsheng@627 9253 "As you can see from the output of <command role=\"hg-cmd\">hg status</"
dongsheng@627 9254 "command>, the renamed-to file is no longer identified as added, but the "
dongsheng@627 9255 "renamed-<emphasis>from</emphasis> file is still removed! This is counter-"
dongsheng@627 9256 "intuitive (at least to me), but at least it's easy to deal with."
dongsheng@627 9257 msgstr ""
dongsheng@627 9258
dongsheng@627 9259 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 9260 #: ../en/ch08-undo.xml:273
dongsheng@627 9261 msgid ""
dongsheng@627 9262 "So remember, to revert a <command role=\"hg-cmd\">hg rename</command>, you "
dongsheng@627 9263 "must provide <emphasis>both</emphasis> the source and destination names."
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:278
dongsheng@627 9268 msgid "% TODO: the output doesn't look like it will be removed!"
dongsheng@627 9269 msgstr ""
dongsheng@627 9270
dongsheng@627 9271 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 9272 #: ../en/ch08-undo.xml:281
dongsheng@627 9273 msgid ""
dongsheng@627 9274 "(By the way, if you rename a file, then modify the renamed-to file, then "
dongsheng@627 9275 "revert both components of the rename, when Mercurial restores the file that "
dongsheng@627 9276 "was removed as part of the rename, it will be unmodified. If you need the "
dongsheng@627 9277 "modifications in the renamed-to file to show up in the renamed-from file, "
dongsheng@627 9278 "don't forget to copy them over.)"
dongsheng@627 9279 msgstr ""
dongsheng@627 9280
dongsheng@627 9281 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 9282 #: ../en/ch08-undo.xml:288
dongsheng@627 9283 msgid ""
dongsheng@627 9284 "These fiddly aspects of reverting a rename arguably constitute a small bug in "
dongsheng@627 9285 "Mercurial."
dongsheng@627 9286 msgstr ""
dongsheng@627 9287
dongsheng@627 9288 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 9289 #: ../en/ch08-undo.xml:295
dongsheng@627 9290 msgid "Dealing with committed changes"
dongsheng@635 9291 msgstr "处理已经提交的修改"
dongsheng@627 9292
dongsheng@627 9293 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 9294 #: ../en/ch08-undo.xml:297
dongsheng@627 9295 msgid ""
dongsheng@627 9296 "Consider a case where you have committed a change $a$, and another change $b$ "
dongsheng@627 9297 "on top of it; you then realise that change $a$ was incorrect. Mercurial lets "
dongsheng@627 9298 "you <quote>back out</quote> an entire changeset automatically, and building "
dongsheng@627 9299 "blocks that let you reverse part of a changeset by hand."
dongsheng@627 9300 msgstr ""
dongsheng@627 9301
dongsheng@627 9302 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 9303 #: ../en/ch08-undo.xml:303
dongsheng@627 9304 msgid ""
dongsheng@627 9305 "Before you read this section, here's something to keep in mind: the <command "
dongsheng@627 9306 "role=\"hg-cmd\">hg backout</command> command undoes changes by "
dongsheng@627 9307 "<emphasis>adding</emphasis> history, not by modifying or erasing it. It's "
dongsheng@627 9308 "the right tool to use if you're fixing bugs, but not if you're trying to undo "
dongsheng@627 9309 "some change that has catastrophic consequences. To deal with those, see "
songdongsheng@658 9310 "<xref linkend=\"sec:undo:aaaiiieee\"/>."
dongsheng@627 9311 msgstr ""
dongsheng@627 9312
dongsheng@627 9313 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 9314 #: ../en/ch08-undo.xml:312
dongsheng@627 9315 msgid "Backing out a changeset"
dongsheng@635 9316 msgstr "恢复一个修改集"
dongsheng@627 9317
dongsheng@627 9318 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9319 #: ../en/ch08-undo.xml:314
dongsheng@627 9320 msgid ""
dongsheng@627 9321 "The <command role=\"hg-cmd\">hg backout</command> command lets you "
dongsheng@627 9322 "<quote>undo</quote> the effects of an entire changeset in an automated "
dongsheng@627 9323 "fashion. Because Mercurial's history is immutable, this command "
dongsheng@627 9324 "<emphasis>does not</emphasis> get rid of the changeset you want to undo. "
dongsheng@627 9325 "Instead, it creates a new changeset that <emphasis>reverses</emphasis> the "
dongsheng@627 9326 "effect of the to-be-undone changeset."
dongsheng@627 9327 msgstr ""
dongsheng@627 9328
dongsheng@627 9329 #
dongsheng@627 9330 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9331 #: ../en/ch08-undo.xml:323
dongsheng@627 9332 msgid ""
dongsheng@627 9333 "The operation of the <command role=\"hg-cmd\">hg backout</command> command is "
dongsheng@627 9334 "a little intricate, so let's illustrate it with some examples. First, we'll "
dongsheng@627 9335 "create a repository with some simple changes."
dongsheng@627 9336 msgstr ""
dongsheng@627 9337
dongsheng@627 9338 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9339 #: ../en/ch08-undo.xml:330
dongsheng@627 9340 msgid ""
dongsheng@627 9341 "The <command role=\"hg-cmd\">hg backout</command> command takes a single "
dongsheng@627 9342 "changeset ID as its argument; this is the changeset to back out. Normally, "
dongsheng@627 9343 "<command role=\"hg-cmd\">hg backout</command> will drop you into a text "
dongsheng@627 9344 "editor to write a commit message, so you can record why you're backing the "
dongsheng@627 9345 "change out. In this example, we provide a commit message on the command line "
dongsheng@627 9346 "using the <option role=\"hg-opt-backout\">-m</option> option."
dongsheng@627 9347 msgstr ""
dongsheng@627 9348
dongsheng@627 9349 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 9350 #: ../en/ch08-undo.xml:341
dongsheng@627 9351 msgid "Backing out the tip changeset"
dongsheng@635 9352 msgstr "恢复顶点修改集"
dongsheng@627 9353
dongsheng@627 9354 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9355 #: ../en/ch08-undo.xml:343
dongsheng@627 9356 msgid "We're going to start by backing out the last changeset we committed."
dongsheng@627 9357 msgstr ""
dongsheng@627 9358
dongsheng@627 9359 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 9360 #: ../en/ch08-undo.xml:348
dongsheng@627 9361 msgid ""
dongsheng@627 9362 "You can see that the second line from <filename>myfile</filename> is no "
dongsheng@627 9363 "longer present. Taking a look at the output of <command role=\"hg-cmd\">hg "
dongsheng@627 9364 "log</command> gives us an idea of what the <command role=\"hg-cmd\">hg "
dongsheng@627 9365 "backout</command> command has done. &interaction.backout.simple.log; Notice "
dongsheng@627 9366 "that the new changeset that <command role=\"hg-cmd\">hg backout</command> has "
dongsheng@627 9367 "created is a child of the changeset we backed out. It's easier to see this "
songdongsheng@658 9368 "in <xref linkend=\"fig:undo:backout\"/>, which presents a graphical view of "
songdongsheng@658 9369 "the change history. As you can see, the history is nice and linear."
songdongsheng@658 9370 msgstr ""
songdongsheng@658 9371
songdongsheng@658 9372 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 9373 #: ../en/ch08-undo.xml:361 ../en/ch08-undo.xml:473
dongsheng@627 9374 msgid ""
dongsheng@627 9375 "Backing out a change using the <command role=\"hg-cmd\">hg backout</command> "
dongsheng@627 9376 "command"
dongsheng@660 9377 msgstr "使用 <command role=\"hg-cmd\">hg backout</command> 恢复一个修改"
dongsheng@627 9378
songdongsheng@658 9379 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 9380 #: ../en/ch08-undo.xml:364
songdongsheng@658 9381 msgid "<imageobject><imagedata fileref=\"figs/undo-simple.png\"/></imageobject>"
songdongsheng@658 9382 msgstr ""
songdongsheng@658 9383
dongsheng@627 9384 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 9385 #: ../en/ch08-undo.xml:371
dongsheng@627 9386 msgid "Backing out a non-tip change"
dongsheng@635 9387 msgstr "恢复非顶点的修改"
dongsheng@627 9388
dongsheng@627 9389 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9390 #: ../en/ch08-undo.xml:373
dongsheng@627 9391 msgid ""
dongsheng@627 9392 "If you want to back out a change other than the last one you committed, pass "
dongsheng@627 9393 "the <option role=\"hg-opt-backout\">--merge</option> option to the <command "
dongsheng@627 9394 "role=\"hg-cmd\">hg backout</command> command."
dongsheng@627 9395 msgstr ""
dongsheng@627 9396
dongsheng@627 9397 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9398 #: ../en/ch08-undo.xml:380
dongsheng@627 9399 msgid ""
dongsheng@627 9400 "This makes backing out any changeset a <quote>one-shot</quote> operation "
dongsheng@627 9401 "that's usually simple and fast."
dongsheng@627 9402 msgstr ""
dongsheng@627 9403
dongsheng@627 9404 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9405 #: ../en/ch08-undo.xml:386
dongsheng@627 9406 msgid ""
dongsheng@627 9407 "If you take a look at the contents of <filename>myfile</filename> after the "
dongsheng@627 9408 "backout finishes, you'll see that the first and third changes are present, "
dongsheng@627 9409 "but not the second."
dongsheng@627 9410 msgstr ""
dongsheng@627 9411
dongsheng@627 9412 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9413 #: ../en/ch08-undo.xml:393
songdongsheng@658 9414 msgid ""
songdongsheng@658 9415 "As the graphical history in <xref linkend=\"fig:undo:backout-non-tip\"/> "
songdongsheng@658 9416 "illustrates, Mercurial actually commits <emphasis>two</emphasis> changes in "
songdongsheng@658 9417 "this kind of situation (the box-shaped nodes are the ones that Mercurial "
songdongsheng@658 9418 "commits automatically). Before Mercurial begins the backout process, it "
songdongsheng@658 9419 "first remembers what the current parent of the working directory is. It then "
songdongsheng@658 9420 "backs out the target changeset, and commits that as a changeset. Finally, it "
songdongsheng@658 9421 "merges back to the previous parent of the working directory, and commits the "
songdongsheng@658 9422 "result of the merge."
songdongsheng@658 9423 msgstr ""
songdongsheng@658 9424
songdongsheng@658 9425 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9426 #: ../en/ch08-undo.xml:404
dongsheng@627 9427 msgid ""
dongsheng@627 9428 "% TODO: to me it looks like mercurial doesn't commit the second merge "
dongsheng@627 9429 "automatically!"
dongsheng@627 9430 msgstr ""
dongsheng@627 9431
songdongsheng@658 9432 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 9433 #: ../en/ch08-undo.xml:408
dongsheng@627 9434 msgid ""
dongsheng@627 9435 "Automated backout of a non-tip change using the <command role=\"hg-cmd\">hg "
dongsheng@627 9436 "backout</command> command"
dongsheng@660 9437 msgstr "使用 <command role=\"hg-cmd\">hg backout</command> 自动恢复非顶点的修改"
dongsheng@627 9438
songdongsheng@658 9439 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 9440 #: ../en/ch08-undo.xml:411
songdongsheng@658 9441 msgid ""
songdongsheng@658 9442 "<imageobject><imagedata fileref=\"figs/undo-non-tip.png\"/></imageobject>"
songdongsheng@658 9443 msgstr ""
songdongsheng@658 9444
songdongsheng@658 9445 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9446 #: ../en/ch08-undo.xml:416
dongsheng@627 9447 msgid ""
dongsheng@627 9448 "The result is that you end up <quote>back where you were</quote>, only with "
dongsheng@627 9449 "some extra history that undoes the effect of the changeset you wanted to back "
dongsheng@627 9450 "out."
dongsheng@627 9451 msgstr ""
dongsheng@627 9452
dongsheng@627 9453 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 9454 #: ../en/ch08-undo.xml:421
dongsheng@627 9455 msgid "Always use the <option role=\"hg-opt-backout\">--merge</option> option"
dongsheng@635 9456 msgstr "始终使用选项 <option role=\"hg-opt-backout\">--merge</option>"
dongsheng@627 9457
dongsheng@627 9458 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 9459 #: ../en/ch08-undo.xml:424
dongsheng@627 9460 msgid ""
dongsheng@627 9461 "In fact, since the <option role=\"hg-opt-backout\">--merge</option> option "
dongsheng@627 9462 "will do the <quote>right thing</quote> whether or not the changeset you're "
dongsheng@627 9463 "backing out is the tip (i.e. it won't try to merge if it's backing out the "
dongsheng@627 9464 "tip, since there's no need), you should <emphasis>always</emphasis> use this "
dongsheng@627 9465 "option when you run the <command role=\"hg-cmd\">hg backout</command> command."
dongsheng@627 9466 msgstr ""
dongsheng@627 9467
dongsheng@627 9468 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 9469 #: ../en/ch08-undo.xml:435
dongsheng@627 9470 msgid "Gaining more control of the backout process"
dongsheng@635 9471 msgstr "在恢复处理中获得更多控制"
dongsheng@627 9472
dongsheng@627 9473 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9474 #: ../en/ch08-undo.xml:437
dongsheng@627 9475 msgid ""
dongsheng@627 9476 "While I've recommended that you always use the <option role=\"hg-opt-backout"
dongsheng@627 9477 "\">--merge</option> option when backing out a change, the <command role=\"hg-"
dongsheng@627 9478 "cmd\">hg backout</command> command lets you decide how to merge a backout "
dongsheng@627 9479 "changeset. Taking control of the backout process by hand is something you "
dongsheng@627 9480 "will rarely need to do, but it can be useful to understand what the <command "
dongsheng@627 9481 "role=\"hg-cmd\">hg backout</command> command is doing for you automatically. "
dongsheng@627 9482 "To illustrate this, let's clone our first repository, but omit the backout "
dongsheng@627 9483 "change that it contains."
dongsheng@627 9484 msgstr ""
dongsheng@627 9485
dongsheng@627 9486 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9487 #: ../en/ch08-undo.xml:450
dongsheng@627 9488 msgid ""
dongsheng@627 9489 "As with our earlier example, We'll commit a third changeset, then back out "
dongsheng@627 9490 "its parent, and see what happens."
dongsheng@627 9491 msgstr ""
dongsheng@627 9492
dongsheng@627 9493 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9494 #: ../en/ch08-undo.xml:456
dongsheng@627 9495 msgid ""
dongsheng@627 9496 "Our new changeset is again a descendant of the changeset we backout out; it's "
dongsheng@627 9497 "thus a new head, <emphasis>not</emphasis> a descendant of the changeset that "
dongsheng@627 9498 "was the tip. The <command role=\"hg-cmd\">hg backout</command> command was "
dongsheng@627 9499 "quite explicit in telling us this."
dongsheng@627 9500 msgstr ""
dongsheng@627 9501
dongsheng@627 9502 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9503 #: ../en/ch08-undo.xml:464
dongsheng@627 9504 msgid ""
dongsheng@627 9505 "Again, it's easier to see what has happened by looking at a graph of the "
songdongsheng@658 9506 "revision history, in <xref linkend=\"fig:undo:backout-manual\"/>. This makes "
songdongsheng@658 9507 "it clear that when we use <command role=\"hg-cmd\">hg backout</command> to "
songdongsheng@658 9508 "back out a change other than the tip, Mercurial adds a new head to the "
songdongsheng@658 9509 "repository (the change it committed is box-shaped)."
songdongsheng@658 9510 msgstr ""
songdongsheng@658 9511
songdongsheng@658 9512 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 9513 #: ../en/ch08-undo.xml:476
songdongsheng@658 9514 msgid "<imageobject><imagedata fileref=\"figs/undo-manual.png\"/></imageobject>"
songdongsheng@658 9515 msgstr ""
songdongsheng@658 9516
songdongsheng@658 9517 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9518 #: ../en/ch08-undo.xml:481
dongsheng@627 9519 msgid ""
dongsheng@627 9520 "After the <command role=\"hg-cmd\">hg backout</command> command has "
dongsheng@627 9521 "completed, it leaves the new <quote>backout</quote> changeset as the parent "
dongsheng@627 9522 "of the working directory."
dongsheng@627 9523 msgstr ""
dongsheng@627 9524
dongsheng@627 9525 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9526 #: ../en/ch08-undo.xml:488
dongsheng@627 9527 msgid "Now we have two isolated sets of changes."
dongsheng@627 9528 msgstr ""
dongsheng@627 9529
dongsheng@627 9530 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9531 #: ../en/ch08-undo.xml:492
dongsheng@627 9532 msgid ""
dongsheng@627 9533 "Let's think about what we expect to see as the contents of <filename>myfile</"
dongsheng@627 9534 "filename> now. The first change should be present, because we've never "
dongsheng@627 9535 "backed it out. The second change should be missing, as that's the change we "
dongsheng@627 9536 "backed out. Since the history graph shows the third change as a separate "
dongsheng@627 9537 "head, we <emphasis>don't</emphasis> expect to see the third change present in "
dongsheng@627 9538 "<filename>myfile</filename>."
dongsheng@627 9539 msgstr ""
dongsheng@627 9540
dongsheng@627 9541 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9542 #: ../en/ch08-undo.xml:502
dongsheng@627 9543 msgid ""
dongsheng@627 9544 "To get the third change back into the file, we just do a normal merge of our "
dongsheng@627 9545 "two heads."
dongsheng@627 9546 msgstr ""
dongsheng@627 9547
dongsheng@627 9548 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9549 #: ../en/ch08-undo.xml:507
songdongsheng@658 9550 msgid ""
songdongsheng@658 9551 "Afterwards, the graphical history of our repository looks like <xref linkend="
songdongsheng@658 9552 "\"fig:undo:backout-manual-merge\"/>."
songdongsheng@658 9553 msgstr ""
songdongsheng@658 9554
songdongsheng@658 9555 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 9556 #: ../en/ch08-undo.xml:512
dongsheng@627 9557 msgid "Manually merging a backout change"
dongsheng@660 9558 msgstr "手工合并恢复修改"
dongsheng@627 9559
songdongsheng@658 9560 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
songdongsheng@658 9561 #: ../en/ch08-undo.xml:514
songdongsheng@658 9562 msgid ""
songdongsheng@658 9563 "<imageobject><imagedata fileref=\"figs/undo-manual-merge.png\"/></imageobject>"
songdongsheng@658 9564 msgstr ""
songdongsheng@658 9565
dongsheng@627 9566 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 9567 #: ../en/ch08-undo.xml:521
dongsheng@627 9568 msgid "Why <command role=\"hg-cmd\">hg backout</command> works as it does"
dongsheng@635 9569 msgstr "<command role=\"hg-cmd\">hg backout</command> 的内幕"
dongsheng@627 9570
dongsheng@627 9571 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9572 #: ../en/ch08-undo.xml:524
dongsheng@627 9573 msgid ""
dongsheng@627 9574 "Here's a brief description of how the <command role=\"hg-cmd\">hg backout</"
dongsheng@627 9575 "command> command works."
dongsheng@627 9576 msgstr ""
dongsheng@627 9577
dongsheng@627 9578 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9579 #: ../en/ch08-undo.xml:527
dongsheng@627 9580 msgid ""
dongsheng@627 9581 "It ensures that the working directory is <quote>clean</quote>, i.e. that the "
dongsheng@627 9582 "output of <command role=\"hg-cmd\">hg status</command> would be empty."
dongsheng@627 9583 msgstr ""
dongsheng@627 9584
dongsheng@627 9585 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9586 #: ../en/ch08-undo.xml:531
dongsheng@627 9587 msgid ""
dongsheng@627 9588 "It remembers the current parent of the working directory. Let's call this "
dongsheng@627 9589 "changeset <literal>orig</literal>"
dongsheng@627 9590 msgstr ""
dongsheng@627 9591
dongsheng@627 9592 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9593 #: ../en/ch08-undo.xml:535
dongsheng@627 9594 msgid ""
dongsheng@627 9595 "It does the equivalent of a <command role=\"hg-cmd\">hg update</command> to "
dongsheng@627 9596 "sync the working directory to the changeset you want to back out. Let's call "
dongsheng@627 9597 "this changeset <literal>backout</literal>"
dongsheng@627 9598 msgstr ""
dongsheng@627 9599
dongsheng@627 9600 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9601 #: ../en/ch08-undo.xml:540
dongsheng@627 9602 msgid ""
dongsheng@627 9603 "It finds the parent of that changeset. Let's call that changeset "
dongsheng@627 9604 "<literal>parent</literal>."
dongsheng@627 9605 msgstr ""
dongsheng@627 9606
dongsheng@627 9607 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9608 #: ../en/ch08-undo.xml:543
dongsheng@627 9609 msgid ""
dongsheng@627 9610 "For each file that the <literal>backout</literal> changeset affected, it does "
dongsheng@627 9611 "the equivalent of a <command role=\"hg-cmd\">hg revert -r parent</command> on "
dongsheng@627 9612 "that file, to restore it to the contents it had before that changeset was "
dongsheng@627 9613 "committed."
dongsheng@627 9614 msgstr ""
dongsheng@627 9615
dongsheng@627 9616 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9617 #: ../en/ch08-undo.xml:550
dongsheng@627 9618 msgid ""
dongsheng@627 9619 "It commits the result as a new changeset. This changeset has "
dongsheng@627 9620 "<literal>backout</literal> as its parent."
dongsheng@627 9621 msgstr ""
dongsheng@627 9622
dongsheng@627 9623 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9624 #: ../en/ch08-undo.xml:554
dongsheng@627 9625 msgid ""
dongsheng@627 9626 "If you specify <option role=\"hg-opt-backout\">--merge</option> on the "
dongsheng@627 9627 "command line, it merges with <literal>orig</literal>, and commits the result "
dongsheng@627 9628 "of the merge."
dongsheng@627 9629 msgstr ""
dongsheng@627 9630
dongsheng@627 9631 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9632 #: ../en/ch08-undo.xml:560
dongsheng@627 9633 msgid ""
dongsheng@627 9634 "An alternative way to implement the <command role=\"hg-cmd\">hg backout</"
dongsheng@627 9635 "command> command would be to <command role=\"hg-cmd\">hg export</command> the "
dongsheng@627 9636 "to-be-backed-out changeset as a diff, then use the <option role=\"cmd-opt-"
dongsheng@627 9637 "patch\">--reverse</option> option to the <command>patch</command> command to "
dongsheng@627 9638 "reverse the effect of the change without fiddling with the working "
dongsheng@627 9639 "directory. This sounds much simpler, but it would not work nearly as well."
dongsheng@627 9640 msgstr ""
dongsheng@627 9641
dongsheng@627 9642 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9643 #: ../en/ch08-undo.xml:570
dongsheng@627 9644 msgid ""
dongsheng@627 9645 "The reason that <command role=\"hg-cmd\">hg backout</command> does an update, "
dongsheng@627 9646 "a commit, a merge, and another commit is to give the merge machinery the best "
dongsheng@627 9647 "chance to do a good job when dealing with all the changes <emphasis>between</"
dongsheng@627 9648 "emphasis> the change you're backing out and the current tip."
dongsheng@627 9649 msgstr ""
dongsheng@627 9650
dongsheng@627 9651 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9652 #: ../en/ch08-undo.xml:577
dongsheng@627 9653 msgid ""
dongsheng@627 9654 "If you're backing out a changeset that's 100 revisions back in your project's "
dongsheng@627 9655 "history, the chances that the <command>patch</command> command will be able "
dongsheng@627 9656 "to apply a reverse diff cleanly are not good, because intervening changes are "
dongsheng@627 9657 "likely to have <quote>broken the context</quote> that <command>patch</"
dongsheng@627 9658 "command> uses to determine whether it can apply a patch (if this sounds like "
songdongsheng@658 9659 "gibberish, see <xref linkend=\"sec:mq:patch\"/> for a discussion of the "
dongsheng@627 9660 "<command>patch</command> command). Also, Mercurial's merge machinery will "
dongsheng@627 9661 "handle files and directories being renamed, permission changes, and "
dongsheng@627 9662 "modifications to binary files, none of which <command>patch</command> can "
dongsheng@627 9663 "deal with."
dongsheng@627 9664 msgstr ""
dongsheng@627 9665
dongsheng@627 9666 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 9667 #: ../en/ch08-undo.xml:594
dongsheng@627 9668 msgid "Changes that should never have been"
dongsheng@635 9669 msgstr "不该发生的修改"
dongsheng@627 9670
dongsheng@627 9671 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9672 #: ../en/ch08-undo.xml:596
dongsheng@627 9673 msgid ""
dongsheng@627 9674 "Most of the time, the <command role=\"hg-cmd\">hg backout</command> command "
dongsheng@627 9675 "is exactly what you need if you want to undo the effects of a change. It "
dongsheng@627 9676 "leaves a permanent record of exactly what you did, both when committing the "
dongsheng@627 9677 "original changeset and when you cleaned up after it."
dongsheng@627 9678 msgstr ""
dongsheng@627 9679
dongsheng@627 9680 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9681 #: ../en/ch08-undo.xml:602
dongsheng@627 9682 msgid ""
dongsheng@627 9683 "On rare occasions, though, you may find that you've committed a change that "
dongsheng@627 9684 "really should not be present in the repository at all. For example, it would "
dongsheng@627 9685 "be very unusual, and usually considered a mistake, to commit a software "
dongsheng@627 9686 "project's object files as well as its source files. Object files have almost "
dongsheng@627 9687 "no intrinsic value, and they're <emphasis>big</emphasis>, so they increase "
dongsheng@627 9688 "the size of the repository and the amount of time it takes to clone or pull "
dongsheng@627 9689 "changes."
dongsheng@627 9690 msgstr ""
dongsheng@627 9691
dongsheng@627 9692 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9693 #: ../en/ch08-undo.xml:611
dongsheng@627 9694 msgid ""
dongsheng@627 9695 "Before I discuss the options that you have if you commit a <quote>brown paper "
dongsheng@627 9696 "bag</quote> change (the kind that's so bad that you want to pull a brown "
dongsheng@627 9697 "paper bag over your head), let me first discuss some approaches that probably "
dongsheng@627 9698 "won't work."
dongsheng@627 9699 msgstr ""
dongsheng@627 9700
dongsheng@627 9701 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9702 #: ../en/ch08-undo.xml:616
dongsheng@627 9703 msgid ""
dongsheng@661 9704 "Since Mercurial treats history as accumulative—every change builds on top of "
dongsheng@661 9705 "all changes that preceded it—you generally can't just make disastrous changes "
dongsheng@661 9706 "disappear. The one exception is when you've just committed a change, and it "
dongsheng@661 9707 "hasn't been pushed or pulled into another repository. That's when you can "
dongsheng@661 9708 "safely use the <command role=\"hg-cmd\">hg rollback</command> command, as I "
dongsheng@661 9709 "detailed in <xref linkend=\"sec:undo:rollback\"/>."
songdongsheng@658 9710 msgstr ""
songdongsheng@658 9711
songdongsheng@658 9712 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9713 #: ../en/ch08-undo.xml:625
dongsheng@627 9714 msgid ""
dongsheng@627 9715 "After you've pushed a bad change to another repository, you <emphasis>could</"
dongsheng@627 9716 "emphasis> still use <command role=\"hg-cmd\">hg rollback</command> to make "
dongsheng@627 9717 "your local copy of the change disappear, but it won't have the consequences "
dongsheng@627 9718 "you want. The change will still be present in the remote repository, so it "
dongsheng@627 9719 "will reappear in your local repository the next time you pull."
dongsheng@627 9720 msgstr ""
dongsheng@627 9721
dongsheng@627 9722 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9723 #: ../en/ch08-undo.xml:633
dongsheng@627 9724 msgid ""
dongsheng@627 9725 "If a situation like this arises, and you know which repositories your bad "
dongsheng@627 9726 "change has propagated into, you can <emphasis>try</emphasis> to get rid of "
dongsheng@627 9727 "the changeefrom <emphasis>every</emphasis> one of those repositories. This "
dongsheng@627 9728 "is, of course, not a satisfactory solution: if you miss even a single "
dongsheng@627 9729 "repository while you're expunging, the change is still <quote>in the wild</"
dongsheng@627 9730 "quote>, and could propagate further."
dongsheng@627 9731 msgstr ""
dongsheng@627 9732
dongsheng@627 9733 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9734 #: ../en/ch08-undo.xml:641
dongsheng@627 9735 msgid ""
dongsheng@627 9736 "If you've committed one or more changes <emphasis>after</emphasis> the change "
dongsheng@627 9737 "that you'd like to see disappear, your options are further reduced. Mercurial "
dongsheng@627 9738 "doesn't provide a way to <quote>punch a hole</quote> in history, leaving "
dongsheng@627 9739 "changesets intact."
dongsheng@627 9740 msgstr ""
dongsheng@627 9741
dongsheng@627 9742 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9743 #: ../en/ch08-undo.xml:647
dongsheng@627 9744 msgid ""
dongsheng@627 9745 "XXX This needs filling out. The <literal>hg-replay</literal> script in the "
dongsheng@627 9746 "<literal>examples</literal> directory works, but doesn't handle merge "
dongsheng@627 9747 "changesets. Kind of an important omission."
dongsheng@627 9748 msgstr ""
dongsheng@627 9749
dongsheng@627 9750 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 9751 #: ../en/ch08-undo.xml:653
dongsheng@627 9752 msgid "Protect yourself from <quote>escaped</quote> changes"
dongsheng@635 9753 msgstr "使用<quote>校验</quote>修改来保护你自己"
dongsheng@627 9754
dongsheng@627 9755 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9756 #: ../en/ch08-undo.xml:656
dongsheng@627 9757 msgid ""
dongsheng@627 9758 "If you've committed some changes to your local repository and they've been "
dongsheng@627 9759 "pushed or pulled somewhere else, this isn't necessarily a disaster. You can "
dongsheng@627 9760 "protect yourself ahead of time against some classes of bad changeset. This "
dongsheng@627 9761 "is particularly easy if your team usually pulls changes from a central "
dongsheng@627 9762 "repository."
dongsheng@627 9763 msgstr ""
dongsheng@627 9764
dongsheng@627 9765 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9766 #: ../en/ch08-undo.xml:663
dongsheng@627 9767 msgid ""
dongsheng@627 9768 "By configuring some hooks on that repository to validate incoming changesets "
songdongsheng@658 9769 "(see chapter <xref linkend=\"chap:hook\"/>), you can automatically prevent "
dongsheng@627 9770 "some kinds of bad changeset from being pushed to the central repository at "
dongsheng@627 9771 "all. With such a configuration in place, some kinds of bad changeset will "
dongsheng@627 9772 "naturally tend to <quote>die out</quote> because they can't propagate into "
dongsheng@627 9773 "the central repository. Better yet, this happens without any need for "
dongsheng@627 9774 "explicit intervention."
dongsheng@627 9775 msgstr ""
dongsheng@627 9776
dongsheng@627 9777 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9778 #: ../en/ch08-undo.xml:673
dongsheng@627 9779 msgid ""
dongsheng@627 9780 "For instance, an incoming change hook that verifies that a changeset will "
dongsheng@627 9781 "actually compile can prevent people from inadvertantly <quote>breaking the "
dongsheng@627 9782 "build</quote>."
dongsheng@627 9783 msgstr ""
dongsheng@627 9784
dongsheng@627 9785 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 9786 #: ../en/ch08-undo.xml:680
dongsheng@627 9787 msgid "Finding the source of a bug"
dongsheng@635 9788 msgstr "查找问题的根源"
dongsheng@627 9789
dongsheng@627 9790 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9791 #: ../en/ch08-undo.xml:682
dongsheng@627 9792 msgid ""
dongsheng@627 9793 "While it's all very well to be able to back out a changeset that introduced a "
dongsheng@627 9794 "bug, this requires that you know which changeset to back out. Mercurial "
dongsheng@627 9795 "provides an invaluable command, called <command role=\"hg-cmd\">hg bisect</"
dongsheng@627 9796 "command>, that helps you to automate this process and accomplish it very "
dongsheng@627 9797 "efficiently."
dongsheng@627 9798 msgstr ""
dongsheng@627 9799
dongsheng@627 9800 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9801 #: ../en/ch08-undo.xml:689
dongsheng@627 9802 msgid ""
dongsheng@627 9803 "The idea behind the <command role=\"hg-cmd\">hg bisect</command> command is "
dongsheng@627 9804 "that a changeset has introduced some change of behaviour that you can "
dongsheng@627 9805 "identify with a simple binary test. You don't know which piece of code "
dongsheng@627 9806 "introduced the change, but you know how to test for the presence of the bug. "
dongsheng@627 9807 "The <command role=\"hg-cmd\">hg bisect</command> command uses your test to "
dongsheng@627 9808 "direct its search for the changeset that introduced the code that caused the "
dongsheng@627 9809 "bug."
dongsheng@627 9810 msgstr ""
dongsheng@627 9811
dongsheng@627 9812 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9813 #: ../en/ch08-undo.xml:698
dongsheng@627 9814 msgid ""
dongsheng@627 9815 "Here are a few scenarios to help you understand how you might apply this "
dongsheng@627 9816 "command."
dongsheng@627 9817 msgstr ""
dongsheng@627 9818
dongsheng@627 9819 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 9820 #: ../en/ch08-undo.xml:701
dongsheng@627 9821 msgid ""
dongsheng@627 9822 "The most recent version of your software has a bug that you remember wasn't "
dongsheng@627 9823 "present a few weeks ago, but you don't know when it was introduced. Here, "
dongsheng@627 9824 "your binary test checks for the presence of that bug."
dongsheng@627 9825 msgstr ""
dongsheng@627 9826
dongsheng@627 9827 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 9828 #: ../en/ch08-undo.xml:706
dongsheng@627 9829 msgid ""
dongsheng@627 9830 "You fixed a bug in a rush, and now it's time to close the entry in your "
dongsheng@627 9831 "team's bug database. The bug database requires a changeset ID when you close "
dongsheng@627 9832 "an entry, but you don't remember which changeset you fixed the bug in. Once "
dongsheng@627 9833 "again, your binary test checks for the presence of the bug."
dongsheng@627 9834 msgstr ""
dongsheng@627 9835
dongsheng@627 9836 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 9837 #: ../en/ch08-undo.xml:713
dongsheng@627 9838 msgid ""
dongsheng@627 9839 "Your software works correctly, but runs 15% slower than the last time you "
dongsheng@627 9840 "measured it. You want to know which changeset introduced the performance "
dongsheng@627 9841 "regression. In this case, your binary test measures the performance of your "
dongsheng@627 9842 "software, to see whether it's <quote>fast</quote> or <quote>slow</quote>."
dongsheng@627 9843 msgstr ""
dongsheng@627 9844
dongsheng@627 9845 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 9846 #: ../en/ch08-undo.xml:720
dongsheng@627 9847 msgid ""
dongsheng@627 9848 "The sizes of the components of your project that you ship exploded recently, "
dongsheng@627 9849 "and you suspect that something changed in the way you build your project."
dongsheng@627 9850 msgstr ""
dongsheng@627 9851
dongsheng@627 9852 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9853 #: ../en/ch08-undo.xml:725
dongsheng@627 9854 msgid ""
dongsheng@627 9855 "From these examples, it should be clear that the <command role=\"hg-cmd\">hg "
dongsheng@627 9856 "bisect</command> command is not useful only for finding the sources of bugs. "
dongsheng@627 9857 "You can use it to find any <quote>emergent property</quote> of a repository "
dongsheng@627 9858 "(anything that you can't find from a simple text search of the files in the "
dongsheng@627 9859 "tree) for which you can write a binary test."
dongsheng@627 9860 msgstr ""
dongsheng@627 9861
dongsheng@627 9862 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9863 #: ../en/ch08-undo.xml:732
dongsheng@627 9864 msgid ""
dongsheng@627 9865 "We'll introduce a little bit of terminology here, just to make it clear which "
dongsheng@627 9866 "parts of the search process are your responsibility, and which are "
dongsheng@627 9867 "Mercurial's. A <emphasis>test</emphasis> is something that <emphasis>you</"
dongsheng@627 9868 "emphasis> run when <command role=\"hg-cmd\">hg bisect</command> chooses a "
dongsheng@627 9869 "changeset. A <emphasis>probe</emphasis> is what <command role=\"hg-cmd\">hg "
dongsheng@627 9870 "bisect</command> runs to tell whether a revision is good. Finally, we'll use "
dongsheng@627 9871 "the word <quote>bisect</quote>, as both a noun and a verb, to stand in for "
dongsheng@627 9872 "the phrase <quote>search using the <command role=\"hg-cmd\">hg bisect</"
dongsheng@627 9873 "command> command</quote>."
dongsheng@627 9874 msgstr ""
dongsheng@627 9875
dongsheng@627 9876 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9877 #: ../en/ch08-undo.xml:745
dongsheng@627 9878 msgid ""
dongsheng@627 9879 "One simple way to automate the searching process would be simply to probe "
dongsheng@627 9880 "every changeset. However, this scales poorly. If it took ten minutes to "
dongsheng@627 9881 "test a single changeset, and you had 10,000 changesets in your repository, "
dongsheng@627 9882 "the exhaustive approach would take on average 35 <emphasis>days</emphasis> to "
dongsheng@627 9883 "find the changeset that introduced a bug. Even if you knew that the bug was "
dongsheng@627 9884 "introduced by one of the last 500 changesets, and limited your search to "
dongsheng@627 9885 "those, you'd still be looking at over 40 hours to find the changeset that "
dongsheng@627 9886 "introduced your bug."
dongsheng@627 9887 msgstr ""
dongsheng@627 9888
dongsheng@627 9889 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9890 #: ../en/ch08-undo.xml:755
dongsheng@627 9891 msgid ""
dongsheng@627 9892 "What the <command role=\"hg-cmd\">hg bisect</command> command does is use its "
dongsheng@627 9893 "knowledge of the <quote>shape</quote> of your project's revision history to "
dongsheng@627 9894 "perform a search in time proportional to the <emphasis>logarithm</emphasis> "
dongsheng@627 9895 "of the number of changesets to check (the kind of search it performs is "
dongsheng@627 9896 "called a dichotomic search). With this approach, searching through 10,000 "
dongsheng@627 9897 "changesets will take less than three hours, even at ten minutes per test (the "
dongsheng@627 9898 "search will require about 14 tests). Limit your search to the last hundred "
dongsheng@627 9899 "changesets, and it will take only about an hour (roughly seven tests)."
dongsheng@627 9900 msgstr ""
dongsheng@627 9901
dongsheng@627 9902 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 9903 #: ../en/ch08-undo.xml:766
dongsheng@627 9904 msgid ""
dongsheng@627 9905 "The <command role=\"hg-cmd\">hg bisect</command> command is aware of the "
dongsheng@627 9906 "<quote>branchy</quote> nature of a Mercurial project's revision history, so "
dongsheng@627 9907 "it has no problems dealing with branches, merges, or multiple heads in a "
dongsheng@627 9908 "repository. It can prune entire branches of history with a single probe, "
dongsheng@627 9909 "which is how it operates so efficiently."
dongsheng@627 9910 msgstr ""
dongsheng@627 9911
dongsheng@627 9912 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 9913 #: ../en/ch08-undo.xml:774
dongsheng@627 9914 msgid "Using the <command role=\"hg-cmd\">hg bisect</command> command"
dongsheng@635 9915 msgstr "使用命令 <command role=\"hg-cmd\">hg bisect</command>"
dongsheng@627 9916
dongsheng@627 9917 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9918 #: ../en/ch08-undo.xml:777
dongsheng@627 9919 msgid ""
dongsheng@627 9920 "Here's an example of <command role=\"hg-cmd\">hg bisect</command> in action."
dongsheng@627 9921 msgstr ""
dongsheng@627 9922
dongsheng@627 9923 #. type: Content of: <book><chapter><sect1><sect2><note><para>
songdongsheng@658 9924 #: ../en/ch08-undo.xml:781
dongsheng@627 9925 msgid ""
dongsheng@627 9926 "In versions 0.9.5 and earlier of Mercurial, <command role=\"hg-cmd\">hg "
dongsheng@627 9927 "bisect</command> was not a core command: it was distributed with Mercurial as "
dongsheng@627 9928 "an extension. This section describes the built-in command, not the old "
dongsheng@627 9929 "extension."
dongsheng@627 9930 msgstr ""
dongsheng@627 9931
dongsheng@627 9932 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9933 #: ../en/ch08-undo.xml:788
dongsheng@627 9934 msgid ""
dongsheng@627 9935 "Now let's create a repository, so that we can try out the <command role=\"hg-"
dongsheng@627 9936 "cmd\">hg bisect</command> command in isolation."
dongsheng@627 9937 msgstr ""
dongsheng@627 9938
dongsheng@627 9939 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9940 #: ../en/ch08-undo.xml:794
dongsheng@627 9941 msgid ""
dongsheng@627 9942 "We'll simulate a project that has a bug in it in a simple-minded way: create "
dongsheng@627 9943 "trivial changes in a loop, and nominate one specific change that will have "
dongsheng@627 9944 "the <quote>bug</quote>. This loop creates 35 changesets, each adding a "
dongsheng@627 9945 "single file to the repository. We'll represent our <quote>bug</quote> with a "
dongsheng@627 9946 "file that contains the text <quote>i have a gub</quote>."
dongsheng@627 9947 msgstr ""
dongsheng@627 9948
dongsheng@627 9949 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9950 #: ../en/ch08-undo.xml:804
dongsheng@627 9951 msgid ""
dongsheng@627 9952 "The next thing that we'd like to do is figure out how to use the <command "
dongsheng@627 9953 "role=\"hg-cmd\">hg bisect</command> command. We can use Mercurial's normal "
dongsheng@627 9954 "built-in help mechanism for this."
dongsheng@627 9955 msgstr ""
dongsheng@627 9956
dongsheng@627 9957 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9958 #: ../en/ch08-undo.xml:811
dongsheng@627 9959 msgid ""
dongsheng@627 9960 "The <command role=\"hg-cmd\">hg bisect</command> command works in steps. "
dongsheng@627 9961 "Each step proceeds as follows."
dongsheng@627 9962 msgstr ""
dongsheng@627 9963
dongsheng@627 9964 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9965 #: ../en/ch08-undo.xml:814
dongsheng@627 9966 msgid "You run your binary test."
dongsheng@627 9967 msgstr ""
dongsheng@627 9968
dongsheng@627 9969 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><itemizedlist><listitem><para>
songdongsheng@658 9970 #: ../en/ch08-undo.xml:816
dongsheng@627 9971 msgid ""
dongsheng@627 9972 "If the test succeeded, you tell <command role=\"hg-cmd\">hg bisect</command> "
dongsheng@627 9973 "by running the <command role=\"hg-cmd\">hg bisect good</command> command."
dongsheng@627 9974 msgstr ""
dongsheng@627 9975
dongsheng@627 9976 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><itemizedlist><listitem><para>
songdongsheng@658 9977 #: ../en/ch08-undo.xml:821
dongsheng@627 9978 msgid ""
dongsheng@627 9979 "If it failed, run the <command role=\"hg-cmd\">hg bisect bad</command> "
dongsheng@627 9980 "command."
dongsheng@627 9981 msgstr ""
dongsheng@627 9982
dongsheng@627 9983 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9984 #: ../en/ch08-undo.xml:825
dongsheng@627 9985 msgid ""
dongsheng@627 9986 "The command uses your information to decide which changeset to test next."
dongsheng@627 9987 msgstr ""
dongsheng@627 9988
dongsheng@627 9989 #. type: Content of: <book><chapter><sect1><sect2><orderedlist><listitem><para>
songdongsheng@658 9990 #: ../en/ch08-undo.xml:828
dongsheng@627 9991 msgid ""
dongsheng@627 9992 "It updates the working directory to that changeset, and the process begins "
dongsheng@627 9993 "again."
dongsheng@627 9994 msgstr ""
dongsheng@627 9995
dongsheng@627 9996 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 9997 #: ../en/ch08-undo.xml:831
dongsheng@627 9998 msgid ""
dongsheng@627 9999 "The process ends when <command role=\"hg-cmd\">hg bisect</command> identifies "
dongsheng@627 10000 "a unique changeset that marks the point where your test transitioned from "
dongsheng@627 10001 "<quote>succeeding</quote> to <quote>failing</quote>."
dongsheng@627 10002 msgstr ""
dongsheng@627 10003
dongsheng@627 10004 #
dongsheng@627 10005 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10006 #: ../en/ch08-undo.xml:836
dongsheng@627 10007 msgid ""
dongsheng@627 10008 "To start the search, we must run the <command role=\"hg-cmd\">hg bisect --"
dongsheng@627 10009 "reset</command> command."
dongsheng@627 10010 msgstr ""
dongsheng@627 10011
dongsheng@627 10012 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10013 #: ../en/ch08-undo.xml:841
dongsheng@627 10014 msgid ""
dongsheng@627 10015 "In our case, the binary test we use is simple: we check to see if any file in "
dongsheng@627 10016 "the repository contains the string <quote>i have a gub</quote>. If it does, "
dongsheng@627 10017 "this changeset contains the change that <quote>caused the bug</quote>. By "
dongsheng@627 10018 "convention, a changeset that has the property we're searching for is "
dongsheng@627 10019 "<quote>bad</quote>, while one that doesn't is <quote>good</quote>."
dongsheng@627 10020 msgstr ""
dongsheng@627 10021
dongsheng@627 10022 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10023 #: ../en/ch08-undo.xml:849
dongsheng@627 10024 msgid ""
dongsheng@627 10025 "Most of the time, the revision to which the working directory is synced "
dongsheng@627 10026 "(usually the tip) already exhibits the problem introduced by the buggy "
dongsheng@627 10027 "change, so we'll mark it as <quote>bad</quote>."
dongsheng@627 10028 msgstr ""
dongsheng@627 10029
dongsheng@627 10030 #
dongsheng@627 10031 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10032 #: ../en/ch08-undo.xml:856
dongsheng@627 10033 msgid ""
dongsheng@627 10034 "Our next task is to nominate a changeset that we know <emphasis>doesn't</"
dongsheng@627 10035 "emphasis> have the bug; the <command role=\"hg-cmd\">hg bisect</command> "
dongsheng@627 10036 "command will <quote>bracket</quote> its search between the first pair of good "
dongsheng@627 10037 "and bad changesets. In our case, we know that revision 10 didn't have the "
dongsheng@627 10038 "bug. (I'll have more words about choosing the first <quote>good</quote> "
dongsheng@627 10039 "changeset later.)"
dongsheng@627 10040 msgstr ""
dongsheng@627 10041
dongsheng@627 10042 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10043 #: ../en/ch08-undo.xml:866
dongsheng@627 10044 msgid "Notice that this command printed some output."
dongsheng@627 10045 msgstr ""
dongsheng@627 10046
dongsheng@627 10047 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 10048 #: ../en/ch08-undo.xml:868
dongsheng@627 10049 msgid ""
dongsheng@627 10050 "It told us how many changesets it must consider before it can identify the "
dongsheng@627 10051 "one that introduced the bug, and how many tests that will require."
dongsheng@627 10052 msgstr ""
dongsheng@627 10053
dongsheng@627 10054 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 10055 #: ../en/ch08-undo.xml:872
dongsheng@627 10056 msgid ""
dongsheng@627 10057 "It updated the working directory to the next changeset to test, and told us "
dongsheng@627 10058 "which changeset it's testing."
dongsheng@627 10059 msgstr ""
dongsheng@627 10060
dongsheng@627 10061 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10062 #: ../en/ch08-undo.xml:877
dongsheng@627 10063 msgid ""
dongsheng@627 10064 "We now run our test in the working directory. We use the <command>grep</"
dongsheng@627 10065 "command> command to see if our <quote>bad</quote> file is present in the "
dongsheng@627 10066 "working directory. If it is, this revision is bad; if not, this revision is "
dongsheng@627 10067 "good. &interaction.bisect.search.step1;"
dongsheng@627 10068 msgstr ""
dongsheng@627 10069
dongsheng@627 10070 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10071 #: ../en/ch08-undo.xml:883
dongsheng@627 10072 msgid ""
dongsheng@627 10073 "This test looks like a perfect candidate for automation, so let's turn it "
dongsheng@627 10074 "into a shell function."
dongsheng@627 10075 msgstr ""
dongsheng@627 10076
dongsheng@627 10077 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10078 #: ../en/ch08-undo.xml:887
dongsheng@627 10079 msgid ""
dongsheng@627 10080 "We can now run an entire test step with a single command, <literal>mytest</"
dongsheng@627 10081 "literal>."
dongsheng@627 10082 msgstr ""
dongsheng@627 10083
dongsheng@627 10084 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10085 #: ../en/ch08-undo.xml:892
dongsheng@627 10086 msgid "A few more invocations of our canned test step command, and we're done."
dongsheng@627 10087 msgstr ""
dongsheng@627 10088
dongsheng@627 10089 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10090 #: ../en/ch08-undo.xml:897
dongsheng@627 10091 msgid ""
dongsheng@627 10092 "Even though we had 40 changesets to search through, the <command role=\"hg-cmd"
dongsheng@627 10093 "\">hg bisect</command> command let us find the changeset that introduced our "
dongsheng@627 10094 "<quote>bug</quote> with only five tests. Because the number of tests that "
dongsheng@627 10095 "the <command role=\"hg-cmd\">hg bisect</command> command performs grows "
dongsheng@627 10096 "logarithmically with the number of changesets to search, the advantage that "
dongsheng@627 10097 "it has over the <quote>brute force</quote> search approach increases with "
dongsheng@627 10098 "every changeset you add."
dongsheng@627 10099 msgstr ""
dongsheng@627 10100
dongsheng@627 10101 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 10102 #: ../en/ch08-undo.xml:908
dongsheng@627 10103 msgid "Cleaning up after your search"
dongsheng@635 10104 msgstr "搜索后的清理"
dongsheng@627 10105
dongsheng@627 10106 #
dongsheng@627 10107 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10108 #: ../en/ch08-undo.xml:910
dongsheng@627 10109 msgid ""
dongsheng@627 10110 "When you're finished using the <command role=\"hg-cmd\">hg bisect</command> "
dongsheng@627 10111 "command in a repository, you can use the <command role=\"hg-cmd\">hg bisect "
dongsheng@627 10112 "reset</command> command to drop the information it was using to drive your "
dongsheng@627 10113 "search. The command doesn't use much space, so it doesn't matter if you "
dongsheng@627 10114 "forget to run this command. However, <command role=\"hg-cmd\">hg bisect</"
dongsheng@627 10115 "command> won't let you start a new search in that repository until you do a "
dongsheng@627 10116 "<command role=\"hg-cmd\">hg bisect reset</command>."
dongsheng@627 10117 msgstr ""
dongsheng@627 10118
dongsheng@627 10119 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 10120 #: ../en/ch08-undo.xml:925
dongsheng@627 10121 msgid "Tips for finding bugs effectively"
dongsheng@635 10122 msgstr "有效查找问题的技巧"
dongsheng@627 10123
dongsheng@627 10124 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 10125 #: ../en/ch08-undo.xml:928
dongsheng@627 10126 msgid "Give consistent input"
dongsheng@635 10127 msgstr "给出一致的输入"
dongsheng@627 10128
dongsheng@627 10129 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10130 #: ../en/ch08-undo.xml:930
dongsheng@627 10131 msgid ""
dongsheng@627 10132 "The <command role=\"hg-cmd\">hg bisect</command> command requires that you "
dongsheng@627 10133 "correctly report the result of every test you perform. If you tell it that a "
dongsheng@627 10134 "test failed when it really succeeded, it <emphasis>might</emphasis> be able "
dongsheng@627 10135 "to detect the inconsistency. If it can identify an inconsistency in your "
dongsheng@627 10136 "reports, it will tell you that a particular changeset is both good and bad. "
dongsheng@627 10137 "However, it can't do this perfectly; it's about as likely to report the wrong "
dongsheng@627 10138 "changeset as the source of the bug."
dongsheng@627 10139 msgstr ""
dongsheng@627 10140
dongsheng@627 10141 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 10142 #: ../en/ch08-undo.xml:942
dongsheng@627 10143 msgid "Automate as much as possible"
dongsheng@635 10144 msgstr "尽量自动"
dongsheng@627 10145
dongsheng@627 10146 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10147 #: ../en/ch08-undo.xml:944
dongsheng@627 10148 msgid ""
dongsheng@627 10149 "When I started using the <command role=\"hg-cmd\">hg bisect</command> "
dongsheng@627 10150 "command, I tried a few times to run my tests by hand, on the command line. "
dongsheng@627 10151 "This is an approach that I, at least, am not suited to. After a few tries, I "
dongsheng@627 10152 "found that I was making enough mistakes that I was having to restart my "
dongsheng@627 10153 "searches several times before finally getting correct results."
dongsheng@627 10154 msgstr ""
dongsheng@627 10155
dongsheng@627 10156 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10157 #: ../en/ch08-undo.xml:952
dongsheng@627 10158 msgid ""
dongsheng@627 10159 "My initial problems with driving the <command role=\"hg-cmd\">hg bisect</"
dongsheng@627 10160 "command> command by hand occurred even with simple searches on small "
dongsheng@627 10161 "repositories; if the problem you're looking for is more subtle, or the number "
dongsheng@627 10162 "of tests that <command role=\"hg-cmd\">hg bisect</command> must perform "
dongsheng@627 10163 "increases, the likelihood of operator error ruining the search is much "
dongsheng@627 10164 "higher. Once I started automating my tests, I had much better results."
dongsheng@627 10165 msgstr ""
dongsheng@627 10166
dongsheng@627 10167 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10168 #: ../en/ch08-undo.xml:961
dongsheng@627 10169 msgid "The key to automated testing is twofold:"
dongsheng@627 10170 msgstr ""
dongsheng@627 10171
dongsheng@627 10172 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 10173 #: ../en/ch08-undo.xml:963
dongsheng@627 10174 msgid "always test for the same symptom, and"
dongsheng@627 10175 msgstr ""
dongsheng@627 10176
dongsheng@627 10177 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 10178 #: ../en/ch08-undo.xml:965
dongsheng@627 10179 msgid ""
dongsheng@627 10180 "always feed consistent input to the <command role=\"hg-cmd\">hg bisect</"
dongsheng@627 10181 "command> command."
dongsheng@627 10182 msgstr ""
dongsheng@627 10183
dongsheng@627 10184 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10185 #: ../en/ch08-undo.xml:968
dongsheng@627 10186 msgid ""
dongsheng@627 10187 "In my tutorial example above, the <command>grep</command> command tests for "
dongsheng@627 10188 "the symptom, and the <literal>if</literal> statement takes the result of this "
dongsheng@627 10189 "check and ensures that we always feed the same input to the <command role="
dongsheng@627 10190 "\"hg-cmd\">hg bisect</command> command. The <literal>mytest</literal> "
dongsheng@627 10191 "function marries these together in a reproducible way, so that every test is "
dongsheng@627 10192 "uniform and consistent."
dongsheng@627 10193 msgstr ""
dongsheng@627 10194
dongsheng@627 10195 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 10196 #: ../en/ch08-undo.xml:978
dongsheng@627 10197 msgid "Check your results"
dongsheng@635 10198 msgstr "检查你的结果"
dongsheng@627 10199
dongsheng@627 10200 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10201 #: ../en/ch08-undo.xml:980
dongsheng@627 10202 msgid ""
dongsheng@627 10203 "Because the output of a <command role=\"hg-cmd\">hg bisect</command> search "
dongsheng@627 10204 "is only as good as the input you give it, don't take the changeset it reports "
dongsheng@627 10205 "as the absolute truth. A simple way to cross-check its report is to manually "
dongsheng@627 10206 "run your test at each of the following changesets:"
dongsheng@627 10207 msgstr ""
dongsheng@627 10208
dongsheng@627 10209 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 10210 #: ../en/ch08-undo.xml:986
dongsheng@627 10211 msgid ""
dongsheng@627 10212 "The changeset that it reports as the first bad revision. Your test should "
dongsheng@627 10213 "still report this as bad."
dongsheng@627 10214 msgstr ""
dongsheng@627 10215
dongsheng@627 10216 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 10217 #: ../en/ch08-undo.xml:990
dongsheng@627 10218 msgid ""
dongsheng@627 10219 "The parent of that changeset (either parent, if it's a merge). Your test "
dongsheng@627 10220 "should report this changeset as good."
dongsheng@627 10221 msgstr ""
dongsheng@627 10222
dongsheng@627 10223 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 10224 #: ../en/ch08-undo.xml:994
dongsheng@627 10225 msgid ""
dongsheng@627 10226 "A child of that changeset. Your test should report this changeset as bad."
dongsheng@627 10227 msgstr ""
dongsheng@627 10228
dongsheng@627 10229 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 10230 #: ../en/ch08-undo.xml:1000
dongsheng@627 10231 msgid "Beware interference between bugs"
dongsheng@635 10232 msgstr "谨防问题之间的冲突"
dongsheng@627 10233
dongsheng@627 10234 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10235 #: ../en/ch08-undo.xml:1002
dongsheng@627 10236 msgid ""
dongsheng@627 10237 "It's possible that your search for one bug could be disrupted by the presence "
dongsheng@627 10238 "of another. For example, let's say your software crashes at revision 100, "
dongsheng@627 10239 "and worked correctly at revision 50. Unknown to you, someone else introduced "
dongsheng@627 10240 "a different crashing bug at revision 60, and fixed it at revision 80. This "
dongsheng@627 10241 "could distort your results in one of several ways."
dongsheng@627 10242 msgstr ""
dongsheng@627 10243
dongsheng@627 10244 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10245 #: ../en/ch08-undo.xml:1010
dongsheng@627 10246 msgid ""
dongsheng@627 10247 "It is possible that this other bug completely <quote>masks</quote> yours, "
dongsheng@627 10248 "which is to say that it occurs before your bug has a chance to manifest "
dongsheng@627 10249 "itself. If you can't avoid that other bug (for example, it prevents your "
dongsheng@627 10250 "project from building), and so can't tell whether your bug is present in a "
dongsheng@627 10251 "particular changeset, the <command role=\"hg-cmd\">hg bisect</command> "
dongsheng@627 10252 "command cannot help you directly. Instead, you can mark a changeset as "
dongsheng@627 10253 "untested by running <command role=\"hg-cmd\">hg bisect --skip</command>."
dongsheng@627 10254 msgstr ""
dongsheng@627 10255
dongsheng@627 10256 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10257 #: ../en/ch08-undo.xml:1020
dongsheng@627 10258 msgid ""
dongsheng@627 10259 "A different problem could arise if your test for a bug's presence is not "
dongsheng@627 10260 "specific enough. If you check for <quote>my program crashes</quote>, then "
dongsheng@627 10261 "both your crashing bug and an unrelated crashing bug that masks it will look "
dongsheng@627 10262 "like the same thing, and mislead <command role=\"hg-cmd\">hg bisect</command>."
dongsheng@627 10263 msgstr ""
dongsheng@627 10264
dongsheng@627 10265 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10266 #: ../en/ch08-undo.xml:1027
dongsheng@627 10267 msgid ""
dongsheng@627 10268 "Another useful situation in which to use <command role=\"hg-cmd\">hg bisect --"
dongsheng@627 10269 "skip</command> is if you can't test a revision because your project was in a "
dongsheng@627 10270 "broken and hence untestable state at that revision, perhaps because someone "
dongsheng@627 10271 "checked in a change that prevented the project from building."
dongsheng@627 10272 msgstr ""
dongsheng@627 10273
dongsheng@627 10274 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 10275 #: ../en/ch08-undo.xml:1036
dongsheng@627 10276 msgid "Bracket your search lazily"
dongsheng@635 10277 msgstr "减少你的查找工作"
dongsheng@627 10278
dongsheng@627 10279 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10280 #: ../en/ch08-undo.xml:1038
dongsheng@627 10281 msgid ""
dongsheng@627 10282 "Choosing the first <quote>good</quote> and <quote>bad</quote> changesets that "
dongsheng@627 10283 "will mark the end points of your search is often easy, but it bears a little "
dongsheng@627 10284 "discussion nevertheless. From the perspective of <command role=\"hg-cmd\">hg "
dongsheng@627 10285 "bisect</command>, the <quote>newest</quote> changeset is conventionally "
dongsheng@627 10286 "<quote>bad</quote>, and the older changeset is <quote>good</quote>."
dongsheng@627 10287 msgstr ""
dongsheng@627 10288
dongsheng@627 10289 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10290 #: ../en/ch08-undo.xml:1046
dongsheng@627 10291 msgid ""
dongsheng@627 10292 "If you're having trouble remembering when a suitable <quote>good</quote> "
dongsheng@627 10293 "change was, so that you can tell <command role=\"hg-cmd\">hg bisect</"
dongsheng@627 10294 "command>, you could do worse than testing changesets at random. Just "
dongsheng@627 10295 "remember to eliminate contenders that can't possibly exhibit the bug (perhaps "
dongsheng@627 10296 "because the feature with the bug isn't present yet) and those where another "
dongsheng@627 10297 "problem masks the bug (as I discussed above)."
dongsheng@627 10298 msgstr ""
dongsheng@627 10299
dongsheng@627 10300 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 10301 #: ../en/ch08-undo.xml:1055
dongsheng@627 10302 msgid ""
dongsheng@627 10303 "Even if you end up <quote>early</quote> by thousands of changesets or months "
dongsheng@627 10304 "of history, you will only add a handful of tests to the total number that "
dongsheng@627 10305 "<command role=\"hg-cmd\">hg bisect</command> must perform, thanks to its "
dongsheng@627 10306 "logarithmic behaviour."
dongsheng@627 10307 msgstr ""
dongsheng@627 10308
dongsheng@627 10309 #. type: Content of: <book><chapter><title>
dongsheng@650 10310 #: ../en/ch09-hook.xml:5
dongsheng@627 10311 msgid "Handling repository events with hooks"
dongsheng@627 10312 msgstr "使用钩子处理版本库事件"
dongsheng@627 10313
dongsheng@627 10314 #. type: Content of: <book><chapter><para>
dongsheng@650 10315 #: ../en/ch09-hook.xml:7
dongsheng@627 10316 msgid ""
dongsheng@627 10317 "Mercurial offers a powerful mechanism to let you perform automated actions in "
dongsheng@627 10318 "response to events that occur in a repository. In some cases, you can even "
dongsheng@627 10319 "control Mercurial's response to those events."
dongsheng@627 10320 msgstr ""
dongsheng@627 10321
dongsheng@627 10322 #. type: Content of: <book><chapter><para>
dongsheng@650 10323 #: ../en/ch09-hook.xml:12
dongsheng@627 10324 msgid ""
dongsheng@627 10325 "The name Mercurial uses for one of these actions is a <emphasis>hook</"
dongsheng@627 10326 "emphasis>. Hooks are called <quote>triggers</quote> in some revision control "
dongsheng@627 10327 "systems, but the two names refer to the same idea."
dongsheng@627 10328 msgstr ""
dongsheng@627 10329
dongsheng@627 10330 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 10331 #: ../en/ch09-hook.xml:18
dongsheng@627 10332 msgid "An overview of hooks in Mercurial"
dongsheng@635 10333 msgstr "Mercurial 钩子概述"
dongsheng@627 10334
dongsheng@627 10335 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10336 #: ../en/ch09-hook.xml:20
dongsheng@627 10337 msgid ""
songdongsheng@658 10338 "Here is a brief list of the hooks that Mercurial supports. We will revisit "
songdongsheng@658 10339 "each of these hooks in more detail later, in <xref linkend=\"sec:hook:ref\"/>."
dongsheng@627 10340 msgstr ""
dongsheng@627 10341
dongsheng@627 10342 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10343 #: ../en/ch09-hook.xml:25
dongsheng@627 10344 msgid ""
dongsheng@627 10345 "<literal role=\"hook\">changegroup</literal>: This is run after a group of "
dongsheng@627 10346 "changesets has been brought into the repository from elsewhere."
dongsheng@627 10347 msgstr ""
dongsheng@627 10348
dongsheng@627 10349 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10350 #: ../en/ch09-hook.xml:29
dongsheng@627 10351 msgid ""
dongsheng@627 10352 "<literal role=\"hook\">commit</literal>: This is run after a new changeset "
dongsheng@627 10353 "has been created in the local repository."
dongsheng@627 10354 msgstr ""
dongsheng@627 10355
dongsheng@627 10356 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10357 #: ../en/ch09-hook.xml:33
dongsheng@627 10358 msgid ""
dongsheng@627 10359 "<literal role=\"hook\">incoming</literal>: This is run once for each new "
dongsheng@627 10360 "changeset that is brought into the repository from elsewhere. Notice the "
dongsheng@627 10361 "difference from <literal role=\"hook\">changegroup</literal>, which is run "
dongsheng@627 10362 "once per <emphasis>group</emphasis> of changesets brought in."
dongsheng@627 10363 msgstr ""
dongsheng@627 10364
dongsheng@627 10365 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10366 #: ../en/ch09-hook.xml:40
dongsheng@627 10367 msgid ""
dongsheng@627 10368 "<literal role=\"hook\">outgoing</literal>: This is run after a group of "
dongsheng@627 10369 "changesets has been transmitted from this repository."
dongsheng@627 10370 msgstr ""
dongsheng@627 10371
dongsheng@627 10372 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10373 #: ../en/ch09-hook.xml:44
dongsheng@627 10374 msgid ""
dongsheng@627 10375 "<literal role=\"hook\">prechangegroup</literal>: This is run before starting "
dongsheng@627 10376 "to bring a group of changesets into the repository."
dongsheng@627 10377 msgstr ""
dongsheng@627 10378
dongsheng@627 10379 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10380 #: ../en/ch09-hook.xml:49
dongsheng@627 10381 msgid ""
dongsheng@627 10382 "<literal role=\"hook\">precommit</literal>: Controlling. This is run before "
dongsheng@627 10383 "starting a commit."
dongsheng@627 10384 msgstr ""
dongsheng@627 10385
dongsheng@627 10386 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10387 #: ../en/ch09-hook.xml:53
dongsheng@627 10388 msgid ""
dongsheng@627 10389 "<literal role=\"hook\">preoutgoing</literal>: Controlling. This is run before "
dongsheng@627 10390 "starting to transmit a group of changesets from this repository."
dongsheng@627 10391 msgstr ""
dongsheng@627 10392
dongsheng@627 10393 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10394 #: ../en/ch09-hook.xml:58
dongsheng@627 10395 msgid ""
dongsheng@627 10396 "<literal role=\"hook\">pretag</literal>: Controlling. This is run before "
dongsheng@627 10397 "creating a tag."
dongsheng@627 10398 msgstr ""
dongsheng@627 10399
dongsheng@627 10400 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10401 #: ../en/ch09-hook.xml:62
dongsheng@627 10402 msgid ""
dongsheng@627 10403 "<literal role=\"hook\">pretxnchangegroup</literal>: Controlling. This is run "
dongsheng@627 10404 "after a group of changesets has been brought into the local repository from "
dongsheng@627 10405 "another, but before the transaction completes that will make the changes "
dongsheng@627 10406 "permanent in the repository."
dongsheng@627 10407 msgstr ""
dongsheng@627 10408
dongsheng@627 10409 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10410 #: ../en/ch09-hook.xml:70
dongsheng@627 10411 msgid ""
dongsheng@627 10412 "<literal role=\"hook\">pretxncommit</literal>: Controlling. This is run after "
dongsheng@627 10413 "a new changeset has been created in the local repository, but before the "
dongsheng@627 10414 "transaction completes that will make it permanent."
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:76
dongsheng@627 10419 msgid ""
dongsheng@627 10420 "<literal role=\"hook\">preupdate</literal>: Controlling. This is run before "
dongsheng@627 10421 "starting an update or merge of the working directory."
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:81
dongsheng@627 10426 msgid ""
dongsheng@627 10427 "<literal role=\"hook\">tag</literal>: This is run after a tag is created."
dongsheng@627 10428 msgstr ""
dongsheng@627 10429
dongsheng@627 10430 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 10431 #: ../en/ch09-hook.xml:85
dongsheng@627 10432 msgid ""
dongsheng@627 10433 "<literal role=\"hook\">update</literal>: This is run after an update or merge "
dongsheng@627 10434 "of the working directory has finished."
dongsheng@627 10435 msgstr ""
dongsheng@627 10436
dongsheng@627 10437 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10438 #: ../en/ch09-hook.xml:90
dongsheng@627 10439 msgid ""
dongsheng@627 10440 "Each of the hooks whose description begins with the word <quote>Controlling</"
dongsheng@627 10441 "quote> has the ability to determine whether an activity can proceed. If the "
dongsheng@627 10442 "hook succeeds, the activity may proceed; if it fails, the activity is either "
dongsheng@627 10443 "not permitted or undone, depending on the hook."
dongsheng@627 10444 msgstr ""
dongsheng@627 10445
dongsheng@627 10446 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 10447 #: ../en/ch09-hook.xml:99
dongsheng@627 10448 msgid "Hooks and security"
dongsheng@635 10449 msgstr "钩子与安全性"
dongsheng@627 10450
dongsheng@627 10451 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10452 #: ../en/ch09-hook.xml:102
dongsheng@627 10453 msgid "Hooks are run with your privileges"
dongsheng@635 10454 msgstr "钩子以你的特权执行"
dongsheng@627 10455
dongsheng@627 10456 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10457 #: ../en/ch09-hook.xml:104
dongsheng@627 10458 msgid ""
dongsheng@627 10459 "When you run a Mercurial command in a repository, and the command causes a "
dongsheng@627 10460 "hook to run, that hook runs on <emphasis>your</emphasis> system, under "
dongsheng@627 10461 "<emphasis>your</emphasis> user account, with <emphasis>your</emphasis> "
dongsheng@627 10462 "privilege level. Since hooks are arbitrary pieces of executable code, you "
dongsheng@627 10463 "should treat them with an appropriate level of suspicion. Do not install a "
dongsheng@627 10464 "hook unless you are confident that you know who created it and what it does."
dongsheng@627 10465 msgstr ""
dongsheng@627 10466
dongsheng@627 10467 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10468 #: ../en/ch09-hook.xml:115
dongsheng@627 10469 msgid ""
dongsheng@627 10470 "In some cases, you may be exposed to hooks that you did not install "
dongsheng@627 10471 "yourself. If you work with Mercurial on an unfamiliar system, Mercurial will "
dongsheng@650 10472 "run hooks defined in that system's global <filename role=\"special\">~/.hgrc</"
dongsheng@650 10473 "filename> file."
dongsheng@650 10474 msgstr ""
dongsheng@650 10475
dongsheng@650 10476 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10477 #: ../en/ch09-hook.xml:122
dongsheng@627 10478 msgid ""
dongsheng@627 10479 "If you are working with a repository owned by another user, Mercurial can run "
dongsheng@627 10480 "hooks defined in that user's repository, but it will still run them as "
dongsheng@627 10481 "<quote>you</quote>. For example, if you <command role=\"hg-cmd\">hg pull</"
dongsheng@627 10482 "command> from that repository, and its <filename role=\"special\">.hg/hgrc</"
dongsheng@627 10483 "filename> defines a local <literal role=\"hook\">outgoing</literal> hook, "
dongsheng@627 10484 "that hook will run under your user account, even though you don't own that "
dongsheng@627 10485 "repository."
dongsheng@627 10486 msgstr ""
dongsheng@627 10487
dongsheng@627 10488 #. type: Content of: <book><chapter><sect1><sect2><note><para>
dongsheng@650 10489 #: ../en/ch09-hook.xml:134
dongsheng@627 10490 msgid ""
dongsheng@627 10491 "This only applies if you are pulling from a repository on a local or network "
dongsheng@627 10492 "filesystem. If you're pulling over http or ssh, any <literal role=\"hook"
dongsheng@627 10493 "\">outgoing</literal> hook will run under whatever account is executing the "
dongsheng@627 10494 "server process, on the server."
dongsheng@627 10495 msgstr ""
dongsheng@627 10496
dongsheng@627 10497 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10498 #: ../en/ch09-hook.xml:142
dongsheng@627 10499 msgid ""
dongsheng@627 10500 "XXX To see what hooks are defined in a repository, use the <command role=\"hg-"
dongsheng@627 10501 "cmd\">hg config hooks</command> command. If you are working in one "
dongsheng@627 10502 "repository, but talking to another that you do not own (e.g. using <command "
dongsheng@627 10503 "role=\"hg-cmd\">hg pull</command> or <command role=\"hg-cmd\">hg incoming</"
dongsheng@627 10504 "command>), remember that it is the other repository's hooks you should be "
dongsheng@627 10505 "checking, not your own."
dongsheng@627 10506 msgstr ""
dongsheng@627 10507
dongsheng@627 10508 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10509 #: ../en/ch09-hook.xml:153
dongsheng@627 10510 msgid "Hooks do not propagate"
dongsheng@635 10511 msgstr "钩子不会传播"
dongsheng@627 10512
dongsheng@627 10513 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10514 #: ../en/ch09-hook.xml:155
dongsheng@627 10515 msgid ""
dongsheng@627 10516 "In Mercurial, hooks are not revision controlled, and do not propagate when "
dongsheng@627 10517 "you clone, or pull from, a repository. The reason for this is simple: a hook "
dongsheng@627 10518 "is a completely arbitrary piece of executable code. It runs under your user "
dongsheng@627 10519 "identity, with your privilege level, on your machine."
dongsheng@627 10520 msgstr ""
dongsheng@627 10521
dongsheng@627 10522 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10523 #: ../en/ch09-hook.xml:162
dongsheng@627 10524 msgid ""
dongsheng@627 10525 "It would be extremely reckless for any distributed revision control system to "
dongsheng@627 10526 "implement revision-controlled hooks, as this would offer an easily "
dongsheng@627 10527 "exploitable way to subvert the accounts of users of the revision control "
dongsheng@627 10528 "system."
dongsheng@627 10529 msgstr ""
dongsheng@627 10530
dongsheng@627 10531 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10532 #: ../en/ch09-hook.xml:168
dongsheng@627 10533 msgid ""
dongsheng@627 10534 "Since Mercurial does not propagate hooks, if you are collaborating with other "
dongsheng@627 10535 "people on a common project, you should not assume that they are using the "
dongsheng@627 10536 "same Mercurial hooks as you are, or that theirs are correctly configured. "
dongsheng@627 10537 "You should document the hooks you expect people to use."
dongsheng@627 10538 msgstr ""
dongsheng@627 10539
dongsheng@627 10540 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10541 #: ../en/ch09-hook.xml:175
dongsheng@627 10542 msgid ""
dongsheng@627 10543 "In a corporate intranet, this is somewhat easier to control, as you can for "
dongsheng@627 10544 "example provide a <quote>standard</quote> installation of Mercurial on an NFS "
dongsheng@650 10545 "filesystem, and use a site-wide <filename role=\"special\">~/.hgrc</filename> "
dongsheng@650 10546 "file to define hooks that all users will see. However, this too has its "
dongsheng@627 10547 "limits; see below."
dongsheng@627 10548 msgstr ""
dongsheng@627 10549
dongsheng@627 10550 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10551 #: ../en/ch09-hook.xml:184
dongsheng@627 10552 msgid "Hooks can be overridden"
dongsheng@635 10553 msgstr "钩子可以被覆盖"
dongsheng@627 10554
dongsheng@627 10555 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10556 #: ../en/ch09-hook.xml:186
dongsheng@627 10557 msgid ""
dongsheng@627 10558 "Mercurial allows you to override a hook definition by redefining the hook. "
dongsheng@627 10559 "You can disable it by setting its value to the empty string, or change its "
dongsheng@627 10560 "behaviour as you wish."
dongsheng@627 10561 msgstr ""
dongsheng@627 10562
dongsheng@627 10563 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10564 #: ../en/ch09-hook.xml:191
dongsheng@650 10565 msgid ""
dongsheng@650 10566 "If you deploy a system- or site-wide <filename role=\"special\">~/.hgrc</"
dongsheng@650 10567 "filename> file that defines some hooks, you should thus understand that your "
dongsheng@650 10568 "users can disable or override those hooks."
dongsheng@650 10569 msgstr ""
dongsheng@650 10570
dongsheng@650 10571 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10572 #: ../en/ch09-hook.xml:199
dongsheng@627 10573 msgid "Ensuring that critical hooks are run"
dongsheng@635 10574 msgstr "确保关键钩子的执行"
dongsheng@627 10575
dongsheng@627 10576 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10577 #: ../en/ch09-hook.xml:201
dongsheng@627 10578 msgid ""
dongsheng@627 10579 "Sometimes you may want to enforce a policy that you do not want others to be "
dongsheng@627 10580 "able to work around. For example, you may have a requirement that every "
dongsheng@627 10581 "changeset must pass a rigorous set of tests. Defining this requirement via a "
dongsheng@650 10582 "hook in a site-wide <filename role=\"special\">~/.hgrc</filename> won't work "
dongsheng@650 10583 "for remote users on laptops, and of course local users can subvert it at will "
dongsheng@650 10584 "by overriding the hook."
dongsheng@650 10585 msgstr ""
dongsheng@650 10586
dongsheng@650 10587 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10588 #: ../en/ch09-hook.xml:210
dongsheng@627 10589 msgid ""
dongsheng@627 10590 "Instead, you can set up your policies for use of Mercurial so that people are "
dongsheng@627 10591 "expected to propagate changes through a well-known <quote>canonical</quote> "
dongsheng@627 10592 "server that you have locked down and configured appropriately."
dongsheng@627 10593 msgstr ""
dongsheng@627 10594
dongsheng@627 10595 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10596 #: ../en/ch09-hook.xml:216
dongsheng@627 10597 msgid ""
dongsheng@627 10598 "One way to do this is via a combination of social engineering and "
dongsheng@627 10599 "technology. Set up a restricted-access account; users can push changes over "
dongsheng@627 10600 "the network to repositories managed by this account, but they cannot log into "
dongsheng@627 10601 "the account and run normal shell commands. In this scenario, a user can "
dongsheng@627 10602 "commit a changeset that contains any old garbage they want."
dongsheng@627 10603 msgstr ""
dongsheng@627 10604
dongsheng@627 10605 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10606 #: ../en/ch09-hook.xml:225
dongsheng@627 10607 msgid ""
dongsheng@627 10608 "When someone pushes a changeset to the server that everyone pulls from, the "
dongsheng@627 10609 "server will test the changeset before it accepts it as permanent, and reject "
dongsheng@627 10610 "it if it fails to pass the test suite. If people only pull changes from this "
dongsheng@627 10611 "filtering server, it will serve to ensure that all changes that people pull "
dongsheng@627 10612 "have been automatically vetted."
dongsheng@627 10613 msgstr ""
dongsheng@627 10614
dongsheng@627 10615 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 10616 #: ../en/ch09-hook.xml:236
dongsheng@627 10617 msgid "Care with <literal>pretxn</literal> hooks in a shared-access repository"
dongsheng@635 10618 msgstr "在共享版本库中注意 <literal>pretxn</literal> 钩子"
dongsheng@627 10619
dongsheng@627 10620 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10621 #: ../en/ch09-hook.xml:239
dongsheng@627 10622 msgid ""
dongsheng@627 10623 "If you want to use hooks to do some automated work in a repository that a "
dongsheng@627 10624 "number of people have shared access to, you need to be careful in how you do "
dongsheng@627 10625 "this."
dongsheng@627 10626 msgstr ""
dongsheng@627 10627
dongsheng@627 10628 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10629 #: ../en/ch09-hook.xml:244
dongsheng@627 10630 msgid ""
dongsheng@627 10631 "Mercurial only locks a repository when it is writing to the repository, and "
dongsheng@627 10632 "only the parts of Mercurial that write to the repository pay attention to "
dongsheng@627 10633 "locks. Write locks are necessary to prevent multiple simultaneous writers "
dongsheng@627 10634 "from scribbling on each other's work, corrupting the repository."
dongsheng@627 10635 msgstr ""
dongsheng@627 10636
dongsheng@627 10637 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10638 #: ../en/ch09-hook.xml:251
dongsheng@627 10639 msgid ""
dongsheng@627 10640 "Because Mercurial is careful with the order in which it reads and writes "
dongsheng@627 10641 "data, it does not need to acquire a lock when it wants to read data from the "
dongsheng@627 10642 "repository. The parts of Mercurial that read from the repository never pay "
dongsheng@627 10643 "attention to locks. This lockless reading scheme greatly increases "
dongsheng@627 10644 "performance and concurrency."
dongsheng@627 10645 msgstr ""
dongsheng@627 10646
dongsheng@627 10647 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10648 #: ../en/ch09-hook.xml:259
dongsheng@627 10649 msgid ""
dongsheng@627 10650 "With great performance comes a trade-off, though, one which has the potential "
dongsheng@627 10651 "to cause you trouble unless you're aware of it. To describe this requires a "
dongsheng@627 10652 "little detail about how Mercurial adds changesets to a repository and reads "
dongsheng@627 10653 "those changes."
dongsheng@627 10654 msgstr ""
dongsheng@627 10655
dongsheng@627 10656 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10657 #: ../en/ch09-hook.xml:266
dongsheng@627 10658 msgid ""
dongsheng@627 10659 "When Mercurial <emphasis>writes</emphasis> metadata, it writes it straight "
dongsheng@627 10660 "into the destination file. It writes file data first, then manifest data "
dongsheng@627 10661 "(which contains pointers to the new file data), then changelog data (which "
dongsheng@627 10662 "contains pointers to the new manifest data). Before the first write to each "
dongsheng@627 10663 "file, it stores a record of where the end of the file was in its transaction "
dongsheng@627 10664 "log. If the transaction must be rolled back, Mercurial simply truncates each "
dongsheng@627 10665 "file back to the size it was before the transaction began."
dongsheng@627 10666 msgstr ""
dongsheng@627 10667
dongsheng@627 10668 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10669 #: ../en/ch09-hook.xml:277
dongsheng@627 10670 msgid ""
dongsheng@627 10671 "When Mercurial <emphasis>reads</emphasis> metadata, it reads the changelog "
dongsheng@627 10672 "first, then everything else. Since a reader will only access parts of the "
dongsheng@627 10673 "manifest or file metadata that it can see in the changelog, it can never see "
dongsheng@627 10674 "partially written data."
dongsheng@627 10675 msgstr ""
dongsheng@627 10676
dongsheng@627 10677 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10678 #: ../en/ch09-hook.xml:283
dongsheng@627 10679 msgid ""
dongsheng@627 10680 "Some controlling hooks (<literal role=\"hook\">pretxncommit</literal> and "
dongsheng@627 10681 "<literal role=\"hook\">pretxnchangegroup</literal>) run when a transaction is "
dongsheng@627 10682 "almost complete. All of the metadata has been written, but Mercurial can "
dongsheng@627 10683 "still roll the transaction back and cause the newly-written data to disappear."
dongsheng@627 10684 msgstr ""
dongsheng@627 10685
dongsheng@627 10686 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10687 #: ../en/ch09-hook.xml:291
dongsheng@627 10688 msgid ""
dongsheng@627 10689 "If one of these hooks runs for long, it opens a window of time during which a "
dongsheng@627 10690 "reader can see the metadata for changesets that are not yet permanent, and "
dongsheng@627 10691 "should not be thought of as <quote>really there</quote>. The longer the hook "
dongsheng@627 10692 "runs, the longer that window is open."
dongsheng@627 10693 msgstr ""
dongsheng@627 10694
dongsheng@627 10695 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10696 #: ../en/ch09-hook.xml:299
dongsheng@627 10697 msgid "The problem illustrated"
dongsheng@635 10698 msgstr "问题的演示"
dongsheng@627 10699
dongsheng@627 10700 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10701 #: ../en/ch09-hook.xml:301
dongsheng@627 10702 msgid ""
dongsheng@627 10703 "In principle, a good use for the <literal role=\"hook\">pretxnchangegroup</"
dongsheng@627 10704 "literal> hook would be to automatically build and test incoming changes "
dongsheng@627 10705 "before they are accepted into a central repository. This could let you "
dongsheng@627 10706 "guarantee that nobody can push changes to this repository that <quote>break "
dongsheng@627 10707 "the build</quote>. But if a client can pull changes while they're being "
dongsheng@627 10708 "tested, the usefulness of the test is zero; an unsuspecting someone can pull "
dongsheng@627 10709 "untested changes, potentially breaking their build."
dongsheng@627 10710 msgstr ""
dongsheng@627 10711
dongsheng@627 10712 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10713 #: ../en/ch09-hook.xml:312
dongsheng@627 10714 msgid ""
dongsheng@627 10715 "The safest technological answer to this challenge is to set up such a "
dongsheng@627 10716 "<quote>gatekeeper</quote> repository as <emphasis>unidirectional</emphasis>. "
dongsheng@627 10717 "Let it take changes pushed in from the outside, but do not allow anyone to "
dongsheng@627 10718 "pull changes from it (use the <literal role=\"hook\">preoutgoing</literal> "
dongsheng@627 10719 "hook to lock it down). Configure a <literal role=\"hook\">changegroup</"
dongsheng@627 10720 "literal> hook so that if a build or test succeeds, the hook will push the new "
dongsheng@627 10721 "changes out to another repository that people <emphasis>can</emphasis> pull "
dongsheng@627 10722 "from."
dongsheng@627 10723 msgstr ""
dongsheng@627 10724
dongsheng@627 10725 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10726 #: ../en/ch09-hook.xml:324
dongsheng@627 10727 msgid ""
dongsheng@627 10728 "In practice, putting a centralised bottleneck like this in place is not often "
dongsheng@627 10729 "a good idea, and transaction visibility has nothing to do with the problem. "
dongsheng@661 10730 "As the size of a project—and the time it takes to build and test—grows, you "
dongsheng@661 10731 "rapidly run into a wall with this <quote>try before you buy</quote> approach, "
dongsheng@661 10732 "where you have more changesets to test than time in which to deal with them. "
dongsheng@661 10733 "The inevitable result is frustration on the part of all involved."
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:335
dongsheng@627 10738 msgid ""
dongsheng@627 10739 "An approach that scales better is to get people to build and test before they "
dongsheng@627 10740 "push, then run automated builds and tests centrally <emphasis>after</"
dongsheng@627 10741 "emphasis> a push, to be sure all is well. The advantage of this approach is "
dongsheng@627 10742 "that it does not impose a limit on the rate at which the repository can "
dongsheng@627 10743 "accept changes."
dongsheng@627 10744 msgstr ""
dongsheng@627 10745
dongsheng@627 10746 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 10747 #: ../en/ch09-hook.xml:346
dongsheng@627 10748 msgid "A short tutorial on using hooks"
dongsheng@635 10749 msgstr "使用钩子的简短指南"
dongsheng@627 10750
dongsheng@627 10751 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10752 #: ../en/ch09-hook.xml:348
dongsheng@627 10753 msgid ""
dongsheng@627 10754 "It is easy to write a Mercurial hook. Let's start with a hook that runs when "
dongsheng@627 10755 "you finish a <command role=\"hg-cmd\">hg commit</command>, and simply prints "
dongsheng@627 10756 "the hash of the changeset you just created. The hook is called <literal role="
dongsheng@627 10757 "\"hook\">commit</literal>."
dongsheng@627 10758 msgstr ""
dongsheng@627 10759
dongsheng@627 10760 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10761 #: ../en/ch09-hook.xml:355
dongsheng@627 10762 msgid "All hooks follow the pattern in this example."
dongsheng@627 10763 msgstr ""
dongsheng@627 10764
dongsheng@627 10765 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10766 #: ../en/ch09-hook.xml:359
dongsheng@627 10767 msgid ""
dongsheng@627 10768 "You add an entry to the <literal role=\"rc-hooks\">hooks</literal> section of "
dongsheng@650 10769 "your <filename role=\"special\">~/.hgrc</filename>. On the left is the name "
dongsheng@627 10770 "of the event to trigger on; on the right is the action to take. As you can "
dongsheng@627 10771 "see, you can run an arbitrary shell command in a hook. Mercurial passes "
dongsheng@627 10772 "extra information to the hook using environment variables (look for "
dongsheng@627 10773 "<envar>HG_NODE</envar> in the example)."
dongsheng@627 10774 msgstr ""
dongsheng@627 10775
dongsheng@627 10776 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10777 #: ../en/ch09-hook.xml:369
dongsheng@627 10778 msgid "Performing multiple actions per event"
dongsheng@635 10779 msgstr "每个事件执行多个操作"
dongsheng@627 10780
dongsheng@627 10781 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10782 #: ../en/ch09-hook.xml:371
dongsheng@627 10783 msgid ""
dongsheng@627 10784 "Quite often, you will want to define more than one hook for a particular kind "
dongsheng@627 10785 "of event, as shown below."
dongsheng@627 10786 msgstr ""
dongsheng@627 10787
dongsheng@627 10788 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10789 #: ../en/ch09-hook.xml:376
dongsheng@627 10790 msgid ""
dongsheng@627 10791 "Mercurial lets you do this by adding an <emphasis>extension</emphasis> to the "
dongsheng@627 10792 "end of a hook's name. You extend a hook's name by giving the name of the "
dongsheng@627 10793 "hook, followed by a full stop (the <quote><literal>.</literal></quote> "
dongsheng@627 10794 "character), followed by some more text of your choosing. For example, "
dongsheng@627 10795 "Mercurial will run both <literal>commit.foo</literal> and <literal>commit."
dongsheng@627 10796 "bar</literal> when the <literal>commit</literal> event occurs."
dongsheng@627 10797 msgstr ""
dongsheng@627 10798
dongsheng@627 10799 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10800 #: ../en/ch09-hook.xml:387
dongsheng@627 10801 msgid ""
dongsheng@627 10802 "To give a well-defined order of execution when there are multiple hooks "
dongsheng@627 10803 "defined for an event, Mercurial sorts hooks by extension, and executes the "
dongsheng@627 10804 "hook commands in this sorted order. In the above example, it will execute "
dongsheng@627 10805 "<literal>commit.bar</literal> before <literal>commit.foo</literal>, and "
dongsheng@627 10806 "<literal>commit</literal> before both."
dongsheng@627 10807 msgstr ""
dongsheng@627 10808
dongsheng@627 10809 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10810 #: ../en/ch09-hook.xml:396
dongsheng@627 10811 msgid ""
dongsheng@627 10812 "It is a good idea to use a somewhat descriptive extension when you define a "
dongsheng@627 10813 "new hook. This will help you to remember what the hook was for. If the hook "
dongsheng@627 10814 "fails, you'll get an error message that contains the hook name and extension, "
dongsheng@627 10815 "so using a descriptive extension could give you an immediate hint as to why "
songdongsheng@658 10816 "the hook failed (see <xref linkend=\"sec:hook:perm\"/> for an example)."
dongsheng@627 10817 msgstr ""
dongsheng@627 10818
dongsheng@627 10819 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10820 #: ../en/ch09-hook.xml:407
dongsheng@627 10821 msgid "Controlling whether an activity can proceed"
dongsheng@635 10822 msgstr "控制处理的活动"
dongsheng@627 10823
dongsheng@627 10824 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10825 #: ../en/ch09-hook.xml:409
dongsheng@627 10826 msgid ""
dongsheng@627 10827 "In our earlier examples, we used the <literal role=\"hook\">commit</literal> "
dongsheng@627 10828 "hook, which is run after a commit has completed. This is one of several "
dongsheng@627 10829 "Mercurial hooks that run after an activity finishes. Such hooks have no way "
dongsheng@627 10830 "of influencing the activity itself."
dongsheng@627 10831 msgstr ""
dongsheng@627 10832
dongsheng@627 10833 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10834 #: ../en/ch09-hook.xml:416
dongsheng@627 10835 msgid ""
dongsheng@627 10836 "Mercurial defines a number of events that occur before an activity starts; or "
dongsheng@627 10837 "after it starts, but before it finishes. Hooks that trigger on these events "
dongsheng@627 10838 "have the added ability to choose whether the activity can continue, or will "
dongsheng@627 10839 "abort."
dongsheng@627 10840 msgstr ""
dongsheng@627 10841
dongsheng@627 10842 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10843 #: ../en/ch09-hook.xml:422
dongsheng@627 10844 msgid ""
dongsheng@627 10845 "The <literal role=\"hook\">pretxncommit</literal> hook runs after a commit "
dongsheng@627 10846 "has all but completed. In other words, the metadata representing the "
dongsheng@627 10847 "changeset has been written out to disk, but the transaction has not yet been "
dongsheng@627 10848 "allowed to complete. The <literal role=\"hook\">pretxncommit</literal> hook "
dongsheng@627 10849 "has the ability to decide whether the transaction can complete, or must be "
dongsheng@627 10850 "rolled back."
dongsheng@627 10851 msgstr ""
dongsheng@627 10852
dongsheng@627 10853 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10854 #: ../en/ch09-hook.xml:431
dongsheng@627 10855 msgid ""
dongsheng@627 10856 "If the <literal role=\"hook\">pretxncommit</literal> hook exits with a status "
dongsheng@627 10857 "code of zero, the transaction is allowed to complete; the commit finishes; "
dongsheng@627 10858 "and the <literal role=\"hook\">commit</literal> hook is run. If the <literal "
dongsheng@627 10859 "role=\"hook\">pretxncommit</literal> hook exits with a non-zero status code, "
dongsheng@627 10860 "the transaction is rolled back; the metadata representing the changeset is "
dongsheng@627 10861 "erased; and the <literal role=\"hook\">commit</literal> hook is not run."
dongsheng@627 10862 msgstr ""
dongsheng@627 10863
dongsheng@627 10864 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10865 #: ../en/ch09-hook.xml:443
dongsheng@627 10866 msgid ""
dongsheng@627 10867 "The hook in the example above checks that a commit comment contains a bug "
dongsheng@627 10868 "ID. If it does, the commit can complete. If not, the commit is rolled back."
dongsheng@627 10869 msgstr ""
dongsheng@627 10870
dongsheng@627 10871 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 10872 #: ../en/ch09-hook.xml:451
dongsheng@627 10873 msgid "Writing your own hooks"
dongsheng@635 10874 msgstr "编写钩子"
dongsheng@627 10875
dongsheng@627 10876 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 10877 #: ../en/ch09-hook.xml:453
dongsheng@627 10878 msgid ""
dongsheng@627 10879 "When you are writing a hook, you might find it useful to run Mercurial either "
dongsheng@627 10880 "with the <option role=\"hg-opt-global\">-v</option> option, or the <envar "
dongsheng@627 10881 "role=\"rc-item-ui\">verbose</envar> config item set to <quote>true</quote>. "
dongsheng@627 10882 "When you do so, Mercurial will print a message before it calls each hook."
dongsheng@627 10883 msgstr ""
dongsheng@627 10884
dongsheng@627 10885 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10886 #: ../en/ch09-hook.xml:462
dongsheng@627 10887 msgid "Choosing how your hook should run"
dongsheng@635 10888 msgstr "选择钩子的执行方式"
dongsheng@627 10889
dongsheng@627 10890 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10891 #: ../en/ch09-hook.xml:464
dongsheng@627 10892 msgid ""
dongsheng@661 10893 "You can write a hook either as a normal program—typically a shell script—or "
dongsheng@661 10894 "as a Python function that is executed within the Mercurial process."
dongsheng@627 10895 msgstr ""
dongsheng@627 10896
dongsheng@627 10897 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10898 #: ../en/ch09-hook.xml:469
dongsheng@627 10899 msgid ""
dongsheng@627 10900 "Writing a hook as an external program has the advantage that it requires no "
dongsheng@627 10901 "knowledge of Mercurial's internals. You can call normal Mercurial commands "
dongsheng@627 10902 "to get any added information you need. The trade-off is that external hooks "
dongsheng@627 10903 "are slower than in-process hooks."
dongsheng@627 10904 msgstr ""
dongsheng@627 10905
dongsheng@627 10906 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10907 #: ../en/ch09-hook.xml:476
dongsheng@627 10908 msgid ""
dongsheng@627 10909 "An in-process Python hook has complete access to the Mercurial API, and does "
dongsheng@627 10910 "not <quote>shell out</quote> to another process, so it is inherently faster "
dongsheng@627 10911 "than an external hook. It is also easier to obtain much of the information "
dongsheng@627 10912 "that a hook requires by using the Mercurial API than by running Mercurial "
dongsheng@627 10913 "commands."
dongsheng@627 10914 msgstr ""
dongsheng@627 10915
dongsheng@627 10916 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10917 #: ../en/ch09-hook.xml:484
dongsheng@627 10918 msgid ""
dongsheng@627 10919 "If you are comfortable with Python, or require high performance, writing your "
dongsheng@627 10920 "hooks in Python may be a good choice. However, when you have a "
dongsheng@627 10921 "straightforward hook to write and you don't need to care about performance "
dongsheng@627 10922 "(probably the majority of hooks), a shell script is perfectly fine."
dongsheng@627 10923 msgstr ""
dongsheng@627 10924
dongsheng@627 10925 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10926 #: ../en/ch09-hook.xml:493
dongsheng@627 10927 msgid "Hook parameters"
dongsheng@635 10928 msgstr "钩子的参数"
dongsheng@627 10929
dongsheng@627 10930 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10931 #: ../en/ch09-hook.xml:495
dongsheng@627 10932 msgid ""
dongsheng@627 10933 "Mercurial calls each hook with a set of well-defined parameters. In Python, "
dongsheng@627 10934 "a parameter is passed as a keyword argument to your hook function. For an "
dongsheng@627 10935 "external program, a parameter is passed as an environment variable."
dongsheng@627 10936 msgstr ""
dongsheng@627 10937
dongsheng@627 10938 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10939 #: ../en/ch09-hook.xml:501
dongsheng@627 10940 msgid ""
dongsheng@627 10941 "Whether your hook is written in Python or as a shell script, the hook-"
dongsheng@627 10942 "specific parameter names and values will be the same. A boolean parameter "
dongsheng@627 10943 "will be represented as a boolean value in Python, but as the number 1 (for "
dongsheng@627 10944 "<quote>true</quote>) or 0 (for <quote>false</quote>) as an environment "
dongsheng@627 10945 "variable for an external hook. If a hook parameter is named <literal>foo</"
dongsheng@627 10946 "literal>, the keyword argument for a Python hook will also be named "
dongsheng@627 10947 "<literal>foo</literal>, while the environment variable for an external hook "
dongsheng@627 10948 "will be named <literal>HG_FOO</literal>."
dongsheng@627 10949 msgstr ""
dongsheng@627 10950
dongsheng@627 10951 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10952 #: ../en/ch09-hook.xml:515
dongsheng@627 10953 msgid "Hook return values and activity control"
dongsheng@635 10954 msgstr "钩子的返回值与活动控制"
dongsheng@627 10955
dongsheng@627 10956 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10957 #: ../en/ch09-hook.xml:517
dongsheng@627 10958 msgid ""
dongsheng@627 10959 "A hook that executes successfully must exit with a status of zero if "
dongsheng@627 10960 "external, or return boolean <quote>false</quote> if in-process. Failure is "
dongsheng@627 10961 "indicated with a non-zero exit status from an external hook, or an in-process "
dongsheng@627 10962 "hook returning boolean <quote>true</quote>. If an in-process hook raises an "
dongsheng@627 10963 "exception, the hook is considered to have failed."
dongsheng@627 10964 msgstr ""
dongsheng@627 10965
dongsheng@627 10966 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10967 #: ../en/ch09-hook.xml:525
dongsheng@627 10968 msgid ""
dongsheng@627 10969 "For a hook that controls whether an activity can proceed, zero/false means "
dongsheng@627 10970 "<quote>allow</quote>, while non-zero/true/exception means <quote>deny</quote>."
dongsheng@627 10971 msgstr ""
dongsheng@627 10972
dongsheng@627 10973 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 10974 #: ../en/ch09-hook.xml:532
dongsheng@627 10975 msgid "Writing an external hook"
dongsheng@635 10976 msgstr "编写外部钩子"
dongsheng@627 10977
dongsheng@627 10978 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10979 #: ../en/ch09-hook.xml:534
dongsheng@650 10980 msgid ""
dongsheng@650 10981 "When you define an external hook in your <filename role=\"special\">~/.hgrc</"
dongsheng@650 10982 "filename> and the hook is run, its value is passed to your shell, which "
dongsheng@627 10983 "interprets it. This means that you can use normal shell constructs in the "
dongsheng@627 10984 "body of the hook."
dongsheng@627 10985 msgstr ""
dongsheng@627 10986
dongsheng@627 10987 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10988 #: ../en/ch09-hook.xml:541
dongsheng@627 10989 msgid ""
dongsheng@627 10990 "An executable hook is always run with its current directory set to a "
dongsheng@627 10991 "repository's root directory."
dongsheng@627 10992 msgstr ""
dongsheng@627 10993
dongsheng@627 10994 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 10995 #: ../en/ch09-hook.xml:545
dongsheng@627 10996 msgid ""
dongsheng@627 10997 "Each hook parameter is passed in as an environment variable; the name is "
dongsheng@627 10998 "upper-cased, and prefixed with the string <quote><literal>HG_</literal></"
dongsheng@627 10999 "quote>."
dongsheng@627 11000 msgstr ""
dongsheng@627 11001
dongsheng@627 11002 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11003 #: ../en/ch09-hook.xml:550
dongsheng@627 11004 msgid ""
dongsheng@627 11005 "With the exception of hook parameters, Mercurial does not set or modify any "
dongsheng@627 11006 "environment variables when running a hook. This is useful to remember if you "
dongsheng@627 11007 "are writing a site-wide hook that may be run by a number of different users "
dongsheng@627 11008 "with differing environment variables set. In multi-user situations, you "
dongsheng@627 11009 "should not rely on environment variables being set to the values you have in "
dongsheng@627 11010 "your environment when testing the hook."
dongsheng@627 11011 msgstr ""
dongsheng@627 11012
dongsheng@627 11013 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 11014 #: ../en/ch09-hook.xml:561
dongsheng@627 11015 msgid "Telling Mercurial to use an in-process hook"
dongsheng@642 11016 msgstr "让 Mercurial 使用进程内钩子"
dongsheng@627 11017
dongsheng@627 11018 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11019 #: ../en/ch09-hook.xml:563
dongsheng@650 11020 msgid ""
dongsheng@650 11021 "The <filename role=\"special\">~/.hgrc</filename> syntax for defining an in-"
dongsheng@627 11022 "process hook is slightly different than for an executable hook. The value of "
dongsheng@627 11023 "the hook must start with the text <quote><literal>python:</literal></quote>, "
dongsheng@627 11024 "and continue with the fully-qualified name of a callable object to use as the "
dongsheng@627 11025 "hook's value."
dongsheng@627 11026 msgstr ""
dongsheng@627 11027
dongsheng@627 11028 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11029 #: ../en/ch09-hook.xml:571
dongsheng@627 11030 msgid ""
dongsheng@627 11031 "The module in which a hook lives is automatically imported when a hook is "
dongsheng@627 11032 "run. So long as you have the module name and <envar>PYTHONPATH</envar> "
dongsheng@627 11033 "right, it should <quote>just work</quote>."
dongsheng@627 11034 msgstr ""
dongsheng@627 11035
dongsheng@627 11036 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11037 #: ../en/ch09-hook.xml:577
dongsheng@650 11038 msgid ""
dongsheng@650 11039 "The following <filename role=\"special\">~/.hgrc</filename> example snippet "
dongsheng@627 11040 "illustrates the syntax and meaning of the notions we just described."
dongsheng@627 11041 msgstr ""
dongsheng@627 11042
dongsheng@627 11043 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11044 #: ../en/ch09-hook.xml:583
dongsheng@627 11045 msgid ""
dongsheng@627 11046 "When Mercurial runs the <literal>commit.example</literal> hook, it imports "
dongsheng@627 11047 "<literal>mymodule.submodule</literal>, looks for the callable object named "
dongsheng@627 11048 "<literal>myhook</literal>, and calls it."
dongsheng@627 11049 msgstr ""
dongsheng@627 11050
dongsheng@627 11051 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 11052 #: ../en/ch09-hook.xml:591
dongsheng@627 11053 msgid "Writing an in-process hook"
dongsheng@635 11054 msgstr "编写进程内钩子"
dongsheng@627 11055
dongsheng@627 11056 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11057 #: ../en/ch09-hook.xml:593
dongsheng@627 11058 msgid ""
dongsheng@627 11059 "The simplest in-process hook does nothing, but illustrates the basic shape of "
dongsheng@627 11060 "the hook API:"
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:598
dongsheng@627 11065 msgid ""
dongsheng@627 11066 "The first argument to a Python hook is always a <literal role=\"py-mod-"
dongsheng@627 11067 "mercurial.ui\">ui</literal> object. The second is a repository object; at "
dongsheng@627 11068 "the moment, it is always an instance of <literal role=\"py-mod-mercurial."
dongsheng@627 11069 "localrepo\">localrepository</literal>. Following these two arguments are "
dongsheng@627 11070 "other keyword arguments. Which ones are passed in depends on the hook being "
dongsheng@627 11071 "called, but a hook can ignore arguments it doesn't care about by dropping "
dongsheng@627 11072 "them into a keyword argument dict, as with <literal>**kwargs</literal> above."
dongsheng@627 11073 msgstr ""
dongsheng@627 11074
dongsheng@627 11075 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 11076 #: ../en/ch09-hook.xml:613
dongsheng@627 11077 msgid "Some hook examples"
dongsheng@635 11078 msgstr "钩子样例"
dongsheng@627 11079
dongsheng@627 11080 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 11081 #: ../en/ch09-hook.xml:616
dongsheng@627 11082 msgid "Writing meaningful commit messages"
dongsheng@635 11083 msgstr "编写有意义的提交日志"
dongsheng@627 11084
dongsheng@627 11085 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11086 #: ../en/ch09-hook.xml:618
dongsheng@627 11087 msgid ""
dongsheng@627 11088 "It's hard to imagine a useful commit message being very short. The simple "
dongsheng@627 11089 "<literal role=\"hook\">pretxncommit</literal> hook of the example below will "
dongsheng@627 11090 "prevent you from committing a changeset with a message that is less than ten "
dongsheng@627 11091 "bytes long."
dongsheng@627 11092 msgstr ""
dongsheng@627 11093
dongsheng@627 11094 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 11095 #: ../en/ch09-hook.xml:628
dongsheng@627 11096 msgid "Checking for trailing whitespace"
dongsheng@635 11097 msgstr "检查行尾空格"
dongsheng@627 11098
dongsheng@627 11099 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11100 #: ../en/ch09-hook.xml:630
dongsheng@627 11101 msgid ""
dongsheng@627 11102 "An interesting use of a commit-related hook is to help you to write cleaner "
dongsheng@627 11103 "code. A simple example of <quote>cleaner code</quote> is the dictum that a "
dongsheng@627 11104 "change should not add any new lines of text that contain <quote>trailing "
dongsheng@627 11105 "whitespace</quote>. Trailing whitespace is a series of space and tab "
dongsheng@627 11106 "characters at the end of a line of text. In most cases, trailing whitespace "
dongsheng@627 11107 "is unnecessary, invisible noise, but it is occasionally problematic, and "
dongsheng@627 11108 "people often prefer to get rid of it."
dongsheng@627 11109 msgstr ""
dongsheng@627 11110
dongsheng@627 11111 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11112 #: ../en/ch09-hook.xml:641
dongsheng@627 11113 msgid ""
dongsheng@627 11114 "You can use either the <literal role=\"hook\">precommit</literal> or <literal "
dongsheng@627 11115 "role=\"hook\">pretxncommit</literal> hook to tell whether you have a trailing "
dongsheng@627 11116 "whitespace problem. If you use the <literal role=\"hook\">precommit</"
dongsheng@627 11117 "literal> hook, the hook will not know which files you are committing, so it "
dongsheng@627 11118 "will have to check every modified file in the repository for trailing white "
dongsheng@627 11119 "space. If you want to commit a change to just the file <filename>foo</"
dongsheng@627 11120 "filename>, but the file <filename>bar</filename> contains trailing "
dongsheng@627 11121 "whitespace, doing a check in the <literal role=\"hook\">precommit</literal> "
dongsheng@627 11122 "hook will prevent you from committing <filename>foo</filename> due to the "
dongsheng@627 11123 "problem with <filename>bar</filename>. This doesn't seem right."
dongsheng@627 11124 msgstr ""
dongsheng@627 11125
dongsheng@627 11126 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11127 #: ../en/ch09-hook.xml:657
dongsheng@627 11128 msgid ""
dongsheng@627 11129 "Should you choose the <literal role=\"hook\">pretxncommit</literal> hook, the "
dongsheng@627 11130 "check won't occur until just before the transaction for the commit "
dongsheng@627 11131 "completes. This will allow you to check for problems only the exact files "
dongsheng@627 11132 "that are being committed. However, if you entered the commit message "
dongsheng@627 11133 "interactively and the hook fails, the transaction will roll back; you'll have "
dongsheng@627 11134 "to re-enter the commit message after you fix the trailing whitespace and run "
dongsheng@627 11135 "<command role=\"hg-cmd\">hg commit</command> again."
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:670
dongsheng@627 11140 msgid ""
dongsheng@627 11141 "In this example, we introduce a simple <literal role=\"hook\">pretxncommit</"
dongsheng@627 11142 "literal> hook that checks for trailing whitespace. This hook is short, but "
dongsheng@627 11143 "not very helpful. It exits with an error status if a change adds a line with "
dongsheng@627 11144 "trailing whitespace to any file, but does not print any information that "
dongsheng@627 11145 "might help us to identify the offending file or line. It also has the nice "
dongsheng@627 11146 "property of not paying attention to unmodified lines; only lines that "
dongsheng@627 11147 "introduce new trailing whitespace cause problems."
dongsheng@627 11148 msgstr ""
dongsheng@627 11149
dongsheng@627 11150 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11151 #: ../en/ch09-hook.xml:681
dongsheng@627 11152 msgid ""
dongsheng@627 11153 "The above version is much more complex, but also more useful. It parses a "
dongsheng@627 11154 "unified diff to see if any lines add trailing whitespace, and prints the name "
dongsheng@627 11155 "of the file and the line number of each such occurrence. Even better, if the "
dongsheng@627 11156 "change adds trailing whitespace, this hook saves the commit comment and "
dongsheng@627 11157 "prints the name of the save file before exiting and telling Mercurial to roll "
dongsheng@627 11158 "the transaction back, so you can use the <option role=\"hg-opt-commit\">-l "
dongsheng@627 11159 "filename</option> option to <command role=\"hg-cmd\">hg commit</command> to "
dongsheng@627 11160 "reuse the saved commit message once you've corrected the problem."
dongsheng@627 11161 msgstr ""
dongsheng@627 11162
dongsheng@627 11163 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11164 #: ../en/ch09-hook.xml:695
dongsheng@627 11165 msgid ""
dongsheng@627 11166 "As a final aside, note in the example above the use of <command>perl</"
dongsheng@627 11167 "command>'s in-place editing feature to get rid of trailing whitespace from a "
dongsheng@627 11168 "file. This is concise and useful enough that I will reproduce it here."
dongsheng@627 11169 msgstr ""
dongsheng@627 11170
dongsheng@627 11171 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 11172 #: ../en/ch09-hook.xml:705
dongsheng@627 11173 msgid "Bundled hooks"
dongsheng@635 11174 msgstr "内置的钩子"
dongsheng@627 11175
dongsheng@627 11176 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 11177 #: ../en/ch09-hook.xml:707
dongsheng@627 11178 msgid ""
dongsheng@627 11179 "Mercurial ships with several bundled hooks. You can find them in the "
dongsheng@627 11180 "<filename class=\"directory\">hgext</filename> directory of a Mercurial "
dongsheng@627 11181 "source tree. If you are using a Mercurial binary package, the hooks will be "
dongsheng@627 11182 "located in the <filename class=\"directory\">hgext</filename> directory of "
dongsheng@627 11183 "wherever your package installer put Mercurial."
dongsheng@627 11184 msgstr ""
dongsheng@627 11185
dongsheng@627 11186 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 11187 #: ../en/ch09-hook.xml:716
dongsheng@627 11188 msgid ""
dongsheng@661 11189 "<literal role=\"hg-ext\">acl</literal>—access control for parts of a "
dongsheng@627 11190 "repository"
dongsheng@661 11191 msgstr "<literal role=\"hg-ext\">acl</literal>—版本库的访问控制"
dongsheng@627 11192
dongsheng@627 11193 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11194 #: ../en/ch09-hook.xml:719
dongsheng@627 11195 msgid ""
dongsheng@627 11196 "The <literal role=\"hg-ext\">acl</literal> extension lets you control which "
dongsheng@627 11197 "remote users are allowed to push changesets to a networked server. You can "
dongsheng@627 11198 "protect any portion of a repository (including the entire repo), so that a "
dongsheng@627 11199 "specific remote user can push changes that do not affect the protected "
dongsheng@627 11200 "portion."
dongsheng@627 11201 msgstr ""
dongsheng@627 11202
dongsheng@627 11203 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11204 #: ../en/ch09-hook.xml:727
dongsheng@627 11205 msgid ""
dongsheng@627 11206 "This extension implements access control based on the identity of the user "
dongsheng@627 11207 "performing a push, <emphasis>not</emphasis> on who committed the changesets "
dongsheng@627 11208 "they're pushing. It makes sense to use this hook only if you have a locked-"
dongsheng@627 11209 "down server environment that authenticates remote users, and you want to be "
dongsheng@627 11210 "sure that only specific users are allowed to push changes to that server."
dongsheng@627 11211 msgstr ""
dongsheng@627 11212
dongsheng@627 11213 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 11214 #: ../en/ch09-hook.xml:737
dongsheng@627 11215 msgid "Configuring the <literal role=\"hook\">acl</literal> hook"
dongsheng@635 11216 msgstr "配置 <literal role=\"hook\">acl</literal> 钩子"
dongsheng@627 11217
dongsheng@627 11218 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11219 #: ../en/ch09-hook.xml:740
dongsheng@627 11220 msgid ""
dongsheng@627 11221 "In order to manage incoming changesets, the <literal role=\"hg-ext\">acl</"
dongsheng@627 11222 "literal> hook must be used as a <literal role=\"hook\">pretxnchangegroup</"
dongsheng@627 11223 "literal> hook. This lets it see which files are modified by each incoming "
dongsheng@627 11224 "changeset, and roll back a group of changesets if they modify "
dongsheng@627 11225 "<quote>forbidden</quote> files. Example:"
dongsheng@627 11226 msgstr ""
dongsheng@627 11227
dongsheng@627 11228 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11229 #: ../en/ch09-hook.xml:750
dongsheng@627 11230 msgid ""
dongsheng@627 11231 "The <literal role=\"hg-ext\">acl</literal> extension is configured using "
dongsheng@627 11232 "three sections."
dongsheng@627 11233 msgstr ""
dongsheng@627 11234
dongsheng@627 11235 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11236 #: ../en/ch09-hook.xml:754
dongsheng@627 11237 msgid ""
dongsheng@627 11238 "The <literal role=\"rc-acl\">acl</literal> section has only one entry, <envar "
dongsheng@627 11239 "role=\"rc-item-acl\">sources</envar>, which lists the sources of incoming "
dongsheng@627 11240 "changesets that the hook should pay attention to. You don't normally need to "
dongsheng@627 11241 "configure this section."
dongsheng@627 11242 msgstr ""
dongsheng@627 11243
dongsheng@627 11244 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11245 #: ../en/ch09-hook.xml:761
dongsheng@627 11246 msgid ""
dongsheng@627 11247 "<envar role=\"rc-item-acl\">serve</envar>: Control incoming changesets that "
dongsheng@627 11248 "are arriving from a remote repository over http or ssh. This is the default "
dongsheng@627 11249 "value of <envar role=\"rc-item-acl\">sources</envar>, and usually the only "
dongsheng@627 11250 "setting you'll need for this configuration item."
dongsheng@627 11251 msgstr ""
dongsheng@627 11252
dongsheng@627 11253 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11254 #: ../en/ch09-hook.xml:769
dongsheng@627 11255 msgid ""
dongsheng@627 11256 "<envar role=\"rc-item-acl\">pull</envar>: Control incoming changesets that "
dongsheng@627 11257 "are arriving via a pull from a local repository."
dongsheng@627 11258 msgstr ""
dongsheng@627 11259
dongsheng@627 11260 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11261 #: ../en/ch09-hook.xml:774
dongsheng@627 11262 msgid ""
dongsheng@627 11263 "<envar role=\"rc-item-acl\">push</envar>: Control incoming changesets that "
dongsheng@627 11264 "are arriving via a push from a local repository."
dongsheng@627 11265 msgstr ""
dongsheng@627 11266
dongsheng@627 11267 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11268 #: ../en/ch09-hook.xml:779
dongsheng@627 11269 msgid ""
dongsheng@627 11270 "<envar role=\"rc-item-acl\">bundle</envar>: Control incoming changesets that "
dongsheng@627 11271 "are arriving from another repository via a bundle."
dongsheng@627 11272 msgstr ""
dongsheng@627 11273
dongsheng@627 11274 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11275 #: ../en/ch09-hook.xml:785
dongsheng@627 11276 msgid ""
dongsheng@627 11277 "The <literal role=\"rc-acl.allow\">acl.allow</literal> section controls the "
dongsheng@627 11278 "users that are allowed to add changesets to the repository. If this section "
dongsheng@627 11279 "is not present, all users that are not explicitly denied are allowed. If "
dongsheng@627 11280 "this section is present, all users that are not explicitly allowed are denied "
dongsheng@627 11281 "(so an empty section means that all users are denied)."
dongsheng@627 11282 msgstr ""
dongsheng@627 11283
dongsheng@627 11284 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11285 #: ../en/ch09-hook.xml:794
dongsheng@627 11286 msgid ""
dongsheng@627 11287 "The <literal role=\"rc-acl.deny\">acl.deny</literal> section determines which "
dongsheng@627 11288 "users are denied from adding changesets to the repository. If this section "
dongsheng@627 11289 "is not present or is empty, no users are denied."
dongsheng@627 11290 msgstr ""
dongsheng@627 11291
dongsheng@627 11292 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11293 #: ../en/ch09-hook.xml:800
dongsheng@627 11294 msgid ""
dongsheng@627 11295 "The syntaxes for the <literal role=\"rc-acl.allow\">acl.allow</literal> and "
dongsheng@627 11296 "<literal role=\"rc-acl.deny\">acl.deny</literal> sections are identical. On "
dongsheng@627 11297 "the left of each entry is a glob pattern that matches files or directories, "
dongsheng@627 11298 "relative to the root of the repository; on the right, a user name."
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:808
dongsheng@627 11303 msgid ""
dongsheng@627 11304 "In the following example, the user <literal>docwriter</literal> can only push "
dongsheng@627 11305 "changes to the <filename class=\"directory\">docs</filename> subtree of the "
dongsheng@627 11306 "repository, while <literal>intern</literal> can push changes to any file or "
dongsheng@627 11307 "directory except <filename class=\"directory\">source/sensitive</filename>."
dongsheng@627 11308 msgstr ""
dongsheng@627 11309
dongsheng@627 11310 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 11311 #: ../en/ch09-hook.xml:822 ../en/ch09-hook.xml:1089 ../en/ch09-hook.xml:1279
dongsheng@627 11312 msgid "Testing and troubleshooting"
dongsheng@635 11313 msgstr "测试与问题处理"
dongsheng@627 11314
dongsheng@627 11315 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11316 #: ../en/ch09-hook.xml:824
dongsheng@627 11317 msgid ""
dongsheng@627 11318 "If you want to test the <literal role=\"hg-ext\">acl</literal> hook, run it "
dongsheng@627 11319 "with Mercurial's debugging output enabled. Since you'll probably be running "
dongsheng@627 11320 "it on a server where it's not convenient (or sometimes possible) to pass in "
dongsheng@627 11321 "the <option role=\"hg-opt-global\">--debug</option> option, don't forget that "
dongsheng@650 11322 "you can enable debugging output in your <filename role=\"special\">~/.hgrc</"
dongsheng@627 11323 "filename>:"
dongsheng@627 11324 msgstr ""
dongsheng@627 11325
dongsheng@627 11326 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11327 #: ../en/ch09-hook.xml:835
dongsheng@627 11328 msgid ""
dongsheng@627 11329 "With this enabled, the <literal role=\"hg-ext\">acl</literal> hook will print "
dongsheng@627 11330 "enough information to let you figure out why it is allowing or forbidding "
dongsheng@627 11331 "pushes from specific users."
dongsheng@627 11332 msgstr ""
dongsheng@627 11333
dongsheng@627 11334 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 11335 #: ../en/ch09-hook.xml:844
dongsheng@661 11336 msgid "<literal role=\"hg-ext\">bugzilla</literal>—integration with Bugzilla"
dongsheng@661 11337 msgstr "<literal role=\"hg-ext\">bugzilla</literal>—与 Bugzilla 的集成"
dongsheng@627 11338
dongsheng@627 11339 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11340 #: ../en/ch09-hook.xml:848
dongsheng@627 11341 msgid ""
dongsheng@627 11342 "The <literal role=\"hg-ext\">bugzilla</literal> extension adds a comment to a "
dongsheng@627 11343 "Bugzilla bug whenever it finds a reference to that bug ID in a commit "
dongsheng@627 11344 "comment. You can install this hook on a shared server, so that any time a "
dongsheng@627 11345 "remote user pushes changes to this server, the hook gets run."
dongsheng@627 11346 msgstr ""
dongsheng@627 11347
dongsheng@627 11348 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11349 #: ../en/ch09-hook.xml:855
dongsheng@627 11350 msgid ""
dongsheng@627 11351 "It adds a comment to the bug that looks like this (you can configure the "
dongsheng@661 11352 "contents of the comment—see below):"
dongsheng@627 11353 msgstr ""
dongsheng@627 11354
dongsheng@627 11355 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11356 #: ../en/ch09-hook.xml:864
dongsheng@627 11357 msgid ""
dongsheng@627 11358 "The value of this hook is that it automates the process of updating a bug any "
dongsheng@627 11359 "time a changeset refers to it. If you configure the hook properly, it makes "
dongsheng@627 11360 "it easy for people to browse straight from a Bugzilla bug to a changeset that "
dongsheng@627 11361 "refers to that bug."
dongsheng@627 11362 msgstr ""
dongsheng@627 11363
dongsheng@627 11364 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11365 #: ../en/ch09-hook.xml:871
dongsheng@627 11366 msgid ""
dongsheng@627 11367 "You can use the code in this hook as a starting point for some more exotic "
dongsheng@627 11368 "Bugzilla integration recipes. Here are a few possibilities:"
dongsheng@627 11369 msgstr ""
dongsheng@627 11370
dongsheng@627 11371 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 11372 #: ../en/ch09-hook.xml:876
dongsheng@627 11373 msgid ""
dongsheng@627 11374 "Require that every changeset pushed to the server have a valid bug ID in its "
dongsheng@627 11375 "commit comment. In this case, you'd want to configure the hook as a <literal "
dongsheng@627 11376 "role=\"hook\">pretxncommit</literal> hook. This would allow the hook to "
dongsheng@627 11377 "reject changes that didn't contain bug IDs."
dongsheng@627 11378 msgstr ""
dongsheng@627 11379
dongsheng@627 11380 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 11381 #: ../en/ch09-hook.xml:884
dongsheng@627 11382 msgid ""
dongsheng@627 11383 "Allow incoming changesets to automatically modify the <emphasis>state</"
dongsheng@627 11384 "emphasis> of a bug, as well as simply adding a comment. For example, the "
dongsheng@627 11385 "hook could recognise the string <quote>fixed bug 31337</quote> as indicating "
dongsheng@627 11386 "that it should update the state of bug 31337 to <quote>requires testing</"
dongsheng@627 11387 "quote>."
dongsheng@627 11388 msgstr ""
dongsheng@627 11389
dongsheng@627 11390 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 11391 #: ../en/ch09-hook.xml:894
dongsheng@627 11392 msgid "Configuring the <literal role=\"hook\">bugzilla</literal> hook"
dongsheng@635 11393 msgstr "配置 <literal role=\"hook\">bugzilla</literal> 钩子"
dongsheng@627 11394
dongsheng@627 11395 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11396 #: ../en/ch09-hook.xml:897
dongsheng@650 11397 msgid ""
dongsheng@650 11398 "You should configure this hook in your server's <filename role=\"special\">~/."
dongsheng@650 11399 "hgrc</filename> as an <literal role=\"hook\">incoming</literal> hook, for "
dongsheng@627 11400 "example as follows:"
dongsheng@627 11401 msgstr ""
dongsheng@627 11402
dongsheng@627 11403 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11404 #: ../en/ch09-hook.xml:905
dongsheng@627 11405 msgid ""
dongsheng@627 11406 "Because of the specialised nature of this hook, and because Bugzilla was not "
dongsheng@627 11407 "written with this kind of integration in mind, configuring this hook is a "
dongsheng@627 11408 "somewhat involved process."
dongsheng@627 11409 msgstr ""
dongsheng@627 11410
dongsheng@627 11411 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11412 #: ../en/ch09-hook.xml:911
dongsheng@627 11413 msgid ""
dongsheng@627 11414 "Before you begin, you must install the MySQL bindings for Python on the host"
dongsheng@627 11415 "(s) where you'll be running the hook. If this is not available as a binary "
dongsheng@627 11416 "package for your system, you can download it from <citation>web:mysql-python</"
dongsheng@627 11417 "citation>."
dongsheng@627 11418 msgstr ""
dongsheng@627 11419
dongsheng@627 11420 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11421 #: ../en/ch09-hook.xml:918
dongsheng@627 11422 msgid ""
dongsheng@627 11423 "Configuration information for this hook lives in the <literal role=\"rc-"
dongsheng@650 11424 "bugzilla\">bugzilla</literal> section of your <filename role=\"special\">~/."
dongsheng@627 11425 "hgrc</filename>."
dongsheng@627 11426 msgstr ""
dongsheng@627 11427
dongsheng@627 11428 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11429 #: ../en/ch09-hook.xml:923
dongsheng@627 11430 msgid ""
dongsheng@627 11431 "<envar role=\"rc-item-bugzilla\">version</envar>: The version of Bugzilla "
dongsheng@627 11432 "installed on the server. The database schema that Bugzilla uses changes "
dongsheng@627 11433 "occasionally, so this hook has to know exactly which schema to use. At the "
dongsheng@627 11434 "moment, the only version supported is <literal>2.16</literal>."
dongsheng@627 11435 msgstr ""
dongsheng@627 11436
dongsheng@627 11437 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11438 #: ../en/ch09-hook.xml:932
dongsheng@627 11439 msgid ""
dongsheng@627 11440 "<envar role=\"rc-item-bugzilla\">host</envar>: The hostname of the MySQL "
dongsheng@627 11441 "server that stores your Bugzilla data. The database must be configured to "
dongsheng@627 11442 "allow connections from whatever host you are running the <literal role=\"hook"
dongsheng@627 11443 "\">bugzilla</literal> hook on."
dongsheng@627 11444 msgstr ""
dongsheng@627 11445
dongsheng@627 11446 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11447 #: ../en/ch09-hook.xml:939
dongsheng@627 11448 msgid ""
dongsheng@627 11449 "<envar role=\"rc-item-bugzilla\">user</envar>: The username with which to "
dongsheng@627 11450 "connect to the MySQL server. The database must be configured to allow this "
dongsheng@627 11451 "user to connect from whatever host you are running the <literal role=\"hook"
dongsheng@627 11452 "\">bugzilla</literal> hook on. This user must be able to access and modify "
dongsheng@627 11453 "Bugzilla tables. The default value of this item is <literal>bugs</literal>, "
dongsheng@627 11454 "which is the standard name of the Bugzilla user in a MySQL database."
dongsheng@627 11455 msgstr ""
dongsheng@627 11456
dongsheng@627 11457 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11458 #: ../en/ch09-hook.xml:950
dongsheng@627 11459 msgid ""
dongsheng@627 11460 "<envar role=\"rc-item-bugzilla\">password</envar>: The MySQL password for the "
dongsheng@627 11461 "user you configured above. This is stored as plain text, so you should make "
dongsheng@650 11462 "sure that unauthorised users cannot read the <filename role=\"special\">~/."
dongsheng@650 11463 "hgrc</filename> file where you store this information."
dongsheng@627 11464 msgstr ""
dongsheng@627 11465
dongsheng@627 11466 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11467 #: ../en/ch09-hook.xml:959
dongsheng@627 11468 msgid ""
dongsheng@627 11469 "<envar role=\"rc-item-bugzilla\">db</envar>: The name of the Bugzilla "
dongsheng@627 11470 "database on the MySQL server. The default value of this item is "
dongsheng@627 11471 "<literal>bugs</literal>, which is the standard name of the MySQL database "
dongsheng@627 11472 "where Bugzilla stores its data."
dongsheng@627 11473 msgstr ""
dongsheng@627 11474
dongsheng@627 11475 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11476 #: ../en/ch09-hook.xml:966
dongsheng@627 11477 msgid ""
dongsheng@627 11478 "<envar role=\"rc-item-bugzilla\">notify</envar>: If you want Bugzilla to send "
dongsheng@627 11479 "out a notification email to subscribers after this hook has added a comment "
dongsheng@627 11480 "to a bug, you will need this hook to run a command whenever it updates the "
dongsheng@627 11481 "database. The command to run depends on where you have installed Bugzilla, "
dongsheng@627 11482 "but it will typically look something like this, if you have Bugzilla "
dongsheng@627 11483 "installed in <filename class=\"directory\">/var/www/html/bugzilla</filename>:"
dongsheng@627 11484 msgstr ""
dongsheng@627 11485
dongsheng@627 11486 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11487 #: ../en/ch09-hook.xml:979
dongsheng@627 11488 msgid ""
dongsheng@627 11489 "The Bugzilla <literal>processmail</literal> program expects to be given a bug "
dongsheng@627 11490 "ID (the hook replaces <quote><literal>%s</literal></quote> with the bug ID) "
dongsheng@627 11491 "and an email address. It also expects to be able to write to some files in "
dongsheng@627 11492 "the directory that it runs in. If Bugzilla and this hook are not installed "
dongsheng@627 11493 "on the same machine, you will need to find a way to run <literal>processmail</"
dongsheng@627 11494 "literal> on the server where Bugzilla is installed."
dongsheng@627 11495 msgstr ""
dongsheng@627 11496
dongsheng@627 11497 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 11498 #: ../en/ch09-hook.xml:994
dongsheng@627 11499 msgid "Mapping committer names to Bugzilla user names"
dongsheng@635 11500 msgstr "提交者的名称与 Bugzilla 用户名称的映射"
dongsheng@627 11501
dongsheng@627 11502 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11503 #: ../en/ch09-hook.xml:996
dongsheng@627 11504 msgid ""
dongsheng@627 11505 "By default, the <literal role=\"hg-ext\">bugzilla</literal> hook tries to use "
dongsheng@627 11506 "the email address of a changeset's committer as the Bugzilla user name with "
dongsheng@627 11507 "which to update a bug. If this does not suit your needs, you can map "
dongsheng@627 11508 "committer email addresses to Bugzilla user names using a <literal role=\"rc-"
dongsheng@627 11509 "usermap\">usermap</literal> section."
dongsheng@627 11510 msgstr ""
dongsheng@627 11511
dongsheng@627 11512 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11513 #: ../en/ch09-hook.xml:1005
dongsheng@627 11514 msgid ""
dongsheng@627 11515 "Each item in the <literal role=\"rc-usermap\">usermap</literal> section "
dongsheng@627 11516 "contains an email address on the left, and a Bugzilla user name on the right."
dongsheng@627 11517 msgstr ""
dongsheng@627 11518
dongsheng@627 11519 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11520 #: ../en/ch09-hook.xml:1012
dongsheng@627 11521 msgid ""
dongsheng@627 11522 "You can either keep the <literal role=\"rc-usermap\">usermap</literal> data "
dongsheng@627 11523 "in a normal <filename role=\"special\">~/.hgrc</filename>, or tell the "
dongsheng@627 11524 "<literal role=\"hg-ext\">bugzilla</literal> hook to read the information from "
dongsheng@627 11525 "an external <filename>usermap</filename> file. In the latter case, you can "
dongsheng@627 11526 "store <filename>usermap</filename> data by itself in (for example) a user-"
dongsheng@627 11527 "modifiable repository. This makes it possible to let your users maintain "
dongsheng@627 11528 "their own <envar role=\"rc-item-bugzilla\">usermap</envar> entries. The main "
dongsheng@650 11529 "<filename role=\"special\">~/.hgrc</filename> file might look like this:"
dongsheng@627 11530 msgstr ""
dongsheng@627 11531
dongsheng@627 11532 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11533 #: ../en/ch09-hook.xml:1028
dongsheng@627 11534 msgid ""
dongsheng@627 11535 "While the <filename>usermap</filename> file that it refers to might look like "
dongsheng@627 11536 "this:"
dongsheng@627 11537 msgstr ""
dongsheng@627 11538
dongsheng@627 11539 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 11540 #: ../en/ch09-hook.xml:1036
dongsheng@627 11541 msgid "Configuring the text that gets added to a bug"
dongsheng@635 11542 msgstr "配置增加到问题中的正文"
dongsheng@627 11543
dongsheng@627 11544 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11545 #: ../en/ch09-hook.xml:1038
dongsheng@627 11546 msgid ""
dongsheng@627 11547 "You can configure the text that this hook adds as a comment; you specify it "
dongsheng@650 11548 "in the form of a Mercurial template. Several <filename role=\"special\">~/."
dongsheng@650 11549 "hgrc</filename> entries (still in the <literal role=\"rc-bugzilla\">bugzilla</"
dongsheng@650 11550 "literal> section) control this behaviour."
dongsheng@627 11551 msgstr ""
dongsheng@627 11552
dongsheng@627 11553 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11554 #: ../en/ch09-hook.xml:1045
dongsheng@627 11555 msgid ""
dongsheng@627 11556 "<literal>strip</literal>: The number of leading path elements to strip from a "
dongsheng@627 11557 "repository's path name to construct a partial path for a URL. For example, if "
dongsheng@627 11558 "the repositories on your server live under <filename class=\"directory\">/"
dongsheng@627 11559 "home/hg/repos</filename>, and you have a repository whose path is <filename "
dongsheng@627 11560 "class=\"directory\">/home/hg/repos/app/tests</filename>, then setting "
dongsheng@627 11561 "<literal>strip</literal> to <literal>4</literal> will give a partial path of "
dongsheng@627 11562 "<filename class=\"directory\">app/tests</filename>. The hook will make this "
dongsheng@627 11563 "partial path available when expanding a template, as <literal>webroot</"
dongsheng@627 11564 "literal>."
dongsheng@627 11565 msgstr ""
dongsheng@627 11566
dongsheng@627 11567 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11568 #: ../en/ch09-hook.xml:1059
dongsheng@627 11569 msgid ""
dongsheng@627 11570 "<literal>template</literal>: The text of the template to use. In addition to "
dongsheng@627 11571 "the usual changeset-related variables, this template can use <literal>hgweb</"
dongsheng@627 11572 "literal> (the value of the <literal>hgweb</literal> configuration item above) "
dongsheng@627 11573 "and <literal>webroot</literal> (the path constructed using <literal>strip</"
dongsheng@627 11574 "literal> above)."
dongsheng@627 11575 msgstr ""
dongsheng@627 11576
dongsheng@627 11577 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11578 #: ../en/ch09-hook.xml:1069
dongsheng@627 11579 msgid ""
dongsheng@627 11580 "In addition, you can add a <envar role=\"rc-item-web\">baseurl</envar> item "
dongsheng@627 11581 "to the <literal role=\"rc-web\">web</literal> section of your <filename role="
dongsheng@650 11582 "\"special\">~/.hgrc</filename>. The <literal role=\"hg-ext\">bugzilla</"
dongsheng@627 11583 "literal> hook will make this available when expanding a template, as the base "
dongsheng@627 11584 "string to use when constructing a URL that will let users browse from a "
dongsheng@627 11585 "Bugzilla comment to view a changeset. Example:"
dongsheng@627 11586 msgstr ""
dongsheng@627 11587
dongsheng@627 11588 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11589 #: ../en/ch09-hook.xml:1081
dongsheng@627 11590 msgid ""
dongsheng@627 11591 "Here is an example set of <literal role=\"hg-ext\">bugzilla</literal> hook "
dongsheng@627 11592 "config information."
dongsheng@627 11593 msgstr ""
dongsheng@627 11594
dongsheng@627 11595 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11596 #: ../en/ch09-hook.xml:1091
dongsheng@627 11597 msgid ""
dongsheng@627 11598 "The most common problems with configuring the <literal role=\"hg-ext"
dongsheng@627 11599 "\">bugzilla</literal> hook relate to running Bugzilla's "
dongsheng@627 11600 "<filename>processmail</filename> script and mapping committer names to user "
dongsheng@627 11601 "names."
dongsheng@627 11602 msgstr ""
dongsheng@627 11603
dongsheng@627 11604 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11605 #: ../en/ch09-hook.xml:1097
dongsheng@627 11606 msgid ""
songdongsheng@658 11607 "Recall from <xref linkend=\"sec:hook:bugzilla:config\"/> above that the user "
songdongsheng@658 11608 "that runs the Mercurial process on the server is also the one that will run "
songdongsheng@658 11609 "the <filename>processmail</filename> script. The <filename>processmail</"
songdongsheng@658 11610 "filename> script sometimes causes Bugzilla to write to files in its "
songdongsheng@658 11611 "configuration directory, and Bugzilla's configuration files are usually owned "
songdongsheng@658 11612 "by the user that your web server runs under."
dongsheng@627 11613 msgstr ""
dongsheng@627 11614
dongsheng@627 11615 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11616 #: ../en/ch09-hook.xml:1108
dongsheng@627 11617 msgid ""
dongsheng@627 11618 "You can cause <filename>processmail</filename> to be run with the suitable "
dongsheng@627 11619 "user's identity using the <command>sudo</command> command. Here is an "
dongsheng@627 11620 "example entry for a <filename>sudoers</filename> file."
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:1115
dongsheng@627 11625 msgid ""
dongsheng@627 11626 "This allows the <literal>hg_user</literal> user to run a "
dongsheng@627 11627 "<filename>processmail-wrapper</filename> program under the identity of "
dongsheng@627 11628 "<literal>httpd_user</literal>."
dongsheng@627 11629 msgstr ""
dongsheng@627 11630
dongsheng@627 11631 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11632 #: ../en/ch09-hook.xml:1120
dongsheng@627 11633 msgid ""
dongsheng@627 11634 "This indirection through a wrapper script is necessary, because "
dongsheng@627 11635 "<filename>processmail</filename> expects to be run with its current directory "
dongsheng@627 11636 "set to wherever you installed Bugzilla; you can't specify that kind of "
dongsheng@627 11637 "constraint in a <filename>sudoers</filename> file. The contents of the "
dongsheng@627 11638 "wrapper script are simple:"
dongsheng@627 11639 msgstr ""
dongsheng@627 11640
dongsheng@627 11641 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11642 #: ../en/ch09-hook.xml:1129
dongsheng@627 11643 msgid ""
dongsheng@627 11644 "It doesn't seem to matter what email address you pass to "
dongsheng@627 11645 "<filename>processmail</filename>."
dongsheng@627 11646 msgstr ""
dongsheng@627 11647
dongsheng@627 11648 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11649 #: ../en/ch09-hook.xml:1133
dongsheng@627 11650 msgid ""
dongsheng@627 11651 "If your <literal role=\"rc-usermap\">usermap</literal> is not set up "
dongsheng@627 11652 "correctly, users will see an error message from the <literal role=\"hg-ext"
dongsheng@627 11653 "\">bugzilla</literal> hook when they push changes to the server. The error "
dongsheng@627 11654 "message will look like this:"
dongsheng@627 11655 msgstr ""
dongsheng@627 11656
dongsheng@627 11657 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11658 #: ../en/ch09-hook.xml:1140
dongsheng@627 11659 msgid ""
dongsheng@627 11660 "What this means is that the committer's address, <literal>john.q."
dongsheng@627 11661 "public@example.com</literal>, is not a valid Bugzilla user name, nor does it "
dongsheng@627 11662 "have an entry in your <literal role=\"rc-usermap\">usermap</literal> that "
dongsheng@627 11663 "maps it to a valid Bugzilla user name."
dongsheng@627 11664 msgstr ""
dongsheng@627 11665
dongsheng@627 11666 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 11667 #: ../en/ch09-hook.xml:1150
dongsheng@661 11668 msgid "<literal role=\"hg-ext\">notify</literal>—send email notifications"
dongsheng@661 11669 msgstr "<literal role=\"hg-ext\">notify</literal>—邮件通知"
dongsheng@627 11670
dongsheng@627 11671 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11672 #: ../en/ch09-hook.xml:1153
dongsheng@627 11673 msgid ""
dongsheng@627 11674 "Although Mercurial's built-in web server provides RSS feeds of changes in "
dongsheng@627 11675 "every repository, many people prefer to receive change notifications via "
dongsheng@627 11676 "email. The <literal role=\"hg-ext\">notify</literal> hook lets you send out "
dongsheng@627 11677 "notifications to a set of email addresses whenever changesets arrive that "
dongsheng@627 11678 "those subscribers are interested in."
dongsheng@627 11679 msgstr ""
dongsheng@627 11680
dongsheng@627 11681 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11682 #: ../en/ch09-hook.xml:1161
dongsheng@627 11683 msgid ""
dongsheng@627 11684 "As with the <literal role=\"hg-ext\">bugzilla</literal> hook, the <literal "
dongsheng@627 11685 "role=\"hg-ext\">notify</literal> hook is template-driven, so you can "
dongsheng@627 11686 "customise the contents of the notification messages that it sends."
dongsheng@627 11687 msgstr ""
dongsheng@627 11688
dongsheng@627 11689 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 11690 #: ../en/ch09-hook.xml:1167
dongsheng@627 11691 msgid ""
dongsheng@627 11692 "By default, the <literal role=\"hg-ext\">notify</literal> hook includes a "
dongsheng@627 11693 "diff of every changeset that it sends out; you can limit the size of the "
dongsheng@627 11694 "diff, or turn this feature off entirely. It is useful for letting "
dongsheng@627 11695 "subscribers review changes immediately, rather than clicking to follow a URL."
dongsheng@627 11696 msgstr ""
dongsheng@627 11697
dongsheng@627 11698 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
dongsheng@650 11699 #: ../en/ch09-hook.xml:1175
dongsheng@627 11700 msgid "Configuring the <literal role=\"hg-ext\">notify</literal> hook"
dongsheng@635 11701 msgstr "配置 <literal role=\"hg-ext\">notify</literal> 钩子"
dongsheng@627 11702
dongsheng@627 11703 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11704 #: ../en/ch09-hook.xml:1178
dongsheng@627 11705 msgid ""
dongsheng@627 11706 "You can set up the <literal role=\"hg-ext\">notify</literal> hook to send one "
dongsheng@627 11707 "email message per incoming changeset, or one per incoming group of changesets "
dongsheng@627 11708 "(all those that arrived in a single pull or push)."
dongsheng@627 11709 msgstr ""
dongsheng@627 11710
dongsheng@627 11711 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
dongsheng@650 11712 #: ../en/ch09-hook.xml:1190
dongsheng@627 11713 msgid ""
dongsheng@627 11714 "Configuration information for this hook lives in the <literal role=\"rc-notify"
dongsheng@650 11715 "\">notify</literal> section of a <filename role=\"special\">~/.hgrc</"
dongsheng@650 11716 "filename> file."
dongsheng@627 11717 msgstr ""
dongsheng@627 11718
dongsheng@627 11719 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11720 #: ../en/ch09-hook.xml:1195
dongsheng@627 11721 msgid ""
dongsheng@627 11722 "<envar role=\"rc-item-notify\">test</envar>: By default, this hook does not "
dongsheng@627 11723 "send out email at all; instead, it prints the message that it "
dongsheng@627 11724 "<emphasis>would</emphasis> send. Set this item to <literal>false</literal> "
dongsheng@627 11725 "to allow email to be sent. The reason that sending of email is turned off by "
dongsheng@627 11726 "default is that it takes several tries to configure this extension exactly as "
dongsheng@627 11727 "you would like, and it would be bad form to spam subscribers with a number of "
dongsheng@627 11728 "<quote>broken</quote> notifications while you debug your configuration."
dongsheng@627 11729 msgstr ""
dongsheng@627 11730
dongsheng@627 11731 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11732 #: ../en/ch09-hook.xml:1207
dongsheng@627 11733 msgid ""
dongsheng@627 11734 "<envar role=\"rc-item-notify\">config</envar>: The path to a configuration "
dongsheng@627 11735 "file that contains subscription information. This is kept separate from the "
dongsheng@650 11736 "main <filename role=\"special\">~/.hgrc</filename> so that you can maintain "
dongsheng@627 11737 "it in a repository of its own. People can then clone that repository, update "
dongsheng@627 11738 "their subscriptions, and push the changes back to your server."
dongsheng@627 11739 msgstr ""
dongsheng@627 11740
dongsheng@627 11741 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11742 #: ../en/ch09-hook.xml:1216
dongsheng@627 11743 msgid ""
dongsheng@627 11744 "<envar role=\"rc-item-notify\">strip</envar>: The number of leading path "
dongsheng@627 11745 "separator characters to strip from a repository's path, when deciding whether "
dongsheng@627 11746 "a repository has subscribers. For example, if the repositories on your "
dongsheng@627 11747 "server live in <filename class=\"directory\">/home/hg/repos</filename>, and "
dongsheng@627 11748 "<literal role=\"hg-ext\">notify</literal> is considering a repository named "
dongsheng@627 11749 "<filename class=\"directory\">/home/hg/repos/shared/test</filename>, setting "
dongsheng@627 11750 "<envar role=\"rc-item-notify\">strip</envar> to <literal>4</literal> will "
dongsheng@627 11751 "cause <literal role=\"hg-ext\">notify</literal> to trim the path it considers "
dongsheng@627 11752 "down to <filename class=\"directory\">shared/test</filename>, and it will "
dongsheng@627 11753 "match subscribers against that."
dongsheng@627 11754 msgstr ""
dongsheng@627 11755
dongsheng@627 11756 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11757 #: ../en/ch09-hook.xml:1233
dongsheng@627 11758 msgid ""
dongsheng@627 11759 "<envar role=\"rc-item-notify\">template</envar>: The template text to use "
dongsheng@627 11760 "when sending messages. This specifies both the contents of the message "
dongsheng@627 11761 "header and its body."
dongsheng@627 11762 msgstr ""
dongsheng@627 11763
dongsheng@627 11764 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11765 #: ../en/ch09-hook.xml:1239
dongsheng@627 11766 msgid ""
dongsheng@627 11767 "<envar role=\"rc-item-notify\">maxdiff</envar>: The maximum number of lines "
dongsheng@627 11768 "of diff data to append to the end of a message. If a diff is longer than "
dongsheng@627 11769 "this, it is truncated. By default, this is set to 300. Set this to "
dongsheng@627 11770 "<literal>0</literal> to omit diffs from notification emails."
dongsheng@627 11771 msgstr ""
dongsheng@627 11772
dongsheng@627 11773 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
dongsheng@650 11774 #: ../en/ch09-hook.xml:1248
dongsheng@627 11775 msgid ""
dongsheng@627 11776 "<envar role=\"rc-item-notify\">sources</envar>: A list of sources of "
dongsheng@627 11777 "changesets to consider. This lets you limit <literal role=\"hg-ext\">notify</"
dongsheng@627 11778 "literal> to only sending out email about changes that remote users pushed "
songdongsheng@658 11779 "into this repository via a server, for example. See <xref linkend=\"sec:hook:"
songdongsheng@658 11780 "sources\"/> for the sources you can specify here."
dongsheng@627 11781 msgstr ""
dongsheng@627 11782
dongsheng@627 11783 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 11784 #: ../en/ch09-hook.xml:1259
dongsheng@627 11785 msgid ""
dongsheng@627 11786 "If you set the <envar role=\"rc-item-web\">baseurl</envar> item in the "
dongsheng@627 11787 "<literal role=\"rc-web\">web</literal> section, you can use it in a template; "
dongsheng@627 11788 "it will be available as <literal>webroot</literal>."
dongsheng@627 11789 msgstr ""
dongsheng@627 11790
dongsheng@627 11791 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 11792 #: ../en/ch09-hook.xml:1265
dongsheng@627 11793 msgid ""
dongsheng@627 11794 "Here is an example set of <literal role=\"hg-ext\">notify</literal> "
dongsheng@627 11795 "configuration information."
dongsheng@627 11796 msgstr ""
dongsheng@627 11797
dongsheng@627 11798 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 11799 #: ../en/ch09-hook.xml:1271
dongsheng@627 11800 msgid "This will produce a message that looks like the following:"
dongsheng@627 11801 msgstr ""
dongsheng@627 11802
dongsheng@627 11803 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 11804 #: ../en/ch09-hook.xml:1281
dongsheng@627 11805 msgid ""
dongsheng@627 11806 "Do not forget that by default, the <literal role=\"hg-ext\">notify</literal> "
dongsheng@627 11807 "extension <emphasis>will not send any mail</emphasis> until you explicitly "
dongsheng@627 11808 "configure it to do so, by setting <envar role=\"rc-item-notify\">test</envar> "
dongsheng@627 11809 "to <literal>false</literal>. Until you do that, it simply prints the message "
dongsheng@627 11810 "it <emphasis>would</emphasis> send."
dongsheng@627 11811 msgstr ""
dongsheng@627 11812
dongsheng@627 11813 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 11814 #: ../en/ch09-hook.xml:1293
dongsheng@627 11815 msgid "Information for writers of hooks"
dongsheng@635 11816 msgstr "编写钩子的信息"
dongsheng@627 11817
dongsheng@627 11818 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 11819 #: ../en/ch09-hook.xml:1296
dongsheng@627 11820 msgid "In-process hook execution"
dongsheng@635 11821 msgstr "进程内钩子的执行"
dongsheng@627 11822
dongsheng@627 11823 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11824 #: ../en/ch09-hook.xml:1298
dongsheng@627 11825 msgid "An in-process hook is called with arguments of the following form:"
dongsheng@627 11826 msgstr ""
dongsheng@627 11827
dongsheng@627 11828 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11829 #: ../en/ch09-hook.xml:1302
dongsheng@627 11830 msgid ""
dongsheng@627 11831 "The <literal>ui</literal> parameter is a <literal role=\"py-mod-mercurial.ui"
dongsheng@627 11832 "\">ui</literal> object. The <literal>repo</literal> parameter is a <literal "
dongsheng@627 11833 "role=\"py-mod-mercurial.localrepo\">localrepository</literal> object. The "
dongsheng@627 11834 "names and values of the <literal>**kwargs</literal> parameters depend on the "
dongsheng@627 11835 "hook being invoked, with the following common features:"
dongsheng@627 11836 msgstr ""
dongsheng@627 11837
dongsheng@627 11838 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 11839 #: ../en/ch09-hook.xml:1311
dongsheng@627 11840 msgid ""
dongsheng@627 11841 "If a parameter is named <literal>node</literal> or <literal>parentN</"
dongsheng@627 11842 "literal>, it will contain a hexadecimal changeset ID. The empty string is "
dongsheng@627 11843 "used to represent <quote>null changeset ID</quote> instead of a string of "
dongsheng@627 11844 "zeroes."
dongsheng@627 11845 msgstr ""
dongsheng@627 11846
dongsheng@627 11847 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 11848 #: ../en/ch09-hook.xml:1318
dongsheng@627 11849 msgid ""
dongsheng@627 11850 "If a parameter is named <literal>url</literal>, it will contain the URL of a "
dongsheng@627 11851 "remote repository, if that can be determined."
dongsheng@627 11852 msgstr ""
dongsheng@627 11853
dongsheng@627 11854 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 11855 #: ../en/ch09-hook.xml:1323
dongsheng@627 11856 msgid ""
dongsheng@627 11857 "Boolean-valued parameters are represented as Python <literal>bool</literal> "
dongsheng@627 11858 "objects."
dongsheng@627 11859 msgstr ""
dongsheng@627 11860
dongsheng@627 11861 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11862 #: ../en/ch09-hook.xml:1328
dongsheng@627 11863 msgid ""
dongsheng@627 11864 "An in-process hook is called without a change to the process's working "
dongsheng@627 11865 "directory (unlike external hooks, which are run in the root of the "
dongsheng@627 11866 "repository). It must not change the process's working directory, or it will "
dongsheng@627 11867 "cause any calls it makes into the Mercurial API to fail."
dongsheng@627 11868 msgstr ""
dongsheng@627 11869
dongsheng@627 11870 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11871 #: ../en/ch09-hook.xml:1335
dongsheng@627 11872 msgid ""
dongsheng@627 11873 "If a hook returns a boolean <quote>false</quote> value, it is considered to "
dongsheng@627 11874 "have succeeded. If it returns a boolean <quote>true</quote> value or raises "
dongsheng@627 11875 "an exception, it is considered to have failed. A useful way to think of the "
dongsheng@627 11876 "calling convention is <quote>tell me if you fail</quote>."
dongsheng@627 11877 msgstr ""
dongsheng@627 11878
dongsheng@627 11879 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11880 #: ../en/ch09-hook.xml:1342
dongsheng@627 11881 msgid ""
dongsheng@627 11882 "Note that changeset IDs are passed into Python hooks as hexadecimal strings, "
dongsheng@627 11883 "not the binary hashes that Mercurial's APIs normally use. To convert a hash "
dongsheng@650 11884 "from hex to binary, use the <literal>bin</literal> function."
dongsheng@650 11885 msgstr ""
dongsheng@650 11886
dongsheng@650 11887 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 11888 #: ../en/ch09-hook.xml:1350
dongsheng@627 11889 msgid "External hook execution"
dongsheng@635 11890 msgstr "外部钩子的执行"
dongsheng@627 11891
dongsheng@627 11892 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11893 #: ../en/ch09-hook.xml:1352
dongsheng@627 11894 msgid ""
dongsheng@627 11895 "An external hook is passed to the shell of the user running Mercurial. "
dongsheng@627 11896 "Features of that shell, such as variable substitution and command "
dongsheng@627 11897 "redirection, are available. The hook is run in the root directory of the "
dongsheng@627 11898 "repository (unlike in-process hooks, which are run in the same directory that "
dongsheng@627 11899 "Mercurial was run in)."
dongsheng@627 11900 msgstr ""
dongsheng@627 11901
dongsheng@627 11902 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11903 #: ../en/ch09-hook.xml:1360
dongsheng@627 11904 msgid ""
dongsheng@627 11905 "Hook parameters are passed to the hook as environment variables. Each "
dongsheng@627 11906 "environment variable's name is converted in upper case and prefixed with the "
dongsheng@627 11907 "string <quote><literal>HG_</literal></quote>. For example, if the name of a "
dongsheng@627 11908 "parameter is <quote><literal>node</literal></quote>, the name of the "
dongsheng@627 11909 "environment variable representing that parameter will be "
dongsheng@627 11910 "<quote><literal>HG_NODE</literal></quote>."
dongsheng@627 11911 msgstr ""
dongsheng@627 11912
dongsheng@627 11913 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11914 #: ../en/ch09-hook.xml:1369
dongsheng@627 11915 msgid ""
dongsheng@627 11916 "A boolean parameter is represented as the string <quote><literal>1</literal></"
dongsheng@627 11917 "quote> for <quote>true</quote>, <quote><literal>0</literal></quote> for "
dongsheng@627 11918 "<quote>false</quote>. If an environment variable is named <envar>HG_NODE</"
dongsheng@627 11919 "envar>, <envar>HG_PARENT1</envar> or <envar>HG_PARENT2</envar>, it contains a "
dongsheng@627 11920 "changeset ID represented as a hexadecimal string. The empty string is used "
dongsheng@627 11921 "to represent <quote>null changeset ID</quote> instead of a string of zeroes. "
dongsheng@627 11922 "If an environment variable is named <envar>HG_URL</envar>, it will contain "
dongsheng@627 11923 "the URL of a remote repository, if that can be determined."
dongsheng@627 11924 msgstr ""
dongsheng@627 11925
dongsheng@627 11926 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11927 #: ../en/ch09-hook.xml:1381
dongsheng@627 11928 msgid ""
dongsheng@627 11929 "If a hook exits with a status of zero, it is considered to have succeeded. "
dongsheng@627 11930 "If it exits with a non-zero status, it is considered to have failed."
dongsheng@627 11931 msgstr ""
dongsheng@627 11932
dongsheng@627 11933 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 11934 #: ../en/ch09-hook.xml:1388
dongsheng@627 11935 msgid "Finding out where changesets come from"
dongsheng@635 11936 msgstr "检查修改集来自何处"
dongsheng@627 11937
dongsheng@627 11938 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 11939 #: ../en/ch09-hook.xml:1390
dongsheng@627 11940 msgid ""
dongsheng@627 11941 "A hook that involves the transfer of changesets between a local repository "
dongsheng@627 11942 "and another may be able to find out information about the <quote>far side</"
dongsheng@627 11943 "quote>. Mercurial knows <emphasis>how</emphasis> changes are being "
dongsheng@627 11944 "transferred, and in many cases <emphasis>where</emphasis> they are being "
dongsheng@627 11945 "transferred to or from."
dongsheng@627 11946 msgstr ""
dongsheng@627 11947
dongsheng@627 11948 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 11949 #: ../en/ch09-hook.xml:1399
dongsheng@627 11950 msgid "Sources of changesets"
dongsheng@635 11951 msgstr "修改集的来源"
dongsheng@627 11952
dongsheng@627 11953 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 11954 #: ../en/ch09-hook.xml:1401
dongsheng@627 11955 msgid ""
dongsheng@627 11956 "Mercurial will tell a hook what means are, or were, used to transfer "
dongsheng@627 11957 "changesets between repositories. This is provided by Mercurial in a Python "
dongsheng@627 11958 "parameter named <literal>source</literal>, or an environment variable named "
dongsheng@627 11959 "<envar>HG_SOURCE</envar>."
dongsheng@627 11960 msgstr ""
dongsheng@627 11961
dongsheng@627 11962 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
songdongsheng@658 11963 #: ../en/ch09-hook.xml:1409
dongsheng@627 11964 msgid ""
dongsheng@627 11965 "<literal>serve</literal>: Changesets are transferred to or from a remote "
dongsheng@627 11966 "repository over http or ssh."
dongsheng@627 11967 msgstr ""
dongsheng@627 11968
dongsheng@627 11969 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
songdongsheng@658 11970 #: ../en/ch09-hook.xml:1414
dongsheng@627 11971 msgid ""
dongsheng@627 11972 "<literal>pull</literal>: Changesets are being transferred via a pull from one "
dongsheng@627 11973 "repository into another."
dongsheng@627 11974 msgstr ""
dongsheng@627 11975
dongsheng@627 11976 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
songdongsheng@658 11977 #: ../en/ch09-hook.xml:1419
dongsheng@627 11978 msgid ""
dongsheng@627 11979 "<literal>push</literal>: Changesets are being transferred via a push from one "
dongsheng@627 11980 "repository into another."
dongsheng@627 11981 msgstr ""
dongsheng@627 11982
dongsheng@627 11983 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
songdongsheng@658 11984 #: ../en/ch09-hook.xml:1424
dongsheng@627 11985 msgid ""
dongsheng@627 11986 "<literal>bundle</literal>: Changesets are being transferred to or from a "
dongsheng@627 11987 "bundle."
dongsheng@627 11988 msgstr ""
dongsheng@627 11989
dongsheng@627 11990 #. type: Content of: <book><chapter><sect1><sect2><sect3><title>
songdongsheng@658 11991 #: ../en/ch09-hook.xml:1431
dongsheng@661 11992 msgid "Where changes are going—remote repository URLs"
dongsheng@661 11993 msgstr "修改集要到哪里—远程版本库的地址"
dongsheng@627 11994
dongsheng@627 11995 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 11996 #: ../en/ch09-hook.xml:1434
dongsheng@627 11997 msgid ""
dongsheng@627 11998 "When possible, Mercurial will tell a hook the location of the <quote>far "
dongsheng@627 11999 "side</quote> of an activity that transfers changeset data between "
dongsheng@627 12000 "repositories. This is provided by Mercurial in a Python parameter named "
dongsheng@627 12001 "<literal>url</literal>, or an environment variable named <envar>HG_URL</"
dongsheng@627 12002 "envar>."
dongsheng@627 12003 msgstr ""
dongsheng@627 12004
dongsheng@627 12005 #. type: Content of: <book><chapter><sect1><sect2><sect3><para>
songdongsheng@658 12006 #: ../en/ch09-hook.xml:1442
dongsheng@627 12007 msgid ""
dongsheng@627 12008 "This information is not always known. If a hook is invoked in a repository "
dongsheng@627 12009 "that is being served via http or ssh, Mercurial cannot tell where the remote "
dongsheng@627 12010 "repository is, but it may know where the client is connecting from. In such "
dongsheng@627 12011 "cases, the URL will take one of the following forms:"
dongsheng@627 12012 msgstr ""
dongsheng@627 12013
dongsheng@627 12014 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
songdongsheng@658 12015 #: ../en/ch09-hook.xml:1449
dongsheng@627 12016 msgid ""
dongsheng@661 12017 "<literal>remote:ssh:1.2.3.4</literal>—remote ssh client, at the IP address "
dongsheng@661 12018 "<literal>1.2.3.4</literal>."
dongsheng@627 12019 msgstr ""
dongsheng@627 12020
dongsheng@627 12021 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
songdongsheng@658 12022 #: ../en/ch09-hook.xml:1454
dongsheng@627 12023 msgid ""
dongsheng@661 12024 "<literal>remote:http:1.2.3.4</literal>—remote http client, at the IP address "
dongsheng@661 12025 "<literal>1.2.3.4</literal>. If the client is using SSL, this will be of the "
dongsheng@661 12026 "form <literal>remote:https:1.2.3.4</literal>."
dongsheng@627 12027 msgstr ""
dongsheng@627 12028
dongsheng@627 12029 #. type: Content of: <book><chapter><sect1><sect2><sect3><itemizedlist><listitem><para>
songdongsheng@658 12030 #: ../en/ch09-hook.xml:1461
dongsheng@661 12031 msgid "Empty—no information could be discovered about the remote client."
dongsheng@627 12032 msgstr ""
dongsheng@627 12033
dongsheng@627 12034 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 12035 #: ../en/ch09-hook.xml:1470
dongsheng@627 12036 msgid "Hook reference"
dongsheng@635 12037 msgstr "钩子参考"
dongsheng@627 12038
dongsheng@627 12039 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 12040 #: ../en/ch09-hook.xml:1473
dongsheng@627 12041 msgid ""
dongsheng@661 12042 "<literal role=\"hook\">changegroup</literal>—after remote changesets added"
dongsheng@661 12043 msgstr "<literal role=\"hook\">changegroup</literal>—增加远程修改集之后"
dongsheng@627 12044
dongsheng@627 12045 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12046 #: ../en/ch09-hook.xml:1476
dongsheng@627 12047 msgid ""
dongsheng@627 12048 "This hook is run after a group of pre-existing changesets has been added to "
dongsheng@627 12049 "the repository, for example via a <command role=\"hg-cmd\">hg pull</command> "
dongsheng@627 12050 "or <command role=\"hg-cmd\">hg unbundle</command>. This hook is run once per "
dongsheng@627 12051 "operation that added one or more changesets. This is in contrast to the "
dongsheng@627 12052 "<literal role=\"hook\">incoming</literal> hook, which is run once per "
dongsheng@627 12053 "changeset, regardless of whether the changesets arrive in a group."
dongsheng@627 12054 msgstr ""
dongsheng@627 12055
dongsheng@627 12056 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12057 #: ../en/ch09-hook.xml:1486
dongsheng@627 12058 msgid ""
dongsheng@627 12059 "Some possible uses for this hook include kicking off an automated build or "
dongsheng@627 12060 "test of the added changesets, updating a bug database, or notifying "
dongsheng@627 12061 "subscribers that a repository contains new changes."
dongsheng@627 12062 msgstr ""
dongsheng@627 12063
dongsheng@627 12064 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12065 #: ../en/ch09-hook.xml:1492 ../en/ch09-hook.xml:1532 ../en/ch09-hook.xml:1576
dongsheng@650 12066 #: ../en/ch09-hook.xml:1618 ../en/ch09-hook.xml:1673 ../en/ch09-hook.xml:1713
songdongsheng@658 12067 #: ../en/ch09-hook.xml:1749 ../en/ch09-hook.xml:1783 ../en/ch09-hook.xml:1846
songdongsheng@658 12068 #: ../en/ch09-hook.xml:1904 ../en/ch09-hook.xml:1940 ../en/ch09-hook.xml:1967
dongsheng@627 12069 msgid "Parameters to this hook:"
dongsheng@627 12070 msgstr ""
dongsheng@627 12071
dongsheng@627 12072 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12073 #: ../en/ch09-hook.xml:1495 ../en/ch09-hook.xml:1849
dongsheng@627 12074 msgid ""
dongsheng@627 12075 "<literal>node</literal>: A changeset ID. The changeset ID of the first "
dongsheng@627 12076 "changeset in the group that was added. All changesets between this and "
dongsheng@650 12077 "<literal role=\"tag\">tip</literal>, inclusive, were added by a single "
dongsheng@650 12078 "<command role=\"hg-cmd\">hg pull</command>, <command role=\"hg-cmd\">hg push</"
dongsheng@650 12079 "command> or <command role=\"hg-cmd\">hg unbundle</command>."
dongsheng@627 12080 msgstr ""
dongsheng@627 12081
dongsheng@627 12082 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12083 #: ../en/ch09-hook.xml:1504 ../en/ch09-hook.xml:1583 ../en/ch09-hook.xml:1676
dongsheng@650 12084 #: ../en/ch09-hook.xml:1859
dongsheng@627 12085 msgid ""
songdongsheng@658 12086 "<literal>source</literal>: A string. The source of these changes. See <xref "
songdongsheng@658 12087 "linkend=\"sec:hook:sources\"/> for details."
dongsheng@627 12088 msgstr ""
dongsheng@627 12089
dongsheng@627 12090 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12091 #: ../en/ch09-hook.xml:1509 ../en/ch09-hook.xml:1588 ../en/ch09-hook.xml:1639
songdongsheng@658 12092 #: ../en/ch09-hook.xml:1681 ../en/ch09-hook.xml:1762 ../en/ch09-hook.xml:1864
dongsheng@627 12093 msgid ""
dongsheng@627 12094 "<literal>url</literal>: A URL. The location of the remote repository, if "
songdongsheng@658 12095 "known. See <xref linkend=\"sec:hook:url\"/> for more information."
songdongsheng@658 12096 msgstr ""
songdongsheng@658 12097
songdongsheng@658 12098 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12099 #: ../en/ch09-hook.xml:1515
songdongsheng@658 12100 msgid ""
songdongsheng@658 12101 "See also: <literal role=\"hook\">incoming</literal> (<xref linkend=\"sec:hook:"
songdongsheng@658 12102 "incoming\"/>), <literal role=\"hook\">prechangegroup</literal> (<xref linkend="
songdongsheng@658 12103 "\"sec:hook:prechangegroup\"/>), <literal role=\"hook\">pretxnchangegroup</"
songdongsheng@658 12104 "literal> (<xref linkend=\"sec:hook:pretxnchangegroup\"/>)"
dongsheng@627 12105 msgstr ""
dongsheng@627 12106
dongsheng@627 12107 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 12108 #: ../en/ch09-hook.xml:1526
dongsheng@661 12109 msgid "<literal role=\"hook\">commit</literal>—after a new changeset is created"
dongsheng@661 12110 msgstr "<literal role=\"hook\">commit</literal>—创建新修改集之后"
dongsheng@627 12111
dongsheng@627 12112 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12113 #: ../en/ch09-hook.xml:1529
dongsheng@627 12114 msgid "This hook is run after a new changeset has been created."
dongsheng@627 12115 msgstr ""
dongsheng@627 12116
dongsheng@627 12117 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12118 #: ../en/ch09-hook.xml:1535 ../en/ch09-hook.xml:1907
dongsheng@627 12119 msgid ""
dongsheng@627 12120 "<literal>node</literal>: A changeset ID. The changeset ID of the newly "
dongsheng@627 12121 "committed changeset."
dongsheng@627 12122 msgstr ""
dongsheng@627 12123
dongsheng@627 12124 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12125 #: ../en/ch09-hook.xml:1539 ../en/ch09-hook.xml:1911
dongsheng@627 12126 msgid ""
dongsheng@627 12127 "<literal>parent1</literal>: A changeset ID. The changeset ID of the first "
dongsheng@627 12128 "parent of the newly committed changeset."
dongsheng@627 12129 msgstr ""
dongsheng@627 12130
dongsheng@627 12131 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12132 #: ../en/ch09-hook.xml:1544 ../en/ch09-hook.xml:1916
dongsheng@627 12133 msgid ""
dongsheng@627 12134 "<literal>parent2</literal>: A changeset ID. The changeset ID of the second "
dongsheng@627 12135 "parent of the newly committed changeset."
dongsheng@627 12136 msgstr ""
dongsheng@627 12137
dongsheng@627 12138 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12139 #: ../en/ch09-hook.xml:1550
songdongsheng@658 12140 msgid ""
songdongsheng@658 12141 "See also: <literal role=\"hook\">precommit</literal> (<xref linkend=\"sec:"
songdongsheng@658 12142 "hook:precommit\"/>), <literal role=\"hook\">pretxncommit</literal> (<xref "
songdongsheng@658 12143 "linkend=\"sec:hook:pretxncommit\"/>)"
dongsheng@627 12144 msgstr ""
dongsheng@627 12145
dongsheng@627 12146 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12147 #: ../en/ch09-hook.xml:1559
dongsheng@627 12148 msgid ""
dongsheng@661 12149 "<literal role=\"hook\">incoming</literal>—after one remote changeset is added"
dongsheng@661 12150 msgstr "<literal role=\"hook\">incoming</literal>—增加远程修改集之后"
dongsheng@627 12151
dongsheng@627 12152 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12153 #: ../en/ch09-hook.xml:1562
dongsheng@627 12154 msgid ""
dongsheng@627 12155 "This hook is run after a pre-existing changeset has been added to the "
dongsheng@627 12156 "repository, for example via a <command role=\"hg-cmd\">hg push</command>. If "
dongsheng@627 12157 "a group of changesets was added in a single operation, this hook is called "
dongsheng@627 12158 "once for each added changeset."
dongsheng@627 12159 msgstr ""
dongsheng@627 12160
dongsheng@627 12161 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12162 #: ../en/ch09-hook.xml:1569
dongsheng@627 12163 msgid ""
dongsheng@627 12164 "You can use this hook for the same purposes as the <literal role=\"hook"
songdongsheng@658 12165 "\">changegroup</literal> hook (<xref linkend=\"sec:hook:changegroup\"/>); "
songdongsheng@658 12166 "it's simply more convenient sometimes to run a hook once per group of "
dongsheng@627 12167 "changesets, while other times it's handier once per changeset."
dongsheng@627 12168 msgstr ""
dongsheng@627 12169
dongsheng@627 12170 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 12171 #: ../en/ch09-hook.xml:1579
dongsheng@627 12172 msgid ""
dongsheng@627 12173 "<literal>node</literal>: A changeset ID. The ID of the newly added changeset."
dongsheng@627 12174 msgstr ""
dongsheng@627 12175
dongsheng@627 12176 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12177 #: ../en/ch09-hook.xml:1594
songdongsheng@658 12178 msgid ""
songdongsheng@658 12179 "See also: <literal role=\"hook\">changegroup</literal> (<xref linkend=\"sec:"
songdongsheng@658 12180 "hook:changegroup\"/>) <literal role=\"hook\">prechangegroup</literal> (<xref "
songdongsheng@658 12181 "linkend=\"sec:hook:prechangegroup\"/>), <literal role=\"hook"
songdongsheng@658 12182 "\">pretxnchangegroup</literal> (<xref linkend=\"sec:hook:pretxnchangegroup\"/"
songdongsheng@658 12183 ">)"
dongsheng@627 12184 msgstr ""
dongsheng@627 12185
dongsheng@627 12186 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12187 #: ../en/ch09-hook.xml:1605
dongsheng@627 12188 msgid ""
dongsheng@661 12189 "<literal role=\"hook\">outgoing</literal>—after changesets are propagated"
dongsheng@661 12190 msgstr "<literal role=\"hook\">outgoing</literal>—传播修改集之后"
dongsheng@627 12191
dongsheng@627 12192 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12193 #: ../en/ch09-hook.xml:1608
dongsheng@627 12194 msgid ""
dongsheng@627 12195 "This hook is run after a group of changesets has been propagated out of this "
dongsheng@627 12196 "repository, for example by a <command role=\"hg-cmd\">hg push</command> or "
dongsheng@627 12197 "<command role=\"hg-cmd\">hg bundle</command> command."
dongsheng@627 12198 msgstr ""
dongsheng@627 12199
dongsheng@627 12200 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12201 #: ../en/ch09-hook.xml:1614
dongsheng@627 12202 msgid ""
dongsheng@627 12203 "One possible use for this hook is to notify administrators that changes have "
dongsheng@627 12204 "been pulled."
dongsheng@627 12205 msgstr ""
dongsheng@627 12206
dongsheng@627 12207 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 12208 #: ../en/ch09-hook.xml:1621
dongsheng@627 12209 msgid ""
dongsheng@627 12210 "<literal>node</literal>: A changeset ID. The changeset ID of the first "
dongsheng@627 12211 "changeset of the group that was sent."
dongsheng@627 12212 msgstr ""
dongsheng@627 12213
dongsheng@627 12214 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 12215 #: ../en/ch09-hook.xml:1626
dongsheng@627 12216 msgid ""
dongsheng@627 12217 "<literal>source</literal>: A string. The source of the of the operation (see "
songdongsheng@658 12218 "<xref linkend=\"sec:hook:sources\"/>). If a remote client pulled changes "
songdongsheng@658 12219 "from this repository, <literal>source</literal> will be <literal>serve</"
songdongsheng@658 12220 "literal>. If the client that obtained changes from this repository was "
songdongsheng@658 12221 "local, <literal>source</literal> will be <literal>bundle</literal>, "
songdongsheng@658 12222 "<literal>pull</literal>, or <literal>push</literal>, depending on the "
songdongsheng@658 12223 "operation the client performed."
songdongsheng@658 12224 msgstr ""
songdongsheng@658 12225
songdongsheng@658 12226 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12227 #: ../en/ch09-hook.xml:1645
songdongsheng@658 12228 msgid ""
songdongsheng@658 12229 "See also: <literal role=\"hook\">preoutgoing</literal> (<xref linkend=\"sec:"
songdongsheng@658 12230 "hook:preoutgoing\"/>)"
dongsheng@627 12231 msgstr ""
dongsheng@627 12232
dongsheng@627 12233 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12234 #: ../en/ch09-hook.xml:1652
dongsheng@627 12235 msgid ""
dongsheng@661 12236 "<literal role=\"hook\">prechangegroup</literal>—before starting to add remote "
dongsheng@661 12237 "changesets"
dongsheng@661 12238 msgstr "<literal role=\"hook\">prechangegroup</literal>—增加远程修改集之前"
dongsheng@627 12239
dongsheng@627 12240 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12241 #: ../en/ch09-hook.xml:1656
dongsheng@627 12242 msgid ""
dongsheng@627 12243 "This controlling hook is run before Mercurial begins to add a group of "
dongsheng@627 12244 "changesets from another repository."
dongsheng@627 12245 msgstr ""
dongsheng@627 12246
dongsheng@627 12247 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12248 #: ../en/ch09-hook.xml:1660
dongsheng@627 12249 msgid ""
dongsheng@627 12250 "This hook does not have any information about the changesets to be added, "
dongsheng@627 12251 "because it is run before transmission of those changesets is allowed to "
dongsheng@627 12252 "begin. If this hook fails, the changesets will not be transmitted."
dongsheng@627 12253 msgstr ""
dongsheng@627 12254
dongsheng@627 12255 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12256 #: ../en/ch09-hook.xml:1666
dongsheng@627 12257 msgid ""
dongsheng@627 12258 "One use for this hook is to prevent external changes from being added to a "
dongsheng@627 12259 "repository. For example, you could use this to <quote>freeze</quote> a "
dongsheng@627 12260 "server-hosted branch temporarily or permanently so that users cannot push to "
dongsheng@627 12261 "it, while still allowing a local administrator to modify the repository."
dongsheng@627 12262 msgstr ""
dongsheng@627 12263
dongsheng@627 12264 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12265 #: ../en/ch09-hook.xml:1687
songdongsheng@658 12266 msgid ""
songdongsheng@658 12267 "See also: <literal role=\"hook\">changegroup</literal> (<xref linkend=\"sec:"
songdongsheng@658 12268 "hook:changegroup\"/>), <literal role=\"hook\">incoming</literal> (<xref "
songdongsheng@658 12269 "linkend=\"sec:hook:incoming\"/>), <literal role=\"hook\">pretxnchangegroup</"
songdongsheng@658 12270 "literal> (<xref linkend=\"sec:hook:pretxnchangegroup\"/>)"
dongsheng@627 12271 msgstr ""
dongsheng@627 12272
dongsheng@627 12273 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12274 #: ../en/ch09-hook.xml:1698
dongsheng@627 12275 msgid ""
dongsheng@661 12276 "<literal role=\"hook\">precommit</literal>—before starting to commit a "
dongsheng@627 12277 "changeset"
dongsheng@661 12278 msgstr "<literal role=\"hook\">precommit</literal>—提交修改集之前"
dongsheng@627 12279
dongsheng@627 12280 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12281 #: ../en/ch09-hook.xml:1701
dongsheng@627 12282 msgid ""
dongsheng@627 12283 "This hook is run before Mercurial begins to commit a new changeset. It is run "
dongsheng@627 12284 "before Mercurial has any of the metadata for the commit, such as the files to "
dongsheng@627 12285 "be committed, the commit message, or the commit date."
dongsheng@627 12286 msgstr ""
dongsheng@627 12287
dongsheng@627 12288 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12289 #: ../en/ch09-hook.xml:1707
dongsheng@627 12290 msgid ""
dongsheng@627 12291 "One use for this hook is to disable the ability to commit new changesets, "
dongsheng@627 12292 "while still allowing incoming changesets. Another is to run a build or test, "
dongsheng@627 12293 "and only allow the commit to begin if the build or test succeeds."
dongsheng@627 12294 msgstr ""
dongsheng@627 12295
dongsheng@627 12296 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 12297 #: ../en/ch09-hook.xml:1716
dongsheng@627 12298 msgid ""
dongsheng@627 12299 "<literal>parent1</literal>: A changeset ID. The changeset ID of the first "
dongsheng@627 12300 "parent of the working directory."
dongsheng@627 12301 msgstr ""
dongsheng@627 12302
dongsheng@627 12303 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 12304 #: ../en/ch09-hook.xml:1721
dongsheng@627 12305 msgid ""
dongsheng@627 12306 "<literal>parent2</literal>: A changeset ID. The changeset ID of the second "
dongsheng@627 12307 "parent of the working directory."
dongsheng@627 12308 msgstr ""
dongsheng@627 12309
dongsheng@627 12310 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12311 #: ../en/ch09-hook.xml:1726
dongsheng@627 12312 msgid ""
dongsheng@627 12313 "If the commit proceeds, the parents of the working directory will become the "
dongsheng@627 12314 "parents of the new changeset."
dongsheng@627 12315 msgstr ""
dongsheng@627 12316
dongsheng@627 12317 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12318 #: ../en/ch09-hook.xml:1730
dongsheng@627 12319 msgid ""
songdongsheng@658 12320 "See also: <literal role=\"hook\">commit</literal> (<xref linkend=\"sec:hook:"
songdongsheng@658 12321 "commit\"/>), <literal role=\"hook\">pretxncommit</literal> (<xref linkend="
songdongsheng@658 12322 "\"sec:hook:pretxncommit\"/>)"
dongsheng@627 12323 msgstr ""
dongsheng@627 12324
dongsheng@627 12325 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12326 #: ../en/ch09-hook.xml:1738
dongsheng@627 12327 msgid ""
dongsheng@661 12328 "<literal role=\"hook\">preoutgoing</literal>—before starting to propagate "
dongsheng@661 12329 "changesets"
dongsheng@661 12330 msgstr "<literal role=\"hook\">preoutgoing</literal>—传播修改集之前"
dongsheng@627 12331
dongsheng@627 12332 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12333 #: ../en/ch09-hook.xml:1741
dongsheng@627 12334 msgid ""
dongsheng@627 12335 "This hook is invoked before Mercurial knows the identities of the changesets "
dongsheng@627 12336 "to be transmitted."
dongsheng@627 12337 msgstr ""
dongsheng@627 12338
dongsheng@627 12339 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12340 #: ../en/ch09-hook.xml:1745
dongsheng@627 12341 msgid ""
dongsheng@627 12342 "One use for this hook is to prevent changes from being transmitted to another "
dongsheng@627 12343 "repository."
dongsheng@627 12344 msgstr ""
dongsheng@627 12345
dongsheng@627 12346 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 12347 #: ../en/ch09-hook.xml:1752
dongsheng@627 12348 msgid ""
dongsheng@627 12349 "<literal>source</literal>: A string. The source of the operation that is "
songdongsheng@658 12350 "attempting to obtain changes from this repository (see <xref linkend=\"sec:"
songdongsheng@658 12351 "hook:sources\"/>). See the documentation for the <literal>source</literal> "
songdongsheng@658 12352 "parameter to the <literal role=\"hook\">outgoing</literal> hook, in <xref "
songdongsheng@658 12353 "linkend=\"sec:hook:outgoing\"/>, for possible values of this parameter."
songdongsheng@658 12354 msgstr ""
songdongsheng@658 12355
songdongsheng@658 12356 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12357 #: ../en/ch09-hook.xml:1768
songdongsheng@658 12358 msgid ""
songdongsheng@658 12359 "See also: <literal role=\"hook\">outgoing</literal> (<xref linkend=\"sec:hook:"
songdongsheng@658 12360 "outgoing\"/>)"
dongsheng@627 12361 msgstr ""
dongsheng@627 12362
dongsheng@627 12363 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 12364 #: ../en/ch09-hook.xml:1775
dongsheng@661 12365 msgid "<literal role=\"hook\">pretag</literal>—before tagging a changeset"
dongsheng@661 12366 msgstr "<literal role=\"hook\">pretag</literal>—创建标签之前"
dongsheng@627 12367
dongsheng@627 12368 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12369 #: ../en/ch09-hook.xml:1778
dongsheng@627 12370 msgid ""
dongsheng@627 12371 "This controlling hook is run before a tag is created. If the hook succeeds, "
dongsheng@627 12372 "creation of the tag proceeds. If the hook fails, the tag is not created."
dongsheng@627 12373 msgstr ""
dongsheng@627 12374
dongsheng@627 12375 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12376 #: ../en/ch09-hook.xml:1786
dongsheng@627 12377 msgid ""
dongsheng@627 12378 "<literal>local</literal>: A boolean. Whether the tag is local to this "
dongsheng@627 12379 "repository instance (i.e. stored in <filename role=\"special\">.hg/localtags</"
dongsheng@627 12380 "filename>) or managed by Mercurial (stored in <filename role=\"special\">."
dongsheng@627 12381 "hgtags</filename>)."
dongsheng@627 12382 msgstr ""
dongsheng@627 12383
dongsheng@627 12384 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12385 #: ../en/ch09-hook.xml:1793
dongsheng@627 12386 msgid ""
dongsheng@627 12387 "<literal>node</literal>: A changeset ID. The ID of the changeset to be "
dongsheng@627 12388 "tagged."
dongsheng@627 12389 msgstr ""
dongsheng@627 12390
dongsheng@627 12391 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12392 #: ../en/ch09-hook.xml:1797
dongsheng@627 12393 msgid "<literal>tag</literal>: A string. The name of the tag to be created."
dongsheng@627 12394 msgstr ""
dongsheng@627 12395
dongsheng@627 12396 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12397 #: ../en/ch09-hook.xml:1802
dongsheng@627 12398 msgid ""
dongsheng@627 12399 "If the tag to be created is revision-controlled, the <literal role=\"hook"
dongsheng@627 12400 "\">precommit</literal> and <literal role=\"hook\">pretxncommit</literal> "
songdongsheng@658 12401 "hooks (<xref linkend=\"sec:hook:commit\"/> and <xref linkend=\"sec:hook:"
songdongsheng@658 12402 "pretxncommit\"/>) will also be run."
dongsheng@627 12403 msgstr ""
dongsheng@627 12404
dongsheng@627 12405 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12406 #: ../en/ch09-hook.xml:1810
dongsheng@627 12407 msgid ""
songdongsheng@658 12408 "See also: <literal role=\"hook\">tag</literal> (<xref linkend=\"sec:hook:tag"
songdongsheng@658 12409 "\"/>)"
dongsheng@627 12410 msgstr ""
dongsheng@627 12411
dongsheng@627 12412 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12413 #: ../en/ch09-hook.xml:1815
dongsheng@627 12414 msgid ""
dongsheng@661 12415 "<literal role=\"hook\">pretxnchangegroup</literal>—before completing addition "
dongsheng@661 12416 "of remote changesets"
dongsheng@661 12417 msgstr ""
dongsheng@661 12418 "<literal role=\"hook\">pretxnchangegroup</literal>—完成增加远程修改集之前"
dongsheng@627 12419
dongsheng@627 12420 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12421 #: ../en/ch09-hook.xml:1819
dongsheng@627 12422 msgid ""
dongsheng@661 12423 "This controlling hook is run before a transaction—that manages the addition "
dongsheng@661 12424 "of a group of new changesets from outside the repository—completes. If the "
dongsheng@661 12425 "hook succeeds, the transaction completes, and all of the changesets become "
dongsheng@661 12426 "permanent within this repository. If the hook fails, the transaction is "
dongsheng@661 12427 "rolled back, and the data for the changesets is erased."
dongsheng@627 12428 msgstr ""
dongsheng@627 12429
dongsheng@627 12430 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12431 #: ../en/ch09-hook.xml:1828
dongsheng@627 12432 msgid ""
dongsheng@627 12433 "This hook can access the metadata associated with the almost-added "
dongsheng@627 12434 "changesets, but it should not do anything permanent with this data. It must "
dongsheng@627 12435 "also not modify the working directory."
dongsheng@627 12436 msgstr ""
dongsheng@627 12437
dongsheng@627 12438 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12439 #: ../en/ch09-hook.xml:1834
dongsheng@627 12440 msgid ""
dongsheng@627 12441 "While this hook is running, if other Mercurial processes access this "
dongsheng@627 12442 "repository, they will be able to see the almost-added changesets as if they "
dongsheng@627 12443 "are permanent. This may lead to race conditions if you do not take steps to "
dongsheng@627 12444 "avoid them."
dongsheng@627 12445 msgstr ""
dongsheng@627 12446
dongsheng@627 12447 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12448 #: ../en/ch09-hook.xml:1841
dongsheng@627 12449 msgid ""
dongsheng@627 12450 "This hook can be used to automatically vet a group of changesets. If the "
dongsheng@627 12451 "hook fails, all of the changesets are <quote>rejected</quote> when the "
dongsheng@627 12452 "transaction rolls back."
dongsheng@627 12453 msgstr ""
dongsheng@627 12454
dongsheng@627 12455 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12456 #: ../en/ch09-hook.xml:1870
songdongsheng@658 12457 msgid ""
songdongsheng@658 12458 "See also: <literal role=\"hook\">changegroup</literal> (<xref linkend=\"sec:"
songdongsheng@658 12459 "hook:changegroup\"/>), <literal role=\"hook\">incoming</literal> (<xref "
songdongsheng@658 12460 "linkend=\"sec:hook:incoming\"/>), <literal role=\"hook\">prechangegroup</"
songdongsheng@658 12461 "literal> (<xref linkend=\"sec:hook:prechangegroup\"/>)"
dongsheng@627 12462 msgstr ""
dongsheng@627 12463
dongsheng@627 12464 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12465 #: ../en/ch09-hook.xml:1881
dongsheng@627 12466 msgid ""
dongsheng@661 12467 "<literal role=\"hook\">pretxncommit</literal>—before completing commit of new "
dongsheng@661 12468 "changeset"
dongsheng@661 12469 msgstr "<literal role=\"hook\">pretxncommit</literal>—完成提交之前"
dongsheng@627 12470
dongsheng@627 12471 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12472 #: ../en/ch09-hook.xml:1884
dongsheng@627 12473 msgid ""
dongsheng@661 12474 "This controlling hook is run before a transaction—that manages a new commit—"
dongsheng@661 12475 "completes. If the hook succeeds, the transaction completes and the changeset "
dongsheng@661 12476 "becomes permanent within this repository. If the hook fails, the transaction "
dongsheng@661 12477 "is rolled back, and the commit data is erased."
dongsheng@627 12478 msgstr ""
dongsheng@627 12479
dongsheng@627 12480 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12481 #: ../en/ch09-hook.xml:1892
dongsheng@627 12482 msgid ""
dongsheng@627 12483 "This hook can access the metadata associated with the almost-new changeset, "
dongsheng@627 12484 "but it should not do anything permanent with this data. It must also not "
dongsheng@627 12485 "modify the working directory."
dongsheng@627 12486 msgstr ""
dongsheng@627 12487
dongsheng@627 12488 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12489 #: ../en/ch09-hook.xml:1898
dongsheng@627 12490 msgid ""
dongsheng@627 12491 "While this hook is running, if other Mercurial processes access this "
dongsheng@627 12492 "repository, they will be able to see the almost-new changeset as if it is "
dongsheng@627 12493 "permanent. This may lead to race conditions if you do not take steps to "
dongsheng@627 12494 "avoid them."
dongsheng@627 12495 msgstr ""
dongsheng@627 12496
dongsheng@627 12497 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12498 #: ../en/ch09-hook.xml:1922
songdongsheng@658 12499 msgid ""
songdongsheng@658 12500 "See also: <literal role=\"hook\">precommit</literal> (<xref linkend=\"sec:"
songdongsheng@658 12501 "hook:precommit\"/>)"
dongsheng@660 12502 msgstr ""
dongsheng@660 12503 "参见: <literal role=\"hook\">precommit</literal> (<xref linkend=\"sec:hook:"
dongsheng@660 12504 "precommit\"/>)"
dongsheng@627 12505
dongsheng@627 12506 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 12507 #: ../en/ch09-hook.xml:1929
dongsheng@627 12508 msgid ""
dongsheng@661 12509 "<literal role=\"hook\">preupdate</literal>—before updating or merging working "
dongsheng@661 12510 "directory"
dongsheng@661 12511 msgstr "<literal role=\"hook\">preupdate</literal>—更新或合并工作目录之前"
dongsheng@627 12512
dongsheng@627 12513 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12514 #: ../en/ch09-hook.xml:1932
dongsheng@627 12515 msgid ""
dongsheng@627 12516 "This controlling hook is run before an update or merge of the working "
dongsheng@627 12517 "directory begins. It is run only if Mercurial's normal pre-update checks "
dongsheng@627 12518 "determine that the update or merge can proceed. If the hook succeeds, the "
dongsheng@627 12519 "update or merge may proceed; if it fails, the update or merge does not start."
dongsheng@627 12520 msgstr ""
dongsheng@627 12521
dongsheng@627 12522 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12523 #: ../en/ch09-hook.xml:1943
songdongsheng@658 12524 msgid ""
songdongsheng@658 12525 "<literal>parent1</literal>: A changeset ID. The ID of the parent that the "
dongsheng@627 12526 "working directory is to be updated to. If the working directory is being "
dongsheng@627 12527 "merged, it will not change this parent."
dongsheng@627 12528 msgstr ""
dongsheng@627 12529
dongsheng@627 12530 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12531 #: ../en/ch09-hook.xml:1949
songdongsheng@658 12532 msgid ""
songdongsheng@658 12533 "<literal>parent2</literal>: A changeset ID. Only set if the working directory "
songdongsheng@658 12534 "is being merged. The ID of the revision that the working directory is being "
songdongsheng@658 12535 "merged with."
songdongsheng@658 12536 msgstr ""
songdongsheng@658 12537
songdongsheng@658 12538 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12539 #: ../en/ch09-hook.xml:1956
songdongsheng@658 12540 msgid ""
songdongsheng@658 12541 "See also: <literal role=\"hook\">update</literal> (<xref linkend=\"sec:hook:"
songdongsheng@658 12542 "update\"/>)"
dongsheng@627 12543 msgstr ""
dongsheng@627 12544
dongsheng@627 12545 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 12546 #: ../en/ch09-hook.xml:1961
dongsheng@661 12547 msgid "<literal role=\"hook\">tag</literal>—after tagging a changeset"
dongsheng@661 12548 msgstr "<literal role=\"hook\">tag</literal>—创建标签之后"
dongsheng@627 12549
dongsheng@627 12550 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12551 #: ../en/ch09-hook.xml:1964
dongsheng@627 12552 msgid "This hook is run after a tag has been created."
dongsheng@627 12553 msgstr ""
dongsheng@627 12554
dongsheng@627 12555 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12556 #: ../en/ch09-hook.xml:1970
dongsheng@627 12557 msgid ""
dongsheng@627 12558 "<literal>local</literal>: A boolean. Whether the new tag is local to this "
dongsheng@627 12559 "repository instance (i.e. stored in <filename role=\"special\">.hg/"
dongsheng@627 12560 "localtags</filename>) or managed by Mercurial (stored in <filename role="
dongsheng@627 12561 "\"special\">.hgtags</filename>)."
dongsheng@627 12562 msgstr ""
dongsheng@627 12563
dongsheng@627 12564 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12565 #: ../en/ch09-hook.xml:1978
dongsheng@627 12566 msgid ""
dongsheng@627 12567 "<literal>node</literal>: A changeset ID. The ID of the changeset that was "
dongsheng@627 12568 "tagged."
dongsheng@627 12569 msgstr ""
dongsheng@627 12570
dongsheng@627 12571 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12572 #: ../en/ch09-hook.xml:1982
dongsheng@627 12573 msgid "<literal>tag</literal>: A string. The name of the tag that was created."
dongsheng@627 12574 msgstr ""
dongsheng@627 12575
dongsheng@627 12576 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12577 #: ../en/ch09-hook.xml:1987
dongsheng@627 12578 msgid ""
dongsheng@627 12579 "If the created tag is revision-controlled, the <literal role=\"hook\">commit</"
songdongsheng@658 12580 "literal> hook (section <xref linkend=\"sec:hook:commit\"/>) is run before "
dongsheng@627 12581 "this hook."
dongsheng@627 12582 msgstr ""
dongsheng@627 12583
dongsheng@627 12584 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12585 #: ../en/ch09-hook.xml:1992
songdongsheng@658 12586 msgid ""
songdongsheng@658 12587 "See also: <literal role=\"hook\">pretag</literal> (<xref linkend=\"sec:hook:"
songdongsheng@658 12588 "pretag\"/>)"
dongsheng@660 12589 msgstr ""
dongsheng@660 12590 "参见: <literal role=\"hook\">pretag</literal> (<xref linkend=\"sec:hook:pretag"
dongsheng@660 12591 "\"/>)"
dongsheng@627 12592
dongsheng@627 12593 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 12594 #: ../en/ch09-hook.xml:1998
dongsheng@627 12595 msgid ""
dongsheng@661 12596 "<literal role=\"hook\">update</literal>—after updating or merging working "
dongsheng@661 12597 "directory"
dongsheng@661 12598 msgstr "<literal role=\"hook\">update</literal>—更新或合并工作目录之后"
dongsheng@627 12599
dongsheng@627 12600 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12601 #: ../en/ch09-hook.xml:2001
dongsheng@627 12602 msgid ""
dongsheng@627 12603 "This hook is run after an update or merge of the working directory "
dongsheng@627 12604 "completes. Since a merge can fail (if the external <command>hgmerge</"
dongsheng@627 12605 "command> command fails to resolve conflicts in a file), this hook "
dongsheng@627 12606 "communicates whether the update or merge completed cleanly."
dongsheng@627 12607 msgstr ""
dongsheng@627 12608
dongsheng@627 12609 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12610 #: ../en/ch09-hook.xml:2009
dongsheng@627 12611 msgid ""
dongsheng@627 12612 "<literal>error</literal>: A boolean. Indicates whether the update or merge "
dongsheng@627 12613 "completed successfully."
dongsheng@627 12614 msgstr ""
dongsheng@627 12615
dongsheng@627 12616 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12617 #: ../en/ch09-hook.xml:2014
dongsheng@627 12618 msgid ""
dongsheng@627 12619 "<literal>parent1</literal>: A changeset ID. The ID of the parent that the "
dongsheng@627 12620 "working directory was updated to. If the working directory was merged, it "
dongsheng@627 12621 "will not have changed this parent."
dongsheng@627 12622 msgstr ""
dongsheng@627 12623
dongsheng@627 12624 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 12625 #: ../en/ch09-hook.xml:2020
dongsheng@627 12626 msgid ""
dongsheng@627 12627 "<literal>parent2</literal>: A changeset ID. Only set if the working "
dongsheng@627 12628 "directory was merged. The ID of the revision that the working directory was "
dongsheng@627 12629 "merged with."
dongsheng@627 12630 msgstr ""
dongsheng@627 12631
dongsheng@627 12632 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 12633 #: ../en/ch09-hook.xml:2026
songdongsheng@658 12634 msgid ""
songdongsheng@658 12635 "See also: <literal role=\"hook\">preupdate</literal> (<xref linkend=\"sec:"
songdongsheng@658 12636 "hook:preupdate\"/>)"
dongsheng@627 12637 msgstr ""
dongsheng@627 12638
dongsheng@627 12639 #. type: Content of: <book><chapter><title>
dongsheng@650 12640 #: ../en/ch10-template.xml:5
dongsheng@627 12641 msgid "Customising the output of Mercurial"
dongsheng@627 12642 msgstr "定制 Mercurial 的输出"
dongsheng@627 12643
dongsheng@627 12644 #. type: Content of: <book><chapter><para>
dongsheng@650 12645 #: ../en/ch10-template.xml:7
dongsheng@627 12646 msgid ""
dongsheng@627 12647 "Mercurial provides a powerful mechanism to let you control how it displays "
dongsheng@627 12648 "information. The mechanism is based on templates. You can use templates to "
dongsheng@627 12649 "generate specific output for a single command, or to customise the entire "
dongsheng@627 12650 "appearance of the built-in web interface."
dongsheng@627 12651 msgstr ""
dongsheng@627 12652
dongsheng@627 12653 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 12654 #: ../en/ch10-template.xml:14
dongsheng@627 12655 msgid "Using precanned output styles"
dongsheng@636 12656 msgstr "使用预定义的输出样式"
dongsheng@627 12657
dongsheng@627 12658 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12659 #: ../en/ch10-template.xml:16
dongsheng@627 12660 msgid ""
dongsheng@627 12661 "Packaged with Mercurial are some output styles that you can use immediately. "
dongsheng@627 12662 "A style is simply a precanned template that someone wrote and installed "
dongsheng@627 12663 "somewhere that Mercurial can find."
dongsheng@627 12664 msgstr ""
dongsheng@627 12665
dongsheng@627 12666 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12667 #: ../en/ch10-template.xml:21
dongsheng@627 12668 msgid ""
dongsheng@627 12669 "Before we take a look at Mercurial's bundled styles, let's review its normal "
dongsheng@627 12670 "output."
dongsheng@627 12671 msgstr ""
dongsheng@627 12672
dongsheng@627 12673 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12674 #: ../en/ch10-template.xml:26
dongsheng@627 12675 msgid ""
dongsheng@661 12676 "This is somewhat informative, but it takes up a lot of space—five lines of "
dongsheng@661 12677 "output per changeset. The <literal>compact</literal> style reduces this to "
dongsheng@661 12678 "three lines, presented in a sparse manner."
dongsheng@627 12679 msgstr ""
dongsheng@627 12680
dongsheng@627 12681 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12682 #: ../en/ch10-template.xml:33
dongsheng@627 12683 msgid ""
dongsheng@627 12684 "The <literal>changelog</literal> style hints at the expressive power of "
dongsheng@627 12685 "Mercurial's templating engine. This style attempts to follow the GNU "
dongsheng@627 12686 "Project's changelog guidelines<citation>web:changelog</citation>."
dongsheng@627 12687 msgstr ""
dongsheng@627 12688
dongsheng@627 12689 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12690 #: ../en/ch10-template.xml:40
dongsheng@627 12691 msgid ""
dongsheng@627 12692 "You will not be shocked to learn that Mercurial's default output style is "
dongsheng@627 12693 "named <literal>default</literal>."
dongsheng@627 12694 msgstr ""
dongsheng@627 12695
dongsheng@627 12696 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 12697 #: ../en/ch10-template.xml:44
dongsheng@627 12698 msgid "Setting a default style"
dongsheng@636 12699 msgstr "设置默认样式"
dongsheng@627 12700
dongsheng@627 12701 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12702 #: ../en/ch10-template.xml:46
dongsheng@627 12703 msgid ""
dongsheng@627 12704 "You can modify the output style that Mercurial will use for every command by "
dongsheng@650 12705 "editing your <filename role=\"special\">~/.hgrc</filename> file, naming the "
dongsheng@627 12706 "style you would prefer to use."
dongsheng@627 12707 msgstr ""
dongsheng@627 12708
dongsheng@627 12709 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 12710 #: ../en/ch10-template.xml:54
dongsheng@627 12711 msgid ""
dongsheng@627 12712 "If you write a style of your own, you can use it by either providing the path "
dongsheng@627 12713 "to your style file, or copying your style file into a location where "
dongsheng@627 12714 "Mercurial can find it (typically the <literal>templates</literal> "
dongsheng@627 12715 "subdirectory of your Mercurial install directory)."
dongsheng@627 12716 msgstr ""
dongsheng@627 12717
dongsheng@627 12718 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 12719 #: ../en/ch10-template.xml:63
dongsheng@627 12720 msgid "Commands that support styles and templates"
dongsheng@636 12721 msgstr "支持样式和模版的命令"
dongsheng@627 12722
dongsheng@627 12723 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12724 #: ../en/ch10-template.xml:65
dongsheng@627 12725 msgid ""
dongsheng@627 12726 "All of Mercurial's <quote><literal>log</literal>-like</quote> commands let "
dongsheng@627 12727 "you use styles and templates: <command role=\"hg-cmd\">hg incoming</command>, "
dongsheng@627 12728 "<command role=\"hg-cmd\">hg log</command>, <command role=\"hg-cmd\">hg "
dongsheng@627 12729 "outgoing</command>, and <command role=\"hg-cmd\">hg tip</command>."
dongsheng@627 12730 msgstr ""
dongsheng@627 12731
dongsheng@627 12732 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12733 #: ../en/ch10-template.xml:72
dongsheng@627 12734 msgid ""
dongsheng@627 12735 "As I write this manual, these are so far the only commands that support "
dongsheng@627 12736 "styles and templates. Since these are the most important commands that need "
dongsheng@627 12737 "customisable output, there has been little pressure from the Mercurial user "
dongsheng@627 12738 "community to add style and template support to other commands."
dongsheng@627 12739 msgstr ""
dongsheng@627 12740
dongsheng@627 12741 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 12742 #: ../en/ch10-template.xml:80
dongsheng@627 12743 msgid "The basics of templating"
dongsheng@636 12744 msgstr "模版基础"
dongsheng@627 12745
dongsheng@627 12746 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12747 #: ../en/ch10-template.xml:82
dongsheng@627 12748 msgid ""
dongsheng@627 12749 "At its simplest, a Mercurial template is a piece of text. Some of the text "
dongsheng@627 12750 "never changes, while other parts are <emphasis>expanded</emphasis>, or "
dongsheng@627 12751 "replaced with new text, when necessary."
dongsheng@627 12752 msgstr ""
dongsheng@627 12753
dongsheng@627 12754 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12755 #: ../en/ch10-template.xml:87
dongsheng@627 12756 msgid ""
dongsheng@627 12757 "Before we continue, let's look again at a simple example of Mercurial's "
dongsheng@627 12758 "normal output."
dongsheng@627 12759 msgstr ""
dongsheng@627 12760
dongsheng@627 12761 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12762 #: ../en/ch10-template.xml:92
dongsheng@627 12763 msgid ""
dongsheng@627 12764 "Now, let's run the same command, but using a template to change its output."
dongsheng@627 12765 msgstr ""
dongsheng@627 12766
dongsheng@627 12767 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12768 #: ../en/ch10-template.xml:97
dongsheng@627 12769 msgid ""
dongsheng@627 12770 "The example above illustrates the simplest possible template; it's just a "
dongsheng@627 12771 "piece of static text, printed once for each changeset. The <option role=\"hg-"
dongsheng@627 12772 "opt-log\">--template</option> option to the <command role=\"hg-cmd\">hg log</"
dongsheng@627 12773 "command> command tells Mercurial to use the given text as the template when "
dongsheng@627 12774 "printing each changeset."
dongsheng@627 12775 msgstr ""
dongsheng@627 12776
dongsheng@627 12777 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12778 #: ../en/ch10-template.xml:105
dongsheng@627 12779 msgid ""
dongsheng@627 12780 "Notice that the template string above ends with the text <quote><literal>\\n</"
dongsheng@627 12781 "literal></quote>. This is an <emphasis>escape sequence</emphasis>, telling "
dongsheng@627 12782 "Mercurial to print a newline at the end of each template item. If you omit "
songdongsheng@658 12783 "this newline, Mercurial will run each piece of output together. See <xref "
songdongsheng@658 12784 "linkend=\"sec:template:escape\"/> for more details of escape sequences."
dongsheng@627 12785 msgstr ""
dongsheng@627 12786
dongsheng@627 12787 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12788 #: ../en/ch10-template.xml:113
dongsheng@627 12789 msgid ""
dongsheng@627 12790 "A template that prints a fixed string of text all the time isn't very useful; "
dongsheng@627 12791 "let's try something a bit more complex."
dongsheng@627 12792 msgstr ""
dongsheng@627 12793
dongsheng@627 12794 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 12795 #: ../en/ch10-template.xml:119
dongsheng@627 12796 msgid ""
dongsheng@627 12797 "As you can see, the string <quote><literal>{desc}</literal></quote> in the "
dongsheng@627 12798 "template has been replaced in the output with the description of each "
dongsheng@627 12799 "changeset. Every time Mercurial finds text enclosed in curly braces "
dongsheng@627 12800 "(<quote><literal>{</literal></quote> and <quote><literal>}</literal></"
dongsheng@627 12801 "quote>), it will try to replace the braces and text with the expansion of "
dongsheng@627 12802 "whatever is inside. To print a literal curly brace, you must escape it, as "
songdongsheng@658 12803 "described in <xref linkend=\"sec:template:escape\"/>."
dongsheng@627 12804 msgstr ""
dongsheng@627 12805
dongsheng@627 12806 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 12807 #: ../en/ch10-template.xml:131
dongsheng@627 12808 msgid "Common template keywords"
dongsheng@636 12809 msgstr "模版关键字"
dongsheng@627 12810
dongsheng@627 12811 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 12812 #: ../en/ch10-template.xml:133
dongsheng@627 12813 msgid ""
dongsheng@627 12814 "You can start writing simple templates immediately using the keywords below."
dongsheng@627 12815 msgstr ""
dongsheng@627 12816
dongsheng@627 12817 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12818 #: ../en/ch10-template.xml:137
dongsheng@627 12819 msgid ""
dongsheng@627 12820 "<literal role=\"template-keyword\">author</literal>: String. The unmodified "
dongsheng@627 12821 "author of the changeset."
dongsheng@627 12822 msgstr ""
dongsheng@627 12823
dongsheng@627 12824 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12825 #: ../en/ch10-template.xml:141
dongsheng@627 12826 msgid ""
dongsheng@627 12827 "<literal role=\"template-keyword\">branches</literal>: String. The name of "
dongsheng@627 12828 "the branch on which the changeset was committed. Will be empty if the branch "
dongsheng@627 12829 "name was <literal>default</literal>."
dongsheng@627 12830 msgstr ""
dongsheng@627 12831
dongsheng@627 12832 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12833 #: ../en/ch10-template.xml:147
dongsheng@627 12834 msgid ""
dongsheng@627 12835 "<literal role=\"template-keyword\">date</literal>: Date information. The "
dongsheng@627 12836 "date when the changeset was committed. This is <emphasis>not</emphasis> "
dongsheng@627 12837 "human-readable; you must pass it through a filter that will render it "
songdongsheng@658 12838 "appropriately. See <xref linkend=\"sec:template:filter\"/> for more "
dongsheng@627 12839 "information on filters. The date is expressed as a pair of numbers. The "
dongsheng@627 12840 "first number is a Unix UTC timestamp (seconds since January 1, 1970); the "
dongsheng@627 12841 "second is the offset of the committer's timezone from UTC, in seconds."
dongsheng@627 12842 msgstr ""
dongsheng@627 12843
dongsheng@627 12844 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12845 #: ../en/ch10-template.xml:158
dongsheng@627 12846 msgid ""
dongsheng@627 12847 "<literal role=\"template-keyword\">desc</literal>: String. The text of the "
dongsheng@627 12848 "changeset description."
dongsheng@627 12849 msgstr ""
dongsheng@627 12850
dongsheng@627 12851 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12852 #: ../en/ch10-template.xml:161
dongsheng@627 12853 msgid ""
dongsheng@627 12854 "<literal role=\"template-keyword\">files</literal>: List of strings. All "
dongsheng@627 12855 "files modified, added, or removed by this changeset."
dongsheng@627 12856 msgstr ""
dongsheng@627 12857
dongsheng@627 12858 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12859 #: ../en/ch10-template.xml:166
dongsheng@627 12860 msgid ""
dongsheng@627 12861 "<literal role=\"template-keyword\">file_adds</literal>: List of strings. "
dongsheng@627 12862 "Files added by this changeset."
dongsheng@627 12863 msgstr ""
dongsheng@627 12864
dongsheng@627 12865 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12866 #: ../en/ch10-template.xml:170
dongsheng@627 12867 msgid ""
dongsheng@627 12868 "<literal role=\"template-keyword\">file_dels</literal>: List of strings. "
dongsheng@627 12869 "Files removed by this changeset."
dongsheng@627 12870 msgstr ""
dongsheng@627 12871
dongsheng@627 12872 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12873 #: ../en/ch10-template.xml:174
dongsheng@627 12874 msgid ""
dongsheng@627 12875 "<literal role=\"template-keyword\">node</literal>: String. The changeset "
dongsheng@627 12876 "identification hash, as a 40-character hexadecimal string."
dongsheng@627 12877 msgstr ""
dongsheng@627 12878
dongsheng@627 12879 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12880 #: ../en/ch10-template.xml:178
dongsheng@627 12881 msgid ""
dongsheng@627 12882 "<literal role=\"template-keyword\">parents</literal>: List of strings. The "
dongsheng@627 12883 "parents of the changeset."
dongsheng@627 12884 msgstr ""
dongsheng@627 12885
dongsheng@627 12886 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12887 #: ../en/ch10-template.xml:182
dongsheng@627 12888 msgid ""
dongsheng@627 12889 "<literal role=\"template-keyword\">rev</literal>: Integer. The repository-"
dongsheng@627 12890 "local changeset revision number."
dongsheng@627 12891 msgstr ""
dongsheng@627 12892
dongsheng@627 12893 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12894 #: ../en/ch10-template.xml:186
dongsheng@627 12895 msgid ""
dongsheng@627 12896 "<literal role=\"template-keyword\">tags</literal>: List of strings. Any tags "
dongsheng@627 12897 "associated with the changeset."
dongsheng@627 12898 msgstr ""
dongsheng@627 12899
dongsheng@627 12900 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 12901 #: ../en/ch10-template.xml:191
dongsheng@627 12902 msgid ""
dongsheng@627 12903 "A few simple experiments will show us what to expect when we use these "
dongsheng@627 12904 "keywords; you can see the results below."
dongsheng@627 12905 msgstr ""
dongsheng@627 12906
dongsheng@627 12907 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 12908 #: ../en/ch10-template.xml:196
dongsheng@627 12909 msgid ""
dongsheng@627 12910 "As we noted above, the date keyword does not produce human-readable output, "
dongsheng@627 12911 "so we must treat it specially. This involves using a <emphasis>filter</"
songdongsheng@658 12912 "emphasis>, about which more in <xref linkend=\"sec:template:filter\"/>."
dongsheng@627 12913 msgstr ""
dongsheng@627 12914
dongsheng@627 12915 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 12916 #: ../en/ch10-template.xml:205
dongsheng@627 12917 msgid "Escape sequences"
dongsheng@636 12918 msgstr "转义序列"
dongsheng@627 12919
dongsheng@627 12920 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 12921 #: ../en/ch10-template.xml:207
dongsheng@627 12922 msgid ""
dongsheng@627 12923 "Mercurial's templating engine recognises the most commonly used escape "
dongsheng@627 12924 "sequences in strings. When it sees a backslash (<quote><literal>\\</"
dongsheng@627 12925 "literal></quote>) character, it looks at the following character and "
dongsheng@627 12926 "substitutes the two characters with a single replacement, as described below."
dongsheng@627 12927 msgstr ""
dongsheng@627 12928
dongsheng@627 12929 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12930 #: ../en/ch10-template.xml:214
dongsheng@650 12931 msgid ""
dongsheng@650 12932 "<literal>\\</literal>: Backslash, <quote><literal>\\</literal></quote>, ASCII "
dongsheng@650 12933 "134."
dongsheng@627 12934 msgstr ""
dongsheng@627 12935
dongsheng@627 12936 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12937 #: ../en/ch10-template.xml:218
dongsheng@650 12938 msgid "<literal>\\n</literal>: Newline, ASCII 12."
dongsheng@627 12939 msgstr ""
dongsheng@627 12940
dongsheng@627 12941 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12942 #: ../en/ch10-template.xml:221
dongsheng@650 12943 msgid "<literal>\\r</literal>: Carriage return, ASCII 15."
dongsheng@627 12944 msgstr ""
dongsheng@627 12945
dongsheng@627 12946 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12947 #: ../en/ch10-template.xml:224
dongsheng@650 12948 msgid "<literal>\\t</literal>: Tab, ASCII 11."
dongsheng@627 12949 msgstr ""
dongsheng@627 12950
dongsheng@627 12951 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12952 #: ../en/ch10-template.xml:227
dongsheng@650 12953 msgid "<literal>\\v</literal>: Vertical tab, ASCII 13."
dongsheng@627 12954 msgstr ""
dongsheng@627 12955
dongsheng@627 12956 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12957 #: ../en/ch10-template.xml:230
dongsheng@650 12958 msgid ""
dongsheng@650 12959 "<literal>{</literal>: Open curly brace, <quote><literal>{</literal></quote>, "
dongsheng@650 12960 "ASCII 173."
dongsheng@627 12961 msgstr ""
dongsheng@627 12962
dongsheng@627 12963 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 12964 #: ../en/ch10-template.xml:234
dongsheng@650 12965 msgid ""
dongsheng@650 12966 "<literal>}</literal>: Close curly brace, <quote><literal>}</literal></quote>, "
dongsheng@650 12967 "ASCII 175."
dongsheng@650 12968 msgstr ""
dongsheng@650 12969
dongsheng@650 12970 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 12971 #: ../en/ch10-template.xml:239
dongsheng@627 12972 msgid ""
dongsheng@627 12973 "As indicated above, if you want the expansion of a template to contain a "
dongsheng@627 12974 "literal <quote><literal>\\</literal></quote>, <quote><literal>{</literal></"
dongsheng@627 12975 "quote>, or <quote><literal>{</literal></quote> character, you must escape it."
dongsheng@627 12976 msgstr ""
dongsheng@627 12977
dongsheng@627 12978 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 12979 #: ../en/ch10-template.xml:247
dongsheng@627 12980 msgid "Filtering keywords to change their results"
dongsheng@636 12981 msgstr "通过过滤关键字来修改输出结果"
dongsheng@627 12982
dongsheng@627 12983 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 12984 #: ../en/ch10-template.xml:249
dongsheng@627 12985 msgid ""
dongsheng@627 12986 "Some of the results of template expansion are not immediately easy to use. "
dongsheng@627 12987 "Mercurial lets you specify an optional chain of <emphasis>filters</emphasis> "
dongsheng@627 12988 "to modify the result of expanding a keyword. You have already seen a common "
dongsheng@627 12989 "filter, <literal role=\"template-kw-filt-date\">isodate</literal>, in action "
dongsheng@627 12990 "above, to make a date readable."
dongsheng@627 12991 msgstr ""
dongsheng@627 12992
dongsheng@627 12993 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 12994 #: ../en/ch10-template.xml:256
dongsheng@627 12995 msgid ""
dongsheng@627 12996 "Below is a list of the most commonly used filters that Mercurial supports. "
dongsheng@627 12997 "While some filters can be applied to any text, others can only be used in "
dongsheng@627 12998 "specific circumstances. The name of each filter is followed first by an "
dongsheng@627 12999 "indication of where it can be used, then a description of its effect."
dongsheng@627 13000 msgstr ""
dongsheng@627 13001
dongsheng@627 13002 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13003 #: ../en/ch10-template.xml:263
dongsheng@627 13004 msgid ""
dongsheng@627 13005 "<literal role=\"template-filter\">addbreaks</literal>: Any text. Add an XHTML "
dongsheng@627 13006 "<quote><literal>&lt;br/&gt;</literal></quote> tag before the end of every "
dongsheng@627 13007 "line except the last. For example, <quote><literal>foo\\nbar</literal></"
dongsheng@627 13008 "quote> becomes <quote><literal>foo&lt;br/&gt;\\nbar</literal></quote>."
dongsheng@627 13009 msgstr ""
dongsheng@627 13010
dongsheng@627 13011 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13012 #: ../en/ch10-template.xml:270
dongsheng@627 13013 msgid ""
dongsheng@627 13014 "<literal role=\"template-kw-filt-date\">age</literal>: <literal role="
dongsheng@627 13015 "\"template-keyword\">date</literal> keyword. Render the age of the date, "
dongsheng@627 13016 "relative to the current time. Yields a string like <quote><literal>10 "
dongsheng@627 13017 "minutes</literal></quote>."
dongsheng@627 13018 msgstr ""
dongsheng@627 13019
dongsheng@627 13020 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13021 #: ../en/ch10-template.xml:277
dongsheng@627 13022 msgid ""
dongsheng@627 13023 "<literal role=\"template-filter\">basename</literal>: Any text, but most "
dongsheng@627 13024 "useful for the <literal role=\"template-keyword\">files</literal> keyword and "
dongsheng@627 13025 "its relatives. Treat the text as a path, and return the basename. For "
dongsheng@627 13026 "example, <quote><literal>foo/bar/baz</literal></quote> becomes "
dongsheng@627 13027 "<quote><literal>baz</literal></quote>."
dongsheng@627 13028 msgstr ""
dongsheng@627 13029
dongsheng@627 13030 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13031 #: ../en/ch10-template.xml:286
dongsheng@627 13032 msgid ""
dongsheng@627 13033 "<literal role=\"template-kw-filt-date\">date</literal>: <literal role="
dongsheng@627 13034 "\"template-keyword\">date</literal> keyword. Render a date in a similar "
dongsheng@627 13035 "format to the Unix <literal role=\"template-keyword\">date</literal> command, "
dongsheng@627 13036 "but with timezone included. Yields a string like <quote><literal>Mon Sep 04 "
dongsheng@627 13037 "15:13:13 2006 -0700</literal></quote>."
dongsheng@627 13038 msgstr ""
dongsheng@627 13039
dongsheng@627 13040 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13041 #: ../en/ch10-template.xml:294
dongsheng@627 13042 msgid ""
dongsheng@627 13043 "<literal role=\"template-kw-filt-author\">domain</literal>: Any text, but "
dongsheng@627 13044 "most useful for the <literal role=\"template-keyword\">author</literal> "
dongsheng@627 13045 "keyword. Finds the first string that looks like an email address, and "
dongsheng@627 13046 "extract just the domain component. For example, <quote><literal>Bryan "
dongsheng@627 13047 "O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> becomes "
dongsheng@627 13048 "<quote><literal>serpentine.com</literal></quote>."
dongsheng@627 13049 msgstr ""
dongsheng@627 13050
dongsheng@627 13051 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13052 #: ../en/ch10-template.xml:304
dongsheng@627 13053 msgid ""
dongsheng@627 13054 "<literal role=\"template-kw-filt-author\">email</literal>: Any text, but most "
dongsheng@627 13055 "useful for the <literal role=\"template-keyword\">author</literal> keyword. "
dongsheng@627 13056 "Extract the first string that looks like an email address. For example, "
dongsheng@627 13057 "<quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> "
dongsheng@627 13058 "becomes <quote><literal>bos@serpentine.com</literal></quote>."
dongsheng@627 13059 msgstr ""
dongsheng@627 13060
dongsheng@627 13061 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13062 #: ../en/ch10-template.xml:313
dongsheng@627 13063 msgid ""
dongsheng@627 13064 "<literal role=\"template-filter\">escape</literal>: Any text. Replace the "
dongsheng@627 13065 "special XML/XHTML characters <quote><literal>&amp;</literal></quote>, "
dongsheng@627 13066 "<quote><literal>&lt;</literal></quote> and <quote><literal>&gt;</literal></"
dongsheng@627 13067 "quote> with XML entities."
dongsheng@627 13068 msgstr ""
dongsheng@627 13069
dongsheng@627 13070 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13071 #: ../en/ch10-template.xml:321
dongsheng@627 13072 msgid ""
dongsheng@627 13073 "<literal role=\"template-filter\">fill68</literal>: Any text. Wrap the text "
dongsheng@627 13074 "to fit in 68 columns. This is useful before you pass text through the "
dongsheng@627 13075 "<literal role=\"template-filter\">tabindent</literal> filter, and still want "
dongsheng@627 13076 "it to fit in an 80-column fixed-font window."
dongsheng@627 13077 msgstr ""
dongsheng@627 13078
dongsheng@627 13079 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13080 #: ../en/ch10-template.xml:329
dongsheng@627 13081 msgid ""
dongsheng@627 13082 "<literal role=\"template-filter\">fill76</literal>: Any text. Wrap the text "
dongsheng@627 13083 "to fit in 76 columns."
dongsheng@627 13084 msgstr ""
dongsheng@627 13085
dongsheng@627 13086 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13087 #: ../en/ch10-template.xml:333
dongsheng@627 13088 msgid ""
dongsheng@627 13089 "<literal role=\"template-filter\">firstline</literal>: Any text. Yield the "
dongsheng@627 13090 "first line of text, without any trailing newlines."
dongsheng@627 13091 msgstr ""
dongsheng@627 13092
dongsheng@627 13093 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13094 #: ../en/ch10-template.xml:338
dongsheng@627 13095 msgid ""
dongsheng@627 13096 "<literal role=\"template-kw-filt-date\">hgdate</literal>: <literal role="
dongsheng@627 13097 "\"template-keyword\">date</literal> keyword. Render the date as a pair of "
dongsheng@627 13098 "readable numbers. Yields a string like <quote><literal>1157407993 25200</"
dongsheng@627 13099 "literal></quote>."
dongsheng@627 13100 msgstr ""
dongsheng@627 13101
dongsheng@627 13102 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13103 #: ../en/ch10-template.xml:345
dongsheng@627 13104 msgid ""
dongsheng@627 13105 "<literal role=\"template-kw-filt-date\">isodate</literal>: <literal role="
dongsheng@627 13106 "\"template-keyword\">date</literal> keyword. Render the date as a text "
dongsheng@627 13107 "string in ISO 8601 format. Yields a string like <quote><literal>2006-09-04 "
dongsheng@627 13108 "15:13:13 -0700</literal></quote>."
dongsheng@627 13109 msgstr ""
dongsheng@627 13110
dongsheng@627 13111 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13112 #: ../en/ch10-template.xml:352
dongsheng@627 13113 msgid ""
dongsheng@627 13114 "<literal role=\"template-filter\">obfuscate</literal>: Any text, but most "
dongsheng@627 13115 "useful for the <literal role=\"template-keyword\">author</literal> keyword. "
dongsheng@627 13116 "Yield the input text rendered as a sequence of XML entities. This helps to "
dongsheng@627 13117 "defeat some particularly stupid screen-scraping email harvesting spambots."
dongsheng@627 13118 msgstr ""
dongsheng@627 13119
dongsheng@627 13120 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13121 #: ../en/ch10-template.xml:360
dongsheng@627 13122 msgid ""
dongsheng@627 13123 "<literal role=\"template-kw-filt-author\">person</literal>: Any text, but "
dongsheng@627 13124 "most useful for the <literal role=\"template-keyword\">author</literal> "
dongsheng@627 13125 "keyword. Yield the text before an email address. For example, "
dongsheng@627 13126 "<quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> "
dongsheng@627 13127 "becomes <quote><literal>Bryan O'Sullivan</literal></quote>."
dongsheng@627 13128 msgstr ""
dongsheng@627 13129
dongsheng@627 13130 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13131 #: ../en/ch10-template.xml:369
dongsheng@627 13132 msgid ""
dongsheng@627 13133 "<literal role=\"template-kw-filt-date\">rfc822date</literal>: <literal role="
dongsheng@627 13134 "\"template-keyword\">date</literal> keyword. Render a date using the same "
dongsheng@627 13135 "format used in email headers. Yields a string like <quote><literal>Mon, 04 "
dongsheng@627 13136 "Sep 2006 15:13:13 -0700</literal></quote>."
dongsheng@627 13137 msgstr ""
dongsheng@627 13138
dongsheng@627 13139 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13140 #: ../en/ch10-template.xml:376
dongsheng@627 13141 msgid ""
dongsheng@627 13142 "<literal role=\"template-kw-filt-node\">short</literal>: Changeset hash. "
dongsheng@627 13143 "Yield the short form of a changeset hash, i.e. a 12-character hexadecimal "
dongsheng@627 13144 "string."
dongsheng@627 13145 msgstr ""
dongsheng@627 13146
dongsheng@627 13147 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13148 #: ../en/ch10-template.xml:381
dongsheng@627 13149 msgid ""
dongsheng@627 13150 "<literal role=\"template-kw-filt-date\">shortdate</literal>: <literal role="
dongsheng@627 13151 "\"template-keyword\">date</literal> keyword. Render the year, month, and day "
dongsheng@627 13152 "of the date. Yields a string like <quote><literal>2006-09-04</literal></"
dongsheng@627 13153 "quote>."
dongsheng@627 13154 msgstr ""
dongsheng@627 13155
dongsheng@627 13156 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13157 #: ../en/ch10-template.xml:387
dongsheng@627 13158 msgid ""
dongsheng@627 13159 "<literal role=\"template-filter\">strip</literal>: Any text. Strip all "
dongsheng@627 13160 "leading and trailing whitespace from the string."
dongsheng@627 13161 msgstr ""
dongsheng@627 13162
dongsheng@627 13163 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13164 #: ../en/ch10-template.xml:391
dongsheng@627 13165 msgid ""
dongsheng@627 13166 "<literal role=\"template-filter\">tabindent</literal>: Any text. Yield the "
dongsheng@627 13167 "text, with every line except the first starting with a tab character."
dongsheng@627 13168 msgstr ""
dongsheng@627 13169
dongsheng@627 13170 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13171 #: ../en/ch10-template.xml:396
dongsheng@627 13172 msgid ""
dongsheng@627 13173 "<literal role=\"template-filter\">urlescape</literal>: Any text. Escape all "
dongsheng@627 13174 "characters that are considered <quote>special</quote> by URL parsers. For "
dongsheng@627 13175 "example, <literal>foo bar</literal> becomes <literal>foo%20bar</literal>."
dongsheng@627 13176 msgstr ""
dongsheng@627 13177
dongsheng@627 13178 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 13179 #: ../en/ch10-template.xml:403
dongsheng@627 13180 msgid ""
dongsheng@627 13181 "<literal role=\"template-kw-filt-author\">user</literal>: Any text, but most "
dongsheng@627 13182 "useful for the <literal role=\"template-keyword\">author</literal> keyword. "
dongsheng@627 13183 "Return the <quote>user</quote> portion of an email address. For example, "
dongsheng@627 13184 "<quote><literal>Bryan O'Sullivan &lt;bos@serpentine.com&gt;</literal></quote> "
dongsheng@627 13185 "becomes <quote><literal>bos</literal></quote>."
dongsheng@627 13186 msgstr ""
dongsheng@627 13187
dongsheng@627 13188 #. type: Content of: <book><chapter><sect1><note><para>
songdongsheng@658 13189 #: ../en/ch10-template.xml:416
dongsheng@627 13190 msgid ""
dongsheng@627 13191 "If you try to apply a filter to a piece of data that it cannot process, "
dongsheng@627 13192 "Mercurial will fail and print a Python exception. For example, trying to run "
dongsheng@627 13193 "the output of the <literal role=\"template-keyword\">desc</literal> keyword "
dongsheng@627 13194 "into the <literal role=\"template-kw-filt-date\">isodate</literal> filter is "
dongsheng@627 13195 "not a good idea."
dongsheng@627 13196 msgstr ""
dongsheng@627 13197
dongsheng@627 13198 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 13199 #: ../en/ch10-template.xml:425
dongsheng@627 13200 msgid "Combining filters"
dongsheng@636 13201 msgstr "组合过滤器"
dongsheng@627 13202
dongsheng@627 13203 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13204 #: ../en/ch10-template.xml:427
dongsheng@627 13205 msgid ""
dongsheng@627 13206 "It is easy to combine filters to yield output in the form you would like. "
dongsheng@627 13207 "The following chain of filters tidies up a description, then makes sure that "
dongsheng@627 13208 "it fits cleanly into 68 columns, then indents it by a further 8 characters "
dongsheng@627 13209 "(at least on Unix-like systems, where a tab is conventionally 8 characters "
dongsheng@627 13210 "wide)."
dongsheng@627 13211 msgstr ""
dongsheng@627 13212
dongsheng@627 13213 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13214 #: ../en/ch10-template.xml:436
dongsheng@627 13215 msgid ""
dongsheng@627 13216 "Note the use of <quote><literal>\\t</literal></quote> (a tab character) in "
dongsheng@627 13217 "the template to force the first line to be indented; this is necessary since "
dongsheng@627 13218 "<literal role=\"template-keyword\">tabindent</literal> indents all lines "
dongsheng@627 13219 "<emphasis>except</emphasis> the first."
dongsheng@627 13220 msgstr ""
dongsheng@627 13221
dongsheng@627 13222 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13223 #: ../en/ch10-template.xml:442
dongsheng@627 13224 msgid ""
dongsheng@627 13225 "Keep in mind that the order of filters in a chain is significant. The first "
dongsheng@627 13226 "filter is applied to the result of the keyword; the second to the result of "
dongsheng@627 13227 "the first filter; and so on. For example, using <literal>fill68|tabindent</"
dongsheng@627 13228 "literal> gives very different results from <literal>tabindent|fill68</"
dongsheng@627 13229 "literal>."
dongsheng@627 13230 msgstr ""
dongsheng@627 13231
dongsheng@627 13232 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 13233 #: ../en/ch10-template.xml:453
dongsheng@627 13234 msgid "From templates to styles"
dongsheng@636 13235 msgstr "从模版到样式"
dongsheng@627 13236
dongsheng@627 13237 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 13238 #: ../en/ch10-template.xml:455
dongsheng@627 13239 msgid ""
dongsheng@627 13240 "A command line template provides a quick and simple way to format some "
dongsheng@627 13241 "output. Templates can become verbose, though, and it's useful to be able to "
dongsheng@627 13242 "give a template a name. A style file is a template with a name, stored in a "
dongsheng@627 13243 "file."
dongsheng@627 13244 msgstr ""
dongsheng@627 13245
dongsheng@627 13246 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 13247 #: ../en/ch10-template.xml:460
dongsheng@627 13248 msgid ""
dongsheng@627 13249 "More than that, using a style file unlocks the power of Mercurial's "
dongsheng@627 13250 "templating engine in ways that are not possible using the command line "
dongsheng@627 13251 "<option role=\"hg-opt-log\">--template</option> option."
dongsheng@627 13252 msgstr ""
dongsheng@627 13253
dongsheng@627 13254 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 13255 #: ../en/ch10-template.xml:466
dongsheng@627 13256 msgid "The simplest of style files"
dongsheng@636 13257 msgstr "最简单的样式文件"
dongsheng@627 13258
dongsheng@627 13259 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13260 #: ../en/ch10-template.xml:468
dongsheng@627 13261 msgid "Our simple style file contains just one line:"
dongsheng@627 13262 msgstr ""
dongsheng@627 13263
dongsheng@627 13264 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13265 #: ../en/ch10-template.xml:472
dongsheng@627 13266 msgid ""
dongsheng@627 13267 "This tells Mercurial, <quote>if you're printing a changeset, use the text on "
dongsheng@627 13268 "the right as the template</quote>."
dongsheng@627 13269 msgstr ""
dongsheng@627 13270
dongsheng@627 13271 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 13272 #: ../en/ch10-template.xml:478
dongsheng@627 13273 msgid "Style file syntax"
dongsheng@636 13274 msgstr "样式文件语法"
dongsheng@627 13275
dongsheng@627 13276 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13277 #: ../en/ch10-template.xml:480
dongsheng@627 13278 msgid "The syntax rules for a style file are simple."
dongsheng@627 13279 msgstr ""
dongsheng@627 13280
dongsheng@627 13281 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13282 #: ../en/ch10-template.xml:483
dongsheng@627 13283 msgid "The file is processed one line at a time."
dongsheng@627 13284 msgstr ""
dongsheng@627 13285
dongsheng@627 13286 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13287 #: ../en/ch10-template.xml:486
dongsheng@627 13288 msgid "Leading and trailing white space are ignored."
dongsheng@627 13289 msgstr ""
dongsheng@627 13290
dongsheng@627 13291 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13292 #: ../en/ch10-template.xml:489
songdongsheng@658 13293 msgid "Empty lines are skipped."
songdongsheng@658 13294 msgstr ""
songdongsheng@658 13295
songdongsheng@658 13296 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 13297 #: ../en/ch10-template.xml:491
dongsheng@627 13298 msgid ""
dongsheng@627 13299 "If a line starts with either of the characters <quote><literal>#</literal></"
dongsheng@627 13300 "quote> or <quote><literal>;</literal></quote>, the entire line is treated as "
dongsheng@627 13301 "a comment, and skipped as if empty."
dongsheng@627 13302 msgstr ""
dongsheng@627 13303
dongsheng@627 13304 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13305 #: ../en/ch10-template.xml:496
dongsheng@627 13306 msgid ""
dongsheng@627 13307 "A line starts with a keyword. This must start with an alphabetic character "
dongsheng@627 13308 "or underscore, and can subsequently contain any alphanumeric character or "
dongsheng@627 13309 "underscore. (In regexp notation, a keyword must match <literal>[A-Za-z_][A-"
dongsheng@627 13310 "Za-z0-9_]*</literal>.)"
dongsheng@627 13311 msgstr ""
dongsheng@627 13312
dongsheng@627 13313 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13314 #: ../en/ch10-template.xml:502
dongsheng@627 13315 msgid ""
dongsheng@627 13316 "The next element must be an <quote><literal>=</literal></quote> character, "
dongsheng@627 13317 "which can be preceded or followed by an arbitrary amount of white space."
dongsheng@627 13318 msgstr ""
dongsheng@627 13319
dongsheng@627 13320 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13321 #: ../en/ch10-template.xml:507
dongsheng@627 13322 msgid ""
dongsheng@627 13323 "If the rest of the line starts and ends with matching quote characters "
dongsheng@627 13324 "(either single or double quote), it is treated as a template body."
dongsheng@627 13325 msgstr ""
dongsheng@627 13326
dongsheng@627 13327 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13328 #: ../en/ch10-template.xml:511
dongsheng@627 13329 msgid ""
dongsheng@627 13330 "If the rest of the line <emphasis>does not</emphasis> start with a quote "
dongsheng@627 13331 "character, it is treated as the name of a file; the contents of this file "
dongsheng@627 13332 "will be read and used as a template body."
dongsheng@627 13333 msgstr ""
dongsheng@627 13334
dongsheng@627 13335 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 13336 #: ../en/ch10-template.xml:520
dongsheng@627 13337 msgid "Style files by example"
dongsheng@636 13338 msgstr "样式文件例子"
dongsheng@627 13339
dongsheng@627 13340 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 13341 #: ../en/ch10-template.xml:522
dongsheng@627 13342 msgid ""
dongsheng@627 13343 "To illustrate how to write a style file, we will construct a few by example. "
dongsheng@627 13344 "Rather than provide a complete style file and walk through it, we'll mirror "
dongsheng@627 13345 "the usual process of developing a style file by starting with something very "
dongsheng@627 13346 "simple, and walking through a series of successively more complete examples."
dongsheng@627 13347 msgstr ""
dongsheng@627 13348
dongsheng@627 13349 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 13350 #: ../en/ch10-template.xml:529
dongsheng@627 13351 msgid "Identifying mistakes in style files"
dongsheng@636 13352 msgstr "在样式文件中定位错误"
dongsheng@627 13353
dongsheng@627 13354 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13355 #: ../en/ch10-template.xml:531
dongsheng@627 13356 msgid ""
dongsheng@627 13357 "If Mercurial encounters a problem in a style file you are working on, it "
dongsheng@627 13358 "prints a terse error message that, once you figure out what it means, is "
dongsheng@627 13359 "actually quite useful."
dongsheng@627 13360 msgstr ""
dongsheng@627 13361
dongsheng@627 13362 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13363 #: ../en/ch10-template.xml:537
dongsheng@627 13364 msgid ""
dongsheng@627 13365 "Notice that <filename>broken.style</filename> attempts to define a "
dongsheng@627 13366 "<literal>changeset</literal> keyword, but forgets to give any content for it. "
dongsheng@627 13367 "When instructed to use this style file, Mercurial promptly complains."
dongsheng@627 13368 msgstr ""
dongsheng@627 13369
dongsheng@627 13370 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13371 #: ../en/ch10-template.xml:544
dongsheng@627 13372 msgid "This error message looks intimidating, but it is not too hard to follow."
dongsheng@627 13373 msgstr ""
dongsheng@627 13374
dongsheng@627 13375 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13376 #: ../en/ch10-template.xml:548
dongsheng@627 13377 msgid ""
dongsheng@627 13378 "The first component is simply Mercurial's way of saying <quote>I am giving "
dongsheng@627 13379 "up</quote>."
dongsheng@627 13380 msgstr ""
dongsheng@627 13381
dongsheng@627 13382 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13383 #: ../en/ch10-template.xml:552
dongsheng@627 13384 msgid "Next comes the name of the style file that contains the error."
dongsheng@627 13385 msgstr ""
dongsheng@627 13386
dongsheng@627 13387 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13388 #: ../en/ch10-template.xml:556
dongsheng@627 13389 msgid ""
dongsheng@627 13390 "Following the file name is the line number where the error was encountered."
dongsheng@627 13391 msgstr ""
dongsheng@627 13392
dongsheng@627 13393 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13394 #: ../en/ch10-template.xml:560
dongsheng@627 13395 msgid "Finally, a description of what went wrong."
dongsheng@627 13396 msgstr ""
dongsheng@627 13397
dongsheng@627 13398 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13399 #: ../en/ch10-template.xml:564
dongsheng@627 13400 msgid ""
dongsheng@627 13401 "The description of the problem is not always clear (as in this case), but "
dongsheng@627 13402 "even when it is cryptic, it is almost always trivial to visually inspect the "
dongsheng@627 13403 "offending line in the style file and see what is wrong."
dongsheng@627 13404 msgstr ""
dongsheng@627 13405
dongsheng@627 13406 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 13407 #: ../en/ch10-template.xml:572
dongsheng@627 13408 msgid "Uniquely identifying a repository"
dongsheng@636 13409 msgstr "版本库的唯一标识"
dongsheng@627 13410
dongsheng@627 13411 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13412 #: ../en/ch10-template.xml:574
dongsheng@627 13413 msgid ""
dongsheng@627 13414 "If you would like to be able to identify a Mercurial repository <quote>fairly "
dongsheng@627 13415 "uniquely</quote> using a short string as an identifier, you can use the first "
dongsheng@627 13416 "revision in the repository."
dongsheng@627 13417 msgstr ""
dongsheng@627 13418
dongsheng@627 13419 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13420 #: ../en/ch10-template.xml:581
dongsheng@627 13421 msgid ""
dongsheng@627 13422 "This is not guaranteed to be unique, but it is nevertheless useful in many "
dongsheng@627 13423 "cases."
dongsheng@627 13424 msgstr ""
dongsheng@627 13425
dongsheng@627 13426 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13427 #: ../en/ch10-template.xml:584
dongsheng@627 13428 msgid ""
dongsheng@627 13429 "It will not work in a completely empty repository, because such a repository "
dongsheng@627 13430 "does not have a revision zero."
dongsheng@627 13431 msgstr ""
dongsheng@627 13432
dongsheng@627 13433 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13434 #: ../en/ch10-template.xml:588
dongsheng@627 13435 msgid ""
dongsheng@627 13436 "Neither will it work in the (extremely rare) case where a repository is a "
dongsheng@627 13437 "merge of two or more formerly independent repositories, and you still have "
dongsheng@627 13438 "those repositories around."
dongsheng@627 13439 msgstr ""
dongsheng@627 13440
dongsheng@627 13441 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13442 #: ../en/ch10-template.xml:593
dongsheng@627 13443 msgid "Here are some uses to which you could put this identifier:"
dongsheng@627 13444 msgstr ""
dongsheng@627 13445
dongsheng@627 13446 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13447 #: ../en/ch10-template.xml:596
dongsheng@627 13448 msgid ""
dongsheng@627 13449 "As a key into a table for a database that manages repositories on a server."
dongsheng@627 13450 msgstr ""
dongsheng@627 13451
dongsheng@627 13452 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13453 #: ../en/ch10-template.xml:599
dongsheng@627 13454 msgid ""
dongsheng@627 13455 "As half of a {<emphasis>repository ID</emphasis>, <emphasis>revision ID</"
dongsheng@627 13456 "emphasis>} tuple. Save this information away when you run an automated build "
dongsheng@627 13457 "or other activity, so that you can <quote>replay</quote> the build later if "
dongsheng@627 13458 "necessary."
dongsheng@627 13459 msgstr ""
dongsheng@627 13460
dongsheng@627 13461 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 13462 #: ../en/ch10-template.xml:608
dongsheng@627 13463 msgid "Mimicking Subversion's output"
dongsheng@636 13464 msgstr "模仿 Subversion 的输出"
dongsheng@627 13465
dongsheng@627 13466 #
dongsheng@627 13467 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13468 #: ../en/ch10-template.xml:610
dongsheng@627 13469 msgid ""
dongsheng@627 13470 "Let's try to emulate the default output format used by another revision "
dongsheng@627 13471 "control tool, Subversion."
dongsheng@627 13472 msgstr ""
dongsheng@627 13473
dongsheng@627 13474 #
dongsheng@627 13475 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13476 #: ../en/ch10-template.xml:615
dongsheng@627 13477 msgid ""
dongsheng@627 13478 "Since Subversion's output style is fairly simple, it is easy to copy-and-"
dongsheng@627 13479 "paste a hunk of its output into a file, and replace the text produced above "
dongsheng@627 13480 "by Subversion with the template values we'd like to see expanded."
dongsheng@627 13481 msgstr ""
dongsheng@627 13482
dongsheng@627 13483 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13484 #: ../en/ch10-template.xml:622
dongsheng@627 13485 msgid ""
dongsheng@627 13486 "There are a few small ways in which this template deviates from the output "
dongsheng@627 13487 "produced by Subversion."
dongsheng@627 13488 msgstr ""
dongsheng@627 13489
dongsheng@627 13490 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13491 #: ../en/ch10-template.xml:625
dongsheng@627 13492 msgid ""
dongsheng@627 13493 "Subversion prints a <quote>readable</quote> date (the <quote><literal>Wed, 27 "
dongsheng@627 13494 "Sep 2006</literal></quote> in the example output above) in parentheses. "
dongsheng@627 13495 "Mercurial's templating engine does not provide a way to display a date in "
dongsheng@627 13496 "this format without also printing the time and time zone."
dongsheng@627 13497 msgstr ""
dongsheng@627 13498
dongsheng@627 13499 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13500 #: ../en/ch10-template.xml:632
dongsheng@627 13501 msgid ""
dongsheng@627 13502 "We emulate Subversion's printing of <quote>separator</quote> lines full of "
dongsheng@627 13503 "<quote><literal>-</literal></quote> characters by ending the template with "
dongsheng@627 13504 "such a line. We use the templating engine's <literal role=\"template-keyword"
dongsheng@627 13505 "\">header</literal> keyword to print a separator line as the first line of "
dongsheng@627 13506 "output (see below), thus achieving similar output to Subversion."
dongsheng@627 13507 msgstr ""
dongsheng@627 13508
dongsheng@627 13509 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 13510 #: ../en/ch10-template.xml:641
dongsheng@627 13511 msgid ""
dongsheng@627 13512 "Subversion's output includes a count in the header of the number of lines in "
dongsheng@627 13513 "the commit message. We cannot replicate this in Mercurial; the templating "
dongsheng@627 13514 "engine does not currently provide a filter that counts the number of lines "
dongsheng@627 13515 "the template generates."
dongsheng@627 13516 msgstr ""
dongsheng@627 13517
dongsheng@627 13518 #
dongsheng@627 13519 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13520 #: ../en/ch10-template.xml:647
dongsheng@627 13521 msgid ""
dongsheng@627 13522 "It took me no more than a minute or two of work to replace literal text from "
dongsheng@627 13523 "an example of Subversion's output with some keywords and filters to give the "
dongsheng@627 13524 "template above. The style file simply refers to the template."
dongsheng@627 13525 msgstr ""
dongsheng@627 13526
dongsheng@627 13527 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 13528 #: ../en/ch10-template.xml:654
dongsheng@627 13529 msgid ""
dongsheng@627 13530 "We could have included the text of the template file directly in the style "
dongsheng@627 13531 "file by enclosing it in quotes and replacing the newlines with "
dongsheng@627 13532 "<quote><literal>\\n</literal></quote> sequences, but it would have made the "
dongsheng@627 13533 "style file too difficult to read. Readability is a good guide when you're "
dongsheng@627 13534 "trying to decide whether some text belongs in a style file, or in a template "
dongsheng@627 13535 "file that the style file points to. If the style file will look too big or "
dongsheng@627 13536 "cluttered if you insert a literal piece of text, drop it into a template "
dongsheng@627 13537 "instead."
dongsheng@627 13538 msgstr ""
dongsheng@627 13539
dongsheng@627 13540 #. type: Content of: <book><chapter><title>
dongsheng@650 13541 #: ../en/ch11-mq.xml:5
dongsheng@627 13542 msgid "Managing change with Mercurial Queues"
dongsheng@627 13543 msgstr "使用 MQ 管理修改"
dongsheng@627 13544
dongsheng@627 13545 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 13546 #: ../en/ch11-mq.xml:8
dongsheng@627 13547 msgid "The patch management problem"
dongsheng@636 13548 msgstr "补丁的管理问题"
dongsheng@627 13549
dongsheng@627 13550 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13551 #: ../en/ch11-mq.xml:10
dongsheng@627 13552 msgid ""
dongsheng@627 13553 "Here is a common scenario: you need to install a software package from "
dongsheng@627 13554 "source, but you find a bug that you must fix in the source before you can "
dongsheng@627 13555 "start using the package. You make your changes, forget about the package for "
dongsheng@627 13556 "a while, and a few months later you need to upgrade to a newer version of the "
dongsheng@627 13557 "package. If the newer version of the package still has the bug, you must "
dongsheng@627 13558 "extract your fix from the older source tree and apply it against the newer "
dongsheng@627 13559 "version. This is a tedious task, and it's easy to make mistakes."
dongsheng@627 13560 msgstr ""
dongsheng@627 13561
dongsheng@627 13562 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13563 #: ../en/ch11-mq.xml:20
dongsheng@627 13564 msgid ""
dongsheng@627 13565 "This is a simple case of the <quote>patch management</quote> problem. You "
dongsheng@627 13566 "have an <quote>upstream</quote> source tree that you can't change; you need "
dongsheng@627 13567 "to make some local changes on top of the upstream tree; and you'd like to be "
dongsheng@627 13568 "able to keep those changes separate, so that you can apply them to newer "
dongsheng@627 13569 "versions of the upstream source."
dongsheng@627 13570 msgstr ""
dongsheng@627 13571
dongsheng@627 13572 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13573 #: ../en/ch11-mq.xml:27
dongsheng@627 13574 msgid ""
dongsheng@627 13575 "The patch management problem arises in many situations. Probably the most "
dongsheng@627 13576 "visible is that a user of an open source software project will contribute a "
dongsheng@627 13577 "bug fix or new feature to the project's maintainers in the form of a patch."
dongsheng@627 13578 msgstr ""
dongsheng@627 13579
dongsheng@627 13580 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13581 #: ../en/ch11-mq.xml:32
dongsheng@627 13582 msgid ""
dongsheng@627 13583 "Distributors of operating systems that include open source software often "
dongsheng@627 13584 "need to make changes to the packages they distribute so that they will build "
dongsheng@627 13585 "properly in their environments."
dongsheng@627 13586 msgstr ""
dongsheng@627 13587
dongsheng@627 13588 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13589 #: ../en/ch11-mq.xml:37
dongsheng@627 13590 msgid ""
dongsheng@627 13591 "When you have few changes to maintain, it is easy to manage a single patch "
dongsheng@627 13592 "using the standard <command>diff</command> and <command>patch</command> "
songdongsheng@658 13593 "programs (see <xref linkend=\"sec:mq:patch\"/> for a discussion of these "
songdongsheng@658 13594 "tools). Once the number of changes grows, it starts to make sense to maintain "
songdongsheng@658 13595 "patches as discrete <quote>chunks of work,</quote> so that for example a "
songdongsheng@658 13596 "single patch will contain only one bug fix (the patch might modify several "
songdongsheng@658 13597 "files, but it's doing <quote>only one thing</quote>), and you may have a "
songdongsheng@658 13598 "number of such patches for different bugs you need fixed and local changes "
songdongsheng@658 13599 "you require. In this situation, if you submit a bug fix patch to the "
dongsheng@627 13600 "upstream maintainers of a package and they include your fix in a subsequent "
dongsheng@627 13601 "release, you can simply drop that single patch when you're updating to the "
dongsheng@627 13602 "newer release."
dongsheng@627 13603 msgstr ""
dongsheng@627 13604
dongsheng@627 13605 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13606 #: ../en/ch11-mq.xml:52
dongsheng@627 13607 msgid ""
dongsheng@627 13608 "Maintaining a single patch against an upstream tree is a little tedious and "
dongsheng@627 13609 "error-prone, but not difficult. However, the complexity of the problem grows "
dongsheng@627 13610 "rapidly as the number of patches you have to maintain increases. With more "
dongsheng@627 13611 "than a tiny number of patches in hand, understanding which ones you have "
dongsheng@627 13612 "applied and maintaining them moves from messy to overwhelming."
dongsheng@627 13613 msgstr ""
dongsheng@627 13614
dongsheng@627 13615 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13616 #: ../en/ch11-mq.xml:59
dongsheng@627 13617 msgid ""
dongsheng@627 13618 "Fortunately, Mercurial includes a powerful extension, Mercurial Queues (or "
dongsheng@627 13619 "simply <quote>MQ</quote>), that massively simplifies the patch management "
dongsheng@627 13620 "problem."
dongsheng@627 13621 msgstr ""
dongsheng@627 13622
dongsheng@627 13623 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 13624 #: ../en/ch11-mq.xml:65
dongsheng@627 13625 msgid "The prehistory of Mercurial Queues"
dongsheng@636 13626 msgstr "MQ 的历史"
dongsheng@627 13627
dongsheng@627 13628 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13629 #: ../en/ch11-mq.xml:67
dongsheng@627 13630 msgid ""
dongsheng@627 13631 "During the late 1990s, several Linux kernel developers started to maintain "
dongsheng@627 13632 "<quote>patch series</quote> that modified the behaviour of the Linux kernel. "
dongsheng@627 13633 "Some of these series were focused on stability, some on feature coverage, and "
dongsheng@627 13634 "others were more speculative."
dongsheng@627 13635 msgstr ""
dongsheng@627 13636
dongsheng@627 13637 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13638 #: ../en/ch11-mq.xml:73
dongsheng@627 13639 msgid ""
dongsheng@627 13640 "The sizes of these patch series grew rapidly. In 2002, Andrew Morton "
dongsheng@627 13641 "published some shell scripts he had been using to automate the task of "
dongsheng@627 13642 "managing his patch queues. Andrew was successfully using these scripts to "
dongsheng@627 13643 "manage hundreds (sometimes thousands) of patches on top of the Linux kernel."
dongsheng@627 13644 msgstr ""
dongsheng@627 13645
dongsheng@627 13646 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 13647 #: ../en/ch11-mq.xml:80
dongsheng@627 13648 msgid "A patchwork quilt"
dongsheng@627 13649 msgstr ""
dongsheng@627 13650
dongsheng@627 13651 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13652 #: ../en/ch11-mq.xml:82
dongsheng@627 13653 msgid ""
dongsheng@627 13654 "In early 2003, Andreas Gruenbacher and Martin Quinson borrowed the approach "
dongsheng@627 13655 "of Andrew's scripts and published a tool called <quote>patchwork quilt</"
dongsheng@627 13656 "quote> <citation>web:quilt</citation>, or simply <quote>quilt</quote> (see "
dongsheng@627 13657 "<citation>gruenbacher:2005</citation> for a paper describing it). Because "
dongsheng@627 13658 "quilt substantially automated patch management, it rapidly gained a large "
dongsheng@627 13659 "following among open source software developers."
dongsheng@627 13660 msgstr ""
dongsheng@627 13661
dongsheng@627 13662 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13663 #: ../en/ch11-mq.xml:91
dongsheng@627 13664 msgid ""
dongsheng@627 13665 "Quilt manages a <emphasis>stack of patches</emphasis> on top of a directory "
dongsheng@627 13666 "tree. To begin, you tell quilt to manage a directory tree, and tell it which "
dongsheng@627 13667 "files you want to manage; it stores away the names and contents of those "
dongsheng@627 13668 "files. To fix a bug, you create a new patch (using a single command), edit "
dongsheng@627 13669 "the files you need to fix, then <quote>refresh</quote> the patch."
dongsheng@627 13670 msgstr ""
dongsheng@627 13671
dongsheng@627 13672 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13673 #: ../en/ch11-mq.xml:99
dongsheng@627 13674 msgid ""
dongsheng@627 13675 "The refresh step causes quilt to scan the directory tree; it updates the "
dongsheng@627 13676 "patch with all of the changes you have made. You can create another patch on "
dongsheng@627 13677 "top of the first, which will track the changes required to modify the tree "
dongsheng@627 13678 "from <quote>tree with one patch applied</quote> to <quote>tree with two "
dongsheng@627 13679 "patches applied</quote>."
dongsheng@627 13680 msgstr ""
dongsheng@627 13681
dongsheng@627 13682 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13683 #: ../en/ch11-mq.xml:106
dongsheng@627 13684 msgid ""
dongsheng@627 13685 "You can <emphasis>change</emphasis> which patches are applied to the tree. "
dongsheng@627 13686 "If you <quote>pop</quote> a patch, the changes made by that patch will vanish "
dongsheng@627 13687 "from the directory tree. Quilt remembers which patches you have popped, "
dongsheng@627 13688 "though, so you can <quote>push</quote> a popped patch again, and the "
dongsheng@627 13689 "directory tree will be restored to contain the modifications in the patch. "
dongsheng@627 13690 "Most importantly, you can run the <quote>refresh</quote> command at any time, "
dongsheng@627 13691 "and the topmost applied patch will be updated. This means that you can, at "
dongsheng@627 13692 "any time, change both which patches are applied and what modifications those "
dongsheng@627 13693 "patches make."
dongsheng@627 13694 msgstr ""
dongsheng@627 13695
dongsheng@627 13696 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13697 #: ../en/ch11-mq.xml:118
dongsheng@627 13698 msgid ""
dongsheng@627 13699 "Quilt knows nothing about revision control tools, so it works equally well on "
dongsheng@627 13700 "top of an unpacked tarball or a Subversion working copy."
dongsheng@627 13701 msgstr ""
dongsheng@627 13702
dongsheng@627 13703 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 13704 #: ../en/ch11-mq.xml:124
dongsheng@627 13705 msgid "From patchwork quilt to Mercurial Queues"
dongsheng@636 13706 msgstr "从 patchwork quilt 到 MQ"
dongsheng@627 13707
dongsheng@627 13708 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13709 #: ../en/ch11-mq.xml:126
dongsheng@627 13710 msgid ""
dongsheng@627 13711 "In mid-2005, Chris Mason took the features of quilt and wrote an extension "
dongsheng@627 13712 "that he called Mercurial Queues, which added quilt-like behaviour to "
dongsheng@627 13713 "Mercurial."
dongsheng@627 13714 msgstr ""
dongsheng@627 13715
dongsheng@627 13716 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13717 #: ../en/ch11-mq.xml:130
dongsheng@627 13718 msgid ""
dongsheng@627 13719 "The key difference between quilt and MQ is that quilt knows nothing about "
dongsheng@627 13720 "revision control systems, while MQ is <emphasis>integrated</emphasis> into "
dongsheng@627 13721 "Mercurial. Each patch that you push is represented as a Mercurial "
dongsheng@627 13722 "changeset. Pop a patch, and the changeset goes away."
dongsheng@627 13723 msgstr ""
dongsheng@627 13724
dongsheng@627 13725 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13726 #: ../en/ch11-mq.xml:136
dongsheng@627 13727 msgid ""
dongsheng@627 13728 "Because quilt does not care about revision control tools, it is still a "
dongsheng@627 13729 "tremendously useful piece of software to know about for situations where you "
dongsheng@627 13730 "cannot use Mercurial and MQ."
dongsheng@627 13731 msgstr ""
dongsheng@627 13732
dongsheng@627 13733 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 13734 #: ../en/ch11-mq.xml:144
dongsheng@627 13735 msgid "The huge advantage of MQ"
dongsheng@636 13736 msgstr "MQ 的巨大优势"
dongsheng@627 13737
dongsheng@627 13738 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13739 #: ../en/ch11-mq.xml:146
dongsheng@627 13740 msgid ""
dongsheng@627 13741 "I cannot overstate the value that MQ offers through the unification of "
dongsheng@627 13742 "patches and revision control."
dongsheng@627 13743 msgstr ""
dongsheng@627 13744
dongsheng@627 13745 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13746 #: ../en/ch11-mq.xml:149
dongsheng@627 13747 msgid ""
dongsheng@627 13748 "A major reason that patches have persisted in the free software and open "
dongsheng@661 13749 "source world—in spite of the availability of increasingly capable revision "
dongsheng@661 13750 "control tools over the years—is the <emphasis>agility</emphasis> they offer."
dongsheng@627 13751 msgstr ""
dongsheng@627 13752
dongsheng@627 13753 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13754 #: ../en/ch11-mq.xml:155
dongsheng@627 13755 msgid ""
dongsheng@627 13756 "Traditional revision control tools make a permanent, irreversible record of "
dongsheng@627 13757 "everything that you do. While this has great value, it's also somewhat "
dongsheng@627 13758 "stifling. If you want to perform a wild-eyed experiment, you have to be "
dongsheng@661 13759 "careful in how you go about it, or you risk leaving unneeded—or worse, "
dongsheng@661 13760 "misleading or destabilising—traces of your missteps and errors in the "
dongsheng@627 13761 "permanent revision record."
dongsheng@627 13762 msgstr ""
dongsheng@627 13763
dongsheng@627 13764 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13765 #: ../en/ch11-mq.xml:163
dongsheng@627 13766 msgid ""
dongsheng@627 13767 "By contrast, MQ's marriage of distributed revision control with patches makes "
dongsheng@627 13768 "it much easier to isolate your work. Your patches live on top of normal "
dongsheng@627 13769 "revision history, and you can make them disappear or reappear at will. If "
dongsheng@627 13770 "you don't like a patch, you can drop it. If a patch isn't quite as you want "
dongsheng@661 13771 "it to be, simply fix it—as many times as you need to, until you have refined "
dongsheng@661 13772 "it into the form you desire."
dongsheng@627 13773 msgstr ""
dongsheng@627 13774
dongsheng@627 13775 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13776 #: ../en/ch11-mq.xml:171
dongsheng@627 13777 msgid ""
dongsheng@627 13778 "As an example, the integration of patches with revision control makes "
dongsheng@661 13779 "understanding patches and debugging their effects—and their interplay with "
dongsheng@661 13780 "the code they're based on—<emphasis>enormously</emphasis> easier. Since every "
dongsheng@661 13781 "applied patch has an associated changeset, you can give <command role=\"hg-cmd"
dongsheng@661 13782 "\">hg log</command> a file name to see which changesets and patches affected "
dongsheng@661 13783 "the file. You can use the <command role=\"hg-cmd\">hg bisect</command> "
dongsheng@661 13784 "command to binary-search through all changesets and applied patches to see "
dongsheng@661 13785 "where a bug got introduced or fixed. You can use the <command role=\"hg-cmd"
dongsheng@661 13786 "\">hg annotate</command> command to see which changeset or patch modified a "
dongsheng@661 13787 "particular line of a source file. And so on."
dongsheng@627 13788 msgstr ""
dongsheng@627 13789
dongsheng@627 13790 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 13791 #: ../en/ch11-mq.xml:187
dongsheng@627 13792 msgid "Understanding patches"
dongsheng@636 13793 msgstr "理解补丁"
dongsheng@627 13794
dongsheng@627 13795 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13796 #: ../en/ch11-mq.xml:189
dongsheng@627 13797 msgid ""
dongsheng@627 13798 "Because MQ doesn't hide its patch-oriented nature, it is helpful to "
dongsheng@627 13799 "understand what patches are, and a little about the tools that work with them."
dongsheng@627 13800 msgstr ""
dongsheng@627 13801
dongsheng@627 13802 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13803 #: ../en/ch11-mq.xml:193
dongsheng@627 13804 msgid ""
dongsheng@627 13805 "The traditional Unix <command>diff</command> command compares two files, and "
dongsheng@627 13806 "prints a list of differences between them. The <command>patch</command> "
dongsheng@627 13807 "command understands these differences as <emphasis>modifications</emphasis> "
dongsheng@627 13808 "to make to a file. Take a look below for a simple example of these commands "
dongsheng@627 13809 "in action."
dongsheng@627 13810 msgstr ""
dongsheng@627 13811
dongsheng@627 13812 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13813 #: ../en/ch11-mq.xml:202
dongsheng@627 13814 msgid ""
dongsheng@627 13815 "The type of file that <command>diff</command> generates (and <command>patch</"
dongsheng@627 13816 "command> takes as input) is called a <quote>patch</quote> or a <quote>diff</"
dongsheng@627 13817 "quote>; there is no difference between a patch and a diff. (We'll use the "
dongsheng@627 13818 "term <quote>patch</quote>, since it's more commonly used.)"
dongsheng@627 13819 msgstr ""
dongsheng@627 13820
dongsheng@627 13821 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13822 #: ../en/ch11-mq.xml:208
dongsheng@627 13823 msgid ""
dongsheng@627 13824 "A patch file can start with arbitrary text; the <command>patch</command> "
dongsheng@627 13825 "command ignores this text, but MQ uses it as the commit message when creating "
dongsheng@627 13826 "changesets. To find the beginning of the patch content, <command>patch</"
dongsheng@627 13827 "command> searches for the first line that starts with the string "
dongsheng@627 13828 "<quote><literal>diff -</literal></quote>."
dongsheng@627 13829 msgstr ""
dongsheng@627 13830
dongsheng@627 13831 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13832 #: ../en/ch11-mq.xml:215
dongsheng@627 13833 msgid ""
dongsheng@627 13834 "MQ works with <emphasis>unified</emphasis> diffs (<command>patch</command> "
dongsheng@627 13835 "can accept several other diff formats, but MQ doesn't). A unified diff "
dongsheng@627 13836 "contains two kinds of header. The <emphasis>file header</emphasis> describes "
dongsheng@627 13837 "the file being modified; it contains the name of the file to modify. When "
dongsheng@627 13838 "<command>patch</command> sees a new file header, it looks for a file with "
dongsheng@627 13839 "that name to start modifying."
dongsheng@627 13840 msgstr ""
dongsheng@627 13841
dongsheng@627 13842 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13843 #: ../en/ch11-mq.xml:223
dongsheng@627 13844 msgid ""
dongsheng@627 13845 "After the file header comes a series of <emphasis>hunks</emphasis>. Each "
dongsheng@627 13846 "hunk starts with a header; this identifies the range of line numbers within "
dongsheng@627 13847 "the file that the hunk should modify. Following the header, a hunk starts "
dongsheng@627 13848 "and ends with a few (usually three) lines of text from the unmodified file; "
dongsheng@627 13849 "these are called the <emphasis>context</emphasis> for the hunk. If there's "
dongsheng@627 13850 "only a small amount of context between successive hunks, <command>diff</"
dongsheng@627 13851 "command> doesn't print a new hunk header; it just runs the hunks together, "
dongsheng@627 13852 "with a few lines of context between modifications."
dongsheng@627 13853 msgstr ""
dongsheng@627 13854
dongsheng@627 13855 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13856 #: ../en/ch11-mq.xml:235
dongsheng@627 13857 msgid ""
dongsheng@627 13858 "Each line of context begins with a space character. Within the hunk, a line "
dongsheng@627 13859 "that begins with <quote><literal>-</literal></quote> means <quote>remove this "
dongsheng@627 13860 "line,</quote> while a line that begins with <quote><literal>+</literal></"
dongsheng@627 13861 "quote> means <quote>insert this line.</quote> For example, a line that is "
dongsheng@627 13862 "modified is represented by one deletion and one insertion."
dongsheng@627 13863 msgstr ""
dongsheng@627 13864
dongsheng@627 13865 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13866 #: ../en/ch11-mq.xml:243
dongsheng@627 13867 msgid ""
songdongsheng@658 13868 "We will return to some of the more subtle aspects of patches later (in <xref "
songdongsheng@658 13869 "linkend=\"sec:mq:adv-patch\"/>), but you should have enough information now "
songdongsheng@658 13870 "to use MQ."
dongsheng@627 13871 msgstr ""
dongsheng@627 13872
dongsheng@627 13873 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 13874 #: ../en/ch11-mq.xml:250
dongsheng@627 13875 msgid "Getting started with Mercurial Queues"
dongsheng@636 13876 msgstr "开始使用 MQ"
dongsheng@627 13877
dongsheng@627 13878 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13879 #: ../en/ch11-mq.xml:252
dongsheng@627 13880 msgid ""
dongsheng@627 13881 "Because MQ is implemented as an extension, you must explicitly enable before "
dongsheng@627 13882 "you can use it. (You don't need to download anything; MQ ships with the "
dongsheng@627 13883 "standard Mercurial distribution.) To enable MQ, edit your <filename role="
dongsheng@627 13884 "\"home\">~/.hgrc</filename> file, and add the lines below."
dongsheng@627 13885 msgstr ""
dongsheng@627 13886
dongsheng@627 13887 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13888 #: ../en/ch11-mq.xml:262
dongsheng@627 13889 msgid ""
dongsheng@627 13890 "Once the extension is enabled, it will make a number of new commands "
dongsheng@627 13891 "available. To verify that the extension is working, you can use <command "
dongsheng@627 13892 "role=\"hg-cmd\">hg help</command> to see if the <command role=\"hg-ext-mq"
dongsheng@627 13893 "\">qinit</command> command is now available."
dongsheng@627 13894 msgstr ""
dongsheng@627 13895
dongsheng@627 13896 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13897 #: ../en/ch11-mq.xml:270
dongsheng@627 13898 msgid ""
dongsheng@627 13899 "You can use MQ with <emphasis>any</emphasis> Mercurial repository, and its "
dongsheng@627 13900 "commands only operate within that repository. To get started, simply prepare "
dongsheng@627 13901 "the repository using the <command role=\"hg-ext-mq\">qinit</command> command."
dongsheng@627 13902 msgstr ""
dongsheng@627 13903
dongsheng@627 13904 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 13905 #: ../en/ch11-mq.xml:277
dongsheng@627 13906 msgid ""
dongsheng@627 13907 "This command creates an empty directory called <filename role=\"special\" "
dongsheng@627 13908 "class=\"directory\">.hg/patches</filename>, where MQ will keep its metadata. "
dongsheng@627 13909 "As with many Mercurial commands, the <command role=\"hg-ext-mq\">qinit</"
dongsheng@627 13910 "command> command prints nothing if it succeeds."
dongsheng@627 13911 msgstr ""
dongsheng@627 13912
dongsheng@627 13913 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 13914 #: ../en/ch11-mq.xml:284
dongsheng@627 13915 msgid "Creating a new patch"
dongsheng@636 13916 msgstr "创建新补丁"
dongsheng@627 13917
dongsheng@627 13918 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13919 #: ../en/ch11-mq.xml:286
dongsheng@627 13920 msgid ""
dongsheng@627 13921 "To begin work on a new patch, use the <command role=\"hg-ext-mq\">qnew</"
dongsheng@627 13922 "command> command. This command takes one argument, the name of the patch to "
dongsheng@627 13923 "create."
dongsheng@627 13924 msgstr ""
dongsheng@627 13925
dongsheng@627 13926 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13927 #: ../en/ch11-mq.xml:290
dongsheng@627 13928 msgid ""
dongsheng@627 13929 "MQ will use this as the name of an actual file in the <filename role=\"special"
dongsheng@627 13930 "\" class=\"directory\">.hg/patches</filename> directory, as you can see below."
dongsheng@627 13931 msgstr ""
dongsheng@627 13932
dongsheng@627 13933 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13934 #: ../en/ch11-mq.xml:297
dongsheng@627 13935 msgid ""
dongsheng@627 13936 "Also newly present in the <filename role=\"special\" class=\"directory\">.hg/"
dongsheng@627 13937 "patches</filename> directory are two other files, <filename role=\"special"
dongsheng@627 13938 "\">series</filename> and <filename role=\"special\">status</filename>. The "
dongsheng@627 13939 "<filename role=\"special\">series</filename> file lists all of the patches "
dongsheng@627 13940 "that MQ knows about for this repository, with one patch per line. Mercurial "
dongsheng@627 13941 "uses the <filename role=\"special\">status</filename> file for internal book-"
dongsheng@627 13942 "keeping; it tracks all of the patches that MQ has <emphasis>applied</"
dongsheng@627 13943 "emphasis> in this repository."
dongsheng@627 13944 msgstr ""
dongsheng@627 13945
dongsheng@627 13946 #. type: Content of: <book><chapter><sect1><sect2><note><para>
dongsheng@650 13947 #: ../en/ch11-mq.xml:309
dongsheng@627 13948 msgid ""
dongsheng@627 13949 "You may sometimes want to edit the <filename role=\"special\">series</"
dongsheng@627 13950 "filename> file by hand; for example, to change the sequence in which some "
dongsheng@627 13951 "patches are applied. However, manually editing the <filename role=\"special"
dongsheng@627 13952 "\">status</filename> file is almost always a bad idea, as it's easy to "
dongsheng@627 13953 "corrupt MQ's idea of what is happening."
dongsheng@627 13954 msgstr ""
dongsheng@627 13955
dongsheng@627 13956 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13957 #: ../en/ch11-mq.xml:318
dongsheng@627 13958 msgid ""
dongsheng@627 13959 "Once you have created your new patch, you can edit files in the working "
dongsheng@627 13960 "directory as you usually would. All of the normal Mercurial commands, such "
dongsheng@627 13961 "as <command role=\"hg-cmd\">hg diff</command> and <command role=\"hg-cmd\">hg "
dongsheng@627 13962 "annotate</command>, work exactly as they did before."
dongsheng@627 13963 msgstr ""
dongsheng@627 13964
dongsheng@627 13965 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 13966 #: ../en/ch11-mq.xml:326
dongsheng@627 13967 msgid "Refreshing a patch"
dongsheng@636 13968 msgstr "刷新补丁"
dongsheng@627 13969
dongsheng@627 13970 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13971 #: ../en/ch11-mq.xml:328
dongsheng@627 13972 msgid ""
dongsheng@627 13973 "When you reach a point where you want to save your work, use the <command "
dongsheng@627 13974 "role=\"hg-ext-mq\">qrefresh</command> command to update the patch you are "
dongsheng@627 13975 "working on."
dongsheng@627 13976 msgstr ""
dongsheng@627 13977
dongsheng@627 13978 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13979 #: ../en/ch11-mq.xml:334
dongsheng@627 13980 msgid ""
dongsheng@627 13981 "This command folds the changes you have made in the working directory into "
dongsheng@627 13982 "your patch, and updates its corresponding changeset to contain those changes."
dongsheng@627 13983 msgstr ""
dongsheng@627 13984
dongsheng@627 13985 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 13986 #: ../en/ch11-mq.xml:338
dongsheng@627 13987 msgid ""
dongsheng@627 13988 "You can run <command role=\"hg-ext-mq\">qrefresh</command> as often as you "
dongsheng@627 13989 "like, so it's a good way to <quote>checkpoint</quote> your work. Refresh "
dongsheng@627 13990 "your patch at an opportune time; try an experiment; and if the experiment "
dongsheng@627 13991 "doesn't work out, <command role=\"hg-cmd\">hg revert</command> your "
dongsheng@627 13992 "modifications back to the last time you refreshed."
dongsheng@627 13993 msgstr ""
dongsheng@627 13994
dongsheng@627 13995 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 13996 #: ../en/ch11-mq.xml:349
dongsheng@627 13997 msgid "Stacking and tracking patches"
dongsheng@636 13998 msgstr "堆叠和跟踪补丁"
dongsheng@627 13999
dongsheng@627 14000 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14001 #: ../en/ch11-mq.xml:351
dongsheng@627 14002 msgid ""
dongsheng@627 14003 "Once you have finished working on a patch, or need to work on another, you "
dongsheng@627 14004 "can use the <command role=\"hg-ext-mq\">qnew</command> command again to "
dongsheng@627 14005 "create a new patch. Mercurial will apply this patch on top of your existing "
dongsheng@627 14006 "patch."
dongsheng@627 14007 msgstr ""
dongsheng@627 14008
dongsheng@627 14009 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14010 #: ../en/ch11-mq.xml:358
dongsheng@627 14011 msgid ""
dongsheng@627 14012 "Notice that the patch contains the changes in our prior patch as part of its "
dongsheng@627 14013 "context (you can see this more clearly in the output of <command role=\"hg-cmd"
dongsheng@627 14014 "\">hg annotate</command>)."
dongsheng@627 14015 msgstr ""
dongsheng@627 14016
dongsheng@627 14017 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14018 #: ../en/ch11-mq.xml:363
dongsheng@627 14019 msgid ""
dongsheng@627 14020 "So far, with the exception of <command role=\"hg-ext-mq\">qnew</command> and "
dongsheng@627 14021 "<command role=\"hg-ext-mq\">qrefresh</command>, we've been careful to only "
dongsheng@627 14022 "use regular Mercurial commands. However, MQ provides many commands that are "
dongsheng@627 14023 "easier to use when you are thinking about patches, as illustrated below."
dongsheng@627 14024 msgstr ""
dongsheng@627 14025
dongsheng@627 14026 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 14027 #: ../en/ch11-mq.xml:373
dongsheng@627 14028 msgid ""
dongsheng@627 14029 "The <command role=\"hg-ext-mq\">qseries</command> command lists every patch "
dongsheng@627 14030 "that MQ knows about in this repository, from oldest to newest (most recently "
dongsheng@627 14031 "<emphasis>created</emphasis>)."
dongsheng@627 14032 msgstr ""
dongsheng@627 14033
dongsheng@627 14034 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 14035 #: ../en/ch11-mq.xml:379
dongsheng@627 14036 msgid ""
dongsheng@627 14037 "The <command role=\"hg-ext-mq\">qapplied</command> command lists every patch "
dongsheng@627 14038 "that MQ has <emphasis>applied</emphasis> in this repository, again from "
dongsheng@627 14039 "oldest to newest (most recently applied)."
dongsheng@627 14040 msgstr ""
dongsheng@627 14041
dongsheng@627 14042 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 14043 #: ../en/ch11-mq.xml:388
dongsheng@627 14044 msgid "Manipulating the patch stack"
dongsheng@636 14045 msgstr "操作补丁堆栈"
dongsheng@627 14046
dongsheng@627 14047 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14048 #: ../en/ch11-mq.xml:390
dongsheng@627 14049 msgid ""
dongsheng@627 14050 "The previous discussion implied that there must be a difference between "
dongsheng@627 14051 "<quote>known</quote> and <quote>applied</quote> patches, and there is. MQ "
dongsheng@627 14052 "can manage a patch without it being applied in the repository."
dongsheng@627 14053 msgstr ""
dongsheng@627 14054
dongsheng@627 14055 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14056 #: ../en/ch11-mq.xml:395
dongsheng@627 14057 msgid ""
dongsheng@627 14058 "An <emphasis>applied</emphasis> patch has a corresponding changeset in the "
dongsheng@627 14059 "repository, and the effects of the patch and changeset are visible in the "
dongsheng@627 14060 "working directory. You can undo the application of a patch using the "
dongsheng@627 14061 "<command role=\"hg-ext-mq\">qpop</command> command. MQ still <emphasis>knows "
dongsheng@627 14062 "about</emphasis>, or manages, a popped patch, but the patch no longer has a "
dongsheng@627 14063 "corresponding changeset in the repository, and the working directory does not "
songdongsheng@658 14064 "contain the changes made by the patch. <xref linkend=\"fig:mq:stack\"/> "
songdongsheng@658 14065 "illustrates the difference between applied and tracked patches."
songdongsheng@658 14066 msgstr ""
songdongsheng@658 14067
songdongsheng@658 14068 #. type: Content of: <book><chapter><sect1><sect2><figure><title>
songdongsheng@658 14069 #: ../en/ch11-mq.xml:408
songdongsheng@658 14070 msgid "Applied and unapplied patches in the MQ patch stack"
dongsheng@660 14071 msgstr "在 MQ 补丁堆栈中应用和撤销补丁"
songdongsheng@658 14072
songdongsheng@658 14073 #. type: Content of: <book><chapter><sect1><sect2><figure><mediaobject>
dongsheng@650 14074 #: ../en/ch11-mq.xml:411
songdongsheng@658 14075 msgid "<imageobject><imagedata fileref=\"figs/mq-stack.png\"/></imageobject>"
dongsheng@627 14076 msgstr ""
dongsheng@627 14077
dongsheng@627 14078 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14079 #: ../en/ch11-mq.xml:416
dongsheng@627 14080 msgid ""
dongsheng@627 14081 "You can reapply an unapplied, or popped, patch using the <command role=\"hg-"
dongsheng@627 14082 "ext-mq\">qpush</command> command. This creates a new changeset to correspond "
dongsheng@627 14083 "to the patch, and the patch's changes once again become present in the "
dongsheng@627 14084 "working directory. See below for examples of <command role=\"hg-ext-mq"
dongsheng@627 14085 "\">qpop</command> and <command role=\"hg-ext-mq\">qpush</command> in action."
dongsheng@627 14086 msgstr ""
dongsheng@627 14087
dongsheng@627 14088 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14089 #: ../en/ch11-mq.xml:425
dongsheng@627 14090 msgid ""
dongsheng@627 14091 "Notice that once we have popped a patch or two patches, the output of "
dongsheng@627 14092 "<command role=\"hg-ext-mq\">qseries</command> remains the same, while that of "
dongsheng@627 14093 "<command role=\"hg-ext-mq\">qapplied</command> has changed."
dongsheng@627 14094 msgstr ""
dongsheng@627 14095
dongsheng@627 14096 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 14097 #: ../en/ch11-mq.xml:433
dongsheng@627 14098 msgid "Pushing and popping many patches"
dongsheng@636 14099 msgstr "压入或弹出多个补丁"
dongsheng@627 14100
dongsheng@627 14101 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 14102 #: ../en/ch11-mq.xml:435
dongsheng@627 14103 msgid ""
dongsheng@627 14104 "While <command role=\"hg-ext-mq\">qpush</command> and <command role=\"hg-ext-"
dongsheng@627 14105 "mq\">qpop</command> each operate on a single patch at a time by default, you "
dongsheng@627 14106 "can push and pop many patches in one go. The <option role=\"hg-ext-mq-cmd-"
dongsheng@627 14107 "qpush-opt\">hg -a</option> option to <command role=\"hg-ext-mq\">qpush</"
dongsheng@627 14108 "command> causes it to push all unapplied patches, while the <option role=\"hg-"
dongsheng@627 14109 "ext-mq-cmd-qpop-opt\">-a</option> option to <command role=\"hg-ext-mq\">qpop</"
dongsheng@627 14110 "command> causes it to pop all applied patches. (For some more ways to push "
songdongsheng@658 14111 "and pop many patches, see <xref linkend=\"sec:mq:perf\"/> below.)"
dongsheng@627 14112 msgstr ""
dongsheng@627 14113
dongsheng@627 14114 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14115 #: ../en/ch11-mq.xml:451
dongsheng@627 14116 msgid "Safety checks, and overriding them"
dongsheng@636 14117 msgstr "安全的检查,然后覆盖它们"
dongsheng@627 14118
dongsheng@627 14119 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14120 #: ../en/ch11-mq.xml:453
dongsheng@627 14121 msgid ""
dongsheng@627 14122 "Several MQ commands check the working directory before they do anything, and "
dongsheng@627 14123 "fail if they find any modifications. They do this to ensure that you won't "
dongsheng@627 14124 "lose any changes that you have made, but not yet incorporated into a patch. "
dongsheng@627 14125 "The example below illustrates this; the <command role=\"hg-ext-mq\">qnew</"
dongsheng@627 14126 "command> command will not create a new patch if there are outstanding "
dongsheng@627 14127 "changes, caused in this case by the <command role=\"hg-cmd\">hg add</command> "
dongsheng@627 14128 "of <filename>file3</filename>."
dongsheng@627 14129 msgstr ""
dongsheng@627 14130
dongsheng@627 14131 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14132 #: ../en/ch11-mq.xml:465
dongsheng@627 14133 msgid ""
dongsheng@627 14134 "Commands that check the working directory all take an <quote>I know what I'm "
dongsheng@627 14135 "doing</quote> option, which is always named <option>-f</option>. The exact "
dongsheng@627 14136 "meaning of <option>-f</option> depends on the command. For example, <command "
dongsheng@627 14137 "role=\"hg-cmd\">hg qnew <option role=\"hg-ext-mq-cmd-qnew-opt\">hg -f</"
dongsheng@627 14138 "option></command> will incorporate any outstanding changes into the new patch "
dongsheng@627 14139 "it creates, but <command role=\"hg-cmd\">hg qpop <option role=\"hg-ext-mq-cmd-"
dongsheng@627 14140 "qpop-opt\">hg -f</option></command> will revert modifications to any files "
dongsheng@627 14141 "affected by the patch that it is popping. Be sure to read the documentation "
dongsheng@627 14142 "for a command's <option>-f</option> option before you use it!"
dongsheng@627 14143 msgstr ""
dongsheng@627 14144
dongsheng@627 14145 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14146 #: ../en/ch11-mq.xml:480
dongsheng@627 14147 msgid "Working on several patches at once"
dongsheng@636 14148 msgstr "同时处理多个补丁"
dongsheng@627 14149
dongsheng@627 14150 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14151 #: ../en/ch11-mq.xml:482
dongsheng@627 14152 msgid ""
dongsheng@627 14153 "The <command role=\"hg-ext-mq\">qrefresh</command> command always refreshes "
dongsheng@627 14154 "the <emphasis>topmost</emphasis> applied patch. This means that you can "
dongsheng@627 14155 "suspend work on one patch (by refreshing it), pop or push to make a different "
dongsheng@627 14156 "patch the top, and work on <emphasis>that</emphasis> patch for a while."
dongsheng@627 14157 msgstr ""
dongsheng@627 14158
dongsheng@627 14159 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14160 #: ../en/ch11-mq.xml:489
dongsheng@627 14161 msgid ""
dongsheng@627 14162 "Here's an example that illustrates how you can use this ability. Let's say "
dongsheng@627 14163 "you're developing a new feature as two patches. The first is a change to the "
dongsheng@661 14164 "core of your software, and the second—layered on top of the first—changes the "
dongsheng@661 14165 "user interface to use the code you just added to the core. If you notice a "
dongsheng@661 14166 "bug in the core while you're working on the UI patch, it's easy to fix the "
dongsheng@661 14167 "core. Simply <command role=\"hg-ext-mq\">qrefresh</command> the UI patch to "
dongsheng@661 14168 "save your in-progress changes, and <command role=\"hg-ext-mq\">qpop</command> "
dongsheng@661 14169 "down to the core patch. Fix the core bug, <command role=\"hg-ext-mq"
dongsheng@661 14170 "\">qrefresh</command> the core patch, and <command role=\"hg-ext-mq\">qpush</"
dongsheng@661 14171 "command> back to the UI patch to continue where you left off."
dongsheng@627 14172 msgstr ""
dongsheng@627 14173
dongsheng@627 14174 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14175 #: ../en/ch11-mq.xml:506
dongsheng@627 14176 msgid "More about patches"
dongsheng@636 14177 msgstr "关于补丁的更多信息"
dongsheng@627 14178
dongsheng@627 14179 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14180 #: ../en/ch11-mq.xml:508
dongsheng@627 14181 msgid ""
dongsheng@627 14182 "MQ uses the GNU <command>patch</command> command to apply patches, so it's "
dongsheng@627 14183 "helpful to know a few more detailed aspects of how <command>patch</command> "
dongsheng@627 14184 "works, and about patches themselves."
dongsheng@627 14185 msgstr ""
dongsheng@627 14186
dongsheng@627 14187 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14188 #: ../en/ch11-mq.xml:514
dongsheng@627 14189 msgid "The strip count"
dongsheng@636 14190 msgstr "修剪计数"
dongsheng@627 14191
dongsheng@627 14192 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14193 #: ../en/ch11-mq.xml:516
dongsheng@627 14194 msgid ""
dongsheng@627 14195 "If you look at the file headers in a patch, you will notice that the "
dongsheng@627 14196 "pathnames usually have an extra component on the front that isn't present in "
dongsheng@627 14197 "the actual path name. This is a holdover from the way that people used to "
dongsheng@627 14198 "generate patches (people still do this, but it's somewhat rare with modern "
dongsheng@627 14199 "revision control tools)."
dongsheng@627 14200 msgstr ""
dongsheng@627 14201
dongsheng@627 14202 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14203 #: ../en/ch11-mq.xml:523
dongsheng@627 14204 msgid ""
dongsheng@627 14205 "Alice would unpack a tarball, edit her files, then decide that she wanted to "
dongsheng@627 14206 "create a patch. So she'd rename her working directory, unpack the tarball "
dongsheng@627 14207 "again (hence the need for the rename), and use the <option role=\"cmd-opt-diff"
dongsheng@627 14208 "\">-r</option> and <option role=\"cmd-opt-diff\">-N</option> options to "
dongsheng@627 14209 "<command>diff</command> to recursively generate a patch between the "
dongsheng@627 14210 "unmodified directory and the modified one. The result would be that the name "
dongsheng@627 14211 "of the unmodified directory would be at the front of the left-hand path in "
dongsheng@627 14212 "every file header, and the name of the modified directory would be at the "
dongsheng@627 14213 "front of the right-hand path."
dongsheng@627 14214 msgstr ""
dongsheng@627 14215
dongsheng@627 14216 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14217 #: ../en/ch11-mq.xml:536
dongsheng@627 14218 msgid ""
dongsheng@627 14219 "Since someone receiving a patch from the Alices of the net would be unlikely "
dongsheng@627 14220 "to have unmodified and modified directories with exactly the same names, the "
dongsheng@627 14221 "<command>patch</command> command has a <option role=\"cmd-opt-patch\">-p</"
dongsheng@627 14222 "option> option that indicates the number of leading path name components to "
dongsheng@627 14223 "strip when trying to apply a patch. This number is called the "
dongsheng@627 14224 "<emphasis>strip count</emphasis>."
dongsheng@627 14225 msgstr ""
dongsheng@627 14226
dongsheng@627 14227 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14228 #: ../en/ch11-mq.xml:544
dongsheng@627 14229 msgid ""
dongsheng@627 14230 "An option of <quote><literal>-p1</literal></quote> means <quote>use a strip "
dongsheng@627 14231 "count of one</quote>. If <command>patch</command> sees a file name "
dongsheng@627 14232 "<filename>foo/bar/baz</filename> in a file header, it will strip "
dongsheng@627 14233 "<filename>foo</filename> and try to patch a file named <filename>bar/baz</"
dongsheng@627 14234 "filename>. (Strictly speaking, the strip count refers to the number of "
dongsheng@627 14235 "<emphasis>path separators</emphasis> (and the components that go with them ) "
dongsheng@627 14236 "to strip. A strip count of one will turn <filename>foo/bar</filename> into "
dongsheng@627 14237 "<filename>bar</filename>, but <filename>/foo/bar</filename> (notice the extra "
dongsheng@627 14238 "leading slash) into <filename>foo/bar</filename>.)"
dongsheng@627 14239 msgstr ""
dongsheng@627 14240
dongsheng@627 14241 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14242 #: ../en/ch11-mq.xml:557
dongsheng@627 14243 msgid ""
dongsheng@627 14244 "The <quote>standard</quote> strip count for patches is one; almost all "
dongsheng@627 14245 "patches contain one leading path name component that needs to be stripped. "
dongsheng@627 14246 "Mercurial's <command role=\"hg-cmd\">hg diff</command> command generates path "
dongsheng@627 14247 "names in this form, and the <command role=\"hg-cmd\">hg import</command> "
dongsheng@627 14248 "command and MQ expect patches to have a strip count of one."
dongsheng@627 14249 msgstr ""
dongsheng@627 14250
dongsheng@627 14251 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14252 #: ../en/ch11-mq.xml:565
dongsheng@627 14253 msgid ""
dongsheng@627 14254 "If you receive a patch from someone that you want to add to your patch queue, "
dongsheng@627 14255 "and the patch needs a strip count other than one, you cannot just <command "
dongsheng@627 14256 "role=\"hg-ext-mq\">qimport</command> the patch, because <command role=\"hg-"
dongsheng@627 14257 "ext-mq\">qimport</command> does not yet have a <literal>-p</literal> option "
dongsheng@627 14258 "(see <ulink role=\"hg-bug\" url=\"http://www.selenic.com/mercurial/bts/"
dongsheng@627 14259 "issue311\">issue 311</ulink>). Your best bet is to <command role=\"hg-ext-mq"
dongsheng@627 14260 "\">qnew</command> a patch of your own, then use <command>patch -pN</command> "
dongsheng@627 14261 "to apply their patch, followed by <command role=\"hg-cmd\">hg addremove</"
dongsheng@627 14262 "command> to pick up any files added or removed by the patch, followed by "
dongsheng@627 14263 "<command role=\"hg-ext-mq\">hg qrefresh</command>. This complexity may become "
dongsheng@627 14264 "unnecessary; see <ulink role=\"hg-bug\" url=\"http://www.selenic.com/"
dongsheng@627 14265 "mercurial/bts/issue311\">issue 311</ulink> for details."
dongsheng@627 14266 msgstr ""
dongsheng@627 14267
dongsheng@627 14268 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14269 #: ../en/ch11-mq.xml:584
dongsheng@627 14270 msgid "Strategies for applying a patch"
dongsheng@636 14271 msgstr "应用补丁的策略"
dongsheng@627 14272
dongsheng@627 14273 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14274 #: ../en/ch11-mq.xml:586
dongsheng@627 14275 msgid ""
dongsheng@627 14276 "When <command>patch</command> applies a hunk, it tries a handful of "
dongsheng@627 14277 "successively less accurate strategies to try to make the hunk apply. This "
dongsheng@627 14278 "falling-back technique often makes it possible to take a patch that was "
dongsheng@627 14279 "generated against an old version of a file, and apply it against a newer "
dongsheng@627 14280 "version of that file."
dongsheng@627 14281 msgstr ""
dongsheng@627 14282
dongsheng@627 14283 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14284 #: ../en/ch11-mq.xml:593
dongsheng@627 14285 msgid ""
dongsheng@627 14286 "First, <command>patch</command> tries an exact match, where the line numbers, "
dongsheng@627 14287 "the context, and the text to be modified must apply exactly. If it cannot "
dongsheng@627 14288 "make an exact match, it tries to find an exact match for the context, without "
dongsheng@627 14289 "honouring the line numbering information. If this succeeds, it prints a line "
dongsheng@627 14290 "of output saying that the hunk was applied, but at some <emphasis>offset</"
dongsheng@627 14291 "emphasis> from the original line number."
dongsheng@627 14292 msgstr ""
dongsheng@627 14293
dongsheng@627 14294 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14295 #: ../en/ch11-mq.xml:602
dongsheng@627 14296 msgid ""
dongsheng@627 14297 "If a context-only match fails, <command>patch</command> removes the first and "
dongsheng@627 14298 "last lines of the context, and tries a <emphasis>reduced</emphasis> context-"
dongsheng@627 14299 "only match. If the hunk with reduced context succeeds, it prints a message "
dongsheng@627 14300 "saying that it applied the hunk with a <emphasis>fuzz factor</emphasis> (the "
dongsheng@627 14301 "number after the fuzz factor indicates how many lines of context "
dongsheng@627 14302 "<command>patch</command> had to trim before the patch applied)."
dongsheng@627 14303 msgstr ""
dongsheng@627 14304
dongsheng@627 14305 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14306 #: ../en/ch11-mq.xml:611
dongsheng@627 14307 msgid ""
dongsheng@627 14308 "When neither of these techniques works, <command>patch</command> prints a "
dongsheng@627 14309 "message saying that the hunk in question was rejected. It saves rejected "
dongsheng@627 14310 "hunks (also simply called <quote>rejects</quote>) to a file with the same "
dongsheng@627 14311 "name, and an added <filename role=\"special\">.rej</filename> extension. It "
dongsheng@627 14312 "also saves an unmodified copy of the file with a <filename role=\"special\">."
dongsheng@627 14313 "orig</filename> extension; the copy of the file without any extensions will "
dongsheng@627 14314 "contain any changes made by hunks that <emphasis>did</emphasis> apply "
dongsheng@627 14315 "cleanly. If you have a patch that modifies <filename>foo</filename> with six "
dongsheng@627 14316 "hunks, and one of them fails to apply, you will have: an unmodified "
dongsheng@627 14317 "<filename>foo.orig</filename>, a <filename>foo.rej</filename> containing one "
dongsheng@627 14318 "hunk, and <filename>foo</filename>, containing the changes made by the five "
dongsheng@627 14319 "successful hunks."
dongsheng@627 14320 msgstr ""
dongsheng@627 14321
dongsheng@627 14322 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14323 #: ../en/ch11-mq.xml:629
dongsheng@627 14324 msgid "Some quirks of patch representation"
dongsheng@636 14325 msgstr "补丁的一些特性"
dongsheng@627 14326
dongsheng@627 14327 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14328 #: ../en/ch11-mq.xml:631
dongsheng@627 14329 msgid ""
dongsheng@627 14330 "There are a few useful things to know about how <command>patch</command> "
dongsheng@627 14331 "works with files."
dongsheng@627 14332 msgstr ""
dongsheng@627 14333
dongsheng@627 14334 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14335 #: ../en/ch11-mq.xml:634
dongsheng@627 14336 msgid ""
dongsheng@627 14337 "This should already be obvious, but <command>patch</command> cannot handle "
dongsheng@627 14338 "binary files."
dongsheng@627 14339 msgstr ""
dongsheng@627 14340
dongsheng@627 14341 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14342 #: ../en/ch11-mq.xml:638
dongsheng@627 14343 msgid ""
dongsheng@627 14344 "Neither does it care about the executable bit; it creates new files as "
dongsheng@627 14345 "readable, but not executable."
dongsheng@627 14346 msgstr ""
dongsheng@627 14347
dongsheng@627 14348 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14349 #: ../en/ch11-mq.xml:642
dongsheng@627 14350 msgid ""
dongsheng@627 14351 "<command>patch</command> treats the removal of a file as a diff between the "
dongsheng@627 14352 "file to be removed and the empty file. So your idea of <quote>I deleted this "
dongsheng@627 14353 "file</quote> looks like <quote>every line of this file was deleted</quote> in "
dongsheng@627 14354 "a patch."
dongsheng@627 14355 msgstr ""
dongsheng@627 14356
dongsheng@627 14357 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14358 #: ../en/ch11-mq.xml:648
dongsheng@627 14359 msgid ""
dongsheng@627 14360 "It treats the addition of a file as a diff between the empty file and the "
dongsheng@627 14361 "file to be added. So in a patch, your idea of <quote>I added this file</"
dongsheng@627 14362 "quote> looks like <quote>every line of this file was added</quote>."
dongsheng@627 14363 msgstr ""
dongsheng@627 14364
dongsheng@627 14365 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14366 #: ../en/ch11-mq.xml:654
dongsheng@627 14367 msgid ""
dongsheng@627 14368 "It treats a renamed file as the removal of the old name, and the addition of "
dongsheng@627 14369 "the new name. This means that renamed files have a big footprint in "
dongsheng@627 14370 "patches. (Note also that Mercurial does not currently try to infer when "
dongsheng@627 14371 "files have been renamed or copied in a patch.)"
dongsheng@627 14372 msgstr ""
dongsheng@627 14373
dongsheng@627 14374 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14375 #: ../en/ch11-mq.xml:660
dongsheng@627 14376 msgid ""
dongsheng@627 14377 "<command>patch</command> cannot represent empty files, so you cannot use a "
dongsheng@627 14378 "patch to represent the notion <quote>I added this empty file to the tree</"
dongsheng@627 14379 "quote>."
dongsheng@627 14380 msgstr ""
dongsheng@627 14381
dongsheng@627 14382 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14383 #: ../en/ch11-mq.xml:667
dongsheng@627 14384 msgid "Beware the fuzz"
dongsheng@636 14385 msgstr "当心毛刺"
dongsheng@627 14386
dongsheng@627 14387 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14388 #: ../en/ch11-mq.xml:669
dongsheng@627 14389 msgid ""
dongsheng@627 14390 "While applying a hunk at an offset, or with a fuzz factor, will often be "
dongsheng@627 14391 "completely successful, these inexact techniques naturally leave open the "
dongsheng@627 14392 "possibility of corrupting the patched file. The most common cases typically "
dongsheng@627 14393 "involve applying a patch twice, or at an incorrect location in the file. If "
dongsheng@627 14394 "<command>patch</command> or <command role=\"hg-ext-mq\">qpush</command> ever "
dongsheng@627 14395 "mentions an offset or fuzz factor, you should make sure that the modified "
dongsheng@627 14396 "files are correct afterwards."
dongsheng@627 14397 msgstr ""
dongsheng@627 14398
dongsheng@627 14399 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14400 #: ../en/ch11-mq.xml:679
dongsheng@627 14401 msgid ""
dongsheng@627 14402 "It's often a good idea to refresh a patch that has applied with an offset or "
dongsheng@627 14403 "fuzz factor; refreshing the patch generates new context information that will "
dongsheng@627 14404 "make it apply cleanly. I say <quote>often,</quote> not <quote>always,</"
dongsheng@627 14405 "quote> because sometimes refreshing a patch will make it fail to apply "
dongsheng@627 14406 "against a different revision of the underlying files. In some cases, such as "
dongsheng@627 14407 "when you're maintaining a patch that must sit on top of multiple versions of "
dongsheng@627 14408 "a source tree, it's acceptable to have a patch apply with some fuzz, provided "
dongsheng@627 14409 "you've verified the results of the patching process in such cases."
dongsheng@627 14410 msgstr ""
dongsheng@627 14411
dongsheng@627 14412 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14413 #: ../en/ch11-mq.xml:692
dongsheng@627 14414 msgid "Handling rejection"
dongsheng@636 14415 msgstr "处理拒绝"
dongsheng@627 14416
dongsheng@627 14417 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14418 #: ../en/ch11-mq.xml:694
dongsheng@627 14419 msgid ""
dongsheng@627 14420 "If <command role=\"hg-ext-mq\">qpush</command> fails to apply a patch, it "
dongsheng@627 14421 "will print an error message and exit. If it has left <filename role=\"special"
dongsheng@627 14422 "\">.rej</filename> files behind, it is usually best to fix up the rejected "
dongsheng@627 14423 "hunks before you push more patches or do any further work."
dongsheng@627 14424 msgstr ""
dongsheng@627 14425
dongsheng@627 14426 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14427 #: ../en/ch11-mq.xml:700
dongsheng@627 14428 msgid ""
dongsheng@627 14429 "If your patch <emphasis>used to</emphasis> apply cleanly, and no longer does "
dongsheng@627 14430 "because you've changed the underlying code that your patches are based on, "
songdongsheng@658 14431 "Mercurial Queues can help; see <xref linkend=\"sec:mq:merge\"/> for details."
songdongsheng@658 14432 msgstr ""
songdongsheng@658 14433
songdongsheng@658 14434 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14435 #: ../en/ch11-mq.xml:705
dongsheng@627 14436 msgid ""
dongsheng@627 14437 "Unfortunately, there aren't any great techniques for dealing with rejected "
dongsheng@627 14438 "hunks. Most often, you'll need to view the <filename role=\"special\">.rej</"
dongsheng@627 14439 "filename> file and edit the target file, applying the rejected hunks by hand."
dongsheng@627 14440 msgstr ""
dongsheng@627 14441
dongsheng@627 14442 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14443 #: ../en/ch11-mq.xml:710
dongsheng@627 14444 msgid ""
dongsheng@627 14445 "If you're feeling adventurous, Neil Brown, a Linux kernel hacker, wrote a "
dongsheng@627 14446 "tool called <command>wiggle</command> <citation>web:wiggle</citation>, which "
dongsheng@627 14447 "is more vigorous than <command>patch</command> in its attempts to make a "
dongsheng@627 14448 "patch apply."
dongsheng@627 14449 msgstr ""
dongsheng@627 14450
dongsheng@627 14451 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14452 #: ../en/ch11-mq.xml:716
dongsheng@627 14453 msgid ""
dongsheng@627 14454 "Another Linux kernel hacker, Chris Mason (the author of Mercurial Queues), "
dongsheng@627 14455 "wrote a similar tool called <command>mpatch</command> <citation>web:mpatch</"
dongsheng@627 14456 "citation>, which takes a simple approach to automating the application of "
dongsheng@627 14457 "hunks rejected by <command>patch</command>. The <command>mpatch</command> "
dongsheng@627 14458 "command can help with four common reasons that a hunk may be rejected:"
dongsheng@627 14459 msgstr ""
dongsheng@627 14460
dongsheng@627 14461 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14462 #: ../en/ch11-mq.xml:725
dongsheng@627 14463 msgid "The context in the middle of a hunk has changed."
dongsheng@627 14464 msgstr ""
dongsheng@627 14465
dongsheng@627 14466 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14467 #: ../en/ch11-mq.xml:728
dongsheng@627 14468 msgid "A hunk is missing some context at the beginning or end."
dongsheng@627 14469 msgstr ""
dongsheng@627 14470
dongsheng@627 14471 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14472 #: ../en/ch11-mq.xml:731
dongsheng@627 14473 msgid ""
dongsheng@661 14474 "A large hunk might apply better—either entirely or in part&emdash;if it was "
dongsheng@661 14475 "broken up into smaller hunks."
dongsheng@627 14476 msgstr ""
dongsheng@627 14477
dongsheng@627 14478 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 14479 #: ../en/ch11-mq.xml:735
dongsheng@627 14480 msgid ""
dongsheng@627 14481 "A hunk removes lines with slightly different content than those currently "
dongsheng@627 14482 "present in the file."
dongsheng@627 14483 msgstr ""
dongsheng@627 14484
dongsheng@627 14485 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14486 #: ../en/ch11-mq.xml:739
dongsheng@627 14487 msgid ""
dongsheng@627 14488 "If you use <command>wiggle</command> or <command>mpatch</command>, you should "
dongsheng@627 14489 "be doubly careful to check your results when you're done. In fact, "
dongsheng@627 14490 "<command>mpatch</command> enforces this method of double-checking the tool's "
dongsheng@627 14491 "output, by automatically dropping you into a merge program when it has done "
dongsheng@627 14492 "its job, so that you can verify its work and finish off any remaining merges."
dongsheng@627 14493 msgstr ""
dongsheng@627 14494
dongsheng@627 14495 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14496 #: ../en/ch11-mq.xml:751
dongsheng@627 14497 msgid "Getting the best performance out of MQ"
dongsheng@636 14498 msgstr "MQ 的性能"
dongsheng@627 14499
dongsheng@627 14500 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14501 #: ../en/ch11-mq.xml:753
dongsheng@627 14502 msgid ""
dongsheng@627 14503 "MQ is very efficient at handling a large number of patches. I ran some "
dongsheng@627 14504 "performance experiments in mid-2006 for a talk that I gave at the 2006 "
dongsheng@627 14505 "EuroPython conference <citation>web:europython</citation>. I used as my data "
dongsheng@627 14506 "set the Linux 2.6.17-mm1 patch series, which consists of 1,738 patches. I "
dongsheng@627 14507 "applied these on top of a Linux kernel repository containing all 27,472 "
dongsheng@627 14508 "revisions between Linux 2.6.12-rc2 and Linux 2.6.17."
dongsheng@627 14509 msgstr ""
dongsheng@627 14510
dongsheng@627 14511 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14512 #: ../en/ch11-mq.xml:762
dongsheng@627 14513 msgid ""
dongsheng@627 14514 "On my old, slow laptop, I was able to <command role=\"hg-cmd\">hg qpush "
dongsheng@627 14515 "<option role=\"hg-ext-mq-cmd-qpush-opt\">hg -a</option></command> all 1,738 "
dongsheng@627 14516 "patches in 3.5 minutes, and <command role=\"hg-cmd\">hg qpop <option role="
dongsheng@627 14517 "\"hg-ext-mq-cmd-qpop-opt\">hg -a</option></command> them all in 30 seconds. "
dongsheng@627 14518 "(On a newer laptop, the time to push all patches dropped to two minutes.) I "
dongsheng@627 14519 "could <command role=\"hg-ext-mq\">qrefresh</command> one of the biggest "
dongsheng@627 14520 "patches (which made 22,779 lines of changes to 287 files) in 6.6 seconds."
dongsheng@627 14521 msgstr ""
dongsheng@627 14522
dongsheng@627 14523 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14524 #: ../en/ch11-mq.xml:773
dongsheng@627 14525 msgid ""
dongsheng@627 14526 "Clearly, MQ is well suited to working in large trees, but there are a few "
dongsheng@627 14527 "tricks you can use to get the best performance of it."
dongsheng@627 14528 msgstr ""
dongsheng@627 14529
dongsheng@627 14530 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14531 #: ../en/ch11-mq.xml:777
dongsheng@627 14532 msgid ""
dongsheng@627 14533 "First of all, try to <quote>batch</quote> operations together. Every time "
dongsheng@627 14534 "you run <command role=\"hg-ext-mq\">qpush</command> or <command role=\"hg-ext-"
dongsheng@627 14535 "mq\">qpop</command>, these commands scan the working directory once to make "
dongsheng@627 14536 "sure you haven't made some changes and then forgotten to run <command role="
dongsheng@627 14537 "\"hg-ext-mq\">qrefresh</command>. On a small tree, the time that this scan "
dongsheng@627 14538 "takes is unnoticeable. However, on a medium-sized tree (containing tens of "
dongsheng@627 14539 "thousands of files), it can take a second or more."
dongsheng@627 14540 msgstr ""
dongsheng@627 14541
dongsheng@627 14542 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14543 #: ../en/ch11-mq.xml:788
dongsheng@627 14544 msgid ""
dongsheng@627 14545 "The <command role=\"hg-ext-mq\">qpush</command> and <command role=\"hg-ext-mq"
dongsheng@627 14546 "\">qpop</command> commands allow you to push and pop multiple patches at a "
dongsheng@627 14547 "time. You can identify the <quote>destination patch</quote> that you want to "
dongsheng@627 14548 "end up at. When you <command role=\"hg-ext-mq\">qpush</command> with a "
dongsheng@627 14549 "destination specified, it will push patches until that patch is at the top of "
dongsheng@627 14550 "the applied stack. When you <command role=\"hg-ext-mq\">qpop</command> to a "
dongsheng@627 14551 "destination, MQ will pop patches until the destination patch is at the top."
dongsheng@627 14552 msgstr ""
dongsheng@627 14553
dongsheng@627 14554 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14555 #: ../en/ch11-mq.xml:798
dongsheng@627 14556 msgid ""
dongsheng@627 14557 "You can identify a destination patch using either the name of the patch, or "
dongsheng@627 14558 "by number. If you use numeric addressing, patches are counted from zero; "
dongsheng@627 14559 "this means that the first patch is zero, the second is one, and so on."
dongsheng@627 14560 msgstr ""
dongsheng@627 14561
dongsheng@627 14562 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14563 #: ../en/ch11-mq.xml:805
dongsheng@627 14564 msgid "Updating your patches when the underlying code changes"
dongsheng@636 14565 msgstr "当基础代码改变时,更新补丁的方法"
dongsheng@627 14566
dongsheng@627 14567 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14568 #: ../en/ch11-mq.xml:808
dongsheng@627 14569 msgid ""
dongsheng@627 14570 "It's common to have a stack of patches on top of an underlying repository "
dongsheng@627 14571 "that you don't modify directly. If you're working on changes to third-party "
dongsheng@627 14572 "code, or on a feature that is taking longer to develop than the rate of "
dongsheng@627 14573 "change of the code beneath, you will often need to sync up with the "
dongsheng@627 14574 "underlying code, and fix up any hunks in your patches that no longer apply. "
dongsheng@627 14575 "This is called <emphasis>rebasing</emphasis> your patch series."
dongsheng@627 14576 msgstr ""
dongsheng@627 14577
dongsheng@627 14578 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14579 #: ../en/ch11-mq.xml:817
dongsheng@627 14580 msgid ""
dongsheng@627 14581 "The simplest way to do this is to <command role=\"hg-cmd\">hg qpop <option "
dongsheng@627 14582 "role=\"hg-ext-mq-cmd-qpop-opt\">hg -a</option></command> your patches, then "
dongsheng@627 14583 "<command role=\"hg-cmd\">hg pull</command> changes into the underlying "
dongsheng@627 14584 "repository, and finally <command role=\"hg-cmd\">hg qpush <option role=\"hg-"
dongsheng@627 14585 "ext-mq-cmd-qpop-opt\">hg -a</option></command> your patches again. MQ will "
dongsheng@627 14586 "stop pushing any time it runs across a patch that fails to apply during "
dongsheng@627 14587 "conflicts, allowing you to fix your conflicts, <command role=\"hg-ext-mq"
dongsheng@627 14588 "\">qrefresh</command> the affected patch, and continue pushing until you have "
dongsheng@627 14589 "fixed your entire stack."
dongsheng@627 14590 msgstr ""
dongsheng@627 14591
dongsheng@627 14592 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14593 #: ../en/ch11-mq.xml:829
dongsheng@627 14594 msgid ""
dongsheng@627 14595 "This approach is easy to use and works well if you don't expect changes to "
dongsheng@627 14596 "the underlying code to affect how well your patches apply. If your patch "
dongsheng@627 14597 "stack touches code that is modified frequently or invasively in the "
dongsheng@627 14598 "underlying repository, however, fixing up rejected hunks by hand quickly "
dongsheng@627 14599 "becomes tiresome."
dongsheng@627 14600 msgstr ""
dongsheng@627 14601
dongsheng@627 14602 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14603 #: ../en/ch11-mq.xml:836
dongsheng@627 14604 msgid ""
dongsheng@627 14605 "It's possible to partially automate the rebasing process. If your patches "
dongsheng@627 14606 "apply cleanly against some revision of the underlying repo, MQ can use this "
dongsheng@627 14607 "information to help you to resolve conflicts between your patches and a "
dongsheng@627 14608 "different revision."
dongsheng@627 14609 msgstr ""
dongsheng@627 14610
dongsheng@627 14611 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14612 #: ../en/ch11-mq.xml:842
songdongsheng@658 14613 msgid "The process is a little involved."
songdongsheng@658 14614 msgstr ""
songdongsheng@658 14615
songdongsheng@658 14616 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
dongsheng@650 14617 #: ../en/ch11-mq.xml:844
dongsheng@627 14618 msgid ""
dongsheng@627 14619 "To begin, <command role=\"hg-cmd\">hg qpush -a</command> all of your patches "
dongsheng@627 14620 "on top of the revision where you know that they apply cleanly."
dongsheng@627 14621 msgstr ""
dongsheng@627 14622
dongsheng@627 14623 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
songdongsheng@658 14624 #: ../en/ch11-mq.xml:848
dongsheng@627 14625 msgid ""
dongsheng@627 14626 "Save a backup copy of your patch directory using <command role=\"hg-cmd\">hg "
dongsheng@627 14627 "qsave <option role=\"hg-ext-mq-cmd-qsave-opt\">hg -e</option> <option role="
dongsheng@627 14628 "\"hg-ext-mq-cmd-qsave-opt\">hg -c</option></command>. This prints the name "
dongsheng@627 14629 "of the directory that it has saved the patches in. It will save the patches "
dongsheng@627 14630 "to a directory called <filename role=\"special\" class=\"directory\">.hg/"
dongsheng@627 14631 "patches.N</filename>, where <literal>N</literal> is a small integer. It also "
dongsheng@627 14632 "commits a <quote>save changeset</quote> on top of your applied patches; this "
dongsheng@627 14633 "is for internal book-keeping, and records the states of the <filename role="
dongsheng@627 14634 "\"special\">series</filename> and <filename role=\"special\">status</"
dongsheng@627 14635 "filename> files."
dongsheng@627 14636 msgstr ""
dongsheng@627 14637
dongsheng@627 14638 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
songdongsheng@658 14639 #: ../en/ch11-mq.xml:862
dongsheng@627 14640 msgid ""
dongsheng@627 14641 "Use <command role=\"hg-cmd\">hg pull</command> to bring new changes into the "
dongsheng@627 14642 "underlying repository. (Don't run <command role=\"hg-cmd\">hg pull -u</"
dongsheng@627 14643 "command>; see below for why.)"
dongsheng@627 14644 msgstr ""
dongsheng@627 14645
dongsheng@627 14646 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
songdongsheng@658 14647 #: ../en/ch11-mq.xml:867
dongsheng@627 14648 msgid ""
dongsheng@627 14649 "Update to the new tip revision, using <command role=\"hg-cmd\">hg update "
dongsheng@627 14650 "<option role=\"hg-opt-update\">-C</option></command> to override the patches "
dongsheng@627 14651 "you have pushed."
dongsheng@627 14652 msgstr ""
dongsheng@627 14653
dongsheng@627 14654 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
songdongsheng@658 14655 #: ../en/ch11-mq.xml:872
dongsheng@650 14656 msgid ""
dongsheng@650 14657 "Merge all patches using <command>hg qpush -m -a</command>. The <option role="
dongsheng@650 14658 "\"hg-ext-mq-cmd-qpush-opt\">-m</option> option to <command role=\"hg-ext-mq"
dongsheng@650 14659 "\">qpush</command> tells MQ to perform a three-way merge if the patch fails "
dongsheng@650 14660 "to apply."
dongsheng@650 14661 msgstr ""
dongsheng@650 14662
dongsheng@650 14663 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14664 #: ../en/ch11-mq.xml:880
dongsheng@627 14665 msgid ""
dongsheng@627 14666 "During the <command role=\"hg-cmd\">hg qpush <option role=\"hg-ext-mq-cmd-"
dongsheng@627 14667 "qpush-opt\">hg -m</option></command>, each patch in the <filename role="
dongsheng@627 14668 "\"special\">series</filename> file is applied normally. If a patch applies "
dongsheng@627 14669 "with fuzz or rejects, MQ looks at the queue you <command role=\"hg-ext-mq"
dongsheng@627 14670 "\">qsave</command>d, and performs a three-way merge with the corresponding "
dongsheng@627 14671 "changeset. This merge uses Mercurial's normal merge machinery, so it may pop "
dongsheng@627 14672 "up a GUI merge tool to help you to resolve problems."
dongsheng@627 14673 msgstr ""
dongsheng@627 14674
dongsheng@627 14675 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14676 #: ../en/ch11-mq.xml:890
dongsheng@627 14677 msgid ""
dongsheng@627 14678 "When you finish resolving the effects of a patch, MQ refreshes your patch "
dongsheng@627 14679 "based on the result of the merge."
dongsheng@627 14680 msgstr ""
dongsheng@627 14681
dongsheng@627 14682 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14683 #: ../en/ch11-mq.xml:893
dongsheng@627 14684 msgid ""
dongsheng@627 14685 "At the end of this process, your repository will have one extra head from the "
dongsheng@627 14686 "old patch queue, and a copy of the old patch queue will be in <filename role="
dongsheng@627 14687 "\"special\" class=\"directory\">.hg/patches.N</filename>. You can remove the "
dongsheng@627 14688 "extra head using <command role=\"hg-cmd\">hg qpop -a -n patches.N</command> "
dongsheng@627 14689 "or <command role=\"hg-cmd\">hg strip</command>. You can delete <filename "
dongsheng@627 14690 "role=\"special\" class=\"directory\">.hg/patches.N</filename> once you are "
dongsheng@627 14691 "sure that you no longer need it as a backup."
dongsheng@627 14692 msgstr ""
dongsheng@627 14693
dongsheng@627 14694 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14695 #: ../en/ch11-mq.xml:905
dongsheng@627 14696 msgid "Identifying patches"
dongsheng@636 14697 msgstr "标识补丁"
dongsheng@627 14698
dongsheng@627 14699 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14700 #: ../en/ch11-mq.xml:907
dongsheng@627 14701 msgid ""
dongsheng@627 14702 "MQ commands that work with patches let you refer to a patch either by using "
dongsheng@627 14703 "its name or by a number. By name is obvious enough; pass the name "
dongsheng@627 14704 "<filename>foo.patch</filename> to <command role=\"hg-ext-mq\">qpush</"
dongsheng@627 14705 "command>, for example, and it will push patches until <filename>foo.patch</"
dongsheng@627 14706 "filename> is applied."
dongsheng@627 14707 msgstr ""
dongsheng@627 14708
dongsheng@627 14709 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14710 #: ../en/ch11-mq.xml:914
dongsheng@627 14711 msgid ""
dongsheng@627 14712 "As a shortcut, you can refer to a patch using both a name and a numeric "
dongsheng@627 14713 "offset; <literal>foo.patch-2</literal> means <quote>two patches before "
dongsheng@627 14714 "<literal>foo.patch</literal></quote>, while <literal>bar.patch+4</literal> "
dongsheng@627 14715 "means <quote>four patches after <literal>bar.patch</literal></quote>."
dongsheng@627 14716 msgstr ""
dongsheng@627 14717
dongsheng@627 14718 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14719 #: ../en/ch11-mq.xml:920
dongsheng@627 14720 msgid ""
dongsheng@627 14721 "Referring to a patch by index isn't much different. The first patch printed "
dongsheng@627 14722 "in the output of <command role=\"hg-ext-mq\">qseries</command> is patch zero "
dongsheng@627 14723 "(yes, it's one of those start-at-zero counting systems); the second is patch "
dongsheng@627 14724 "one; and so on."
dongsheng@627 14725 msgstr ""
dongsheng@627 14726
dongsheng@627 14727 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14728 #: ../en/ch11-mq.xml:926
dongsheng@627 14729 msgid ""
dongsheng@627 14730 "MQ also makes it easy to work with patches when you are using normal "
dongsheng@627 14731 "Mercurial commands. Every command that accepts a changeset ID will also "
dongsheng@627 14732 "accept the name of an applied patch. MQ augments the tags normally in the "
dongsheng@627 14733 "repository with an eponymous one for each applied patch. In addition, the "
dongsheng@650 14734 "special tags <literal role=\"tag\">qbase</literal> and <literal role=\"tag"
dongsheng@650 14735 "\">qtip</literal> identify the <quote>bottom-most</quote> and topmost applied "
dongsheng@650 14736 "patches, respectively."
dongsheng@650 14737 msgstr ""
dongsheng@650 14738
dongsheng@650 14739 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14740 #: ../en/ch11-mq.xml:936
dongsheng@627 14741 msgid ""
dongsheng@627 14742 "These additions to Mercurial's normal tagging capabilities make dealing with "
dongsheng@627 14743 "patches even more of a breeze."
dongsheng@627 14744 msgstr ""
dongsheng@627 14745
dongsheng@627 14746 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 14747 #: ../en/ch11-mq.xml:939
dongsheng@627 14748 msgid "Want to patchbomb a mailing list with your latest series of changes?"
dongsheng@627 14749 msgstr ""
dongsheng@627 14750
dongsheng@627 14751 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 14752 #: ../en/ch11-mq.xml:942
songdongsheng@658 14753 msgid ""
songdongsheng@658 14754 "(Don't know what <quote>patchbombing</quote> is? See <xref linkend=\"sec:"
songdongsheng@658 14755 "hgext:patchbomb\"/>.)"
dongsheng@627 14756 msgstr ""
dongsheng@627 14757
dongsheng@627 14758 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 14759 #: ../en/ch11-mq.xml:945
dongsheng@627 14760 msgid ""
dongsheng@627 14761 "Need to see all of the patches since <literal>foo.patch</literal> that have "
dongsheng@627 14762 "touched files in a subdirectory of your tree?"
dongsheng@627 14763 msgstr ""
dongsheng@627 14764
dongsheng@650 14765 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14766 #: ../en/ch11-mq.xml:952
dongsheng@627 14767 msgid ""
dongsheng@627 14768 "Because MQ makes the names of patches available to the rest of Mercurial "
dongsheng@627 14769 "through its normal internal tag machinery, you don't need to type in the "
dongsheng@627 14770 "entire name of a patch when you want to identify it by name."
dongsheng@627 14771 msgstr ""
dongsheng@627 14772
dongsheng@627 14773 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14774 #: ../en/ch11-mq.xml:957
dongsheng@627 14775 msgid ""
dongsheng@627 14776 "Another nice consequence of representing patch names as tags is that when you "
dongsheng@627 14777 "run the <command role=\"hg-cmd\">hg log</command> command, it will display a "
dongsheng@627 14778 "patch's name as a tag, simply as part of its normal output. This makes it "
dongsheng@627 14779 "easy to visually distinguish applied patches from underlying <quote>normal</"
dongsheng@627 14780 "quote> revisions. The following example shows a few normal Mercurial "
dongsheng@627 14781 "commands in use with applied patches."
dongsheng@627 14782 msgstr ""
dongsheng@627 14783
dongsheng@627 14784 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14785 #: ../en/ch11-mq.xml:970
dongsheng@627 14786 msgid "Useful things to know about"
dongsheng@636 14787 msgstr "其它需要了解的东西"
dongsheng@627 14788
dongsheng@627 14789 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14790 #: ../en/ch11-mq.xml:972
dongsheng@627 14791 msgid ""
dongsheng@627 14792 "There are a number of aspects of MQ usage that don't fit tidily into sections "
dongsheng@627 14793 "of their own, but that are good to know. Here they are, in one place."
dongsheng@627 14794 msgstr ""
dongsheng@627 14795
dongsheng@627 14796 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 14797 #: ../en/ch11-mq.xml:977
dongsheng@627 14798 msgid ""
dongsheng@627 14799 "Normally, when you <command role=\"hg-ext-mq\">qpop</command> a patch and "
dongsheng@627 14800 "<command role=\"hg-ext-mq\">qpush</command> it again, the changeset that "
dongsheng@627 14801 "represents the patch after the pop/push will have a <emphasis>different "
dongsheng@627 14802 "identity</emphasis> than the changeset that represented the hash beforehand. "
songdongsheng@658 14803 "See <xref linkend=\"sec:mqref:cmd:qpush\"/> for information as to why this is."
dongsheng@627 14804 msgstr ""
dongsheng@627 14805
dongsheng@627 14806 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
songdongsheng@658 14807 #: ../en/ch11-mq.xml:986
dongsheng@627 14808 msgid ""
dongsheng@627 14809 "It's not a good idea to <command role=\"hg-cmd\">hg merge</command> changes "
dongsheng@627 14810 "from another branch with a patch changeset, at least if you want to maintain "
dongsheng@627 14811 "the <quote>patchiness</quote> of that changeset and changesets below it on "
dongsheng@627 14812 "the patch stack. If you try to do this, it will appear to succeed, but MQ "
dongsheng@627 14813 "will become confused."
dongsheng@627 14814 msgstr ""
dongsheng@627 14815
dongsheng@627 14816 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14817 #: ../en/ch11-mq.xml:997
dongsheng@627 14818 msgid "Managing patches in a repository"
dongsheng@636 14819 msgstr "在版本库管理补丁"
dongsheng@627 14820
dongsheng@627 14821 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14822 #: ../en/ch11-mq.xml:999
dongsheng@627 14823 msgid ""
dongsheng@627 14824 "Because MQ's <filename role=\"special\" class=\"directory\">.hg/patches</"
dongsheng@627 14825 "filename> directory resides outside a Mercurial repository's working "
dongsheng@627 14826 "directory, the <quote>underlying</quote> Mercurial repository knows nothing "
dongsheng@627 14827 "about the management or presence of patches."
dongsheng@627 14828 msgstr ""
dongsheng@627 14829
dongsheng@627 14830 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14831 #: ../en/ch11-mq.xml:1005
dongsheng@627 14832 msgid ""
dongsheng@627 14833 "This presents the interesting possibility of managing the contents of the "
dongsheng@627 14834 "patch directory as a Mercurial repository in its own right. This can be a "
dongsheng@627 14835 "useful way to work. For example, you can work on a patch for a while, "
dongsheng@627 14836 "<command role=\"hg-ext-mq\">qrefresh</command> it, then <command role=\"hg-cmd"
dongsheng@627 14837 "\">hg commit</command> the current state of the patch. This lets you "
dongsheng@627 14838 "<quote>roll back</quote> to that version of the patch later on."
dongsheng@627 14839 msgstr ""
dongsheng@627 14840
dongsheng@627 14841 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14842 #: ../en/ch11-mq.xml:1014
dongsheng@627 14843 msgid ""
dongsheng@627 14844 "You can then share different versions of the same patch stack among multiple "
dongsheng@627 14845 "underlying repositories. I use this when I am developing a Linux kernel "
dongsheng@627 14846 "feature. I have a pristine copy of my kernel sources for each of several CPU "
dongsheng@627 14847 "architectures, and a cloned repository under each that contains the patches I "
dongsheng@627 14848 "am working on. When I want to test a change on a different architecture, I "
dongsheng@627 14849 "push my current patches to the patch repository associated with that kernel "
dongsheng@627 14850 "tree, pop and push all of my patches, and build and test that kernel."
dongsheng@627 14851 msgstr ""
dongsheng@627 14852
dongsheng@627 14853 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14854 #: ../en/ch11-mq.xml:1024
dongsheng@627 14855 msgid ""
dongsheng@627 14856 "Managing patches in a repository makes it possible for multiple developers to "
dongsheng@627 14857 "work on the same patch series without colliding with each other, all on top "
dongsheng@627 14858 "of an underlying source base that they may or may not control."
dongsheng@627 14859 msgstr ""
dongsheng@627 14860
dongsheng@627 14861 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14862 #: ../en/ch11-mq.xml:1030
dongsheng@627 14863 msgid "MQ support for patch repositories"
dongsheng@636 14864 msgstr "MQ 支持补丁版本库"
dongsheng@627 14865
dongsheng@627 14866 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14867 #: ../en/ch11-mq.xml:1032
dongsheng@627 14868 msgid ""
dongsheng@627 14869 "MQ helps you to work with the <filename role=\"special\" class=\"directory\">."
dongsheng@627 14870 "hg/patches</filename> directory as a repository; when you prepare a "
dongsheng@627 14871 "repository for working with patches using <command role=\"hg-ext-mq\">qinit</"
dongsheng@627 14872 "command>, you can pass the <option role=\"hg-ext-mq-cmd-qinit-opt\">hg -c</"
dongsheng@627 14873 "option> option to create the <filename role=\"special\" class=\"directory\">."
dongsheng@627 14874 "hg/patches</filename> directory as a Mercurial repository."
dongsheng@627 14875 msgstr ""
dongsheng@627 14876
dongsheng@627 14877 #. type: Content of: <book><chapter><sect1><sect2><note><para>
songdongsheng@658 14878 #: ../en/ch11-mq.xml:1042
dongsheng@627 14879 msgid ""
dongsheng@627 14880 "If you forget to use the <option role=\"hg-ext-mq-cmd-qinit-opt\">hg -c</"
dongsheng@627 14881 "option> option, you can simply go into the <filename role=\"special\" class="
dongsheng@627 14882 "\"directory\">.hg/patches</filename> directory at any time and run <command "
dongsheng@627 14883 "role=\"hg-cmd\">hg init</command>. Don't forget to add an entry for the "
dongsheng@627 14884 "<filename role=\"special\">status</filename> file to the <filename role="
dongsheng@627 14885 "\"special\">.hgignore</filename> file, though"
dongsheng@627 14886 msgstr ""
dongsheng@627 14887
dongsheng@627 14888 #. type: Content of: <book><chapter><sect1><sect2><note><para>
songdongsheng@658 14889 #: ../en/ch11-mq.xml:1051
dongsheng@627 14890 msgid ""
dongsheng@627 14891 "(<command role=\"hg-cmd\">hg qinit <option role=\"hg-ext-mq-cmd-qinit-opt"
dongsheng@627 14892 "\">hg -c</option></command> does this for you automatically); you "
dongsheng@627 14893 "<emphasis>really</emphasis> don't want to manage the <filename role=\"special"
dongsheng@627 14894 "\">status</filename> file."
dongsheng@627 14895 msgstr ""
dongsheng@627 14896
dongsheng@627 14897 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14898 #: ../en/ch11-mq.xml:1058
dongsheng@627 14899 msgid ""
dongsheng@627 14900 "As a convenience, if MQ notices that the <filename class=\"directory\">.hg/"
dongsheng@627 14901 "patches</filename> directory is a repository, it will automatically <command "
dongsheng@627 14902 "role=\"hg-cmd\">hg add</command> every patch that you create and import."
dongsheng@627 14903 msgstr ""
dongsheng@627 14904
dongsheng@627 14905 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14906 #: ../en/ch11-mq.xml:1063
dongsheng@627 14907 msgid ""
dongsheng@627 14908 "MQ provides a shortcut command, <command role=\"hg-ext-mq\">qcommit</"
dongsheng@627 14909 "command>, that runs <command role=\"hg-cmd\">hg commit</command> in the "
dongsheng@627 14910 "<filename role=\"special\" class=\"directory\">.hg/patches</filename> "
dongsheng@627 14911 "directory. This saves some bothersome typing."
dongsheng@627 14912 msgstr ""
dongsheng@627 14913
dongsheng@627 14914 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14915 #: ../en/ch11-mq.xml:1069
dongsheng@627 14916 msgid ""
dongsheng@627 14917 "Finally, as a convenience to manage the patch directory, you can define the "
dongsheng@627 14918 "alias <command>mq</command> on Unix systems. For example, on Linux systems "
dongsheng@627 14919 "using the <command>bash</command> shell, you can include the following "
dongsheng@627 14920 "snippet in your <filename role=\"home\">~/.bashrc</filename>."
dongsheng@627 14921 msgstr ""
dongsheng@627 14922
dongsheng@627 14923 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14924 #: ../en/ch11-mq.xml:1078
dongsheng@627 14925 msgid ""
dongsheng@627 14926 "You can then issue commands of the form <command>mq pull</command> from the "
dongsheng@627 14927 "main repository."
dongsheng@627 14928 msgstr ""
dongsheng@627 14929
dongsheng@627 14930 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 14931 #: ../en/ch11-mq.xml:1083
dongsheng@627 14932 msgid "A few things to watch out for"
dongsheng@636 14933 msgstr "需要注意的事情"
dongsheng@627 14934
dongsheng@627 14935 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14936 #: ../en/ch11-mq.xml:1085
dongsheng@627 14937 msgid ""
dongsheng@627 14938 "MQ's support for working with a repository full of patches is limited in a "
dongsheng@627 14939 "few small respects."
dongsheng@627 14940 msgstr ""
dongsheng@627 14941
dongsheng@627 14942 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 14943 #: ../en/ch11-mq.xml:1088
dongsheng@627 14944 msgid ""
dongsheng@627 14945 "MQ cannot automatically detect changes that you make to the patch directory. "
dongsheng@627 14946 "If you <command role=\"hg-cmd\">hg pull</command>, manually edit, or <command "
dongsheng@627 14947 "role=\"hg-cmd\">hg update</command> changes to patches or the <filename role="
dongsheng@627 14948 "\"special\">series</filename> file, you will have to <command role=\"hg-cmd"
dongsheng@627 14949 "\">hg qpop <option role=\"hg-ext-mq-cmd-qpop-opt\">hg -a</option></command> "
dongsheng@627 14950 "and then <command role=\"hg-cmd\">hg qpush <option role=\"hg-ext-mq-cmd-qpush-"
dongsheng@627 14951 "opt\">hg -a</option></command> in the underlying repository to see those "
dongsheng@627 14952 "changes show up there. If you forget to do this, you can confuse MQ's idea "
dongsheng@627 14953 "of which patches are applied."
dongsheng@627 14954 msgstr ""
dongsheng@627 14955
dongsheng@627 14956 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14957 #: ../en/ch11-mq.xml:1104
dongsheng@627 14958 msgid "Third party tools for working with patches"
dongsheng@636 14959 msgstr "操作补丁的第三方工具"
dongsheng@627 14960
dongsheng@627 14961 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14962 #: ../en/ch11-mq.xml:1106
dongsheng@627 14963 msgid ""
dongsheng@627 14964 "Once you've been working with patches for a while, you'll find yourself "
dongsheng@627 14965 "hungry for tools that will help you to understand and manipulate the patches "
dongsheng@627 14966 "you're dealing with."
dongsheng@627 14967 msgstr ""
dongsheng@627 14968
dongsheng@627 14969 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14970 #: ../en/ch11-mq.xml:1110
dongsheng@627 14971 msgid ""
dongsheng@627 14972 "The <command>diffstat</command> command <citation>web:diffstat</citation> "
dongsheng@627 14973 "generates a histogram of the modifications made to each file in a patch. It "
dongsheng@661 14974 "provides a good way to <quote>get a sense of</quote> a patch—which files it "
dongsheng@661 14975 "affects, and how much change it introduces to each file and as a whole. (I "
dongsheng@661 14976 "find that it's a good idea to use <command>diffstat</command>'s <option role="
dongsheng@661 14977 "\"cmd-opt-diffstat\">-p</option> option as a matter of course, as otherwise "
dongsheng@661 14978 "it will try to do clever things with prefixes of file names that inevitably "
dongsheng@661 14979 "confuse at least me.)"
dongsheng@627 14980 msgstr ""
dongsheng@627 14981
dongsheng@627 14982 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 14983 #: ../en/ch11-mq.xml:1124
dongsheng@627 14984 msgid ""
dongsheng@627 14985 "The <literal role=\"package\">patchutils</literal> package <citation>web:"
dongsheng@627 14986 "patchutils</citation> is invaluable. It provides a set of small utilities "
dongsheng@627 14987 "that follow the <quote>Unix philosophy;</quote> each does one useful thing "
dongsheng@627 14988 "with a patch. The <literal role=\"package\">patchutils</literal> command I "
dongsheng@627 14989 "use most is <command>filterdiff</command>, which extracts subsets from a "
dongsheng@627 14990 "patch file. For example, given a patch that modifies hundreds of files "
dongsheng@627 14991 "across dozens of directories, a single invocation of <command>filterdiff</"
dongsheng@627 14992 "command> can generate a smaller patch that only touches files whose names "
songdongsheng@658 14993 "match a particular glob pattern. See <xref linkend=\"mq-collab:tips:interdiff"
songdongsheng@658 14994 "\"/> for another example."
dongsheng@627 14995 msgstr ""
dongsheng@627 14996
dongsheng@627 14997 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 14998 #: ../en/ch11-mq.xml:1140
dongsheng@627 14999 msgid "Good ways to work with patches"
dongsheng@636 15000 msgstr "操作补丁的好习惯"
dongsheng@627 15001
dongsheng@627 15002 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 15003 #: ../en/ch11-mq.xml:1142
dongsheng@627 15004 msgid ""
dongsheng@627 15005 "Whether you are working on a patch series to submit to a free software or "
dongsheng@627 15006 "open source project, or a series that you intend to treat as a sequence of "
dongsheng@627 15007 "regular changesets when you're done, you can use some simple techniques to "
dongsheng@627 15008 "keep your work well organised."
dongsheng@627 15009 msgstr ""
dongsheng@627 15010
dongsheng@627 15011 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 15012 #: ../en/ch11-mq.xml:1148
dongsheng@627 15013 msgid ""
dongsheng@627 15014 "Give your patches descriptive names. A good name for a patch might be "
dongsheng@627 15015 "<filename>rework-device-alloc.patch</filename>, because it will immediately "
dongsheng@627 15016 "give you a hint what the purpose of the patch is. Long names shouldn't be a "
dongsheng@627 15017 "problem; you won't be typing the names often, but you <emphasis>will</"
dongsheng@627 15018 "emphasis> be running commands like <command role=\"hg-ext-mq\">qapplied</"
dongsheng@627 15019 "command> and <command role=\"hg-ext-mq\">qtop</command> over and over. Good "
dongsheng@627 15020 "naming becomes especially important when you have a number of patches to work "
dongsheng@627 15021 "with, or if you are juggling a number of different tasks and your patches "
dongsheng@627 15022 "only get a fraction of your attention."
dongsheng@627 15023 msgstr ""
dongsheng@627 15024
dongsheng@627 15025 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 15026 #: ../en/ch11-mq.xml:1160
dongsheng@627 15027 msgid ""
dongsheng@627 15028 "Be aware of what patch you're working on. Use the <command role=\"hg-ext-mq"
dongsheng@661 15029 "\">qtop</command> command and skim over the text of your patches frequently—"
dongsheng@661 15030 "for example, using <command role=\"hg-cmd\">hg tip <option role=\"hg-opt-tip"
dongsheng@661 15031 "\">-p</option></command>)—to be sure of where you stand. I have several "
dongsheng@661 15032 "times worked on and <command role=\"hg-ext-mq\">qrefresh</command>ed a patch "
dongsheng@661 15033 "other than the one I intended, and it's often tricky to migrate changes into "
dongsheng@661 15034 "the right patch after making them in the wrong one."
dongsheng@627 15035 msgstr ""
dongsheng@627 15036
dongsheng@627 15037 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 15038 #: ../en/ch11-mq.xml:1170
dongsheng@627 15039 msgid ""
dongsheng@627 15040 "For this reason, it is very much worth investing a little time to learn how "
songdongsheng@658 15041 "to use some of the third-party tools I described in <xref linkend=\"sec:mq:"
songdongsheng@658 15042 "tools\"/>, particularly <command>diffstat</command> and <command>filterdiff</"
songdongsheng@658 15043 "command>. The former will give you a quick idea of what changes your patch "
songdongsheng@658 15044 "is making, while the latter makes it easy to splice hunks selectively out of "
songdongsheng@658 15045 "one patch and into another."
dongsheng@627 15046 msgstr ""
dongsheng@627 15047
dongsheng@627 15048 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 15049 #: ../en/ch11-mq.xml:1181
dongsheng@627 15050 msgid "MQ cookbook"
dongsheng@636 15051 msgstr "MQ 手册"
dongsheng@627 15052
dongsheng@627 15053 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 15054 #: ../en/ch11-mq.xml:1184
dongsheng@627 15055 msgid "Manage <quote>trivial</quote> patches"
dongsheng@636 15056 msgstr "管理<quote>琐碎的</quote>补丁"
dongsheng@627 15057
dongsheng@627 15058 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15059 #: ../en/ch11-mq.xml:1186
dongsheng@627 15060 msgid ""
dongsheng@627 15061 "Because the overhead of dropping files into a new Mercurial repository is so "
dongsheng@627 15062 "low, it makes a lot of sense to manage patches this way even if you simply "
dongsheng@627 15063 "want to make a few changes to a source tarball that you downloaded."
dongsheng@627 15064 msgstr ""
dongsheng@627 15065
dongsheng@627 15066 #
dongsheng@627 15067 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15068 #: ../en/ch11-mq.xml:1191
dongsheng@627 15069 msgid ""
dongsheng@627 15070 "Begin by downloading and unpacking the source tarball, and turning it into a "
dongsheng@627 15071 "Mercurial repository."
dongsheng@627 15072 msgstr ""
dongsheng@627 15073
dongsheng@627 15074 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15075 #: ../en/ch11-mq.xml:1196
dongsheng@627 15076 msgid "Continue by creating a patch stack and making your changes."
dongsheng@627 15077 msgstr ""
dongsheng@627 15078
dongsheng@627 15079 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15080 #: ../en/ch11-mq.xml:1201
dongsheng@627 15081 msgid ""
dongsheng@627 15082 "Let's say a few weeks or months pass, and your package author releases a new "
dongsheng@627 15083 "version. First, bring their changes into the repository."
dongsheng@627 15084 msgstr ""
dongsheng@627 15085
dongsheng@627 15086 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15087 #: ../en/ch11-mq.xml:1207
dongsheng@627 15088 msgid ""
dongsheng@627 15089 "The pipeline starting with <command role=\"hg-cmd\">hg locate</command> above "
dongsheng@627 15090 "deletes all files in the working directory, so that <command role=\"hg-cmd"
dongsheng@627 15091 "\">hg commit</command>'s <option role=\"hg-opt-commit\">--addremove</option> "
dongsheng@627 15092 "option can actually tell which files have really been removed in the newer "
dongsheng@627 15093 "version of the source."
dongsheng@627 15094 msgstr ""
dongsheng@627 15095
dongsheng@627 15096 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15097 #: ../en/ch11-mq.xml:1215
dongsheng@627 15098 msgid "Finally, you can apply your patches on top of the new tree."
dongsheng@627 15099 msgstr ""
dongsheng@627 15100
dongsheng@627 15101 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 15102 #: ../en/ch11-mq.xml:1222
dongsheng@627 15103 msgid "Combining entire patches"
dongsheng@636 15104 msgstr "组合全部的补丁"
dongsheng@627 15105
dongsheng@627 15106 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15107 #: ../en/ch11-mq.xml:1224
dongsheng@627 15108 msgid ""
dongsheng@627 15109 "MQ provides a command, <command role=\"hg-ext-mq\">qfold</command> that lets "
dongsheng@627 15110 "you combine entire patches. This <quote>folds</quote> the patches you name, "
dongsheng@627 15111 "in the order you name them, into the topmost applied patch, and concatenates "
dongsheng@627 15112 "their descriptions onto the end of its description. The patches that you "
dongsheng@627 15113 "fold must be unapplied before you fold them."
dongsheng@627 15114 msgstr ""
dongsheng@627 15115
dongsheng@627 15116 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15117 #: ../en/ch11-mq.xml:1232
dongsheng@627 15118 msgid ""
dongsheng@627 15119 "The order in which you fold patches matters. If your topmost applied patch "
dongsheng@627 15120 "is <literal>foo</literal>, and you <command role=\"hg-ext-mq\">qfold</"
dongsheng@627 15121 "command> <literal>bar</literal> and <literal>quux</literal> into it, you will "
dongsheng@627 15122 "end up with a patch that has the same effect as if you applied first "
dongsheng@627 15123 "<literal>foo</literal>, then <literal>bar</literal>, followed by "
dongsheng@627 15124 "<literal>quux</literal>."
dongsheng@627 15125 msgstr ""
dongsheng@627 15126
dongsheng@627 15127 #. type: Content of: <book><chapter><sect1><sect2><title>
songdongsheng@658 15128 #: ../en/ch11-mq.xml:1243
dongsheng@627 15129 msgid "Merging part of one patch into another"
dongsheng@636 15130 msgstr "合并补丁的部分内容到其它补丁"
dongsheng@627 15131
dongsheng@627 15132 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15133 #: ../en/ch11-mq.xml:1245
dongsheng@627 15134 msgid ""
dongsheng@627 15135 "Merging <emphasis>part</emphasis> of one patch into another is more difficult "
dongsheng@627 15136 "than combining entire patches."
dongsheng@627 15137 msgstr ""
dongsheng@627 15138
dongsheng@627 15139 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15140 #: ../en/ch11-mq.xml:1249
dongsheng@627 15141 msgid ""
dongsheng@627 15142 "If you want to move changes to entire files, you can use <command>filterdiff</"
dongsheng@627 15143 "command>'s <option role=\"cmd-opt-filterdiff\">-i</option> and <option role="
dongsheng@627 15144 "\"cmd-opt-filterdiff\">-x</option> options to choose the modifications to "
dongsheng@627 15145 "snip out of one patch, concatenating its output onto the end of the patch you "
dongsheng@627 15146 "want to merge into. You usually won't need to modify the patch you've merged "
dongsheng@627 15147 "the changes from. Instead, MQ will report some rejected hunks when you "
dongsheng@627 15148 "<command role=\"hg-ext-mq\">qpush</command> it (from the hunks you moved into "
dongsheng@627 15149 "the other patch), and you can simply <command role=\"hg-ext-mq\">qrefresh</"
dongsheng@627 15150 "command> the patch to drop the duplicate hunks."
dongsheng@627 15151 msgstr ""
dongsheng@627 15152
dongsheng@627 15153 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15154 #: ../en/ch11-mq.xml:1262
dongsheng@627 15155 msgid ""
dongsheng@627 15156 "If you have a patch that has multiple hunks modifying a file, and you only "
dongsheng@627 15157 "want to move a few of those hunks, the job becomes more messy, but you can "
dongsheng@627 15158 "still partly automate it. Use <command>lsdiff -nvv</command> to print some "
dongsheng@627 15159 "metadata about the patch."
dongsheng@627 15160 msgstr ""
dongsheng@627 15161
dongsheng@627 15162 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15163 #: ../en/ch11-mq.xml:1270
dongsheng@627 15164 msgid "This command prints three different kinds of number:"
dongsheng@627 15165 msgstr ""
dongsheng@627 15166
dongsheng@627 15167 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 15168 #: ../en/ch11-mq.xml:1273
dongsheng@627 15169 msgid ""
dongsheng@627 15170 "(in the first column) a <emphasis>file number</emphasis> to identify each "
dongsheng@627 15171 "file modified in the patch;"
dongsheng@627 15172 msgstr ""
dongsheng@627 15173
dongsheng@627 15174 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 15175 #: ../en/ch11-mq.xml:1277
dongsheng@627 15176 msgid ""
dongsheng@627 15177 "(on the next line, indented) the line number within a modified file where a "
dongsheng@627 15178 "hunk starts; and"
dongsheng@627 15179 msgstr ""
dongsheng@627 15180
dongsheng@627 15181 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
songdongsheng@658 15182 #: ../en/ch11-mq.xml:1280
dongsheng@627 15183 msgid ""
dongsheng@627 15184 "(on the same line) a <emphasis>hunk number</emphasis> to identify that hunk."
dongsheng@627 15185 msgstr ""
dongsheng@627 15186
dongsheng@627 15187 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15188 #: ../en/ch11-mq.xml:1284
dongsheng@627 15189 msgid ""
dongsheng@627 15190 "You'll have to use some visual inspection, and reading of the patch, to "
dongsheng@627 15191 "identify the file and hunk numbers you'll want, but you can then pass them to "
dongsheng@627 15192 "to <command>filterdiff</command>'s <option role=\"cmd-opt-filterdiff\">--"
dongsheng@627 15193 "files</option> and <option role=\"cmd-opt-filterdiff\">--hunks</option> "
dongsheng@627 15194 "options, to select exactly the file and hunk you want to extract."
dongsheng@627 15195 msgstr ""
dongsheng@627 15196
dongsheng@627 15197 #. type: Content of: <book><chapter><sect1><sect2><para>
songdongsheng@658 15198 #: ../en/ch11-mq.xml:1292
dongsheng@627 15199 msgid ""
dongsheng@627 15200 "Once you have this hunk, you can concatenate it onto the end of your "
songdongsheng@658 15201 "destination patch and continue with the remainder of <xref linkend=\"sec:mq:"
songdongsheng@658 15202 "combine\"/>."
dongsheng@627 15203 msgstr ""
dongsheng@627 15204
dongsheng@627 15205 #. type: Content of: <book><chapter><sect1><title>
songdongsheng@658 15206 #: ../en/ch11-mq.xml:1299
dongsheng@627 15207 msgid "Differences between quilt and MQ"
dongsheng@636 15208 msgstr "MQ 与 quilt 的区别"
dongsheng@627 15209
dongsheng@627 15210 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 15211 #: ../en/ch11-mq.xml:1301
dongsheng@627 15212 msgid ""
dongsheng@627 15213 "If you are already familiar with quilt, MQ provides a similar command set. "
dongsheng@627 15214 "There are a few differences in the way that it works."
dongsheng@627 15215 msgstr ""
dongsheng@627 15216
dongsheng@627 15217 #. type: Content of: <book><chapter><sect1><para>
songdongsheng@658 15218 #: ../en/ch11-mq.xml:1305
dongsheng@627 15219 msgid ""
dongsheng@627 15220 "You will already have noticed that most quilt commands have MQ counterparts "
dongsheng@627 15221 "that simply begin with a <quote><literal>q</literal></quote>. The exceptions "
dongsheng@627 15222 "are quilt's <literal>add</literal> and <literal>remove</literal> commands, "
dongsheng@627 15223 "the counterparts for which are the normal Mercurial <command role=\"hg-cmd"
dongsheng@627 15224 "\">hg add</command> and <command role=\"hg-cmd\">hg remove</command> "
dongsheng@627 15225 "commands. There is no MQ equivalent of the quilt <literal>edit</literal> "
dongsheng@627 15226 "command."
dongsheng@627 15227 msgstr ""
dongsheng@627 15228
dongsheng@627 15229 #. type: Content of: <book><chapter><title>
dongsheng@650 15230 #: ../en/ch12-mq-collab.xml:5
dongsheng@627 15231 msgid "Advanced uses of Mercurial Queues"
dongsheng@627 15232 msgstr "MQ 的高级用法"
dongsheng@627 15233
dongsheng@627 15234 #. type: Content of: <book><chapter><para>
dongsheng@650 15235 #: ../en/ch12-mq-collab.xml:7
dongsheng@627 15236 msgid ""
dongsheng@627 15237 "While it's easy to pick up straightforward uses of Mercurial Queues, use of a "
dongsheng@627 15238 "little discipline and some of MQ's less frequently used capabilities makes it "
dongsheng@627 15239 "possible to work in complicated development environments."
dongsheng@627 15240 msgstr ""
dongsheng@627 15241
dongsheng@627 15242 #. type: Content of: <book><chapter><para>
dongsheng@650 15243 #: ../en/ch12-mq-collab.xml:12
dongsheng@627 15244 msgid ""
dongsheng@627 15245 "In this chapter, I will use as an example a technique I have used to manage "
dongsheng@627 15246 "the development of an Infiniband device driver for the Linux kernel. The "
dongsheng@627 15247 "driver in question is large (at least as drivers go), with 25,000 lines of "
dongsheng@627 15248 "code spread across 35 source files. It is maintained by a small team of "
dongsheng@627 15249 "developers."
dongsheng@627 15250 msgstr ""
dongsheng@627 15251
dongsheng@627 15252 #. type: Content of: <book><chapter><para>
dongsheng@650 15253 #: ../en/ch12-mq-collab.xml:18
dongsheng@627 15254 msgid ""
dongsheng@627 15255 "While much of the material in this chapter is specific to Linux, the same "
dongsheng@627 15256 "principles apply to any code base for which you're not the primary owner, and "
dongsheng@627 15257 "upon which you need to do a lot of development."
dongsheng@627 15258 msgstr ""
dongsheng@627 15259
dongsheng@627 15260 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15261 #: ../en/ch12-mq-collab.xml:24
dongsheng@627 15262 msgid "The problem of many targets"
dongsheng@636 15263 msgstr "多个目标的问题"
dongsheng@627 15264
dongsheng@627 15265 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15266 #: ../en/ch12-mq-collab.xml:26
dongsheng@627 15267 msgid ""
dongsheng@627 15268 "The Linux kernel changes rapidly, and has never been internally stable; "
dongsheng@627 15269 "developers frequently make drastic changes between releases. This means that "
dongsheng@627 15270 "a version of the driver that works well with a particular released version of "
dongsheng@627 15271 "the kernel will not even <emphasis>compile</emphasis> correctly against, "
dongsheng@627 15272 "typically, any other version."
dongsheng@627 15273 msgstr ""
dongsheng@627 15274
dongsheng@627 15275 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15276 #: ../en/ch12-mq-collab.xml:33
dongsheng@627 15277 msgid ""
dongsheng@627 15278 "To maintain a driver, we have to keep a number of distinct versions of Linux "
dongsheng@627 15279 "in mind."
dongsheng@627 15280 msgstr ""
dongsheng@627 15281
dongsheng@627 15282 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15283 #: ../en/ch12-mq-collab.xml:36
dongsheng@627 15284 msgid ""
dongsheng@627 15285 "One target is the main Linux kernel development tree. Maintenance of the code "
dongsheng@627 15286 "is in this case partly shared by other developers in the kernel community, "
dongsheng@627 15287 "who make <quote>drive-by</quote> modifications to the driver as they develop "
dongsheng@627 15288 "and refine kernel subsystems."
dongsheng@627 15289 msgstr ""
dongsheng@627 15290
dongsheng@627 15291 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15292 #: ../en/ch12-mq-collab.xml:42
dongsheng@627 15293 msgid ""
dongsheng@627 15294 "We also maintain a number of <quote>backports</quote> to older versions of "
dongsheng@627 15295 "the Linux kernel, to support the needs of customers who are running older "
dongsheng@627 15296 "Linux distributions that do not incorporate our drivers. (To "
dongsheng@627 15297 "<emphasis>backport</emphasis> a piece of code is to modify it to work in an "
dongsheng@627 15298 "older version of its target environment than the version it was developed "
dongsheng@627 15299 "for.)"
dongsheng@627 15300 msgstr ""
dongsheng@627 15301
dongsheng@627 15302 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15303 #: ../en/ch12-mq-collab.xml:50
dongsheng@627 15304 msgid ""
dongsheng@627 15305 "Finally, we make software releases on a schedule that is necessarily not "
dongsheng@627 15306 "aligned with those used by Linux distributors and kernel developers, so that "
dongsheng@627 15307 "we can deliver new features to customers without forcing them to upgrade "
dongsheng@627 15308 "their entire kernels or distributions."
dongsheng@627 15309 msgstr ""
dongsheng@627 15310
dongsheng@627 15311 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 15312 #: ../en/ch12-mq-collab.xml:58
dongsheng@627 15313 msgid "Tempting approaches that don't work well"
dongsheng@636 15314 msgstr "工作不好的诱人方法"
dongsheng@627 15315
dongsheng@627 15316 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15317 #: ../en/ch12-mq-collab.xml:60
dongsheng@627 15318 msgid ""
dongsheng@627 15319 "There are two <quote>standard</quote> ways to maintain a piece of software "
dongsheng@627 15320 "that has to target many different environments."
dongsheng@627 15321 msgstr ""
dongsheng@627 15322
dongsheng@627 15323 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15324 #: ../en/ch12-mq-collab.xml:64
dongsheng@627 15325 msgid ""
dongsheng@627 15326 "The first is to maintain a number of branches, each intended for a single "
dongsheng@627 15327 "target. The trouble with this approach is that you must maintain iron "
dongsheng@627 15328 "discipline in the flow of changes between repositories. A new feature or bug "
dongsheng@627 15329 "fix must start life in a <quote>pristine</quote> repository, then percolate "
dongsheng@627 15330 "out to every backport repository. Backport changes are more limited in the "
dongsheng@627 15331 "branches they should propagate to; a backport change that is applied to a "
dongsheng@627 15332 "branch where it doesn't belong will probably stop the driver from compiling."
dongsheng@627 15333 msgstr ""
dongsheng@627 15334
dongsheng@627 15335 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15336 #: ../en/ch12-mq-collab.xml:74
dongsheng@627 15337 msgid ""
dongsheng@627 15338 "The second is to maintain a single source tree filled with conditional "
dongsheng@627 15339 "statements that turn chunks of code on or off depending on the intended "
dongsheng@627 15340 "target. Because these <quote>ifdefs</quote> are not allowed in the Linux "
dongsheng@627 15341 "kernel tree, a manual or automatic process must be followed to strip them out "
dongsheng@627 15342 "and yield a clean tree. A code base maintained in this fashion rapidly "
dongsheng@627 15343 "becomes a rat's nest of conditional blocks that are difficult to understand "
dongsheng@627 15344 "and maintain."
dongsheng@627 15345 msgstr ""
dongsheng@627 15346
dongsheng@627 15347 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15348 #: ../en/ch12-mq-collab.xml:83
dongsheng@627 15349 msgid ""
dongsheng@627 15350 "Neither of these approaches is well suited to a situation where you don't "
dongsheng@627 15351 "<quote>own</quote> the canonical copy of a source tree. In the case of a "
dongsheng@627 15352 "Linux driver that is distributed with the standard kernel, Linus's tree "
dongsheng@627 15353 "contains the copy of the code that will be treated by the world as "
dongsheng@627 15354 "canonical. The upstream version of <quote>my</quote> driver can be modified "
dongsheng@627 15355 "by people I don't know, without me even finding out about it until after the "
dongsheng@627 15356 "changes show up in Linus's tree."
dongsheng@627 15357 msgstr ""
dongsheng@627 15358
dongsheng@627 15359 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15360 #: ../en/ch12-mq-collab.xml:93
dongsheng@627 15361 msgid ""
dongsheng@627 15362 "These approaches have the added weakness of making it difficult to generate "
dongsheng@627 15363 "well-formed patches to submit upstream."
dongsheng@627 15364 msgstr ""
dongsheng@627 15365
dongsheng@627 15366 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15367 #: ../en/ch12-mq-collab.xml:97
dongsheng@627 15368 msgid ""
dongsheng@627 15369 "In principle, Mercurial Queues seems like a good candidate to manage a "
dongsheng@627 15370 "development scenario such as the above. While this is indeed the case, MQ "
dongsheng@627 15371 "contains a few added features that make the job more pleasant."
dongsheng@627 15372 msgstr ""
dongsheng@627 15373
dongsheng@627 15374 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15375 #: ../en/ch12-mq-collab.xml:105
dongsheng@627 15376 msgid "Conditionally applying patches with guards"
dongsheng@636 15377 msgstr "有条件的应用补丁"
dongsheng@627 15378
dongsheng@627 15379 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15380 #: ../en/ch12-mq-collab.xml:107
dongsheng@627 15381 msgid ""
dongsheng@627 15382 "Perhaps the best way to maintain sanity with so many targets is to be able to "
dongsheng@627 15383 "choose specific patches to apply for a given situation. MQ provides a "
dongsheng@627 15384 "feature called <quote>guards</quote> (which originates with quilt's "
dongsheng@627 15385 "<literal>guards</literal> command) that does just this. To start off, let's "
dongsheng@627 15386 "create a simple repository for experimenting in."
dongsheng@627 15387 msgstr ""
dongsheng@627 15388
dongsheng@627 15389 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15390 #: ../en/ch12-mq-collab.xml:116
dongsheng@627 15391 msgid ""
dongsheng@627 15392 "This gives us a tiny repository that contains two patches that don't have any "
dongsheng@627 15393 "dependencies on each other, because they touch different files."
dongsheng@627 15394 msgstr ""
dongsheng@627 15395
dongsheng@627 15396 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15397 #: ../en/ch12-mq-collab.xml:120
dongsheng@627 15398 msgid ""
dongsheng@627 15399 "The idea behind conditional application is that you can <quote>tag</quote> a "
dongsheng@627 15400 "patch with a <emphasis>guard</emphasis>, which is simply a text string of "
dongsheng@627 15401 "your choosing, then tell MQ to select specific guards to use when applying "
dongsheng@627 15402 "patches. MQ will then either apply, or skip over, a guarded patch, depending "
dongsheng@627 15403 "on the guards that you have selected."
dongsheng@627 15404 msgstr ""
dongsheng@627 15405
dongsheng@627 15406 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15407 #: ../en/ch12-mq-collab.xml:127
dongsheng@627 15408 msgid ""
dongsheng@627 15409 "A patch can have an arbitrary number of guards; each one is "
dongsheng@627 15410 "<emphasis>positive</emphasis> (<quote>apply this patch if this guard is "
dongsheng@627 15411 "selected</quote>) or <emphasis>negative</emphasis> (<quote>skip this patch if "
dongsheng@627 15412 "this guard is selected</quote>). A patch with no guards is always applied."
dongsheng@627 15413 msgstr ""
dongsheng@627 15414
dongsheng@627 15415 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15416 #: ../en/ch12-mq-collab.xml:135
dongsheng@627 15417 msgid "Controlling the guards on a patch"
dongsheng@636 15418 msgstr "控制补丁的应用条件"
dongsheng@627 15419
dongsheng@627 15420 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15421 #: ../en/ch12-mq-collab.xml:137
dongsheng@627 15422 msgid ""
dongsheng@627 15423 "The <command role=\"hg-ext-mq\">qguard</command> command lets you determine "
dongsheng@627 15424 "which guards should apply to a patch, or display the guards that are already "
dongsheng@627 15425 "in effect. Without any arguments, it displays the guards on the current "
dongsheng@627 15426 "topmost patch."
dongsheng@627 15427 msgstr ""
dongsheng@627 15428
dongsheng@627 15429 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15430 #: ../en/ch12-mq-collab.xml:144
dongsheng@627 15431 msgid ""
dongsheng@627 15432 "To set a positive guard on a patch, prefix the name of the guard with a "
dongsheng@627 15433 "<quote><literal>+</literal></quote>."
dongsheng@627 15434 msgstr ""
dongsheng@627 15435
dongsheng@627 15436 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15437 #: ../en/ch12-mq-collab.xml:149
dongsheng@627 15438 msgid ""
dongsheng@627 15439 "To set a negative guard on a patch, prefix the name of the guard with a "
dongsheng@627 15440 "<quote><literal>-</literal></quote>."
dongsheng@627 15441 msgstr ""
dongsheng@627 15442
dongsheng@627 15443 #. type: Content of: <book><chapter><sect1><note><para>
dongsheng@650 15444 #: ../en/ch12-mq-collab.xml:156
dongsheng@627 15445 msgid ""
dongsheng@627 15446 "The <command role=\"hg-ext-mq\">qguard</command> command <emphasis>sets</"
dongsheng@627 15447 "emphasis> the guards on a patch; it doesn't <emphasis>modify</emphasis> "
dongsheng@627 15448 "them. What this means is that if you run <command role=\"hg-cmd\">hg qguard "
dongsheng@627 15449 "+a +b</command> on a patch, then <command role=\"hg-cmd\">hg qguard +c</"
dongsheng@627 15450 "command> on the same patch, the <emphasis>only</emphasis> guard that will be "
dongsheng@627 15451 "set on it afterwards is <literal>+c</literal>."
dongsheng@627 15452 msgstr ""
dongsheng@627 15453
dongsheng@627 15454 #
dongsheng@627 15455 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15456 #: ../en/ch12-mq-collab.xml:165
dongsheng@627 15457 msgid ""
dongsheng@627 15458 "Mercurial stores guards in the <filename role=\"special\">series</filename> "
dongsheng@627 15459 "file; the form in which they are stored is easy both to understand and to "
dongsheng@627 15460 "edit by hand. (In other words, you don't have to use the <command role=\"hg-"
dongsheng@627 15461 "ext-mq\">qguard</command> command if you don't want to; it's okay to simply "
dongsheng@627 15462 "edit the <filename role=\"special\">series</filename> file.)"
dongsheng@627 15463 msgstr ""
dongsheng@627 15464
dongsheng@627 15465 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15466 #: ../en/ch12-mq-collab.xml:177
dongsheng@627 15467 msgid "Selecting the guards to use"
dongsheng@636 15468 msgstr "选择使用的条件"
dongsheng@627 15469
dongsheng@627 15470 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15471 #: ../en/ch12-mq-collab.xml:179
dongsheng@627 15472 msgid ""
dongsheng@627 15473 "The <command role=\"hg-ext-mq\">qselect</command> command determines which "
dongsheng@627 15474 "guards are active at a given time. The effect of this is to determine which "
dongsheng@627 15475 "patches MQ will apply the next time you run <command role=\"hg-ext-mq"
dongsheng@627 15476 "\">qpush</command>. It has no other effect; in particular, it doesn't do "
dongsheng@627 15477 "anything to patches that are already applied."
dongsheng@627 15478 msgstr ""
dongsheng@627 15479
dongsheng@627 15480 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15481 #: ../en/ch12-mq-collab.xml:186
dongsheng@627 15482 msgid ""
dongsheng@627 15483 "With no arguments, the <command role=\"hg-ext-mq\">qselect</command> command "
dongsheng@627 15484 "lists the guards currently in effect, one per line of output. Each argument "
dongsheng@627 15485 "is treated as the name of a guard to apply."
dongsheng@627 15486 msgstr ""
dongsheng@627 15487
dongsheng@627 15488 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15489 #: ../en/ch12-mq-collab.xml:193
dongsheng@627 15490 msgid ""
dongsheng@627 15491 "In case you're interested, the currently selected guards are stored in the "
dongsheng@627 15492 "<filename role=\"special\">guards</filename> file."
dongsheng@627 15493 msgstr ""
dongsheng@627 15494
dongsheng@627 15495 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15496 #: ../en/ch12-mq-collab.xml:198
dongsheng@627 15497 msgid ""
dongsheng@627 15498 "We can see the effect the selected guards have when we run <command role=\"hg-"
dongsheng@627 15499 "ext-mq\">qpush</command>."
dongsheng@627 15500 msgstr ""
dongsheng@627 15501
dongsheng@627 15502 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15503 #: ../en/ch12-mq-collab.xml:203
dongsheng@627 15504 msgid ""
dongsheng@627 15505 "A guard cannot start with a <quote><literal>+</literal></quote> or "
dongsheng@627 15506 "<quote><literal>-</literal></quote> character. The name of a guard must not "
dongsheng@627 15507 "contain white space, but most other characters are acceptable. If you try to "
dongsheng@627 15508 "use a guard with an invalid name, MQ will complain:"
dongsheng@627 15509 msgstr ""
dongsheng@627 15510
dongsheng@627 15511 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15512 #: ../en/ch12-mq-collab.xml:212
dongsheng@627 15513 msgid "Changing the selected guards changes the patches that are applied."
dongsheng@627 15514 msgstr ""
dongsheng@627 15515
dongsheng@627 15516 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15517 #: ../en/ch12-mq-collab.xml:217
dongsheng@627 15518 msgid ""
dongsheng@627 15519 "You can see in the example below that negative guards take precedence over "
dongsheng@627 15520 "positive guards."
dongsheng@627 15521 msgstr ""
dongsheng@627 15522
dongsheng@627 15523 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15524 #: ../en/ch12-mq-collab.xml:224
dongsheng@627 15525 msgid "MQ's rules for applying patches"
dongsheng@636 15526 msgstr "MQ 应用补丁的规则"
dongsheng@627 15527
dongsheng@627 15528 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15529 #: ../en/ch12-mq-collab.xml:226
dongsheng@627 15530 msgid ""
dongsheng@627 15531 "The rules that MQ uses when deciding whether to apply a patch are as follows."
dongsheng@627 15532 msgstr ""
dongsheng@627 15533
dongsheng@627 15534 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15535 #: ../en/ch12-mq-collab.xml:229
dongsheng@627 15536 msgid "A patch that has no guards is always applied."
dongsheng@627 15537 msgstr ""
dongsheng@627 15538
dongsheng@627 15539 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15540 #: ../en/ch12-mq-collab.xml:232
dongsheng@627 15541 msgid ""
dongsheng@627 15542 "If the patch has any negative guard that matches any currently selected "
dongsheng@627 15543 "guard, the patch is skipped."
dongsheng@627 15544 msgstr ""
dongsheng@627 15545
dongsheng@627 15546 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15547 #: ../en/ch12-mq-collab.xml:235
dongsheng@627 15548 msgid ""
dongsheng@627 15549 "If the patch has any positive guard that matches any currently selected "
dongsheng@627 15550 "guard, the patch is applied."
dongsheng@627 15551 msgstr ""
dongsheng@627 15552
dongsheng@627 15553 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15554 #: ../en/ch12-mq-collab.xml:238
dongsheng@627 15555 msgid ""
dongsheng@627 15556 "If the patch has positive or negative guards, but none matches any currently "
dongsheng@627 15557 "selected guard, the patch is skipped."
dongsheng@627 15558 msgstr ""
dongsheng@627 15559
dongsheng@627 15560 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15561 #: ../en/ch12-mq-collab.xml:245
dongsheng@627 15562 msgid "Trimming the work environment"
dongsheng@636 15563 msgstr "修剪工作环境"
dongsheng@627 15564
dongsheng@627 15565 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15566 #: ../en/ch12-mq-collab.xml:247
dongsheng@627 15567 msgid ""
dongsheng@627 15568 "In working on the device driver I mentioned earlier, I don't apply the "
dongsheng@627 15569 "patches to a normal Linux kernel tree. Instead, I use a repository that "
dongsheng@627 15570 "contains only a snapshot of the source files and headers that are relevant to "
dongsheng@627 15571 "Infiniband development. This repository is 1% the size of a kernel "
dongsheng@627 15572 "repository, so it's easier to work with."
dongsheng@627 15573 msgstr ""
dongsheng@627 15574
dongsheng@627 15575 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15576 #: ../en/ch12-mq-collab.xml:254
dongsheng@627 15577 msgid ""
dongsheng@627 15578 "I then choose a <quote>base</quote> version on top of which the patches are "
dongsheng@627 15579 "applied. This is a snapshot of the Linux kernel tree as of a revision of my "
dongsheng@627 15580 "choosing. When I take the snapshot, I record the changeset ID from the "
dongsheng@627 15581 "kernel repository in the commit message. Since the snapshot preserves the "
dongsheng@627 15582 "<quote>shape</quote> and content of the relevant parts of the kernel tree, I "
dongsheng@627 15583 "can apply my patches on top of either my tiny repository or a normal kernel "
dongsheng@627 15584 "tree."
dongsheng@627 15585 msgstr ""
dongsheng@627 15586
dongsheng@627 15587 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15588 #: ../en/ch12-mq-collab.xml:263
dongsheng@627 15589 msgid ""
dongsheng@627 15590 "Normally, the base tree atop which the patches apply should be a snapshot of "
dongsheng@627 15591 "a very recent upstream tree. This best facilitates the development of "
dongsheng@627 15592 "patches that can easily be submitted upstream with few or no modifications."
dongsheng@627 15593 msgstr ""
dongsheng@627 15594
dongsheng@627 15595 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15596 #: ../en/ch12-mq-collab.xml:270
dongsheng@627 15597 msgid "Dividing up the <filename role=\"special\">series</filename> file"
dongsheng@636 15598 msgstr "分类补丁<filename role=\"special\">系列</filename>"
dongsheng@627 15599
dongsheng@627 15600 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15601 #: ../en/ch12-mq-collab.xml:273
dongsheng@627 15602 msgid ""
dongsheng@627 15603 "I categorise the patches in the <filename role=\"special\">series</filename> "
dongsheng@627 15604 "file into a number of logical groups. Each section of like patches begins "
dongsheng@627 15605 "with a block of comments that describes the purpose of the patches that "
dongsheng@627 15606 "follow."
dongsheng@627 15607 msgstr ""
dongsheng@627 15608
dongsheng@627 15609 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15610 #: ../en/ch12-mq-collab.xml:279
dongsheng@627 15611 msgid ""
dongsheng@627 15612 "The sequence of patch groups that I maintain follows. The ordering of these "
dongsheng@627 15613 "groups is important; I'll describe why after I introduce the groups."
dongsheng@627 15614 msgstr ""
dongsheng@627 15615
dongsheng@627 15616 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15617 #: ../en/ch12-mq-collab.xml:283
dongsheng@627 15618 msgid ""
dongsheng@627 15619 "The <quote>accepted</quote> group. Patches that the development team has "
dongsheng@627 15620 "submitted to the maintainer of the Infiniband subsystem, and which he has "
dongsheng@627 15621 "accepted, but which are not present in the snapshot that the tiny repository "
dongsheng@627 15622 "is based on. These are <quote>read only</quote> patches, present only to "
dongsheng@627 15623 "transform the tree into a similar state as it is in the upstream maintainer's "
dongsheng@627 15624 "repository."
dongsheng@627 15625 msgstr ""
dongsheng@627 15626
dongsheng@627 15627 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15628 #: ../en/ch12-mq-collab.xml:291
dongsheng@627 15629 msgid ""
dongsheng@627 15630 "The <quote>rework</quote> group. Patches that I have submitted, but that the "
dongsheng@627 15631 "upstream maintainer has requested modifications to before he will accept them."
dongsheng@627 15632 msgstr ""
dongsheng@627 15633
dongsheng@627 15634 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15635 #: ../en/ch12-mq-collab.xml:296
dongsheng@627 15636 msgid ""
dongsheng@627 15637 "The <quote>pending</quote> group. Patches that I have not yet submitted to "
dongsheng@627 15638 "the upstream maintainer, but which we have finished working on. These will be "
dongsheng@627 15639 "<quote>read only</quote> for a while. If the upstream maintainer accepts "
dongsheng@627 15640 "them upon submission, I'll move them to the end of the <quote>accepted</"
dongsheng@627 15641 "quote> group. If he requests that I modify any, I'll move them to the "
dongsheng@627 15642 "beginning of the <quote>rework</quote> group."
dongsheng@627 15643 msgstr ""
dongsheng@627 15644
dongsheng@627 15645 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15646 #: ../en/ch12-mq-collab.xml:305
dongsheng@627 15647 msgid ""
dongsheng@627 15648 "The <quote>in progress</quote> group. Patches that are actively being "
dongsheng@627 15649 "developed, and should not be submitted anywhere yet."
dongsheng@627 15650 msgstr ""
dongsheng@627 15651
dongsheng@627 15652 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15653 #: ../en/ch12-mq-collab.xml:309
dongsheng@627 15654 msgid ""
dongsheng@627 15655 "The <quote>backport</quote> group. Patches that adapt the source tree to "
dongsheng@627 15656 "older versions of the kernel tree."
dongsheng@627 15657 msgstr ""
dongsheng@627 15658
dongsheng@627 15659 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15660 #: ../en/ch12-mq-collab.xml:313
dongsheng@627 15661 msgid ""
dongsheng@627 15662 "The <quote>do not ship</quote> group. Patches that for some reason should "
dongsheng@627 15663 "never be submitted upstream. For example, one such patch might change "
dongsheng@627 15664 "embedded driver identification strings to make it easier to distinguish, in "
dongsheng@627 15665 "the field, between an out-of-tree version of the driver and a version shipped "
dongsheng@627 15666 "by a distribution vendor."
dongsheng@627 15667 msgstr ""
dongsheng@627 15668
dongsheng@627 15669 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15670 #: ../en/ch12-mq-collab.xml:321
dongsheng@627 15671 msgid ""
dongsheng@627 15672 "Now to return to the reasons for ordering groups of patches in this way. We "
dongsheng@627 15673 "would like the lowest patches in the stack to be as stable as possible, so "
dongsheng@627 15674 "that we will not need to rework higher patches due to changes in context. "
dongsheng@627 15675 "Putting patches that will never be changed first in the <filename role="
dongsheng@627 15676 "\"special\">series</filename> file serves this purpose."
dongsheng@627 15677 msgstr ""
dongsheng@627 15678
dongsheng@627 15679 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15680 #: ../en/ch12-mq-collab.xml:329
dongsheng@627 15681 msgid ""
dongsheng@627 15682 "We would also like the patches that we know we'll need to modify to be "
dongsheng@627 15683 "applied on top of a source tree that resembles the upstream tree as closely "
dongsheng@627 15684 "as possible. This is why we keep accepted patches around for a while."
dongsheng@627 15685 msgstr ""
dongsheng@627 15686
dongsheng@627 15687 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15688 #: ../en/ch12-mq-collab.xml:334
dongsheng@627 15689 msgid ""
dongsheng@627 15690 "The <quote>backport</quote> and <quote>do not ship</quote> patches float at "
dongsheng@627 15691 "the end of the <filename role=\"special\">series</filename> file. The "
dongsheng@627 15692 "backport patches must be applied on top of all other patches, and the "
dongsheng@627 15693 "<quote>do not ship</quote> patches might as well stay out of harm's way."
dongsheng@627 15694 msgstr ""
dongsheng@627 15695
dongsheng@627 15696 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15697 #: ../en/ch12-mq-collab.xml:343
dongsheng@627 15698 msgid "Maintaining the patch series"
dongsheng@636 15699 msgstr "维护补丁系列"
dongsheng@627 15700
dongsheng@627 15701 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15702 #: ../en/ch12-mq-collab.xml:345
dongsheng@627 15703 msgid ""
dongsheng@627 15704 "In my work, I use a number of guards to control which patches are to be "
dongsheng@627 15705 "applied."
dongsheng@627 15706 msgstr ""
dongsheng@627 15707
dongsheng@627 15708 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15709 #: ../en/ch12-mq-collab.xml:349
dongsheng@627 15710 msgid ""
dongsheng@627 15711 "<quote>Accepted</quote> patches are guarded with <literal>accepted</"
dongsheng@627 15712 "literal>. I enable this guard most of the time. When I'm applying the "
dongsheng@627 15713 "patches on top of a tree where the patches are already present, I can turn "
dongsheng@627 15714 "this patch off, and the patches that follow it will apply cleanly."
dongsheng@627 15715 msgstr ""
dongsheng@627 15716
dongsheng@627 15717 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15718 #: ../en/ch12-mq-collab.xml:356
dongsheng@627 15719 msgid ""
dongsheng@627 15720 "Patches that are <quote>finished</quote>, but not yet submitted, have no "
dongsheng@627 15721 "guards. If I'm applying the patch stack to a copy of the upstream tree, I "
dongsheng@627 15722 "don't need to enable any guards in order to get a reasonably safe source tree."
dongsheng@627 15723 msgstr ""
dongsheng@627 15724
dongsheng@627 15725 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15726 #: ../en/ch12-mq-collab.xml:362
dongsheng@627 15727 msgid ""
dongsheng@627 15728 "Those patches that need reworking before being resubmitted are guarded with "
dongsheng@627 15729 "<literal>rework</literal>."
dongsheng@627 15730 msgstr ""
dongsheng@627 15731
dongsheng@627 15732 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15733 #: ../en/ch12-mq-collab.xml:366
dongsheng@627 15734 msgid ""
dongsheng@627 15735 "For those patches that are still under development, I use <literal>devel</"
dongsheng@627 15736 "literal>."
dongsheng@627 15737 msgstr ""
dongsheng@627 15738
dongsheng@627 15739 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 15740 #: ../en/ch12-mq-collab.xml:369
dongsheng@627 15741 msgid ""
dongsheng@627 15742 "A backport patch may have several guards, one for each version of the kernel "
dongsheng@627 15743 "to which it applies. For example, a patch that backports a piece of code to "
dongsheng@627 15744 "2.6.9 will have a <literal>2.6.9</literal> guard."
dongsheng@627 15745 msgstr ""
dongsheng@627 15746
dongsheng@627 15747 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15748 #: ../en/ch12-mq-collab.xml:374
dongsheng@627 15749 msgid ""
dongsheng@627 15750 "This variety of guards gives me considerable flexibility in determining what "
dongsheng@627 15751 "kind of source tree I want to end up with. For most situations, the "
dongsheng@627 15752 "selection of appropriate guards is automated during the build process, but I "
dongsheng@627 15753 "can manually tune the guards to use for less common circumstances."
dongsheng@627 15754 msgstr ""
dongsheng@627 15755
dongsheng@627 15756 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 15757 #: ../en/ch12-mq-collab.xml:381
dongsheng@627 15758 msgid "The art of writing backport patches"
dongsheng@636 15759 msgstr "编写向后移植补丁的艺术"
dongsheng@627 15760
dongsheng@627 15761 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15762 #: ../en/ch12-mq-collab.xml:383
dongsheng@627 15763 msgid ""
dongsheng@627 15764 "Using MQ, writing a backport patch is a simple process. All such a patch has "
dongsheng@627 15765 "to do is modify a piece of code that uses a kernel feature not present in the "
dongsheng@627 15766 "older version of the kernel, so that the driver continues to work correctly "
dongsheng@627 15767 "under that older version."
dongsheng@627 15768 msgstr ""
dongsheng@627 15769
dongsheng@627 15770 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15771 #: ../en/ch12-mq-collab.xml:389
dongsheng@627 15772 msgid ""
dongsheng@627 15773 "A useful goal when writing a good backport patch is to make your code look as "
dongsheng@627 15774 "if it was written for the older version of the kernel you're targeting. The "
dongsheng@627 15775 "less obtrusive the patch, the easier it will be to understand and maintain. "
dongsheng@627 15776 "If you're writing a collection of backport patches to avoid the <quote>rat's "
dongsheng@627 15777 "nest</quote> effect of lots of <literal>#ifdef</literal>s (hunks of source "
dongsheng@627 15778 "code that are only used conditionally) in your code, don't introduce version-"
dongsheng@627 15779 "dependent <literal>#ifdef</literal>s into the patches. Instead, write "
dongsheng@627 15780 "several patches, each of which makes unconditional changes, and control their "
dongsheng@627 15781 "application using guards."
dongsheng@627 15782 msgstr ""
dongsheng@627 15783
dongsheng@627 15784 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15785 #: ../en/ch12-mq-collab.xml:402
dongsheng@627 15786 msgid ""
dongsheng@627 15787 "There are two reasons to divide backport patches into a distinct group, away "
dongsheng@627 15788 "from the <quote>regular</quote> patches whose effects they modify. The first "
dongsheng@627 15789 "is that intermingling the two makes it more difficult to use a tool like the "
dongsheng@627 15790 "<literal role=\"hg-ext\">patchbomb</literal> extension to automate the "
dongsheng@627 15791 "process of submitting the patches to an upstream maintainer. The second is "
dongsheng@627 15792 "that a backport patch could perturb the context in which a subsequent regular "
dongsheng@627 15793 "patch is applied, making it impossible to apply the regular patch cleanly "
dongsheng@627 15794 "<emphasis>without</emphasis> the earlier backport patch already being applied."
dongsheng@627 15795 msgstr ""
dongsheng@627 15796
dongsheng@627 15797 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15798 #: ../en/ch12-mq-collab.xml:417
dongsheng@627 15799 msgid "Useful tips for developing with MQ"
dongsheng@636 15800 msgstr "使用 MQ 开发的技巧"
dongsheng@627 15801
dongsheng@627 15802 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 15803 #: ../en/ch12-mq-collab.xml:420
dongsheng@627 15804 msgid "Organising patches in directories"
dongsheng@636 15805 msgstr "将补丁放到几个目录中"
dongsheng@627 15806
dongsheng@627 15807 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15808 #: ../en/ch12-mq-collab.xml:422
dongsheng@627 15809 msgid ""
dongsheng@627 15810 "If you're working on a substantial project with MQ, it's not difficult to "
dongsheng@627 15811 "accumulate a large number of patches. For example, I have one patch "
dongsheng@627 15812 "repository that contains over 250 patches."
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:427
dongsheng@627 15817 msgid ""
dongsheng@627 15818 "If you can group these patches into separate logical categories, you can if "
dongsheng@627 15819 "you like store them in different directories; MQ has no problems with patch "
dongsheng@627 15820 "names that contain path separators."
dongsheng@627 15821 msgstr ""
dongsheng@627 15822
dongsheng@627 15823 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 15824 #: ../en/ch12-mq-collab.xml:434
dongsheng@627 15825 msgid "Viewing the history of a patch"
dongsheng@636 15826 msgstr "察看补丁的历史"
dongsheng@627 15827
dongsheng@627 15828 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15829 #: ../en/ch12-mq-collab.xml:436
dongsheng@627 15830 msgid ""
dongsheng@627 15831 "If you're developing a set of patches over a long time, it's a good idea to "
songdongsheng@658 15832 "maintain them in a repository, as discussed in <xref linkend=\"sec:mq:repo\"/"
songdongsheng@658 15833 ">. If you do so, you'll quickly discover that using the <command role=\"hg-"
songdongsheng@658 15834 "cmd\">hg diff</command> command to look at the history of changes to a patch "
songdongsheng@658 15835 "is unworkable. This is in part because you're looking at the second "
dongsheng@627 15836 "derivative of the real code (a diff of a diff), but also because MQ adds "
dongsheng@627 15837 "noise to the process by modifying time stamps and directory names when it "
dongsheng@627 15838 "updates a patch."
dongsheng@627 15839 msgstr ""
dongsheng@627 15840
dongsheng@627 15841 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15842 #: ../en/ch12-mq-collab.xml:448
dongsheng@627 15843 msgid ""
dongsheng@627 15844 "However, you can use the <literal role=\"hg-ext\">extdiff</literal> "
dongsheng@627 15845 "extension, which is bundled with Mercurial, to turn a diff of two versions of "
dongsheng@627 15846 "a patch into something readable. To do this, you will need a third-party "
dongsheng@627 15847 "package called <literal role=\"package\">patchutils</literal> <citation>web:"
dongsheng@627 15848 "patchutils</citation>. This provides a command named <command>interdiff</"
dongsheng@627 15849 "command>, which shows the differences between two diffs as a diff. Used on "
dongsheng@627 15850 "two versions of the same diff, it generates a diff that represents the diff "
dongsheng@627 15851 "from the first to the second version."
dongsheng@627 15852 msgstr ""
dongsheng@627 15853
dongsheng@627 15854 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15855 #: ../en/ch12-mq-collab.xml:459
dongsheng@627 15856 msgid ""
dongsheng@627 15857 "You can enable the <literal role=\"hg-ext\">extdiff</literal> extension in "
dongsheng@627 15858 "the usual way, by adding a line to the <literal role=\"rc-extensions"
dongsheng@650 15859 "\">extensions</literal> section of your <filename role=\"special\">~/.hgrc</"
dongsheng@627 15860 "filename>."
dongsheng@627 15861 msgstr ""
dongsheng@627 15862
dongsheng@627 15863 #
dongsheng@646 15864 #. &example.hg-interdiff;
dongsheng@627 15865 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15866 #: ../en/ch12-mq-collab.xml:466
dongsheng@627 15867 msgid ""
dongsheng@627 15868 "The <command>interdiff</command> command expects to be passed the names of "
dongsheng@627 15869 "two files, but the <literal role=\"hg-ext\">extdiff</literal> extension "
dongsheng@627 15870 "passes the program it runs a pair of directories, each of which can contain "
dongsheng@627 15871 "an arbitrary number of files. We thus need a small program that will run "
dongsheng@627 15872 "<command>interdiff</command> on each pair of files in these two directories. "
dongsheng@627 15873 "This program is available as <filename role=\"special\">hg-interdiff</"
dongsheng@627 15874 "filename> in the <filename class=\"directory\">examples</filename> directory "
dongsheng@627 15875 "of the source code repository that accompanies this book."
dongsheng@627 15876 msgstr ""
dongsheng@627 15877
dongsheng@627 15878 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15879 #: ../en/ch12-mq-collab.xml:478
dongsheng@627 15880 msgid ""
dongsheng@627 15881 "With the <filename role=\"special\">hg-interdiff</filename> program in your "
dongsheng@627 15882 "shell's search path, you can run it as follows, from inside an MQ patch "
dongsheng@627 15883 "directory:"
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:482
dongsheng@627 15888 msgid ""
dongsheng@627 15889 "Since you'll probably want to use this long-winded command a lot, you can get "
dongsheng@627 15890 "<literal role=\"hg-ext\">hgext</literal> to make it available as a normal "
dongsheng@650 15891 "Mercurial command, again by editing your <filename role=\"special\">~/.hgrc</"
dongsheng@627 15892 "filename>."
dongsheng@627 15893 msgstr ""
dongsheng@627 15894
dongsheng@627 15895 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15896 #: ../en/ch12-mq-collab.xml:489
dongsheng@627 15897 msgid ""
dongsheng@627 15898 "This directs <literal role=\"hg-ext\">hgext</literal> to make an "
dongsheng@627 15899 "<literal>interdiff</literal> command available, so you can now shorten the "
dongsheng@627 15900 "previous invocation of <command role=\"hg-ext-extdiff\">extdiff</command> to "
dongsheng@627 15901 "something a little more wieldy."
dongsheng@627 15902 msgstr ""
dongsheng@627 15903
dongsheng@627 15904 #. type: Content of: <book><chapter><sect1><sect2><note><para>
dongsheng@650 15905 #: ../en/ch12-mq-collab.xml:497
dongsheng@627 15906 msgid ""
dongsheng@627 15907 "The <command>interdiff</command> command works well only if the underlying "
dongsheng@627 15908 "files against which versions of a patch are generated remain the same. If "
dongsheng@627 15909 "you create a patch, modify the underlying files, and then regenerate the "
dongsheng@627 15910 "patch, <command>interdiff</command> may not produce useful output."
dongsheng@627 15911 msgstr ""
dongsheng@627 15912
dongsheng@627 15913 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 15914 #: ../en/ch12-mq-collab.xml:505
dongsheng@627 15915 msgid ""
dongsheng@627 15916 "The <literal role=\"hg-ext\">extdiff</literal> extension is useful for more "
dongsheng@627 15917 "than merely improving the presentation of MQ patches. To read more about it, "
songdongsheng@658 15918 "go to <xref linkend=\"sec:hgext:extdiff\"/>."
dongsheng@627 15919 msgstr ""
dongsheng@627 15920
dongsheng@627 15921 #. type: Content of: <book><chapter><title>
dongsheng@650 15922 #: ../en/ch13-hgext.xml:5
dongsheng@627 15923 msgid "Adding functionality with extensions"
dongsheng@627 15924 msgstr "使用扩展增加功能"
dongsheng@627 15925
dongsheng@627 15926 #. type: Content of: <book><chapter><para>
dongsheng@650 15927 #: ../en/ch13-hgext.xml:7
dongsheng@627 15928 msgid ""
dongsheng@627 15929 "While the core of Mercurial is quite complete from a functionality "
dongsheng@627 15930 "standpoint, it's deliberately shorn of fancy features. This approach of "
dongsheng@627 15931 "preserving simplicity keeps the software easy to deal with for both "
dongsheng@627 15932 "maintainers and users."
dongsheng@627 15933 msgstr ""
dongsheng@627 15934
dongsheng@627 15935 #. type: Content of: <book><chapter><para>
dongsheng@650 15936 #: ../en/ch13-hgext.xml:12
dongsheng@627 15937 msgid ""
dongsheng@627 15938 "However, Mercurial doesn't box you in with an inflexible command set: you can "
dongsheng@627 15939 "add features to it as <emphasis>extensions</emphasis> (sometimes known as "
dongsheng@627 15940 "<emphasis>plugins</emphasis>). We've already discussed a few of these "
dongsheng@627 15941 "extensions in earlier chapters."
dongsheng@627 15942 msgstr ""
dongsheng@627 15943
dongsheng@627 15944 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
dongsheng@650 15945 #: ../en/ch13-hgext.xml:18
dongsheng@627 15946 msgid ""
songdongsheng@658 15947 "<xref linkend=\"sec:tour-merge:fetch\"/> covers the <literal role=\"hg-ext"
songdongsheng@658 15948 "\">fetch</literal> extension; this combines pulling new changes and merging "
songdongsheng@658 15949 "them with local changes into a single command, <command role=\"hg-ext-fetch"
songdongsheng@658 15950 "\">fetch</command>."
dongsheng@627 15951 msgstr ""
dongsheng@627 15952
dongsheng@627 15953 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
dongsheng@650 15954 #: ../en/ch13-hgext.xml:24
dongsheng@627 15955 msgid ""
songdongsheng@658 15956 "In <xref linkend=\"chap:hook\"/>, we covered several extensions that are "
songdongsheng@658 15957 "useful for hook-related functionality: <literal role=\"hg-ext\">acl</literal> "
songdongsheng@658 15958 "adds access control lists; <literal role=\"hg-ext\">bugzilla</literal> adds "
songdongsheng@658 15959 "integration with the Bugzilla bug tracking system; and <literal role=\"hg-ext"
songdongsheng@658 15960 "\">notify</literal> sends notification emails on new changes."
dongsheng@627 15961 msgstr ""
dongsheng@627 15962
dongsheng@627 15963 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
dongsheng@650 15964 #: ../en/ch13-hgext.xml:33
dongsheng@627 15965 msgid ""
dongsheng@627 15966 "The Mercurial Queues patch management extension is so invaluable that it "
songdongsheng@658 15967 "merits two chapters and an appendix all to itself. <xref linkend=\"chap:mq\"/"
songdongsheng@658 15968 "> covers the basics; <xref linkend=\"chap:mq-collab\"/> discusses advanced "
songdongsheng@658 15969 "topics; and <xref linkend=\"chap:mqref\"/> goes into detail on each command."
dongsheng@627 15970 msgstr ""
dongsheng@627 15971
dongsheng@627 15972 #. type: Content of: <book><chapter><para>
dongsheng@650 15973 #: ../en/ch13-hgext.xml:43
dongsheng@627 15974 msgid ""
dongsheng@627 15975 "In this chapter, we'll cover some of the other extensions that are available "
dongsheng@627 15976 "for Mercurial, and briefly touch on some of the machinery you'll need to know "
dongsheng@627 15977 "about if you want to write an extension of your own."
dongsheng@627 15978 msgstr ""
dongsheng@627 15979
dongsheng@627 15980 #. type: Content of: <book><chapter><itemizedlist><listitem><para>
dongsheng@650 15981 #: ../en/ch13-hgext.xml:48
dongsheng@627 15982 msgid ""
songdongsheng@658 15983 "In <xref linkend=\"sec:hgext:inotify\"/>, we'll discuss the possibility of "
songdongsheng@658 15984 "<emphasis>huge</emphasis> performance improvements using the <literal role="
songdongsheng@658 15985 "\"hg-ext\">inotify</literal> extension."
dongsheng@627 15986 msgstr ""
dongsheng@627 15987
dongsheng@627 15988 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 15989 #: ../en/ch13-hgext.xml:55
dongsheng@627 15990 msgid ""
dongsheng@627 15991 "Improve performance with the <literal role=\"hg-ext\">inotify</literal> "
dongsheng@627 15992 "extension"
dongsheng@636 15993 msgstr "使用扩展 <literal role=\"hg-ext\">inotify</literal> 以提高性能"
dongsheng@627 15994
dongsheng@627 15995 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 15996 #: ../en/ch13-hgext.xml:58
dongsheng@627 15997 msgid ""
dongsheng@627 15998 "Are you interested in having some of the most common Mercurial operations run "
dongsheng@627 15999 "as much as a hundred times faster? Read on!"
dongsheng@627 16000 msgstr ""
dongsheng@627 16001
dongsheng@627 16002 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16003 #: ../en/ch13-hgext.xml:62
dongsheng@627 16004 msgid ""
dongsheng@627 16005 "Mercurial has great performance under normal circumstances. For example, "
dongsheng@627 16006 "when you run the <command role=\"hg-cmd\">hg status</command> command, "
dongsheng@627 16007 "Mercurial has to scan almost every directory and file in your repository so "
dongsheng@627 16008 "that it can display file status. Many other Mercurial commands need to do "
dongsheng@627 16009 "the same work behind the scenes; for example, the <command role=\"hg-cmd\">hg "
dongsheng@627 16010 "diff</command> command uses the status machinery to avoid doing an expensive "
dongsheng@627 16011 "comparison operation on files that obviously haven't changed."
dongsheng@627 16012 msgstr ""
dongsheng@627 16013
dongsheng@627 16014 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16015 #: ../en/ch13-hgext.xml:72
dongsheng@627 16016 msgid ""
dongsheng@627 16017 "Because obtaining file status is crucial to good performance, the authors of "
dongsheng@627 16018 "Mercurial have optimised this code to within an inch of its life. However, "
dongsheng@627 16019 "there's no avoiding the fact that when you run <command role=\"hg-cmd\">hg "
dongsheng@627 16020 "status</command>, Mercurial is going to have to perform at least one "
dongsheng@627 16021 "expensive system call for each managed file to determine whether it's changed "
dongsheng@627 16022 "since the last time Mercurial checked. For a sufficiently large repository, "
dongsheng@627 16023 "this can take a long time."
dongsheng@627 16024 msgstr ""
dongsheng@627 16025
dongsheng@627 16026 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16027 #: ../en/ch13-hgext.xml:82
dongsheng@627 16028 msgid ""
dongsheng@627 16029 "To put a number on the magnitude of this effect, I created a repository "
dongsheng@627 16030 "containing 150,000 managed files. I timed <command role=\"hg-cmd\">hg "
dongsheng@627 16031 "status</command> as taking ten seconds to run, even when <emphasis>none</"
dongsheng@627 16032 "emphasis> of those files had been modified."
dongsheng@627 16033 msgstr ""
dongsheng@627 16034
dongsheng@627 16035 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16036 #: ../en/ch13-hgext.xml:88
dongsheng@627 16037 msgid ""
dongsheng@627 16038 "Many modern operating systems contain a file notification facility. If a "
dongsheng@627 16039 "program signs up to an appropriate service, the operating system will notify "
dongsheng@627 16040 "it every time a file of interest is created, modified, or deleted. On Linux "
dongsheng@627 16041 "systems, the kernel component that does this is called <literal>inotify</"
dongsheng@627 16042 "literal>."
dongsheng@627 16043 msgstr ""
dongsheng@627 16044
dongsheng@627 16045 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16046 #: ../en/ch13-hgext.xml:95
dongsheng@627 16047 msgid ""
dongsheng@627 16048 "Mercurial's <literal role=\"hg-ext\">inotify</literal> extension talks to the "
dongsheng@627 16049 "kernel's <literal>inotify</literal> component to optimise <command role=\"hg-"
dongsheng@627 16050 "cmd\">hg status</command> commands. The extension has two components. A "
dongsheng@627 16051 "daemon sits in the background and receives notifications from the "
dongsheng@627 16052 "<literal>inotify</literal> subsystem. It also listens for connections from a "
dongsheng@627 16053 "regular Mercurial command. The extension modifies Mercurial's behaviour so "
dongsheng@627 16054 "that instead of scanning the filesystem, it queries the daemon. Since the "
dongsheng@627 16055 "daemon has perfect information about the state of the repository, it can "
dongsheng@627 16056 "respond with a result instantaneously, avoiding the need to scan every "
dongsheng@627 16057 "directory and file in the repository."
dongsheng@627 16058 msgstr ""
dongsheng@627 16059
dongsheng@627 16060 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16061 #: ../en/ch13-hgext.xml:108
dongsheng@627 16062 msgid ""
dongsheng@627 16063 "Recall the ten seconds that I measured plain Mercurial as taking to run "
dongsheng@627 16064 "<command role=\"hg-cmd\">hg status</command> on a 150,000 file repository. "
dongsheng@627 16065 "With the <literal role=\"hg-ext\">inotify</literal> extension enabled, the "
dongsheng@627 16066 "time dropped to 0.1 seconds, a factor of <emphasis>one hundred</emphasis> "
dongsheng@627 16067 "faster."
dongsheng@627 16068 msgstr ""
dongsheng@627 16069
dongsheng@627 16070 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16071 #: ../en/ch13-hgext.xml:115
dongsheng@627 16072 msgid "Before we continue, please pay attention to some caveats."
dongsheng@627 16073 msgstr ""
dongsheng@627 16074
dongsheng@627 16075 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 16076 #: ../en/ch13-hgext.xml:118
dongsheng@627 16077 msgid ""
dongsheng@627 16078 "The <literal role=\"hg-ext\">inotify</literal> extension is Linux-specific. "
dongsheng@627 16079 "Because it interfaces directly to the Linux kernel's <literal>inotify</"
dongsheng@627 16080 "literal> subsystem, it does not work on other operating systems."
dongsheng@627 16081 msgstr ""
dongsheng@627 16082
dongsheng@627 16083 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 16084 #: ../en/ch13-hgext.xml:123
dongsheng@627 16085 msgid ""
dongsheng@627 16086 "It should work on any Linux distribution that was released after early 2005. "
dongsheng@627 16087 "Older distributions are likely to have a kernel that lacks <literal>inotify</"
dongsheng@627 16088 "literal>, or a version of <literal>glibc</literal> that does not have the "
dongsheng@627 16089 "necessary interfacing support."
dongsheng@627 16090 msgstr ""
dongsheng@627 16091
dongsheng@627 16092 #. type: Content of: <book><chapter><sect1><itemizedlist><listitem><para>
dongsheng@650 16093 #: ../en/ch13-hgext.xml:130
dongsheng@627 16094 msgid ""
dongsheng@627 16095 "Not all filesystems are suitable for use with the <literal role=\"hg-ext"
dongsheng@627 16096 "\">inotify</literal> extension. Network filesystems such as NFS are a non-"
dongsheng@627 16097 "starter, for example, particularly if you're running Mercurial on several "
dongsheng@627 16098 "systems, all mounting the same network filesystem. The kernel's "
dongsheng@627 16099 "<literal>inotify</literal> system has no way of knowing about changes made on "
dongsheng@627 16100 "another system. Most local filesystems (e.g. ext3, XFS, ReiserFS) should "
dongsheng@627 16101 "work fine."
dongsheng@627 16102 msgstr ""
dongsheng@627 16103
dongsheng@627 16104 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16105 #: ../en/ch13-hgext.xml:141
dongsheng@627 16106 msgid ""
dongsheng@627 16107 "The <literal role=\"hg-ext\">inotify</literal> extension is not yet shipped "
dongsheng@627 16108 "with Mercurial as of May 2007, so it's a little more involved to set up than "
dongsheng@627 16109 "other extensions. But the performance improvement is worth it!"
dongsheng@627 16110 msgstr ""
dongsheng@627 16111
dongsheng@627 16112 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16113 #: ../en/ch13-hgext.xml:146
dongsheng@627 16114 msgid ""
dongsheng@627 16115 "The extension currently comes in two parts: a set of patches to the Mercurial "
dongsheng@627 16116 "source code, and a library of Python bindings to the <literal>inotify</"
dongsheng@627 16117 "literal> subsystem."
dongsheng@627 16118 msgstr ""
dongsheng@627 16119
dongsheng@627 16120 #. type: Content of: <book><chapter><sect1><note><para>
dongsheng@650 16121 #: ../en/ch13-hgext.xml:150
dongsheng@627 16122 msgid ""
dongsheng@627 16123 "There are <emphasis>two</emphasis> Python <literal>inotify</literal> binding "
dongsheng@627 16124 "libraries. One of them is called <literal>pyinotify</literal>, and is "
dongsheng@627 16125 "packaged by some Linux distributions as <literal>python-inotify</literal>. "
dongsheng@627 16126 "This is <emphasis>not</emphasis> the one you'll need, as it is too buggy and "
dongsheng@627 16127 "inefficient to be practical."
dongsheng@627 16128 msgstr ""
dongsheng@627 16129
dongsheng@627 16130 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16131 #: ../en/ch13-hgext.xml:157
dongsheng@627 16132 msgid ""
dongsheng@627 16133 "To get going, it's best to already have a functioning copy of Mercurial "
dongsheng@627 16134 "installed."
dongsheng@627 16135 msgstr ""
dongsheng@627 16136
dongsheng@627 16137 #. type: Content of: <book><chapter><sect1><note><para>
dongsheng@650 16138 #: ../en/ch13-hgext.xml:160
dongsheng@627 16139 msgid ""
dongsheng@627 16140 "If you follow the instructions below, you'll be <emphasis>replacing</"
dongsheng@627 16141 "emphasis> and overwriting any existing installation of Mercurial that you "
dongsheng@627 16142 "might already have, using the latest <quote>bleeding edge</quote> Mercurial "
dongsheng@627 16143 "code. Don't say you weren't warned!"
dongsheng@627 16144 msgstr ""
dongsheng@627 16145
dongsheng@627 16146 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
dongsheng@650 16147 #: ../en/ch13-hgext.xml:167
dongsheng@627 16148 msgid ""
dongsheng@627 16149 "Clone the Python <literal>inotify</literal> binding repository. Build and "
dongsheng@627 16150 "install it."
dongsheng@627 16151 msgstr ""
dongsheng@627 16152
dongsheng@627 16153 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
dongsheng@650 16154 #: ../en/ch13-hgext.xml:174
dongsheng@627 16155 msgid ""
dongsheng@627 16156 "Clone the <filename class=\"directory\">crew</filename> Mercurial "
dongsheng@627 16157 "repository. Clone the <literal role=\"hg-ext\">inotify</literal> patch "
dongsheng@627 16158 "repository so that Mercurial Queues will be able to apply patches to your "
dongsheng@627 16159 "cope of the <filename class=\"directory\">crew</filename> repository."
dongsheng@627 16160 msgstr ""
dongsheng@627 16161
dongsheng@627 16162 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
dongsheng@650 16163 #: ../en/ch13-hgext.xml:184
dongsheng@627 16164 msgid ""
dongsheng@627 16165 "Make sure that you have the Mercurial Queues extension, <literal role=\"hg-ext"
songdongsheng@658 16166 "\">mq</literal>, enabled. If you've never used MQ, read <xref linkend=\"sec:"
songdongsheng@658 16167 "mq:start\"/> to get started quickly."
dongsheng@627 16168 msgstr ""
dongsheng@627 16169
dongsheng@627 16170 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
dongsheng@650 16171 #: ../en/ch13-hgext.xml:190
dongsheng@627 16172 msgid ""
dongsheng@627 16173 "Go into the <filename class=\"directory\">inotify</filename> repo, and apply "
dongsheng@627 16174 "all of the <literal role=\"hg-ext\">inotify</literal> patches using the "
dongsheng@627 16175 "<option role=\"hg-ext-mq-cmd-qpush-opt\">hg -a</option> option to the "
dongsheng@627 16176 "<command role=\"hg-ext-mq\">qpush</command> command."
dongsheng@627 16177 msgstr ""
dongsheng@627 16178
dongsheng@627 16179 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
dongsheng@650 16180 #: ../en/ch13-hgext.xml:199
dongsheng@627 16181 msgid ""
dongsheng@627 16182 "If you get an error message from <command role=\"hg-ext-mq\">qpush</command>, "
dongsheng@627 16183 "you should not continue. Instead, ask for help."
dongsheng@627 16184 msgstr ""
dongsheng@627 16185
dongsheng@627 16186 #. type: Content of: <book><chapter><sect1><orderedlist><listitem><para>
dongsheng@650 16187 #: ../en/ch13-hgext.xml:203
dongsheng@627 16188 msgid "Build and install the patched version of Mercurial."
dongsheng@627 16189 msgstr ""
dongsheng@627 16190
dongsheng@627 16191 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16192 #: ../en/ch13-hgext.xml:209
dongsheng@627 16193 msgid ""
dongsheng@627 16194 "Once you've build a suitably patched version of Mercurial, all you need to do "
dongsheng@627 16195 "to enable the <literal role=\"hg-ext\">inotify</literal> extension is add an "
dongsheng@650 16196 "entry to your <filename role=\"special\">~/.hgrc</filename>."
dongsheng@650 16197 msgstr ""
dongsheng@650 16198
dongsheng@650 16199 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16200 #: ../en/ch13-hgext.xml:214
dongsheng@627 16201 msgid ""
dongsheng@627 16202 "When the <literal role=\"hg-ext\">inotify</literal> extension is enabled, "
dongsheng@627 16203 "Mercurial will automatically and transparently start the status daemon the "
dongsheng@627 16204 "first time you run a command that needs status in a repository. It runs one "
dongsheng@627 16205 "status daemon per repository."
dongsheng@627 16206 msgstr ""
dongsheng@627 16207
dongsheng@627 16208 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16209 #: ../en/ch13-hgext.xml:220
dongsheng@627 16210 msgid ""
dongsheng@627 16211 "The status daemon is started silently, and runs in the background. If you "
dongsheng@627 16212 "look at a list of running processes after you've enabled the <literal role="
dongsheng@627 16213 "\"hg-ext\">inotify</literal> extension and run a few commands in different "
dongsheng@627 16214 "repositories, you'll thus see a few <literal>hg</literal> processes sitting "
dongsheng@627 16215 "around, waiting for updates from the kernel and queries from Mercurial."
dongsheng@627 16216 msgstr ""
dongsheng@627 16217
dongsheng@627 16218 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16219 #: ../en/ch13-hgext.xml:228
dongsheng@627 16220 msgid ""
dongsheng@627 16221 "The first time you run a Mercurial command in a repository when you have the "
dongsheng@627 16222 "<literal role=\"hg-ext\">inotify</literal> extension enabled, it will run "
dongsheng@627 16223 "with about the same performance as a normal Mercurial command. This is "
dongsheng@627 16224 "because the status daemon needs to perform a normal status scan so that it "
dongsheng@627 16225 "has a baseline against which to apply later updates from the kernel. "
dongsheng@627 16226 "However, <emphasis>every</emphasis> subsequent command that does any kind of "
dongsheng@627 16227 "status check should be noticeably faster on repositories of even fairly "
dongsheng@627 16228 "modest size. Better yet, the bigger your repository is, the greater a "
dongsheng@627 16229 "performance advantage you'll see. The <literal role=\"hg-ext\">inotify</"
dongsheng@627 16230 "literal> daemon makes status operations almost instantaneous on repositories "
dongsheng@627 16231 "of all sizes!"
dongsheng@627 16232 msgstr ""
dongsheng@627 16233
dongsheng@627 16234 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16235 #: ../en/ch13-hgext.xml:242
dongsheng@627 16236 msgid ""
dongsheng@627 16237 "If you like, you can manually start a status daemon using the <command role="
dongsheng@627 16238 "\"hg-ext-inotify\">inserve</command> command. This gives you slightly finer "
dongsheng@627 16239 "control over how the daemon ought to run. This command will of course only "
dongsheng@627 16240 "be available when the <literal role=\"hg-ext\">inotify</literal> extension is "
dongsheng@627 16241 "enabled."
dongsheng@627 16242 msgstr ""
dongsheng@627 16243
dongsheng@627 16244 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16245 #: ../en/ch13-hgext.xml:249
dongsheng@627 16246 msgid ""
dongsheng@627 16247 "When you're using the <literal role=\"hg-ext\">inotify</literal> extension, "
dongsheng@627 16248 "you should notice <emphasis>no difference at all</emphasis> in Mercurial's "
dongsheng@627 16249 "behaviour, with the sole exception of status-related commands running a whole "
dongsheng@627 16250 "lot faster than they used to. You should specifically expect that commands "
dongsheng@627 16251 "will not print different output; neither should they give different results. "
dongsheng@627 16252 "If either of these situations occurs, please report a bug."
dongsheng@627 16253 msgstr ""
dongsheng@627 16254
dongsheng@627 16255 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 16256 #: ../en/ch13-hgext.xml:260
dongsheng@627 16257 msgid ""
dongsheng@627 16258 "Flexible diff support with the <literal role=\"hg-ext\">extdiff</literal> "
dongsheng@627 16259 "extension"
dongsheng@636 16260 msgstr "使用扩展 <literal role=\"hg-ext\">extdiff</literal> 以扩展差异支持"
dongsheng@627 16261
dongsheng@627 16262 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16263 #: ../en/ch13-hgext.xml:263
dongsheng@627 16264 msgid ""
dongsheng@627 16265 "Mercurial's built-in <command role=\"hg-cmd\">hg diff</command> command "
dongsheng@627 16266 "outputs plaintext unified diffs."
dongsheng@627 16267 msgstr ""
dongsheng@627 16268 "Mercurial 内置命令 <command role=\"hg-cmd\">hg diff</command> 的输出与统一差异"
dongsheng@627 16269 "不同。"
dongsheng@627 16270
dongsheng@627 16271 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16272 #: ../en/ch13-hgext.xml:268
dongsheng@627 16273 msgid ""
dongsheng@627 16274 "If you would like to use an external tool to display modifications, you'll "
dongsheng@627 16275 "want to use the <literal role=\"hg-ext\">extdiff</literal> extension. This "
dongsheng@627 16276 "will let you use, for example, a graphical diff tool."
dongsheng@627 16277 msgstr ""
dongsheng@627 16278
dongsheng@627 16279 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16280 #: ../en/ch13-hgext.xml:273
dongsheng@627 16281 msgid ""
dongsheng@627 16282 "The <literal role=\"hg-ext\">extdiff</literal> extension is bundled with "
dongsheng@627 16283 "Mercurial, so it's easy to set up. In the <literal role=\"rc-extensions"
dongsheng@650 16284 "\">extensions</literal> section of your <filename role=\"special\">~/.hgrc</"
dongsheng@627 16285 "filename>, simply add a one-line entry to enable the extension."
dongsheng@627 16286 msgstr ""
dongsheng@627 16287
dongsheng@627 16288 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16289 #: ../en/ch13-hgext.xml:280
dongsheng@627 16290 msgid ""
dongsheng@627 16291 "This introduces a command named <command role=\"hg-ext-extdiff\">extdiff</"
dongsheng@627 16292 "command>, which by default uses your system's <command>diff</command> command "
dongsheng@627 16293 "to generate a unified diff in the same form as the built-in <command role="
dongsheng@627 16294 "\"hg-cmd\">hg diff</command> command."
dongsheng@627 16295 msgstr ""
dongsheng@627 16296
dongsheng@627 16297 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16298 #: ../en/ch13-hgext.xml:288
dongsheng@627 16299 msgid ""
dongsheng@627 16300 "The result won't be exactly the same as with the built-in <command role=\"hg-"
dongsheng@627 16301 "cmd\">hg diff</command> variations, because the output of <command>diff</"
dongsheng@627 16302 "command> varies from one system to another, even when passed the same options."
dongsheng@627 16303 msgstr ""
dongsheng@627 16304
dongsheng@627 16305 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16306 #: ../en/ch13-hgext.xml:293
dongsheng@627 16307 msgid ""
dongsheng@627 16308 "As the <quote><literal>making snapshot</literal></quote> lines of output "
dongsheng@627 16309 "above imply, the <command role=\"hg-ext-extdiff\">extdiff</command> command "
dongsheng@627 16310 "works by creating two snapshots of your source tree. The first snapshot is "
dongsheng@627 16311 "of the source revision; the second, of the target revision or working "
dongsheng@627 16312 "directory. The <command role=\"hg-ext-extdiff\">extdiff</command> command "
dongsheng@627 16313 "generates these snapshots in a temporary directory, passes the name of each "
dongsheng@627 16314 "directory to an external diff viewer, then deletes the temporary directory. "
dongsheng@627 16315 "For efficiency, it only snapshots the directories and files that have changed "
dongsheng@627 16316 "between the two revisions."
dongsheng@627 16317 msgstr ""
dongsheng@627 16318
dongsheng@627 16319 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16320 #: ../en/ch13-hgext.xml:306
dongsheng@627 16321 msgid ""
dongsheng@627 16322 "Snapshot directory names have the same base name as your repository. If your "
dongsheng@627 16323 "repository path is <filename class=\"directory\">/quux/bar/foo</filename>, "
dongsheng@627 16324 "then <filename class=\"directory\">foo</filename> will be the name of each "
dongsheng@627 16325 "snapshot directory. Each snapshot directory name has its changeset ID "
dongsheng@627 16326 "appended, if appropriate. If a snapshot is of revision "
dongsheng@627 16327 "<literal>a631aca1083f</literal>, the directory will be named <filename class="
dongsheng@627 16328 "\"directory\">foo.a631aca1083f</filename>. A snapshot of the working "
dongsheng@627 16329 "directory won't have a changeset ID appended, so it would just be <filename "
dongsheng@627 16330 "class=\"directory\">foo</filename> in this example. To see what this looks "
dongsheng@627 16331 "like in practice, look again at the <command role=\"hg-ext-extdiff\">extdiff</"
dongsheng@627 16332 "command> example above. Notice that the diff has the snapshot directory "
dongsheng@627 16333 "names embedded in its header."
dongsheng@627 16334 msgstr ""
dongsheng@627 16335
dongsheng@627 16336 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16337 #: ../en/ch13-hgext.xml:322
dongsheng@627 16338 msgid ""
dongsheng@627 16339 "The <command role=\"hg-ext-extdiff\">extdiff</command> command accepts two "
dongsheng@627 16340 "important options. The <option role=\"hg-ext-extdiff-cmd-extdiff-opt\">hg -p</"
dongsheng@627 16341 "option> option lets you choose a program to view differences with, instead of "
dongsheng@627 16342 "<command>diff</command>. With the <option role=\"hg-ext-extdiff-cmd-extdiff-"
dongsheng@627 16343 "opt\">hg -o</option> option, you can change the options that <command role="
dongsheng@627 16344 "\"hg-ext-extdiff\">extdiff</command> passes to the program (by default, these "
dongsheng@627 16345 "options are <quote><literal>-Npru</literal></quote>, which only make sense if "
dongsheng@627 16346 "you're running <command>diff</command>). In other respects, the <command "
dongsheng@627 16347 "role=\"hg-ext-extdiff\">extdiff</command> command acts similarly to the built-"
dongsheng@627 16348 "in <command role=\"hg-cmd\">hg diff</command> command: you use the same "
dongsheng@627 16349 "option names, syntax, and arguments to specify the revisions you want, the "
dongsheng@627 16350 "files you want, and so on."
dongsheng@627 16351 msgstr ""
dongsheng@627 16352
dongsheng@627 16353 #
dongsheng@627 16354 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16355 #: ../en/ch13-hgext.xml:339
dongsheng@627 16356 msgid ""
dongsheng@627 16357 "As an example, here's how to run the normal system <command>diff</command> "
dongsheng@627 16358 "command, getting it to generate context diffs (using the <option role=\"cmd-"
dongsheng@627 16359 "opt-diff\">-c</option> option) instead of unified diffs, and five lines of "
dongsheng@627 16360 "context instead of the default three (passing <literal>5</literal> as the "
dongsheng@627 16361 "argument to the <option role=\"cmd-opt-diff\">-C</option> option)."
dongsheng@627 16362 msgstr ""
dongsheng@627 16363
dongsheng@627 16364 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16365 #: ../en/ch13-hgext.xml:348
dongsheng@627 16366 msgid ""
dongsheng@627 16367 "Launching a visual diff tool is just as easy. Here's how to launch the "
dongsheng@627 16368 "<command>kdiff3</command> viewer."
dongsheng@627 16369 msgstr ""
dongsheng@627 16370
dongsheng@627 16371 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16372 #: ../en/ch13-hgext.xml:352
dongsheng@627 16373 msgid ""
dongsheng@627 16374 "If your diff viewing command can't deal with directories, you can easily work "
dongsheng@627 16375 "around this with a little scripting. For an example of such scripting in "
dongsheng@627 16376 "action with the <literal role=\"hg-ext\">mq</literal> extension and the "
songdongsheng@658 16377 "<command>interdiff</command> command, see <xref linkend=\"mq-collab:tips:"
songdongsheng@658 16378 "interdiff\"/>."
dongsheng@627 16379 msgstr ""
dongsheng@627 16380
dongsheng@627 16381 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 16382 #: ../en/ch13-hgext.xml:360
dongsheng@627 16383 msgid "Defining command aliases"
dongsheng@636 16384 msgstr "定义命令的别名"
dongsheng@627 16385
dongsheng@627 16386 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 16387 #: ../en/ch13-hgext.xml:362
dongsheng@627 16388 msgid ""
dongsheng@627 16389 "It can be cumbersome to remember the options to both the <command role=\"hg-"
dongsheng@627 16390 "ext-extdiff\">extdiff</command> command and the diff viewer you want to use, "
dongsheng@627 16391 "so the <literal role=\"hg-ext\">extdiff</literal> extension lets you define "
dongsheng@627 16392 "<emphasis>new</emphasis> commands that will invoke your diff viewer with "
dongsheng@627 16393 "exactly the right options."
dongsheng@627 16394 msgstr ""
dongsheng@627 16395
dongsheng@627 16396 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 16397 #: ../en/ch13-hgext.xml:369
dongsheng@650 16398 msgid ""
dongsheng@650 16399 "All you need to do is edit your <filename role=\"special\">~/.hgrc</"
dongsheng@627 16400 "filename>, and add a section named <literal role=\"rc-extdiff\">extdiff</"
dongsheng@627 16401 "literal>. Inside this section, you can define multiple commands. Here's how "
dongsheng@627 16402 "to add a <literal>kdiff3</literal> command. Once you've defined this, you "
dongsheng@627 16403 "can type <quote><literal>hg kdiff3</literal></quote> and the <literal role="
dongsheng@627 16404 "\"hg-ext\">extdiff</literal> extension will run <command>kdiff3</command> for "
dongsheng@627 16405 "you."
dongsheng@627 16406 msgstr ""
dongsheng@627 16407
dongsheng@627 16408 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 16409 #: ../en/ch13-hgext.xml:379
dongsheng@627 16410 msgid ""
dongsheng@627 16411 "If you leave the right hand side of the definition empty, as above, the "
dongsheng@627 16412 "<literal role=\"hg-ext\">extdiff</literal> extension uses the name of the "
dongsheng@627 16413 "command you defined as the name of the external program to run. But these "
dongsheng@627 16414 "names don't have to be the same. Here, we define a command named "
dongsheng@627 16415 "<quote><literal>hg wibble</literal></quote>, which runs <command>kdiff3</"
dongsheng@627 16416 "command>."
dongsheng@627 16417 msgstr ""
dongsheng@627 16418
dongsheng@627 16419 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 16420 #: ../en/ch13-hgext.xml:389
dongsheng@627 16421 msgid ""
dongsheng@627 16422 "You can also specify the default options that you want to invoke your diff "
dongsheng@627 16423 "viewing program with. The prefix to use is <quote><literal>opts.</literal></"
dongsheng@627 16424 "quote>, followed by the name of the command to which the options apply. This "
dongsheng@627 16425 "example defines a <quote><literal>hg vimdiff</literal></quote> command that "
dongsheng@627 16426 "runs the <command>vim</command> editor's <literal>DirDiff</literal> extension."
dongsheng@627 16427 msgstr ""
dongsheng@627 16428
dongsheng@627 16429 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 16430 #: ../en/ch13-hgext.xml:403
dongsheng@627 16431 msgid ""
dongsheng@627 16432 "Cherrypicking changes with the <literal role=\"hg-ext\">transplant</literal> "
dongsheng@627 16433 "extension"
dongsheng@636 16434 msgstr "使用扩展 <literal role=\"hg-ext\">transplant</literal> 以挑选修改"
dongsheng@627 16435
dongsheng@627 16436 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16437 #: ../en/ch13-hgext.xml:406
dongsheng@627 16438 msgid "Need to have a long chat with Brendan about this."
dongsheng@627 16439 msgstr ""
dongsheng@627 16440
dongsheng@627 16441 #. type: Content of: <book><chapter><sect1><title>
dongsheng@650 16442 #: ../en/ch13-hgext.xml:410
dongsheng@627 16443 msgid ""
dongsheng@627 16444 "Send changes via email with the <literal role=\"hg-ext\">patchbomb</literal> "
dongsheng@627 16445 "extension"
dongsheng@627 16446 msgstr ""
dongsheng@636 16447 "使用扩展 <literal role=\"hg-ext\">patchbomb</literal> 通过 email 发送修改"
dongsheng@627 16448
dongsheng@627 16449 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16450 #: ../en/ch13-hgext.xml:413
dongsheng@627 16451 msgid ""
dongsheng@627 16452 "Many projects have a culture of <quote>change review</quote>, in which people "
dongsheng@627 16453 "send their modifications to a mailing list for others to read and comment on "
dongsheng@627 16454 "before they commit the final version to a shared repository. Some projects "
dongsheng@627 16455 "have people who act as gatekeepers; they apply changes from other people to a "
dongsheng@627 16456 "repository to which those others don't have access."
dongsheng@627 16457 msgstr ""
dongsheng@627 16458
dongsheng@627 16459 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16460 #: ../en/ch13-hgext.xml:421
dongsheng@627 16461 msgid ""
dongsheng@627 16462 "Mercurial makes it easy to send changes over email for review or application, "
dongsheng@627 16463 "via its <literal role=\"hg-ext\">patchbomb</literal> extension. The "
dongsheng@627 16464 "extension is so named because changes are formatted as patches, and it's "
dongsheng@627 16465 "usual to send one changeset per email message. Sending a long series of "
dongsheng@627 16466 "changes by email is thus much like <quote>bombing</quote> the recipient's "
dongsheng@627 16467 "inbox, hence <quote>patchbomb</quote>."
dongsheng@627 16468 msgstr ""
dongsheng@627 16469
dongsheng@627 16470 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16471 #: ../en/ch13-hgext.xml:429
dongsheng@627 16472 msgid ""
dongsheng@627 16473 "As usual, the basic configuration of the <literal role=\"hg-ext\">patchbomb</"
dongsheng@627 16474 "literal> extension takes just one or two lines in your <filename role="
dongsheng@627 16475 "\"special\"> /.hgrc</filename>."
dongsheng@627 16476 msgstr ""
dongsheng@627 16477
dongsheng@627 16478 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16479 #: ../en/ch13-hgext.xml:435
dongsheng@627 16480 msgid ""
dongsheng@627 16481 "Once you've enabled the extension, you will have a new command available, "
dongsheng@627 16482 "named <command role=\"hg-ext-patchbomb\">email</command>."
dongsheng@627 16483 msgstr ""
dongsheng@627 16484
dongsheng@627 16485 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16486 #: ../en/ch13-hgext.xml:439
dongsheng@627 16487 msgid ""
dongsheng@627 16488 "The safest and best way to invoke the <command role=\"hg-ext-patchbomb"
dongsheng@627 16489 "\">email</command> command is to <emphasis>always</emphasis> run it first "
dongsheng@627 16490 "with the <option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -n</option> "
dongsheng@627 16491 "option. This will show you what the command <emphasis>would</emphasis> send, "
dongsheng@627 16492 "without actually sending anything. Once you've had a quick glance over the "
dongsheng@627 16493 "changes and verified that you are sending the right ones, you can rerun the "
dongsheng@627 16494 "same command, with the <option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -n</"
dongsheng@627 16495 "option> option removed."
dongsheng@627 16496 msgstr ""
dongsheng@627 16497
dongsheng@627 16498 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16499 #: ../en/ch13-hgext.xml:450
dongsheng@627 16500 msgid ""
dongsheng@627 16501 "The <command role=\"hg-ext-patchbomb\">email</command> command accepts the "
dongsheng@627 16502 "same kind of revision syntax as every other Mercurial command. For example, "
dongsheng@627 16503 "this command will send every revision between 7 and <literal>tip</literal>, "
dongsheng@627 16504 "inclusive."
dongsheng@627 16505 msgstr ""
dongsheng@627 16506
dongsheng@627 16507 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16508 #: ../en/ch13-hgext.xml:455
dongsheng@627 16509 msgid ""
dongsheng@627 16510 "You can also specify a <emphasis>repository</emphasis> to compare with. If "
dongsheng@627 16511 "you provide a repository but no revisions, the <command role=\"hg-ext-"
dongsheng@627 16512 "patchbomb\">email</command> command will send all revisions in the local "
dongsheng@627 16513 "repository that are not present in the remote repository. If you "
dongsheng@627 16514 "additionally specify revisions or a branch name (the latter using the <option "
dongsheng@627 16515 "role=\"hg-ext-patchbomb-cmd-email-opt\">hg -b</option> option), this will "
dongsheng@627 16516 "constrain the revisions sent."
dongsheng@627 16517 msgstr ""
dongsheng@627 16518
dongsheng@627 16519 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16520 #: ../en/ch13-hgext.xml:464
dongsheng@627 16521 msgid ""
dongsheng@627 16522 "It's perfectly safe to run the <command role=\"hg-ext-patchbomb\">email</"
dongsheng@627 16523 "command> command without the names of the people you want to send to: if you "
dongsheng@627 16524 "do this, it will just prompt you for those values interactively. (If you're "
dongsheng@627 16525 "using a Linux or Unix-like system, you should have enhanced "
dongsheng@627 16526 "<literal>readline</literal>-style editing capabilities when entering those "
dongsheng@627 16527 "headers, too, which is useful.)"
dongsheng@627 16528 msgstr ""
dongsheng@627 16529
dongsheng@627 16530 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16531 #: ../en/ch13-hgext.xml:472
dongsheng@627 16532 msgid ""
dongsheng@627 16533 "When you are sending just one revision, the <command role=\"hg-ext-patchbomb"
dongsheng@627 16534 "\">email</command> command will by default use the first line of the "
dongsheng@627 16535 "changeset description as the subject of the single email message it sends."
dongsheng@627 16536 msgstr ""
dongsheng@627 16537
dongsheng@627 16538 #. type: Content of: <book><chapter><sect1><para>
dongsheng@650 16539 #: ../en/ch13-hgext.xml:477
dongsheng@627 16540 msgid ""
dongsheng@627 16541 "If you send multiple revisions, the <command role=\"hg-ext-patchbomb\">email</"
dongsheng@627 16542 "command> command will usually send one message per changeset. It will "
dongsheng@627 16543 "preface the series with an introductory message, in which you should describe "
dongsheng@627 16544 "the purpose of the series of changes you're sending."
dongsheng@627 16545 msgstr ""
dongsheng@627 16546
dongsheng@627 16547 #. type: Content of: <book><chapter><sect1><sect2><title>
dongsheng@650 16548 #: ../en/ch13-hgext.xml:484
dongsheng@627 16549 msgid "Changing the behaviour of patchbombs"
dongsheng@636 16550 msgstr "修改 patchbomb 的行为"
dongsheng@627 16551
dongsheng@627 16552 #. type: Content of: <book><chapter><sect1><sect2><para>
dongsheng@650 16553 #: ../en/ch13-hgext.xml:486
dongsheng@627 16554 msgid ""
dongsheng@627 16555 "Not every project has exactly the same conventions for sending changes in "
dongsheng@627 16556 "email; the <literal role=\"hg-ext\">patchbomb</literal> extension tries to "
dongsheng@627 16557 "accommodate a number of variations through command line options."
dongsheng@627 16558 msgstr ""
dongsheng@627 16559
dongsheng@627 16560 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 16561 #: ../en/ch13-hgext.xml:492
dongsheng@627 16562 msgid ""
dongsheng@627 16563 "You can write a subject for the introductory message on the command line "
dongsheng@627 16564 "using the <option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -s</option> "
dongsheng@627 16565 "option. This takes one argument, the text of the subject to use."
dongsheng@627 16566 msgstr ""
dongsheng@627 16567
dongsheng@627 16568 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 16569 #: ../en/ch13-hgext.xml:498
dongsheng@627 16570 msgid ""
dongsheng@627 16571 "To change the email address from which the messages originate, use the "
dongsheng@627 16572 "<option role=\"hg-ext-patchbomb-cmd-email-opt\">hg -f</option> option. This "
dongsheng@627 16573 "takes one argument, the email address to use."
dongsheng@627 16574 msgstr ""
dongsheng@627 16575
dongsheng@627 16576 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 16577 #: ../en/ch13-hgext.xml:504
dongsheng@627 16578 msgid ""
songdongsheng@658 16579 "The default behaviour is to send unified diffs (see <xref linkend=\"sec:mq:"
songdongsheng@658 16580 "patch\"/> for a description of the format), one per message. You can send a "
songdongsheng@658 16581 "binary bundle instead with the <option role=\"hg-ext-patchbomb-cmd-email-opt"
songdongsheng@658 16582 "\">hg -b</option> option."
dongsheng@627 16583 msgstr ""
dongsheng@627 16584
dongsheng@627 16585 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 16586 #: ../en/ch13-hgext.xml:512
dongsheng@627 16587 msgid ""
dongsheng@627 16588 "Unified diffs are normally prefaced with a metadata header. You can omit "
dongsheng@627 16589 "this, and send unadorned diffs, with the <option role=\"hg-ext-patchbomb-cmd-"
dongsheng@627 16590 "email-opt\">hg --plain</option> option."
dongsheng@627 16591 msgstr ""
dongsheng@627 16592
dongsheng@627 16593 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 16594 #: ../en/ch13-hgext.xml:518
dongsheng@627 16595 msgid ""
dongsheng@627 16596 "Diffs are normally sent <quote>inline</quote>, in the same body part as the "
dongsheng@627 16597 "description of a patch. This makes it easiest for the largest number of "
dongsheng@627 16598 "readers to quote and respond to parts of a diff, as some mail clients will "
dongsheng@627 16599 "only quote the first MIME body part in a message. If you'd prefer to send the "
dongsheng@627 16600 "description and the diff in separate body parts, use the <option role=\"hg-"
dongsheng@627 16601 "ext-patchbomb-cmd-email-opt\">hg -a</option> option."
dongsheng@627 16602 msgstr ""
dongsheng@627 16603
dongsheng@627 16604 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 16605 #: ../en/ch13-hgext.xml:528
dongsheng@627 16606 msgid ""
dongsheng@627 16607 "Instead of sending mail messages, you can write them to an <literal>mbox</"
dongsheng@627 16608 "literal>-format mail folder using the <option role=\"hg-ext-patchbomb-cmd-"
dongsheng@627 16609 "email-opt\">hg -m</option> option. That option takes one argument, the name "
dongsheng@627 16610 "of the file to write to."
dongsheng@627 16611 msgstr ""
dongsheng@627 16612
dongsheng@627 16613 #. type: Content of: <book><chapter><sect1><sect2><itemizedlist><listitem><para>
dongsheng@650 16614 #: ../en/ch13-hgext.xml:535
dongsheng@627 16615 msgid ""
dongsheng@627 16616 "If you would like to add a <command>diffstat</command>-format summary to each "
dongsheng@627 16617 "patch, and one to the introductory message, use the <option role=\"hg-ext-"
dongsheng@627 16618 "patchbomb-cmd-email-opt\">hg -d</option> option. The <command>diffstat</"
dongsheng@627 16619 "command> command displays a table containing the name of each file patched, "
dongsheng@627 16620 "the number of lines affected, and a histogram showing how much each file is "
dongsheng@627 16621 "modified. This gives readers a qualitative glance at how complex a patch is."
dongsheng@627 16622 msgstr ""