Commits

Ivan Galin  committed 49c5a1c

[ru] draft translation

translated by community on site
http://translated.by/you/mercurial-the-definitive-guide/

translators: miramir, Максим, vour, Денис, ivangalin, a.yekimov,
Nikita Baksalyar, csharpblog, Ильдус, suhr, blandger,
smilesrg, Oleksandr, qwestid, rokot, biow0lf

  • Participants
  • Parent commits 8767e1a

Comments (0)

Files changed (110)

 FORMATS=html html-single pdf epub
 
 PO_LANGUAGES := zh
-DBK_LANGUAGES := en fr it
+DBK_LANGUAGES := en fr it ru
 LANGUAGES := $(DBK_LANGUAGES) $(PO_LANGUAGES)
 
 UPDATEPO = PERLLIB=$(PO4A_LIB) $(PO4A_HOME)/po4a-updatepo -M UTF-8 \

File ru/00book.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
+ "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd"
+[
+<!-- Below are references to files in this directory. -->
+
+<!-- Chapters. -->
+
+<!ENTITY ch00     SYSTEM "ch00-preface.xml">
+<!ENTITY ch01     SYSTEM "ch01-intro.xml">
+<!ENTITY ch02     SYSTEM "ch02-tour-basic.xml">
+<!ENTITY ch03     SYSTEM "ch03-tour-merge.xml">
+<!ENTITY ch04     SYSTEM "ch04-concepts.xml">
+<!ENTITY ch05     SYSTEM "ch05-daily.xml">
+<!ENTITY ch06     SYSTEM "ch06-collab.xml">
+<!ENTITY ch07     SYSTEM "ch07-filenames.xml">
+<!ENTITY ch08     SYSTEM "ch08-branch.xml">
+<!ENTITY ch09     SYSTEM "ch09-undo.xml">
+<!ENTITY ch10     SYSTEM "ch10-hook.xml">
+<!ENTITY ch11     SYSTEM "ch11-template.xml">
+<!ENTITY ch12     SYSTEM "ch12-mq.xml">
+<!ENTITY ch13     SYSTEM "ch13-mq-collab.xml">
+<!ENTITY ch14     SYSTEM "ch14-hgext.xml">
+<!ENTITY appA     SYSTEM "appA-svn.xml">
+<!ENTITY appB     SYSTEM "appB-mq-ref.xml">
+<!ENTITY appC     SYSTEM "appC-srcinstall.xml">
+<!ENTITY appD     SYSTEM "appD-license.xml">
+
+<!-- Include our standard shortcuts. -->
+
+<!ENTITY % SHORTCUTS SYSTEM "book-shortcuts.xml">
+%SHORTCUTS;
+
+<!-- Include automatically and manually generated code snippets. -->
+
+<!ENTITY % AUTOSNIPPETS SYSTEM "examples/auto-snippets.xml">
+%AUTOSNIPPETS;
+]>
+
+<book id="hg">
+  <title>Mercurial: Полное руководство</title>
+  
+  <!-- hg parents &#x2d;&#x2d;template '{node|short} ({date|shortdate})' 
+  <subtitle>Compiled from 8a1d3f1aff17 (2009-03-10)</subtitle>
+  -->
+  <subtitle>Compiled from $rev_id$</subtitle>
+  <bookinfo>
+    <edition>1</edition>
+    <isbn>9780596800673</isbn>
+    <authorgroup>
+      <author>
+        <firstname>Bryan</firstname>
+        <surname>O'Sullivan</surname>
+      </author>
+    </authorgroup>
+
+    <editor>
+      <firstname>Mike</firstname>
+      <surname>Loukides</surname>
+    </editor>
+
+    <copyright>
+      <year>2006</year>
+      <year>2007</year>
+      <year>2008</year>
+      <year>2009</year>
+      <holder>Bryan O'Sullivan</holder>
+    </copyright>
+  </bookinfo>
+
+  <!-- BEGIN ch00 -->
+  &ch00;
+  <!-- BEGIN ch01 -->
+  &ch01;
+  <!-- BEGIN ch02 -->
+  &ch02;
+  <!-- BEGIN ch03 -->
+  &ch03;
+  <!-- BEGIN ch04 -->
+  &ch04;
+  <!-- BEGIN ch05 -->
+  &ch05;
+  <!-- BEGIN ch06 -->
+  &ch06;
+  <!-- BEGIN ch07 -->
+  &ch07;
+  <!-- BEGIN ch08 -->
+  &ch08;
+  <!-- BEGIN ch09 -->
+  &ch09;
+  <!-- BEGIN ch10 -->
+  &ch10;
+  <!-- BEGIN ch11 -->
+  &ch11;
+  <!-- BEGIN ch12 -->
+  &ch12;
+  <!-- BEGIN ch13 -->
+  &ch13;
+  <!-- BEGIN ch14 -->
+  &ch14;
+  <!-- BEGIN appA -->
+  &appA;
+  <!-- BEGIN appB -->
+  &appB;
+  <!-- BEGIN appC -->
+  &appC;
+  <!-- BEGIN appD -->
+  &appD;
+</book>
+# This makefile requires GNU make.
+
+image-sources := $(wildcard figs/*.dot figs/*.gif figs/*.png figs/*.svg)
+
+xml-src-files := \
+	00book.xml \
+	app*.xml \
+	ch*.xml
+
+image-dot := $(filter %.dot,$(image-sources))
+image-svg := $(filter %.svg,$(image-sources))
+image-oth := $(filter %.gif %.png,$(image-sources))
+
+obj-web := html
+obj-websup := $(obj-web)/support
+obj-web-read := $(obj-web)/read
+
+image-web := \
+	$(image-dot:%.dot=$(obj-web-read)/%.png) \
+	$(image-svg:%.svg=$(obj-web-read)/%.png) \
+	$(image-oth:%=$(obj-web-read)/%)
+
+example-sources-by-name := \
+	backout \
+	bisect \
+	branching \
+	branch-named \
+	branch-repo \
+	cmdref \
+	daily.copy \
+	daily.files \
+	daily.rename \
+	daily.revert \
+	extdiff \
+	filenames \
+	hook.msglen \
+	hook.simple \
+	issue29 \
+	mq.guards \
+	mq.qinit-help \
+	mq.dodiff \
+	mq.id \
+	mq.tarball \
+	mq.tools \
+	mq.tutorial \
+	rename.divergent \
+	rollback \
+	tag \
+	template.simple \
+	template.svnstyle \
+	tour \
+	tour-merge-conflict
+
+example-sources := \
+	$(example-sources-by-name:%=examples/%) \
+	$(wildcard examples/ch*/*)
+
+extras-web-base := \
+	$(obj-web)/index.html \
+	$(obj-web)/robots.txt \
+	$(obj-websup)/form-min.js \
+	$(obj-websup)/form.js \
+	$(obj-websup)/hsbook.js \
+	$(obj-websup)/jquery-min.js \
+	$(obj-websup)/jquery.js \
+	$(obj-websup)/styles.css
+
+extras-web := $(extras-web-base) $(extras-web-base:%=%.gz)
+
+xsltproc := xsltproc
+xsltproc-opts := --nonet --xinclude --path '$(xml-path)'
+
+xmllint := xmllint
+xmllint-opts := --noout --nonet --valid
+
+system-xsl-dir := $(firstword $(wildcard \
+	/usr/share/sgml/docbook/xsl-stylesheets \
+	/usr/share/xml/docbook/stylesheet/nwalsh \
+	))
+
+# Bletcherousness.
+
+ifneq ($(wildcard /usr/share/sgml/docbook/xml-dtd-4.4-*),)
+dtd-dir := $(wildcard /usr/share/sgml/docbook/xml-dtd-4.4-*)
+else
+ifneq ($(wildcard /usr/share/xml/docbook/schema/dtd/4.4),)
+dtd-dir := $(wildcard /usr/share/xml/docbook/schema/dtd/4.4)
+else
+$(error Do not know where to look for DocBook XML 4.4 DTD)
+endif
+endif
+
+ifeq ($(system-xsl-dir),)
+$(error add a suitable directory to system-xsl-dir)
+endif
+
+example-prereqs := \
+	/usr/bin/merge
+
+dist-sources := \
+	../html/hgicon.png \
+	../html/index.html.var \
+	../html/index.en.html
+
+hg = $(shell which hg)
+
+hg-id = $(shell hg parents --template '{node|short}, dated {date|isodate},\n')
+
+hg-version = $(shell hg version -q | \
+		     sed 's,.*(version \(unknown\|[a-f0-9+]*\)),\1,')
+
+all: web complete.xml
+
+../stylesheets/system-xsl: $(system-xsl-dir)
+	ln -s $< $@
+
+web: ../stylesheets/system-xsl websup html
+
+html: $(obj-web-read)/index.html
+
+../web/index-read.html.in: ../web/genindex.py $(xml-src-files)
+	cd ../web && ./genindex.py
+
+$(obj-web-read)/index.html: ../stylesheets/system-xsl .validated-00book.xml ../web/index-read.html.in
+	xsltproc $(xsltproc-opts) -o $(obj-web-read)/x ../stylesheets/chunk-stylesheet.xsl 00book.xml
+	python ../web/texpand.py ../web/index-read.html.in html/read/index.html
+	for i in $(obj-web-read)/*.html; do \
+	  gzip -9 -c $$i > $$i.gz; \
+	done
+
+websup: $(extras-web) $(image-web)
+	mkdir -p $(obj-websup)/figs $(obj-web-read)/figs
+	cp ../stylesheets/system-xsl/images/*.png $(obj-websup)/figs
+	cp -f ../web/icons/*.png $(obj-websup)/figs
+
+complete.xml: .validated-00book.xml
+	$(xsltproc) $(xsltproc-opts) -o $@ ../stylesheets/dtd-profile.xsl 00book.xml
+
+all-ids.dat: ../stylesheets/all-ids.xsl $(xml-src-files)
+	$(xsltproc) $(xsltproc-opts) -o $@ ../stylesheets/all-ids.xsl 00book.xml
+
+web: websup
+
+valid: .validated-00book.xml
+
+.validated-00book.xml: $(xml-src-files) examples/.run
+	$(xmllint) --path '$(dtd-dir):$(xml-path)' $(xmllint-opts) $<
+	touch $@
+
+# Produce 90dpi PNGs for the web.
+
+$(obj-web-read)/figs/%.png: $(obj-web-read)/figs/%.svg fixsvg
+	mkdir -p $(dir $@)
+	./fixsvg $<
+	inkscape -D -e $@ $<-tmp.svg
+	rm $<-tmp.svg
+
+$(obj-web-read)/figs/%.png: figs/%.svg fixsvg
+	mkdir -p $(dir $@)
+	./fixsvg $<
+	inkscape -D -e $@ $<-tmp.svg
+	rm $<-tmp.svg
+
+$(obj-web-read)/figs/%.gif: figs/%.gif
+	cp $< $@
+
+$(obj-web-read)/figs/%.png: figs/%.png
+	cp $< $@
+
+$(obj-web-read)/figs/%.svg: figs/%.dot
+	mkdir -p $(dir $@)
+	dot -Tsvg -o $@ $<
+
+examples: $(example-prereqs) examples/.run
+
+examples/.run: $(example-sources)
+	cd examples && ./run-example -a
+
+examples/%.run: examples/% examples/run-example
+
+clean:
+	-rm -rf dist html $(image-dot:%.dot=%.pdf) $(image-dot:%.dot=%.png) \
+	  $(image-svg:%.svg=%.png) examples/*.{lxo,run} examples/.run
+
+install: html $(dist-sources)
+	rm -rf dist
+	mkdir -p dist
+	cp html/*.{css,html,png} dist
+	cp $(dist-sources) dist
+
+rsync: install
+	rsync -avz --delete dist sp.red-bean.com:public_html/hgbook
+
+vpath %.css ../web
+vpath %.html.in ../web
+vpath %.js ../web/javascript
+
+$(obj-websup)/%.css: %.css
+	@mkdir -p $(dir $@)
+	cp $< $@
+
+$(obj-websup)/%.jpg: %.jpg
+	@mkdir -p $(dir $@)
+	cp $< $@
+
+$(obj-websup)/%.js: %.js
+	@mkdir -p $(dir $@)
+	cp $< $@
+
+$(obj-web)/%: ../web/%
+	@mkdir -p $(dir $@)
+	cp $< $@
+
+$(obj-web)/%.html: %.html.in
+	@mkdir -p $(dir $@)
+	python ../web/texpand.py $< $@
+
+%.gz: %
+	gzip -9 -c $< > $@

File ru/appA-svn.xml

+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+
+<appendix id="svn">
+  <?dbhtml filename="migrating-to-mercurial.html"?>
+<title>Переход на Mercurial</title>
+
+  <para id="x_6e1">Простой способ прощупать почву с новым инструментом контроля версий, это поэкспериментировать с переключением существующих проектов, а не начинать новый проект с нуля.</para>
+
+  <para id="x_6e2">В этом приложении мы обсудим, как импортировать историю проекта в Mercurial, и на что обратить внимание, если вы привыкли к другой системе контроля версий.</para>
+
+  <sect1>
+    <title>Импорт истории из другой системы</title>
+
+    <para id="x_6e3">Mercurial поставляется с расширением называемым <literal>convert</literal>, которое может импортировать историю проекта из наиболее популярных систем контроля версий. В то время когда эта книга была написана, оно могло импортировать историю из следующих систем:</para>
+    <itemizedlist>
+      <listitem>
+	<para id="x_6e4">Subversion</para>
+      </listitem>
+      <listitem>
+	<para id="x_6e5">CVS</para>
+      </listitem>
+      <listitem>
+	<para id="x_6e6">git</para>
+      </listitem>
+      <listitem>
+	<para id="x_6e7">Darcs</para>
+      </listitem>
+      <listitem>
+	<para id="x_6e8">Bazaar</para>
+      </listitem>
+      <listitem>
+	<para id="x_6e9">Monotone</para>
+      </listitem>
+      <listitem>
+	<para id="x_6ea">GNU Arch</para>
+      </listitem>
+      <listitem>
+	<para id="x_6eb">Mercurial</para>
+      </listitem>
+    </itemizedlist>
+
+    <para id="x_6ec">(Чтобы понять, почему Mercurial поддерживает в качестве источника самого себя, смотрите в разделе <xref linkend="svn.filemap"/>.)</para>
+
+    <para id="x_6ed">Вы можете включить расширение в обычном порядке, отредактировав файл <filename>~/.hgrc</filename>.</para>
+
+    <programlisting>[extensions]
+convert =</programlisting>
+
+    <para id="x_6ee">Это сделает доступной команду <command>hg convert</command>. Команда проста в использовании. Например, эта команда будет импортировать историю Subversion для Nose unit testing framework в Mercurial.</para>
+
+    <screen><prompt>$</prompt> <userinput>hg convert http://python-nose.googlecode.com/svn/trunk</userinput></screen>
+
+    <para id="x_6ef">Расширение <literal>convert</literal> действует поэтапно. Иными словами, после того как вы выполните <command>hg convert</command> первый раз, запуская его снова вы будете импортировать любые новые ревизии, совершенные после первого запуска. Инкрементные преобразования будут работать только если вы запустите <command>hg convert</command> в том же репозитории Mercurial, который вы использовали, потому что расширение <literal>convert</literal> сохраняет некоторые частные метаданные не под контролем системы контроля версий, в файле с именем <filename>.hg/shamap</filename> внутри целевого репозитория.</para>
+
+    <para id="x_707">Если вы хотите начать делать изменения, используя Mercurial, то лучше клонировать дерево, в котором вы будете проводить преобразование и оставить оригинальное дерево для последующий инкрементальных преобразований. Это самый безопасный способ позволяет вытягивать и объединять будущие изменения из исходной системы контроля версий в своём новом активном репозитории Mercurial.</para>
+
+    <sect2>
+      <title>Конвертирование нескольких ветвей</title>
+
+      <para id="x_708">Команда <command>hg convert</command> приведенная выше преобразует только историю ветки <literal>trunk</literal> репозитория Subversion. Если мы вместо этого используем URL <literal>http://python-nose.googlecode.com/svn</literal>, Mercurial автоматически обнаружит <literal>trunk</literal>, <literal>tags</literal> и <literal>branches</literal>, которые обычно используют проекты Subversion, и он будет импортировать каждый как отдельную ветвь Mercurial.</para>
+
+      <para id="x_709">По умолчанию, каждая ветка Subversion импортируется в Mercurial с названием ветки. После завершения преобразования, можно получить список имен активных веток в Mercurial репозитории с помощью <command>hg branches -a</command>. Если вы предпочитаете импортировать ветви Subversion без названия, используйте опцию <option>--config convert.hg.usebranchnames=false</option> команды <command>hg convert</command>.</para>
+
+      <para id="x_70a">Как только вы преобразовывали свое дерево, если вы хотите следовать обычной для Mercurial практике работы в  одном дереве, содержащем одну ветку, можно клонировать одну ветку используя <command>hg clone -r mybranchname</command>.</para>
+    </sect2>
+
+    <sect2>
+      <title>Связь имён пользователей</title>
+
+      <para id="x_6f0">Некоторые средства контроля версий сохраняют только короткие имена пользователей при фиксации, и они могут трудно интерпретироваться. Обычно в Mercurial сохраняется имя коммиттера и адрес электронной почты, который является гораздо более полезным для разговора с ними после факта фиксации.</para>
+
+      <para id="x_6f1">Если вы преобразовываете дерево из системы контроля версий, которая использует короткие имена, можно сопоставить эти имена с длинными эквивалентами, передавая опцию <option>--authors</option> команде <command>hg convert</command>. Этот параметр принимает имя файла, который должен содержать записи следующего вида.</para>
+
+      <programlisting>arist = Aristotle &lt;aristotle@phil.example.gr&gt;
+soc = Socrates &lt;socrates@phil.example.gr&gt;</programlisting>
+
+      <para id="x_6f2">Всякий раз, когда <literal>convert</literal> встретит ревизию с именем пользователя <literal>arist</literal> в исходном репозитории, он будет использовать имя <literal>Aristotle &lt;aristotle@phil.example.gr&gt;</literal> в преобразованной для Mercurial ревизии. Если совпадения не найдется, то имя используется дословно.</para>
+    </sect2>
+
+    <sect2 id="svn.filemap">
+      <title>Очистка дерева</title>
+
+      <para id="x_6f3">Не все проекты имеют чистую историю. Там может быть каталог, который никогда не должен были проверятся, слишком большие файлы, или целая иерархия, которая должна быть переработана.</para>
+
+      <para id="x_6f4">Расширение <literal>convert</literal> поддерживает идею <quote>карты файлов</quote>, которая позволяет реорганизовать файлы и каталоги в проекте, при импорте истории проекта. Это полезно не только при импорте истории из других систем контроля версий, но также и для того чтобы подрезать или реорганизовать дерево Mercurial.</para>
+
+      <para id="x_6f5">Чтобы указать карту файлов, используйте опцию <option>--filemap</option> и укажите имя файла. Карта файлов содержит строки в следующем формате.</para>
+
+      <programlisting># This is a comment.
+# Empty lines are ignored.	
+
+include path/to/file
+
+exclude path/to/file
+
+rename from/some/path to/some/other/place
+</programlisting>
+
+      <para id="x_6f6">Директива <literal>include</literal> указывает файл или все файлы в каталоге, которые будут включены в целевой репозиторий. Она также исключает любые другие файлы и директории не включенные явно. Директива <literal>exclude</literal> указывает файлы или директории, которые будут исключены, а другие прямо не упоминаемые должны быть включены.</para>
+
+      <para id="x_6f7">Чтобы переместить файлы или каталог из одного места в другое, используйте директиву <literal>rename</literal>. Если вам необходимо переместить файл или каталог из подкаталога в корневой каталог репозитория, используйте <literal>.</literal> в качестве второго аргумента директивы <literal>rename</literal>.</para>
+    </sect2>
+
+    <sect2>
+      <title>Улучшение эффективности преобразования Subversion</title>
+
+      <para id="x_70b">Часто требуется несколько попыток, прежде чем будет получена идеальное сочетание карты пользователей, карты файлов и других параметров конвертации. Преобразование репозитория subversion через протокол доступа похожий на <literal>ssh</literal> или <literal>http</literal> может протекать в тысячи раз медленнее, чем Mercurial реально способен работать, из-за задержек в сети. Это делает подбор идеальных настроек преобразования очень тяжелой.</para>
+
+      <para id="x_70c">Команда <ulink url="http://svn.collab.net/repos/svn/trunk/notes/svnsync.txt"><command>svnsync</command></ulink> может значительно ускорить преобразование репозитория Subversion. Она создаёт зеркало только для чтения для репозитория Subversion. Идея заключается в создании локального зеркала вашего Subversion дерева, а затем преобразовании зеркала в Mercurial репозиторий.</para>
+
+      <para id="x_70d">Предположим, мы хотим преобразовать репозиторий Subversion для популярного проекта Memcached в Mercurial дерево. Во-первых, мы создаем локальный репозиторий Subversion.</para>
+
+      <screen><prompt>$</prompt> <userinput>svnadmin create memcached-mirror</userinput></screen>
+
+      <para id="x_70e">Далее, мы установим ловушку Subversion необходимую для <command>svnsync</command>.</para>
+
+      <screen><prompt>$</prompt> <userinput>echo '#!/bin/sh' > memcached-mirror/hooks/pre-revprop-change</userinput>
+<prompt>$</prompt> <userinput>chmod +x memcached-mirror/hooks/pre-revprop-change</userinput></screen>
+
+      <para id="x_70f">Затем мы инициализируем <command>svnsync</command> в этом репозитории.</para>
+
+      <screen><prompt>$</prompt> <userinput>svnsync --init file://`pwd`/memcached-mirror \
+  http://code.sixapart.com/svn/memcached</userinput></screen>
+
+      <para id="x_710">Наш следующий шаг &emdash; начинаем процесс зеркалирования <command>svnsync</command>.</para>
+
+      <screen><prompt>$</prompt> <userinput>svnsync sync file://`pwd`/memcached-mirror</userinput></screen>
+
+      <para id="x_711">Наконец, мы импортируем истории нашего локального зеркала Subversion в Mercurial.</para>
+
+      <screen><prompt>$</prompt> <userinput>hg convert memcached-mirror</userinput></screen>
+      
+      <para id="x_712">Мы можем использовать этот процесс инкрементно, если репозиторий Subversion по-прежнему используется. Мы запускаем <command>svnsync</command> для вытягивания новых изменений в наше зеркало, а затем запускаем <command>hg convert</command> для импорта их в наше дерево Mercurial.</para>
+
+      <para id="x_713">Есть два преимущества двухступенчатого импорта с <command>svnsync</command>. Во-первых, используется более эффективная синхронизация кода Subversion по сети, чем при <command>hg convert</command>, так как меньше данных передаётся по сети. Во-вторых, импорт из локального дерева Subversion настолько быстр, что вы можете изменять ваши установки неоднократно без ожидания сетевых процессов каждый раз.</para>
+    </sect2>
+  </sect1>
+
+  <sect1>
+    <title>Переход из Subversion</title>
+
+    <para id="x_6f8">Subversion в настоящее время является самой популярной системой контроля версий с открытым исходным кодом. Хотя есть много различий между Mercurial и Subversion, что делает переход от Subversion на Mercurial не особенно трудным. Обе имеют схожие наборы команд и в целом единый интерфейс.</para>
+
+    <sect2>
+      <title>Философские различия</title>
+
+      <para id="x_6f9">Основное различие между Subversion и Mercurial, конечно то, что Subversion является централизованной, в то время как Mercurial распределённой. Mercurial хранит всю историю проекта на локальном диске, сеть нужна только если вы хотите явно общаться с другим репозиторием. В отличие от Subversion, которая очень мало информации хранит локально, и таким образом, клиент должен связываться со своим сервером для большинства распространенных операций.</para>
+
+      <para id="x_6fa">Subversion более или менее может обходится без четко определенного понятия ветви: какая-то часть пространства имён сервера объявляется веткой и является предметом конвенции, с программным ограничением доступа. Mercurial обрабатывает репозиторий в качестве единой ветви управления.</para>
+
+      <sect3>
+	<title>Набор команд</title>
+
+	<para id="x_6fb">Поскольку Subversion не знает, что части ее пространства имён в действительности ветви, то относится к большинству команд, как запросу работы над любым каталогом в котором вы сейчас находитесь. Например, если вы запускаете <command>svn log</command>, вы получите историю той части дерева, в которой вы находитесь, а не дерева в целом.</para>
+
+	<para id="x_6fc">Команды Mercurial ведут себя по-другому, по умолчанию они работают со всем репозиторием. Запустите <command>hg log</command> и он расскажет вам историю всего дерева, в какой бы части рабочей директории вы не находились в данный момент. Если вы хотите увидеть историю одного файла или каталога, просто укажите его имя, например, <command>hg log src</command>.</para>
+
+	<para id="x_6fd">Из моего собственного опыта, это различие в поведение по умолчанию, скорее всего запутает вас, если у вас есть необходимость часто переключаться между двумя инструментами.</para>
+      </sect3>
+
+      <sect3>
+	<title>Многопользовательская эксплуатация и безопасность</title>
+
+	<para id="x_6fe">В Subversion, это нормально (хотя и несколько неодобрительно) для нескольких пользователей совместно работать в одной ветке. Если Алиса и Боб работают вместе, и Алиса совершает какое-либо изменений в их общей ветке, Бобу необходимо обновить свою рабочую копию прежде чем он сможет фиксировать свои изменения. Так как в это время он не имеет постоянной записи своих изменений, он может повредить или потерять их в ходе или после обновления.</para>
+
+	<para id="x_6ff">Mercurial использует модель фиксация-потом-слияние. Боб фиксирует свои изменения локально перед вытягиванием изменений, или отправкой их на сервер, который он разделяет с Алисой. Если Алиса отправит ее изменения перед тем как Боб попытается  отправить свои, он не сможет отправить свои изменения пока вытянет ее, не выполнит слияние с ними, и не зафиксирует результат слияния. Если он делает ошибку в процессе слияния, он все еще может вернуться к ревизии, в которой записаны его изменения.</para>
+
+	<para id="x_700">Стоит отметить, что это общие методы работы с этими инструментами. Subversion поддерживает безопасную модели работы-в-своей-собственной-ветке, но это достаточно громоздко на практике и не будет широко использоваться. Mercurial может поддерживать менее безопасный режим, позволяющий вытягивать изменения и объединять их поверх незафиксированных изменений, но это считается в высшей степени необычным.</para>
+      </sect3>
+
+      <sect3>
+	<title>Публикация против локальных изменений</title>
+
+	<para id="x_701">Команда Subversion <command>svn commit</command> немедленно публикует изменения на сервер, где их могут видеть все, кто имеет доступ на чтение.</para>
+
+	<para id="x_702">С Mercurial фиксация всегда локальна, и должна быть опубликована через команду <command>hg push</command> позднее.</para>
+
+	<para id="x_703">Каждый подход имеет свои преимущества и недостатки. Модель Subversion означает, что изменения публикуются и, следовательно могут быть пересмотрены и использованы, немедленно. С другой стороны, это означает, что пользователь должен иметь доступ к фиксации в репозиторий для того, чтобы использовать программное обеспечение в обычном порядке, а доступ к фиксации не легко выдается в большинстве проектов с открытым кодом.</para>
+
+	<para id="x_704">Подход Mercurial позволяет любому, кто может клонировать репозиторий вносить изменения без необходимости каких-либо разрешений, и они могут публиковать свои изменения и продолжать участвовать так как они считают нужными. Различие между фиксацией и публикацией открывает возможность фиксировать изменения на своём ноутбуке и на несколько дней забыть, чтобы потом отправить их, что в редких случаях сотрудник может временно застрять.</para>
+      </sect3>
+    </sect2>
+
+    <sect2>
+      <title>Краткий справочник</title>
+
+      <table>
+	<title>Команды Subversion и их эквиваленты в Mercurial</title>
+	<tgroup cols="3">
+	  <thead>
+	    <row>
+	      <entry>Subversion</entry>
+	      <entry>Mercurial</entry>
+	      <entry>Примечание</entry>
+	    </row>
+	  </thead>
+	  <tbody>
+	    <row>
+	      <entry><command>svn add</command></entry>
+	      <entry><command>hg add</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn blame</command></entry>
+	      <entry><command>hg annotate</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn cat</command></entry>
+	      <entry><command>hg cat</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn checkout</command></entry>
+	      <entry><command>hg clone</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn cleanup</command></entry>
+	      <entry>n/a</entry>
+	      <entry>Очистка не требуется</entry>
+	    </row>
+	    <row>
+	      <entry><command>svn commit</command></entry>
+	      <entry><command>hg commit</command>; <command>hg push</command></entry>
+	      <entry><command>hg push</command> публикует после фиксации</entry>
+	    </row>
+	    <row>
+	      <entry><command>svn copy</command></entry>
+	      <entry><command>hg clone</command></entry>
+	      <entry>Создание новой ветки</entry>
+	    </row>
+	    <row>
+	      <entry><command>svn copy</command></entry>
+	      <entry><command>hg copy</command></entry>
+	      <entry>Копирование файлов и директорий</entry>
+	    </row>
+	    <row>
+	      <entry><command>svn delete</command> (<command>svn remove</command>)</entry>
+	      <entry><command>hg remove</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn diff</command></entry>
+	      <entry><command>hg diff</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn export</command></entry>
+	      <entry><command>hg archive</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn help</command></entry>
+	      <entry><command>hg help</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn import</command></entry>
+	      <entry><command>hg addremove</command>; <command>hg commit</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn info</command></entry>
+	      <entry><command>hg parents</command></entry>
+	      <entry>Показывает какая ревизия сейчас вытянута</entry>
+	    </row>
+	    <row>
+	      <entry><command>svn info</command></entry>
+	      <entry><command>hg showconfig paths.parent</command></entry>
+	      <entry>Показывает вытянутый URL</entry>
+	    </row>
+	    <row>
+	      <entry><command>svn list</command></entry>
+	      <entry><command>hg manifest</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn log</command></entry>
+	      <entry><command>hg log</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn merge</command></entry>
+	      <entry><command>hg merge</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn mkdir</command></entry>
+	      <entry>n/a</entry>
+	      <entry>Mercurial не отслеживает каталоги</entry>
+	    </row>
+	    <row>
+	      <entry><command>svn move</command> (<command>svn rename</command>)</entry>
+	      <entry><command>hg rename</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn resolved</command></entry>
+	      <entry><command>hg resolve -m</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn revert</command></entry>
+	      <entry><command>hg revert</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn status</command></entry>
+	      <entry><command>hg status</command></entry>
+	      <entry></entry>
+	    </row>
+	    <row>
+	      <entry><command>svn update</command></entry>
+	      <entry><command>hg pull -u</command></entry>
+	      <entry></entry>
+	    </row>
+	  </tbody>
+	</tgroup>
+      </table>
+    </sect2>
+  </sect1>
+
+  <sect1>
+    <title>Полезные советы для новичков</title>
+
+    <para id="x_705">В некоторых системах контроля версий, печать diff для одного зафиксированной ревизии может быть мучительным. Например, в Subversion, чтобы посмотреть, что изменилось в редакции 104654, вы должны ввести <command>svn diff -r104653:104654</command>. Mercurial устраняет необходимость указания ID-ревизии дважды в общем случае. Для простого просмотра используйте <command>hg export 104654</command>. Для сообщения лога и последующего diff <command>hg log -r104654 -p</command>.</para>
+
+    <para id="x_706">При запуске <command>hg status</command> без каких-либо аргументов, он выдает статус всего дерева, с путями относительно корня репозитория. Это делает сложным копирование имени файла из вывода <command>hg status</command> в командную строку. Если вы укажете имя файла или каталога команде <command>hg status</command>, она будет печатать пути относительно вашего текущего местоположения вместо этого. Таким образом, чтобы получить статус всего дерева с помощью <command>hg status</command>, с путями, которые считаются относительно текущего каталога, а не корня репозитория, укажите вывод команды <command>hg root</command> как параметр для команды <command>hg status</command>. Вы легко можете сделать это следующим образом на Unix-подобной операционной системе:</para>
+
+    <screen><prompt>$</prompt> <userinput>hg status `hg root`</userinput></screen>
+  </sect1>
+</appendix>
+
+<!--
+local variables: 
+sgml-parent-document: ("00book.xml" "book" "appendix")
+end:
+-->

File ru/appB-mq-ref.xml

+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+
+<appendix id="chap:mqref">
+  <?dbhtml filename="mercurial-queues-reference.html"?>
+  <title>Справочник Mercurial Queues</title>
+
+  <sect1 id="sec:mqref:cmdref">
+    <title>Справочник команд MQ</title>
+
+    <para id="x_5e8">Для просмотра команд предоставляемых mq, используйте команду <command role="hg-cmd">hg help mq</command>.</para>
+
+    <sect2>
+      <title><command role="hg-ext-mq">qapplied</command> &emdash; печатает применённые патчи</title>
+
+      <para id="x_5e9">Команда <command role="hg-ext-mq">qapplied</command> выводит стек текущих применённых патчей. Патчи печатаются в порядке от старых к новым, так что последний патч в списке будет <quote>верхним</quote> патчем.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qcommit</command> &emdash; фиксирует изменения в репозитории очереди</title>
+
+      <para id="x_5ea">Команда <command role="hg-ext-mq">qcommit</command> фиксирует замеченные изменения в репозитории <filename role="special" class="directory">.hg/patches</filename>. Эта команда работает только если директория <filename role="special" class="directory">.hg/patches</filename> является репозиторием, например, вы создали каталог с помощью <command role="hg-cmd">hg qinit <option role="hg-ext-mq-cmd-qinit-opt">-c</option></command> или запустив <command role="hg-cmd">hg init</command> в директории после запуска <command role="hg-ext-mq">qinit</command>.</para>
+
+      <para id="x_5eb">Эта команда представляет собой сокращение от <command role="hg-cmd">hg commit --cwd .hg/patches</command>.</para>
+    </sect2>
+    <sect2>
+	<title><command role="hg-ext-mq">qdelete</command> &emdash; удалить патч из файла <filename role="special">series</filename></title>
+
+      <para id="x_5ec">Команда <command role="hg-ext-mq">qdelete</command> удаляет запись о патче из файла <filename role="special">series</filename> в каталоге <filename role="special" class="directory">.hg/patches</filename>. Это не извлечение патча, если патч уже применён. По умолчанию, это не приводит к удалению файла патча, для этого используйте опцию <option role="hg-ext-mq-cmd-qdel-opt">-f</option>.</para>
+
+      <para id="x_5ed">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_5ee"><option role="hg-ext-mq-cmd-qdel-opt">-f</option>: Удалить файл патча.</para>
+	</listitem></itemizedlist>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qdiff</command> &emdash; печатает diff для верхнего применяемого патча</title>
+
+      <para id="x_5ef">Команда <command role="hg-ext-mq">qdiff</command> выводит список различий верхнего применяемого патча. Это эквивалентно <command role="hg-cmd">hg diff -r-2:-1</command>.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qfinish</command> &emdash; перемещает применённые патчи в историю репозитория</title>
+
+      <para id="x_72d">Команда <command>hg qfinish</command> преобразует указанные примененные патчи в постоянную ревизию, перемещая их из-под контроля MQ, чтобы они преобразовались в нормальную историю репозитория.</para>
+    </sect2>
+
+    <sect2>
+      <title><command role="hg-ext-mq">qfold</command> &emdash; слияние (<quote>свёртка</quote>), нескольких патчей в один</title>
+
+      <para id="x_5f0">Команда <command role="hg-ext-mq">qfold</command> объединяет несколько исправлений в верхний применяемый патч, так что верхний применяемый патч делает объединение всех изменений в патчах запроса.</para>
+
+      <para id="x_5f1">Патчи для свёртки не должны быть применены; <command role="hg-ext-mq">qfold</command> выйдет с ошибкой, если какой-либо патч применён. Порядок, в котором складываются патчи является значимым; <command role="hg-cmd">hg qfold a b</command> означает <quote>применить текущий верхний патч, затем <literal>a</literal>, потом <literal>b</literal></quote>.</para>
+
+      <para id="x_5f2">Комментарии сворачиваемых патчей добавляются к комментариям патча назначения, при этом каждый блок комментариев разделен символами трёх звездочек (<quote><literal>*</literal></quote>). Использование опции <option role="hg-ext-mq-cmd-qfold-opt">-e</option> редактирует сообщение фиксации для комбинированных патчей/ревизий после завершен свёртки.</para>
+
+      <para id="x_5f3">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_5f4"><option role="hg-ext-mq-cmd-qfold-opt">-e</option>: Изменить сообщение фиксации и описание патча для недавно свёрнутого патча.</para>
+	</listitem>
+	<listitem><para id="x_5f5"><option role="hg-ext-mq-cmd-qfold-opt">-l</option>: использовать содержимое заданного файла в качестве нового сообщения фиксации и  описания свёрнутого патча.</para>
+	</listitem>
+	<listitem><para id="x_5f6"><option role="hg-ext-mq-cmd-qfold-opt">-m</option>: Используйте данный текст в качестве нового сообщения фиксации и описание патча для сложенного патча.</para>
+	</listitem></itemizedlist>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qheader</command> &emdash; отображает заголовки/описание патча</title>
+
+      <para id="x_5f7">Команда <command role="hg-ext-mq">qheader</command> печатает заголовок или описание, из патча. По умолчанию, она печатает заголовок применяемого верхнего патча. С учетом аргументов, оно выводит заголовок именованного патча.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qimport</command> &emdash; импорт сторонних патчей в очередь</title>
+
+      <para id="x_5f8">Команда <command role="hg-ext-mq">qimport</command> добавляет запись для внешнего патча в файле <filename role="special">series</filename>, а также копирует патч в каталог <filename role="special" class="directory">.hg/patches</filename>. Она добавляет запись сразу же после верхнего примененного патча, но не вставляет патч.</para>
+
+      <para id="x_5f9">Если каталог <filename role="special" class="directory">.hg/patches</filename> репозиторий, <command role="hg-ext-mq">qimport</command> автоматически выполняет <command role="hg-cmd">hg add</command> импортируемого патча.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qinit</command> &emdash; подготовить хранилище для работы с MQ</title>
+
+      <para id="x_5fa">Команда <command role="hg-ext-mq">qinit</command> готовит репозиторий для работы с MQ. Она создает каталог с именем <filename role="special" class="directory">.hg/patches</filename>.</para>
+
+      <para id="x_5fb">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_5fc"><option role="hg-ext-mq-cmd-qinit-opt">-c</option>: Создает <filename role="special" class="directory">.hg/patches</filename>, как репозиторий под своим собственным контролем. Также создается файл <filename role="special">.hgignore</filename>, для игнорирования файла <filename role="special">status</filename>.</para>
+	</listitem></itemizedlist>
+
+      <para id="x_5fd">Если директория <filename role="special" class="directory">.hg/patches</filename> репозиторий, команды <command role="hg-ext-mq">qimport</command> и <command role="hg-ext-mq">qnew</command> автоматически запускают <command role="hg-cmd">hg add</command> для новых патчей.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qnew</command> &emdash; создание новых патчей</title>
+
+      <para id="x_5fe">Команда <command role="hg-ext-mq">qnew</command> создаёт новый патч. Она принимает один обязательный аргумент, имя использующееся для файла патча. Вновь созданный патч создается по-умолчанию пустым. Он добавляется в файл <filename role="special">series</filename> после текущего верхнего применённого патча, и сразу вставляется верхним патчем.</para>
+
+      <para id="x_5ff">Если <command role="hg-ext-mq">qnew</command> находит измененные файлы в рабочем каталоге, она откажется от создания нового патча, если не используется опция <option role="hg-ext-mq-cmd-qnew-opt">-f</option> (смотрите ниже). Такое поведение позволяет вызвать <command role="hg-ext-mq">qrefresh</command> для вашего верхнего применённого патча, перед тем как применить новый патч поверх него.</para>
+
+      <para id="x_600">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_601"><option role="hg-ext-mq-cmd-qnew-opt">-f</option>: Создаёт новый патч, если содержимое рабочего каталога изменено. Любые неразрешенные модификаций добавляются в только что созданный патч, так что после того как команда завершает свою работу, рабочий каталог больше не будут измененым.</para>
+	</listitem>
+	<listitem><para id="x_602"><option role="hg-ext-mq-cmd-qnew-opt">-m</option>: Использование данного текста как сообщения фиксации. Этот текст будет храниться в начале файла заплатки, до данных патча.</para>
+	</listitem></itemizedlist>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qnext</command> &emdash; печатает имя следующего патча</title>
+
+      <para id="x_603">Команда <command role="hg-ext-mq">qnext</command> печатает имя следующего патча в файле <filename role="special">series</filename> после верхнего применяемого патча. Этот патч будет применён, если вы запустите <command role="hg-ext-mq">qpush</command>.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qpop</command>&emdash; извлекает патчи из стека</title>
+
+      <para id="x_604">Команда <command role="hg-ext-mq">qpop</command> удаляет применённые патчи с вершины стека применённых патчей. По умолчанию, она удаляет только один патч.</para>
+
+      <para id="x_605">Эта команда удаляет наборы изменений, которые представляют извлечённые патчи из репозитория, и обновляет рабочий каталог, чтобы устранить последствия патчей.</para>
+
+      <para id="x_606">Эта команда принимает необязательный аргумент, который она использует в качестве имени или индекса патча для извлечения. Если имя передаётся, патчи будут применяться пока патч, имя которого было передано, не станет верхним. Если передаётся номер, <command role="hg-ext-mq">qpop</command> использует номер в качестве индекса записи в файле серий, начиная с нуля (пустые строки и строки, содержащие только комментарии не в учитываются). Она извлекает патчи пока выявленный патч не станет самым верхним применённым патчем.</para>
+
+      <para id="x_607">Команда <command role="hg-ext-mq">qpop</command> не читает или пишет патчи или файл <filename role="special">series</filename>. Таким образом, безопасно извлечь патч, который вы удалили из файла <filename role="special">series</filename> или патч, который был переименован или удален полностью. В двух последних случаях, используйте имя патча, как это было, когда вы применили его.</para>
+
+      <para id="x_608">По умолчанию, команда <command role="hg-ext-mq">qpop</command> не выполнится для любого патча, если рабочий каталог был изменен. Вы можете изменить это поведение, используя опцию <option role="hg-ext-mq-cmd-qpop-opt">-f</option>, которая возвращает все изменения в рабочий каталог.</para>
+
+      <para id="x_609">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_60a"><option role="hg-ext-mq-cmd-qpop-opt">-a</option>: Извлекает все применённые патчи. Это вернет репозиторий в состояние до установки патчей.</para>
+	</listitem>
+	<listitem><para id="x_60b"><option role="hg-ext-mq-cmd-qpop-opt">-f</option>: Принудительно восстановить любые изменения в рабочем каталоге, при их извлечении.</para>
+	</listitem>
+	<listitem><para id="x_60c"><option role="hg-ext-mq-cmd-qpop-opt">-n</option>: Извлекает патч из именованной очереди.</para>
+	</listitem></itemizedlist>
+
+      <para id="x_60d">Команда <command role="hg-ext-mq">qpop</command> удаляет одну строку с конца файла <filename role="special">status</filename> для каждого патча, который она извлекает.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qprev</command> &emdash; печатает имя предыдущего патча</title>
+
+      <para id="x_60e">Команда <command role="hg-ext-mq">qprev</command> печатает название патча в файле <filename role="special">series</filename>, который находится перед верхним применённым патчем. Он станет самым верхним патчем применённым при запуске <command role="hg-ext-mq">qpop</command>.</para>
+
+    </sect2>
+    <sect2 id="sec:mqref:cmd:qpush">
+      <title><command role="hg-ext-mq">qpush</command> &emdash; вставляет патчи в стек</title>
+
+      <para id="x_60f">Команда <command role="hg-ext-mq">qpush</command> добавляет патчи на верх стека применённых патчей. По умолчанию, она добавляет только один патч.</para>
+
+      <para id="x_610">Эта команда создает новую ревизию для представления каждого применённого патча и обновляет рабочую директорию применяя патч.</para>
+
+      <para id="x_611">По умолчанию данные используемые при создании ревизии, следующие:</para>
+      <itemizedlist>
+	<listitem><para id="x_612">Текущая дата и часовой пояс коммитера. Так как эти данные используются для вычисления идентификатора ревизии, это означает, что если вы извлечёте (<command role="hg-ext-mq">qpop</command>) патч и добавите (<command role="hg-ext-mq">qpush</command>) его снова, ревизия, которые вы вставите будет иметь другой идентификатор, чем та ревизия которую вы удалили.</para>
+	</listitem>
+	<listitem><para id="x_613">Автор который используется по умолчанию при использовании команды <command role="hg-cmd">hg commit</command>.</para>
+	</listitem>
+	<listitem><para id="x_614">Сообщение фиксации &emdash; любой текст из файла патча, который находится перед первым заголовком diff. Если нет такого текста, по умолчанию используется сообщение, которое идентифицирует имя патча.</para>
+	</listitem></itemizedlist>
+      <para id="x_615">Если патч содержит заголовок Mercurial для патча, информация в заголовке патча перекрывает все эти умолчания.</para>
+
+      <para id="x_616">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_617"><option role="hg-ext-mq-cmd-qpush-opt">-a</option>: вставить все не применённые патчи из файла <filename role="special">series</filename>, пока есть что вставлять.</para>
+	</listitem>
+	<listitem><para id="x_618"><option role="hg-ext-mq-cmd-qpush-opt">-l</option>: Добавить название патча к концу сообщения фиксации.</para>
+	</listitem>
+	<listitem><para id="x_619"><option role="hg-ext-mq-cmd-qpush-opt">-m</option>: Если патч не удастся применить аккуратно, использовать запись исправлений в другой сохранённой очереди, чтобы вычислить параметры трехстороннего слияния, а также выполнить трехстороннее слияние с использованием обычного механизма слияния Mercurial. Использовать результат слияния в качестве нового содержимого патча.</para>
+	</listitem>
+	<listitem><para id="x_61a"><option role="hg-ext-mq-cmd-qpush-opt">-n</option>: Использовать имя очереди, если слияние происходит во время вставки.</para>
+	</listitem></itemizedlist>
+
+      <para id="x_61b">Команда <command role="hg-ext-mq">qpush</command> читает, но не изменяет, файл <filename role="special">series</filename>. Он добавляет одну строку в файл <command role="hg-cmd">hg status</command> для каждого патча, который она вставляет.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qrefresh</command> &emdash; обновление верхнего применённого патча</title>
+
+      <para id="x_61c">Команда <command role="hg-ext-mq">qrefresh</command> обновляет верхний применённый патч. Она изменяет патч, удаляет старую ревизию, которая представляет патч, и создает новую ревизию для представления изменённого патча.</para>
+
+      <para id="x_61d">Команда <command role="hg-ext-mq">qrefresh</command> просматривает следующие изменения:</para>
+      <itemizedlist>
+	<listitem><para id="x_61e">Изменения в сообщении фиксации, то есть текст до первого заголовка различий в патче, отражены в новом наборе изменений, которая представляет собой патч.</para>
+	</listitem>
+	<listitem><para id="x_61f">Изменения в отслеживаемых файлах в рабочем каталоге добавляются в патч.</para>
+	</listitem>
+	<listitem><para id="x_620">Изменения файлов отслеживаемых с помощью <command role="hg-cmd">hg add</command>, <command role="hg-cmd">hg copy</command>, <command role="hg-cmd">hg remove</command>, или <command role="hg-cmd">hg rename</command>. Добавляет файлы и копирует и переименовывает целевой патч, в то время как удаленные файлы и переименованные удаляются.</para>
+	</listitem></itemizedlist>
+
+      <para id="x_621">Даже если <command role="hg-ext-mq">qrefresh</command> обнаруживает отсутствие изменений, она по-прежнему переписывает ревизию, которая представляет собой патч. Это приводит к изменению идентификатора отличающегося от предыдущих ревизий, которые идентифицируют патч.</para>
+
+      <para id="x_622">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_623"><option role="hg-ext-mq-cmd-qrefresh-opt">-e</option>: Изменение сообщения фиксации и описания патча, используя текстовый редактор.</para>
+	</listitem>
+	<listitem><para id="x_624"><option role="hg-ext-mq-cmd-qrefresh-opt">-m</option>: Изменение сообщения фиксации и описания патча, используя передаваемый текст.</para>
+	</listitem>
+	<listitem><para id="x_625"><option role="hg-ext-mq-cmd-qrefresh-opt">-l</option>: Изменение сообщения фиксации и описания патча, используя текст из переданного файла.</para>
+	</listitem></itemizedlist>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qrename</command> &emdash; переименование патча</title>
+
+      <para id="x_626">Команда qrename переименовывает патч и изменяет запись для патча в файле <filename role="special">series</filename>.</para>
+
+      <para id="x_627">С помощью единственного аргумента, <command role="hg-ext-mq">qrename</command> переименовывает верхний применённый патч. С двумя аргументами, переименовывает патч из первого аргумента ко второму.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qseries</command> &emdash; печатает записи серии патчей</title>
+
+      <para id="x_62a">Команда <command role="hg-ext-mq">qseries</command> выводит целый ряд патчей из файла <filename role="special">series</filename>. Он печатает только имена патчей, а не пустые строки или комментарии. Он печатает в порядке от первого к последнему применённому патчу.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qtop</command>&emdash; печатает имя текущего патча</title>
+
+      <para id="x_62b">Команда <command role="hg-ext-mq">qtop</command> печатает имя верхнего примененного в настоящее время патча.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-ext-mq">qunapplied</command>&emdash; печатает не применённые патчи</title>
+
+      <para id="x_62c">Команда <command role="hg-ext-mq">qunapplied</command> печатает имена патчей из файла <filename role="special">series</filename>, которые пока еще не применены. Он выводит их в порядке от следующего патча, которые будет вставлен до последнего.</para>
+
+    </sect2>
+    <sect2>
+      <title><command role="hg-cmd">hg strip</command> &emdash; удаляет ревизию и потомков</title>
+
+      <para id="x_62d">Команда <command role="hg-cmd">hg strip</command> удаляет ревизию, и всех её потомков, из репозитория. Она отменяет последствия изменений удаленной из репозитория, и обновляет рабочую директорию на первого родителя удалённой ревизии.</para>
+
+      <para id="x_62e">Команда <command role="hg-cmd">hg strip</command> сохраняет резервные копии удаленных ревизий в пакете, так что они могут быть повторно применены, если по ошибке удалены.</para>
+
+      <para id="x_62f">Опции:</para>
+      <itemizedlist>
+	<listitem><para id="x_630"><option role="hg-opt-strip">-b</option>: Сохранить несвязанные ревизии, смешанные с ревизиями в резервный комплект.</para>
+	</listitem>
+	<listitem><para id="x_631"><option role="hg-opt-strip">-f</option>: если ветвь имеет несколько голов, удаляет все головы.</para>
+	</listitem>
+	<listitem><para id="x_632"><option role="hg-opt-strip">-n</option>: Не сохранять резервный комплект.</para>
+	</listitem></itemizedlist>
+
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>Справочник файлов MQ</title>
+
+    <sect2>
+      <title>Файл <filename role="special">series</filename></title>
+
+      <para id="x_633">Файл <filename role="special">series</filename> содержит список имен из всех патчей, которые MQ может применить. Он представляется в виде списка имен, с одним именем в каждой строке. Начальные и конечные пробелы в строке игнорируются.</para>
+
+      <para id="x_634">Строки могут содержать комментарии, которые начинается с символа <quote><literal>#</literal></quote> и продолжается до конца строки. Пустые строки и строки, содержащие только комментарии, игнорируются.</para>
+
+      <para id="x_635">Вам часто придется изменять ряд файлов вручную, поэтому поддерживаются комментарии и пустые строки, упомянутые выше. Например, вы можете временно закомментировать патч, и <command role="hg-ext-mq">qpush</command> будет пропускать этот патч при применении исправлений. Также вы можете изменить последовательность применения патчей, изменяя их порядок в файле <filename role="special">series</filename>.</para>
+
+      <para id="x_636">Размещение файла <filename role="special">series</filename> под контролем версий также поддерживается. Это хорошая идея, чтобы поставить все патчи, которые к ней относятся, под контроль версий. Если вы создаете каталог с помощью опции <option role="hg-ext-mq-cmd-qinit-opt">-c</option> команды <command role="hg-ext-mq">qinit</command>, это будет сделано автоматически.</para>
+
+    </sect2>
+    <sect2>
+      <title>Файл <filename role="special">status</filename>.</title>
+
+      <para id="x_637">Файл <filename role="special">status</filename> содержит имена и хеши ревизий всех патчей, которые в настоящее время могут быть применены MQ. В отличие от файла <filename role="special">series</filename>, этот файл не предназначен для редактирования. Вы не должны помещать этот файл под контроль версий, или изменять его в любом случае. Он используется MQ строго для внутреннего учета.</para>
+
+    </sect2>
+  </sect1>
+</appendix>
+
+<!--
+local variables: 
+sgml-parent-document: ("00book.xml" "book" "appendix")
+end:
+-->

File ru/appC-srcinstall.xml

+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+
+<appendix id="chap:srcinstall">
+  <?dbhtml filename="installing-mercurial-from-source.html"?>
+  <title>Установка Mercurial из исходников</title>
+
+  <sect1 id="sec:srcinstall:unixlike">
+    <title>На Unix-подобных системах</title>
+
+    <para id="x_5e0">Если вы используете Unix-подобную операционную систему, которая имеет достаточно свежую версию python (версии 2.3 или более поздней), установка Mercurial из исходных текстов проста.</para>
+    <orderedlist>
+      <listitem><para id="x_5e1">Скачайте последний архив исходников из <ulink url="http://www.selenic.com/mercurial/download">http://www.selenic.com/mercurial/download</ulink>.</para>
+      </listitem>
+      <listitem><para id="x_5e2">Распакуйте архив исходников:</para>
+	<programlisting>gzip -dc mercurial-MYVERSION.tar.gz | tar xf -</programlisting>
+      </listitem>
+      <listitem><para id="x_5e3">Зайдите в директорию с исходными текстами и запустите скрипт установки. Он соберёт Mercurial и установит его в вашем домашнем каталоге.</para>
+	<programlisting>cd mercurial-MYVERSION
+python setup.py install --force --home=$HOME</programlisting>
+      </listitem>
+    </orderedlist>
+    <para id="x_5e4">После завершения установки Mercurial будет в подкаталоге <literal>bin</literal> домашнего каталога. Не забудьте убедиться, что эта директория находится на пути поиска вашей оболочки.</para>
+
+    <para id="x_5e5">Вам, вероятно, необходимо будет установить переменную окружения <envar>PYTHONPATH</envar> так чтобы Mercurial при запуске мог найти остальные пакеты Mercurial. Например, на моем ноутбуке, я установил ее в <literal>/home/bos/lib/python</literal>. Точный путь, который вам нужно использовать, зависит от того, как Python был собран для вашей системы, но должен легко выяснятся. Если вы не уверены, посмотрите вывод скрипта установки и увидите, куда был установлен <literal>mercurial</literal>.</para>
+
+  </sect1>
+  <sect1>
+    <title>На Windows</title>
+
+    <para id="x_5e6">Сборка и установка Mercurial на Windows требует разнообразных инструментов, достаточного количества технических знаний и значительного терпения. Я очень <emphasis>не рекомендую</emphasis> этот путь, если вы <quote>обычный пользователь</quote>. Если вы не собираетесь взломать Mercurial, я настоятельно рекомендую использовать бинарный пакет.</para>
+
+    <para id="x_5e7">Если вы намерены собирать Mercurial из исходников под Windows, используйте <quote>трудный путь</quote> описаный на вики Mercurial <ulink url="http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall">http://www.selenic.com/mercurial/wiki/index.cgi/WindowsInstall</ulink>, и имейте ввиду, что этот процесс утомителен.</para>
+
+  </sect1>
+</appendix>
+
+<!--
+local variables: 
+sgml-parent-document: ("00book.xml" "book" "appendix")
+end:
+-->

File ru/appD-license.xml

+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+
+<appendix id="cha:opl">
+  <?dbhtml filename="open-publication-license.html"?>
+  <title>Open Publication License</title>
+
+  <para id="x_638">Версия 1.0, 8 Июня 1999</para>
+
+  <sect1>
+    <title>Требования в обоих немодифицированной и модифицированной версии</title>
+
+    <para id="x_639">Открытые публикации могут воспроизводиться и распространяться целиком или частично на любом физическом или электронном носителе при условии точного соблюдения условий настоящей лицензии, и при включении полного текста настоящей лицензии или ссылки на неё (с любыми допустимыми дополнительными ограничениями, наложенными автором(ами) и/или издателем).</para>
+
+    <para id="x_63a">Ссылка должна быть приведена в следующем форме</para>
+
+    <blockquote>
+      <para id="x_63b">Copyright (c) <emphasis>год</emphasis> by имя <emphasis>автора или разработчика</emphasis>. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v<emphasis>X.Y</emphasis> or later (the latest version is presently available at <ulink url="http://www.opencontent.org/openpub/">http://www.opencontent.org/openpub/</ulink>).</para>
+    </blockquote>
+
+    <para id="x_63c">Непосредственно после ссылки должны быть приведены дополнительные ограничения, наложенные автором(ами) и/или издателем документа (см. раздел <xref linkend="sec:opl:options"/>).</para>
+
+    <para id="x_63d">Допускается коммерческое распространение материалов, распространяющихся на условии Лицензии открытых публикаций.</para>
+
+    <para id="x_63e">Любая публикация в форме обычной (бумажной) книги требует указания первых издателя и автора. Имена издателя и автора должны присутствовать на всех внешних поверхностях книги. На всех внешних поверхностях книги имя первого издателя должно быть набрано шрифтом не меньшего размера, чем шрифт, которым набран заголовок произведения, и должно быть согласовано с заголовком произведения в притяжательном падеже.</para>
+
+  </sect1>
+  <sect1>
+    <title>Исключительное авторское право</title>
+
+    <para id="x_63f">Исключительное авторское право на любую открытую публикацию принадлежит её автору(ам) или разработчику(ам).</para>
+
+  </sect1>
+  <sect1>
+    <title>Отношения, регулируемые лицензией</title>
+
+    <para id="x_640">Следующие условия лицензии применяются ко всем произведениям, распространяющимся на условиях настоящей лицензии, если иное не оговорено в документе явно.</para>
+
+    <para id="x_641">Объединение произведения, распространяющегося на условиях настоящей лицензии, или части такого произведения, с другими произведениями (в т.ч. программами) на одном носителе само по себе не приводит к применению условий лицензии к таким произведениям. Результат объединения должен содержать уведомление, указывающее на присутствие материалов, распространяющихся на условиях Лицензии открытых публикаций, и соответствующее уведомление об авторских правах.</para>
+
+    <para id="x_642"><emphasis role="bold">Частичное действие</emphasis>. Если какая-либо часть настоящей лицензии в каком-либо правовом пространстве признаётся не имеющей юридической силы, все остальные части лицензии по-прежнему сохраняют силу.</para>
+
+    <para id="x_643"><emphasis role="bold">Отсутствие гарантий</emphasis>. Открытые публикации лицензируются и распространяются <quote>как есть</quote>, без каких-либо гарантий, явных или подразумеваемых, включая, но не ограничиваясь ими, подразумеваемые гарантии коммерческого успеха и пригодности в конкретных целях или гарантии отсутствия нарушений законодательства.</para>
+
+  </sect1>
+  <sect1>
+    <title>Требования к модифицированным копиям</title>
+
+    <para id="x_644">Все модифицированные версии документов, распространяющихся на условиях настоящей лицензии, включая переводы, антологии, компиляции и фрагменты документов, должны соответствовать следующим требованиям:</para>
+
+    <orderedlist>
+      <listitem><para id="x_645">Модифицированная версия должна быть явно обозначена как модифицированная.</para>
+      </listitem>
+      <listitem><para id="x_646">Лицо, произведшее модификацию, должно быть однозначно указано, модификация датирована.</para>
+      </listitem>
+      <listitem><para id="x_647">Если это возможно, должны быть сохранены ссылки на первых автора и издателя в соответствии с общепринятой в научной среде практикой цитирования.</para>
+      </listitem>
+      <listitem><para id="x_648">Должно быть указано расположение оригинального не модифицированного документа.</para>
+      </listitem>
+      <listitem><para id="x_649">Имя (имена) первого автора(ов) произведения не может использоваться в качестве подтверждения принадлежности первому автору данной редакции произведения без его (их) явного разрешения.</para>
+      </listitem></orderedlist>
+
+  </sect1>
+  <sect1>
+    <title>Рекомендации</title>
+
+    <para id="x_64a">Помимо обязательных требований, настоящая лицензия содержит просьбу и настоятельную рекомендацию к лицам, распространяющим произведения на её условиях:</para>
+
+    <orderedlist>
+      <listitem><para id="x_64b">Если вы распространяете открытые публикации на физическом носителе или компакт-диске, отправьте уведомление о вашем намерении авторам по крайней мере за 30 дней до передачи в тираж, чтобы они могли предоставить вам обновлённую версию публикации. В такое уведомление следует включить также описание модификаций, сделанных в документе, если таковые есть.</para>
+      </listitem>
+      <listitem><para id="x_64c">Все существенные модификации документа (включая удаление его части) должны быть либо явно отмечены в его тексте, либо описаны в приложении к документу.</para>
+      </listitem>
+      <listitem><para id="x_64d">Наконец, хотя лицензия и не обязывает вас делать это, хорошим тоном считается предоставить бесплатный авторский экземпляр произведения на физическом носителе или компакт-диске его автору(ам).</para>
+      </listitem></orderedlist>
+
+  </sect1>
+  <sect1 id="sec:opl:options">
+    <title>Дополнительные ограничения</title>
+
+    <para id="x_64e">Авторы(ы) и/или издатель произведения, распространяющегося на условиях Лицензии открытых публикаций, могут наложить некоторые дополнительные ограничения на условия их распространения, добавив соответствующее требование к ссылке на лицензию или её копии. Эти ограничения рассматриваются как часть текста лицензии и должны быть включены в любые производные произведения вместе с текстом лицензии (или ссылкой на неё).</para>
+
+    <orderedlist>
+      <listitem><para id="x_64f">Запрещение распространение существенно модифицированных версий без явного разрешения автора(ов). <quote>Существенно модифицированными</quote> признаются изменения смыслового содержания документа и не признаются изменения форматирования текста или типографская корректура.</para>
+      </listitem>
+      <listitem><para id="x_650">Для наложения этого ограничения добавьте к ссылке на лицензию или её копии предложение <quote>Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder</quote>.</para>
+      </listitem>
+      <listitem><para id="x_651">Запрещение публикации оригинального или производного произведения целиком или частично в форме обычной (бумажной) книги в коммерческих целях без предварительного разрешения правообладателя.</para>
+      </listitem>
+      <listitem><para id="x_652">Для наложения этого ограничения добавьте к ссылке на лицензию или её копии предложение <quote>Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.</quote>.</para>
+      </listitem></orderedlist>
+
+  </sect1>
+</appendix>
+
+<!--
+local variables: 
+sgml-parent-document: ("00book.xml" "book" "appendix")
+end:
+-->

File ru/autoid.py

+#!/usr/bin/env python
+#
+# Add unique ID attributes to para tags.  This script should only be
+# run by one person, since otherwise it introduces the possibility of
+# chaotic conflicts among tags.
+
+import glob, os, re, sys
+
+tagged = re.compile('<para[^>]* id="x_([0-9a-f]+)"[^>]*>', re.M)
+untagged = re.compile('<para>')
+
+names = glob.glob('ch*.xml') + glob.glob('app*.xml')
+
+# First pass: find the highest-numbered paragraph ID.
+
+biggest_id = 0
+seen = set()
+errs = 0
+
+for name in names:
+    for m in tagged.finditer(open(name).read()):
+        i = int(m.group(1),16)
+        if i in seen:
+            print >> sys.stderr, '%s: duplication of ID %s' % (name, i)
+            errs += 1
+        seen.add(i)
+        if i > biggest_id:
+            biggest_id = i
+
+def retag(s):
+    global biggest_id
+    biggest_id += 1
+    return '<para id="x_%x">' % biggest_id
+
+# Second pass: add IDs to paragraphs that currently lack them.
+
+for name in names:
+    f = open(name).read()
+    f1 = untagged.sub(retag, f)
+    if f1 != f:
+        tmpname = name + '.tmp'
+        fp = open(tmpname, 'w')
+        fp.write(f1)
+        fp.close()
+        os.rename(tmpname, name)
+
+sys.exit(errs)

File ru/book-shortcuts.xml

+<!-- Please keep the contents of this file sorted. -->
+
+<!ENTITY emdash "&#8212;">

File ru/ch00-preface.xml

+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+
+<preface id="chap:preface">
+  <?dbhtml filename="preface.html"?>
+  <title>Предисловие</title>
+
+  <sect1>
+    <title>Технические детали</title>
+
+    <para id="x_72e">Несколько лет назад, когда я хотел объяснить человеку, почему распределенное управление версиями важно, тема была настолько новая, что почти не было литературы, которую можно было бы порекомендовать.</para>
+
+    <para id="x_72f">Хотя тогда я работал над самим Mercurial, я решил переключиться на написание этой книги, потому как считал, что это самый эффективный способ помочь новому программному обеспечению покорить широкую аудиторию. Также это отличный способ донести идею о том, что управление версиями по своей природе должно быть распределенным. Я опубликовал книгу в Сети под свободной лицензией по той же причине: чтобы ввести в курс дела всех желающих.</para>
+
+    <para id="x_730">Я создавал это руководство в привычном ключе хорошей книги о программном обеспечении, которая рассказывает: <quote>Что это такое?</quote>, <quote>Почему это важно?</quote>, <quote>Как это поможет мне?</quote> и <quote>Как это использовать?</quote>. В этой книге я пытаюсь ответить на эти вопросы как для систем распределённого контроля версий в целом, так и для Mercurial в частности.</para>
+  </sect1>
+    
+  <sect1>
+    <title>Спасибо за поддержку Mercurial</title>
+
+    <para id="x_731">Приобретая экземпляр этой книги, вы поддерживаете постоянное развитие и свободность Mercurial в частности, а также свободного программного обеспечения с открытым исходным кодом в целом. Я и O'Reilly Media безвозмездно передаём мои гонорары от продажи этой книги в Software Freedom Conservancy (<ulink url="http://www.softwarefreedom.org/">http://www.softwarefreedom.org/</ulink>), которая предоставляет административную и юридическую поддержку Mercurial, а также ряд других заметных и значимых открытых проектов свободного программного обеспечения.</para>
+  </sect1>
+
+  <sect1>
+    <title>Благодарности</title>
+
+    <para id="x_732">Этой книги не существовало бы, если бы не помощь Мэтта Мэккалла, автора и руководителя проекта Mercurial. Также мне компетентно помогали сотни добровольных участников из разных уголков мира.</para>
+
+    <para id="x_733">Спасибо моим детям, Чиан и Руари, всегда готовым помочь мне расслабиться и замечательно поиграть в детские игры. Я также хотел бы поблагодарить мою бывшую жену Шеннен за ее поддержку.</para>
+
+    <para id="x_734">Мои коллеги и друзья оказывали помощь и поддержку во многих отношениях. Этот список людей очень неполон: Стивен Ган, Керин Риттер, Бонни Корвин, Джеймс Василе, Мэтт Норвуд, Эбен Моглен, Брэдли Кан, Роберт Уолш, Джереми Фитцхардиндж, Рэйчел Челмерс.</para>
+
+    <para id="x_735">Я писал эту книгу открыто, размещая предварительные варианты глав на веб-сайте книги по мере их готовности. Читатели затем оставляли комментарии, используя разработанный мной веб-интерфейс. К тому времени, как я закончил писать книгу, более 100 человек представили свои замечания — это огромное количество, особенно с учетом того, что система комментариев стала  работать всего за 2 месяца до окончания процесса написания книги.</para>
+
+    <para id="x_736">Особенно хотелось бы отметить следующих людей, которые обеспечили более трети от общего количества замечаний. Я хотел бы поблагодарить их за помощь и усилия в написании настолько подробных отзывов:</para>
+
+    <para id="x_737">Martin Geisler, Damien Cassou, Alexey Bakhirkin, Till Plewe, Dan Himes, Paul Sargent, Gokberk Hamurcu, Matthijs van der Vleuten, Michael Chermside, John Mulligan, Jordi Fita, Jon Parise.</para>
+
+    <para id="x_738">Я также хотел бы отметить помощь многих людей, которые замечали ошибки и давали полезные советы по содержанию всей книги:</para>
+
+    <para id="x_739">Jeremy W. Sherman, Brian Mearns, Vincent Furia, Iwan Luijks, Billy Edwards, Andreas Sliwka, Paweł Sołyga, Eric Hanchrow, Steve Nicolai, Michał Masłowski, Kevin Fitch, Johan Holmberg, Hal Wine, Volker Simonis, Thomas P Jakobsen, Ted Stresen-Reuter, Stephen Rasku, Raphael Das Gupta, Ned Batchelder, Lou Keeble, Li Linxiao, Kao Cardoso Félix, Joseph Wecker, Jon Prescot, Jon Maken, John Yeary, Jason Harris, Geoffrey Zheng, Fredrik Jonson, Ed Davies, David Zumbrunnen, David Mercer, David Cabana, Ben Karel, Alan Franzoni, Yousry Abdallah, Whitney Young, Vinay Sajip, Tom Towle, Tim Ottinger, Thomas Schraitle, Tero Saarni, Ted Mielczarek, Svetoslav Agafonkin, Shaun Rowland, Rocco Rutte, Polo-Francois Poli, Philip Jenvey, Petr Tesałék, Peter R. Annema, Paul Bonser, Olivier Scherler, Olivier Fournier, Nick Parker, Nick Fabry, Nicholas Guarracino, Mike Driscoll, Mike Coleman, Mietek Bák, Michael Maloney, László Nagy, Kent Johnson, Julio Nobrega, Jord Fita, Jonathan March, Jonas Nockert, Jim Tittsler, Jeduan Cornejo Legorreta, Jan Larres, James Murphy, Henri Wiechers, Hagen Möbius, Gábor Farkas, Fabien Engels, Evert Rol, Evan Willms, Eduardo Felipe Castegnaro, Dennis Decker Jensen, Deniz Dogan, David Smith, Daed Lee, Christine Slotty, Charles Merriam, Guillaume Catto, Brian Dorsey, Bob Nystrom, Benoit Boissinot, Avi Rosenschein, Andrew Watts, Andrew Donkin, Alexey Rodriguez, Ahmed Chaudhary.</para>
+  </sect1>
+
+  <sect1>
+    <title>Соглашения, принятые в этой книге</title>
+
+    <para id="x_73a">В книге используются следующие соглашения:</para>
+
+    <variablelist>
+      <varlistentry>
+        <term><emphasis>Курсив</emphasis></term>
+
+        <listitem>
+          <para id="x_73b">Указывает на новые термины, URL ресурсы, адреса электронной почты, имена файлов и файловых расширений.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><literal>Моноширинный шрифт</literal></term>
+
+        <listitem>
+          <para id="x_73c">Используется для листингов программ, а также внутри текста, ссылающегося на элементы программы, такие, как, например, переменные или имена функций, базы данных, типы данных, переменные окружения, операторы и ключевые слова.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><userinput>Моноширинный полужирный шрифт</userinput></term>
+
+        <listitem>
+          <para id="x_73d">Указывает на команды или другой текст, которые пользователю при наборе следует в точности скопировать с оригинала.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><replaceable>Моноширинный шрифт с курсивом</replaceable></term>
+
+        <listitem>
+          <para id="x_73e">Указывает на текст, который должен быть заменен на пользовательские значения или значения, определяемые по контексту.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+
+    <tip>
+      <para id="x_73f">Этот значок означает подсказку, замечание или общую заметку.</para>
+    </tip>
+
+    <caution>
+      <para id="x_740">Этот значок означает предупреждение или предостережение.</para>
+    </caution>
+  </sect1>
+
+  <sect1>
+    <title>Использование примеров кода</title>
+
+    <para id="x_741">Эта книга сделана, чтобы помочь вам делать свою работу. В целом, вы можете использовать код в этой книге в своих программах и документах. Вам не нужно обращаться к нам за разрешением, если вы не воспроизводите значительные части кода. Например, написание программы, которая использует несколько фрагментов кода из этой книги, не требует разрешения. Продажа или распространение примеров с CD-ROM, прилагающемуся к книге O’Reilly требует разрешения. Вы не должны спрашивать разрешения, если отвечаете на вопрос, приводя цитаты из книги или примеров кода. Включение значительного количества примеров кода из этой книги в документацию вашего продукта требует разрешения.</para>
+
+    <para id="x_742">Мы приветствуем, но не требуем ссылок на книгу. Ссылка на книгу обычно включает в себя название, автора, издателя, и ISBN. Например: “<emphasis>Book Title</emphasis> by Some Author. Copyright 2008 O’Reilly Media, Inc., 978-0-596-xxxx-x.”</para>
+
+    <para id="x_743">Если вы считаете, что использование вами примеров кода выходит за рамки разрешений, приведенных выше, не стесняйтесь обращаться к нам на <email>permissions@oreilly.com</email>.</para>
+  </sect1>
+
+  <sect1>
+    <title>Safari® Books Online</title>
+
+    <note role="safarienabled">
+      <para id="x_744">Когда вы видите значок Safari® Books Online на обложке вашей любимой технической книги, это означает, что книга доступна через O’Reilly Network Safari Bookshelf.</para>
+    </note>
+
+    <para id="x_745">Safari предлагает решение, которое лучше, чем просто электронные книги. Это виртуальная библиотека, которая позволяет вам легко производить поиск по тысячам популярных технических книг, копировать примеры кода, скачивать главы и быстро находить ответы когда вам нужна наиболее точная и актуальная информация. Попробуйте воспользоваться её возможностями бесплатно на <ulink role="orm:hideurl:ital" url="http://my.safaribooksonline.com/?portal=oreilly">http://my.safaribooksonline.com</ulink>.</para>
+  </sect1>
+
+  <sect1>
+    <title>Как с нами связаться</title>
+
+    <para id="x_746">С комментариями и вопросами по поводу этой книги обращайтесь к издателю:</para>
+
+    <simplelist type="vert">
+      <member>O’Reilly Media, Inc.</member>
+
+      <member>1005 Gravenstein Highway North</member>
+
+      <member>Sebastopol, CA 95472</member>
+
+      <member>800-998-9938 (in the United States or Canada)</member>
+
+      <member>707-829-0515 (international or local)</member>
+
+      <member>707 829-0104 (fax)</member>
+    </simplelist>
+
+    <para id="x_747">У нас есть веб-страница этой книги, где есть список опечаток, примеры и другая дополнительная информация. Вы можете получить доступ к этой странице по адресу:</para>
+
+    <simplelist type="vert">
+      <member><ulink url="http://www.oreilly.com/catalog/&lt;catalog
+	  page&gt;"></ulink></member>
+    </simplelist>
+
+    <remark>Don’t forget to update the &lt;url&gt; attribute,
+      too.</remark>
+
+    <para id="x_748">Чтобы прокомментировать или задать технические вопросы по этой книге, отправьте сообщение по электронной почте:</para>
+
+    <simplelist type="vert">
+      <member><email>bookquestions@oreilly.com</email></member>
+    </simplelist>
+
+    <para id="x_749">Для получения дополнительной информации о наших книгах, конференциях, Resource Centers и O’Reilly Network, посмотрите наш веб-сайт:</para>
+
+    <simplelist type="vert">
+      <member><ulink url="http://www.oreilly.com"></ulink></member>
+    </simplelist>
+  </sect1>
+</preface>
+
+<!--
+local variables: 
+sgml-parent-document: ("00book.xml" "book" "preface")
+end:
+-->

File ru/ch01-intro.xml

+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+
+<chapter id="chap:intro">
+  <?dbhtml filename="how-did-we-get-here.html"?>
+  <title>Как мы сюда попали?</title>
+
+  <sect1>
+    <title>Зачем нужен контроль версий? Почему Mercurial?</title>
+
+    <para id="x_6d">Контроль ревизии представляет собой процесс управления несколькими версиями информации. В своей простейшей форме, это то, что многие люди делают вручную: каждый раз, когда вы изменяете файл, сохраняя его под новым именем, которое содержит номер, каждый из которых выше, чем число предшествующей версии.</para>
+
+    <para id="x_6e">Ручное управление несколькими версиями для одного файла &emdash; задача с возможностью ошибок, хотя программные средства для автоматизации этого процесса давно уже доступны. Первые автоматизированные средства контроля версий были созданы, чтобы помочь одному человеку управлять версиями одного файла. За последние несколько десятилетий, количество инструментов контроля версий значительно увеличилось. Теперь они управляют версиями многих файлов, и помогают нескольким людям работать вместе. Благодаря лучшим современным средствам контроля версий тысячи людей могут работать над общими проектами, содержащими сотни тысяч файлов.</para>
+
+    <para id="x_6f">Распределенные системы контроля версий появились относительно недавно, однако, эта область быстро развивается благодаря тяге людей к исследованию нового.</para>
+
+    <para id="x_70">Я пишу книгу о распределенных системах контроля версий, потому что считаю, что это важная тема, которая заслуживает руководства. Я решил написать о Mercurial, потому что это простой инструмент, чтобы познакомится с этой областью, в то же время &emdash; это реальный инструмент, отработанный в сложных условиях, когда многие другие средства контроля версий ещё не проверены.</para>
+
+    <sect2>
+      <title>Зачем использовать систему контроля версий?</title>
+
+      <para id="x_71">Есть ряд причин, по которым вы или ваша команда может использоваться автоматизированную систему контроля версий для вашего проекта.</para>
+
+      <itemizedlist>
+	<listitem><para id="x_72">Она будет отслеживать историю и прогресс вашего проекта вместо вас. Для каждого изменения у вас будет запись о том, <emphasis>кто</emphasis> его сделал, <emphasis>почему</emphasis> он это сделал, <emphasis>когда</emphasis> он это сделал и <emphasis>в чем</emphasis>, собственно, заключалось изменение.</para></listitem>
+	<listitem><para id="x_73">Когда вы работаете с другими людьми, система контроля версий облегчает вам взаимодействие. Например, когда несколько человек делают потенциально конфликтные изменения одновременно, программа поможет вам определить и разрешить такие конфликты.</para></listitem>
+	<listitem><para id="x_74">Она может помочь вам восстановиться после ошибок. Если вы сделаете изменение, которое потом окажется ошибкой, вы сможете вернуться к более ранней версии одного или нескольких файлов. На самом деле, <emphasis>действительно</emphasis> хорошая система контроля версий даже поможет вам легко найти тот момент времени, когда проблема впервые появилась (см. <xref linkend="sec:undo:bisect"/>).</para></listitem>
+	<listitem><para id="x_75">Она поможет вам работать одновременно над несколькими версиями проекта и переключаться между ними.</para></listitem>
+      </itemizedlist>
+
+      <para id="x_76">Все эти причины одинаково важны (по крайней мере, в теории) независимо от того, работаете ли вы над проектом в одиночку или вместе с сотней других людей.</para>
+
+      <para id="x_77">Ключевой вопрос относительно практичности системы контроля версий в таких разных средах (<quote>хакер-одиночка</quote> и <quote>огромная команда</quote>) в том, как <emphasis>преимущества</emphasis> соотносятся с <quote>ценой</quote> использования. Система, которую сложно понять или использовать, обойдётся дорого.</para>
+
+      <para id="x_78">Проект для пятисот человек скорее всего развалится под собственным весом практически сразу, если в нём не используется система контроля версий и нет процесса разработки. В подобном случае даже говорить о цене использования контроля версий не имеет смысла, так как <emphasis>без</emphasis> неё провал практически неизбежен.</para>
+
+      <para id="x_79">С другой стороны, проект <quote>на коленке</quote> для программиста-одиночки может показаться неудачным примером для использования системы контроля версий, потому как цена её использования наверняка будет сравнима с общей стоимостью всего проекта. Верно?</para>
+
+      <para id="x_7a">Mercurial уникален тем, что поддерживает <emphasis>оба</emphasis> уровня разработки. Вы можете изучить основы всего за несколько минут и, благодаря минимальным накладным расходам, вы с лёгкостию сможете применять управление версиями к наималейшим из проектов. Его простота означает, что вам не придется удерживать в голове множество маловразумительных концепций или последовательностей команд вместо того, чтобы <emphasis>реально</emphasis> работать. В то же время, высокая производительность Mercurial и его распределённая природа позволит вам безболезненно увеличивать масштаб для управления большими проектами.</para>
+
+      <para id="x_7b">Ни одна система контроля версий не поможет спасти скверно управляемый проект, но хорошие инструменты могут оказать значительное влияние на удобство работы над проектом.</para>
+
+    </sect2>
+
+    <sect2>
+      <title>Множество названий для контроля версий</title>
+
+      <para id="x_7c">Системы контроля версий используются в различных областях, так что их называют разными именами и сокращениями. Вот некоторые из наиболее распространенных вариаций с которыми вы можете столкнуться:</para>
+      <itemizedlist>
+	<listitem><para id="x_7d">Контроль ревизий (RCS, Revision control system)</para></listitem>
+	<listitem><para id="x_7e">Конфигурационное управление (SCM, Software configuration management)</para></listitem>
+	<listitem><para id="x_7f">Управление исходным кодом (Source code management)</para></listitem>
+	<listitem><para id="x_80">Контроль исходного кода (Source code control)</para></listitem>
+	<listitem><para id="x_81">Контроль версий (VCS, Version control system)</para></listitem></itemizedlist>
+      <para id="x_82">Некоторые люди утверждают, что на самом деле у этих терминов разные значения, но на практике они настолько сильно пересекаются, что нет общепринятого или хотя бы полезного способа разделить их.</para>
+
+    </sect2>
+  </sect1>
+
+  <sect1>
+    <title>О примерах в этой книге</title>
+
+    <para id="x_84">В этой книге довольно необычные примеры. Каждый пример <quote>живой</quote> &emdash; фактически, это результат исполнения скрипта, который выполняет приведённые команды Mercurial. Каждый раз, когда книга собирается из исходников, все примеры автоматически исполняются и их текущие результаты сравниваются с ожидаемыми.</para>
+
+    <para id="x_85">Плюс такого подхода в том, что примеры всегда верны. Они описывают поведение в <emphasis>точности той</emphasis> версии Mercurial, которая указана в начале книги. Если я обновлю версию Mercurial, которую я описываю, и вывод какой-нибудь команды изменится &emdash; сборка книги не выполнится.</para>
+
+    <para id="x_86">У этого подхода есть маленький недостаток, заключающийся в том, что даты и время, которые вы видите в примерах, <quote>слишком близки</quote> друг к другу, чего бы не происходило, если бы те же самые команды вбивал человек. Там, где человек может набрать не больше одной команды за несколько секунд, с соответствующим образом разнесёнными <quote>отпечатками времени</quote> (timestamps), мои автоматизированные примеры исполняют много команд за одну секунду.</para>
+
+    <para id="x_87">Например, несколько последовательных коммитов в примере могут выглядеть исполненными в одну и ту же секунду. Вы можете это увидеть на примере использования команды <literal role="hg-ext">bisect</literal> в <xref linkend="sec:undo:bisect"/>.</para>
+
+    <para id="x_88">Так что когда вы читаете примеры, не придавайте слишком большого значения датам или времени, которые вы увидите в результатах исполнения команд. Однако, <emphasis>будьте</emphasis> уверены, что поведение команд, которое вы видите, в целом верно и воспроизводимо.</para>
+
+  </sect1>
+
+  <sect1>
+    <title>Тенденции в этой области</title>
+
+    <para id="x_89">За последние четыре десятилетия в разработке и в использовании систем контроля версий &emdash; пока люди осваивали возможности своих инструментов и сталкивались с их ограничениями &emdash; можно проследить следующую тенденцию.</para>
+
+    <para id="x_8a">Первое поколение начинало с управления одиночными файлами на индивидуальных компьютерах. Хотя эти инструменты имели большое преимущество над специализированным ручным управлением версиями, их блокирующая модель и зависимость от одного компьютера позволяли применять их лишь в тесных маленьких командах.</para>
+
+    <para id="x_8b">Второе поколение ослабило эти ограничения переходом на сетевые архитектуры и комплексное управление проектами. По мере роста проектов появлялись новые проблемы. Если клиенты нуждались в очень частом взаимодействии с серверами, масштабирование этих серверов становилось сложной задачей для больших проектов. Ненадёжное соединение с сетью могло вообще не давать удалённым пользователям общаться с сервером. Когда проекты с открытым кодом стали давать всем анонимный доступ только на чтение, люди, не имеющие достаточных прав для внесения изменений, обнаружили, что не могут использовать инструменты для взаимодействия с проектом естественным образом, так как не могут вносить свои правки.</para>
+
+    <para id="x_8c">Современное поколение инструментов контроля версий &emdash; по природе своей децентрализованное (peer-to-peer). Эти системы устранили зависимость от одного центрального сервера и позволили людям передавать данные контроля версий туда, где они действительно необходимы. Сотрудничество через Интернет, прежде ограниченное технологией, ныне стало вопросом выбора и согласия. Современные инструменты могут действовать и без сети, неограниченно и автономно, сетевое соединение требуется только при синхронизации изменений с другим репозиторием.</para>
+
+  </sect1>
+  <sect1>
+    <title>Некоторые из преимуществ распределенных систем контроля версий</title>
+
+    <para id="x_8d">Хотя инструменты распределённого контроля версий уже несколько лет так же надёжны и удобны, как и их аналоги предыдущего поколения, люди, использующие старые инструменты, ещё не осознали преимущества новых. Во многих отношениях распределённые инструменты блистают по сравнению с централизованными.</para>
+
+    <para id="x_8e">Для отдельного разработчика распределённые инструменты практически всегда намного быстрее централизованных. Этому есть простое объяснение: централизованная утилита для многих обыденных операций должна общаться по сети, поскольку большинство метаданных хранятся в единственном экземпляре на центральном сервере. Распределённый инструмент хранит все свои метаданные локально. При прочих равных условиях общение по сети увеличивает накладные расходы использования централизованного инструмента. Не недооценивайте значимость шустрого, быстро реагирующего инструмента: вам доведётся провести массу времени, взаимодействуя с системою контроля версий.</para>
+
+    <para id="x_8f">Распределённые инструменты безразличны к причудам вашей серверной инфраструктуры, опять же потому, что они создают дубликаты метаданных во множестве мест. Если вы используете централизованную систему, а ваш сервер воспламенится, то останется надеяться на то, что резервные копии надёжны, и что последнее создание их прошло успешно и не очень давно. С распределённым инструментом вам доступно множество резервных копий &emdash; на компьютере у каждого разработчика.</para>
+
+    <para id="x_90">Надёжность вашего сетевого соединения будет влиять на распределённые системы значительно меньше, чем на централизованные. А использовать централизованную утилиту без сетевого соединения у вас даже не получится, за исключением нескольких сильно ограниченных команд. С распределённой системой отключение сетевого соединения во время работы вообще может пройти незамеченным. Единственное, что будет невозможным &emdash; запросы к репозиториям на других компьютерах, что происходит не так уж и часто по сравнению с другими операциями. Если вы состоите в группе разработчиков, находящихся на большом расстоянии друг от друга, это может быть значимым.</para>
+
+    <sect2>
+      <title>Преимущества для проектов с открытым исходным кодом</title>
+
+      <para id="x_91">Если вы нашли открытый проект, над которым вам хотелось бы поработать, и проект использует распределённую систему контроля версий, вы находитесь на одной ступеньке с людьми, которые являются <quote>ядром</quote> проекта. Если они публикуют свои репозитории, вы можете незамедлительно копировать историю разработки, делать изменения и записывать их точно так же, как это делают полноправные участники проекта. Централизованную систему, напротив, придётся использовать в режиме <quote>только чтение</quote>, если только кто-нибудь не даст вам достаточно прав для фиксирования изменений на центральном сервере. До тех пор у вас не будет никакой возможности фиксировать изменения и они будут под риском искажения каждый раз при обновлении рабочей копии репозитория.</para>
+
+      <sect3>
+	<title>Ветвления &emdash; не проблема</title>
+
+	<para id="x_92">Есть мнение, что распределённые системы контроля версий добавляют риска проектам с открытым исходным кодом, поскольку делают простым <quote>ветвление</quote> разработки проекта. Это случается, когда существуют разногласия во взглядах или отношениях между группами разработчиков, которые ведут к принятию ими решения о невозможности работать вместе. Тогда каждая сторона берёт более или менее полную копию исходного кода проекта и идёт в своём собственном направлении.</para>
+
+	<para id="x_93">Иногда стороны решают объединиться и согласовать изменения. С централизованной системой процесс слияния изменений <emphasis>технически</emphasis> очень сложен и в основном должен быть произведён вручную. Вам придётся решать, чья история <quote>выиграет</quote>, и каким-то образом прививать изменения другой команды. Обычно при этом теряется история изменений одной или обеих сторон.</para>
+
+	<para id="x_94">Распределённые системы поступают с ветвлением очень просто &emdash; они объявляют его <emphasis>единственным</emphasis> путём развития проекта. Каждое изменение, которое вы делаете, потенциально является точкой ответвления. Силой такого подхода является то, что инструмент должен быть действительно хорош в <emphasis>объединении</emphasis> веток, потому что ветки крайне важны: они всё время создаются.</para>
+
+	<para id="x_95">Если каждый кусочек работы, делаемой всеми, всегда оформляется в терминах ответвления и слияния, тогда то, что мир открытого ПО называет <quote>ветвлением</quote>, становится <emphasis>исключительно</emphasis> социальной проблемой. Как бы то ни было, распределённые системы <emphasis>понижают</emphasis> вероятность ветвления:</para>
+	<itemizedlist>
+	  <listitem><para id="x_96">Они убирают социальное разделение, которое привнесли централизованные системы, между инсайдерами (теми, кто может вносить изменения) и аутсайдерами (теми, кто не может).</para></listitem>
+	  <listitem><para id="x_97">Они упрощают воссоединение после социального ветвления, так как с точки зрения контроля версий это ничем не отличается от обычного слияния.</para></listitem></itemizedlist>
+
+	<para id="x_98">Некоторые люди сопротивляются использованию распределённого контроля версий, потому что хотят сохранить за собой строгий контроль над своими проектами, и думают, что централизованные системы дадут им его. Тем не менее, если вы придерживаетесь таких убеждений, и при этом разрешаете публичный доступ к своему CVS/Subversion репозиторию, то знайте, что существует множество инструментов, позволяющих вытащить полную историю вашего проекта (пусть даже и медленно) и пересоздать её в таком месте, которое вы не сможете контролировать. Таким образом получается, что ваш контроль в этом случае иллюзорен, и в то же время вы потеряли возможность гибко сотрудничать с теми людьми, которые почувствовали себя вынужденными продублировать вашу историю или ответвиться от неё.</para>
+
+      </sect3>
+    </sect2>
+    <sect2>
+      <title>Преимущества для коммерческих проектов</title>
+
+      <para id="x_99">Команды многих коммерческих проектов зачастую разбросаны по всему земному шару. Территориально удалённые от главного сервера разработчики могут сталкиваться с такими проблемами, как замедленная реакция на выполнение команд и, возможно, перерывы в доступности системы. Коммерческие системы контроля версий предлагают решение данной проблемы в виде расширений для удалённой репликации данных. Такие расширения как правило довольно дороги и сложны для администрирования. Распределённые системы изначально лишены подобных недостатков. Более того, можно установить несколько проектных серверов, скажем один в каждом офисе, для сокращения объёма избыточного трафика между репозиториями через дорогие каналы связи.</para>
+
+      <para id="x_9a">Централизованные системы контроля версий как правило обладают ограниченной масштабируемостью. Падение дорогой централизованной системы под нагрузкой, вызванной одновременным обращением всего пары дюжин пользователей, не является чем-то необычным. Повторюсь, наиболее типичным решением проблемы будет дорогой и тяжелый механизм репликации. Так как нагрузка на главный сервер &emdash; даже если он единственный &emdash; для распределённого инструмента контроля версий во много раз меньше (потому что все данные реплицируются повсюду), один недорогой сервер может удовлетворять потребности гораздо более многочисленной команды разработчиков и для репликации с целью распределения нагрузки нужно лишь написать несложные скрипты.</para>
+
+      <para id="x_9b">Если некоторые члены вашей команды работают <quote>в поле</quote>, разрешая проблемы на площадке заказчика, они также получают определённые преимущества от использования распределённой системы контроля версий. Инструмент позволит им строить кастомные сборки, пробовать различные исправления изолированно друг от друга, а также проводить эффективный поиск причины ошибки в среде заказчика с использованием истории версий. Всё это может быть выполнено без необходимости в постоянном соединении с внутренней сетью компании.</para>
+
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>Почему следует остановить выбор на Mercurial?</title>
+
+    <para id="x_9c">Mercurial обладает уникальным набором свойств, позволяющим выбрать его в качестве наиболее подходящей системы контроля версий:</para>
+    <itemizedlist>
+      <listitem><para id="x_9d">Прост в изучении и использовании</para></listitem>
+      <listitem><para id="x_9e">Легковесный</para></listitem>
+      <listitem><para id="x_9f">Превосходно масштабируется</para></listitem>
+      <listitem><para id="x_a0">Легко настраивается под конкретные нужды</para></listitem></itemizedlist>
+
+    <para id="x_a1">Если вы обладаете опытом в использовании систем контроля версий, вам потребуется меньше пяти минут, чтобы начать работать с Mercurial. Если же вы новичок, процесс знакомства не должен занять больше десяти минут. Mercurial предоставляет единообразную и последовательную систему команд и функций, что позволяет руководствоваться небольшим набором общих правил вместо того, чтобы учить массу исключений.</para>
+
+    <para id="x_a2">В небольших проектах вы можете начать работу с Mercurial в считанные минуты. Создание новых веток и изменений, распространение изменений (как локально, так и по сети), операции с историей и статусом &emdash; всё это работает быстро. Mercurial старается быть незаметным и не путаться под вашими ногами, не требует от вас больших умственных усилий и совершает свои операции невероятно быстро.</para>
+
+    <para id="x_a3">Mercurial применяется не только в маленьких проектах, его используют и в проектах с сотнями и тысячами разработчиков, проектах, которые содержат десятки тысяч файлов и сотни мегабайт исходного кода.</para>
+
+    <para id="x_a4">Если вам не хватает базовой функциональности Mercurial, то её легко расширить. Mercurial хорошо подходит для задач скриптинга, его понятное устройство и реализация на языке Python позволяет легко добавлять новые возможности в виде расширений. Существует большое количество популярных и полезных расширений, охватывающих спектр задач от помощи в нахождении ошибок до улучшения производительности.</para>
+
+  </sect1>
+  <sect1>
+    <title>Сравнение Mercurial с другими системами контроля версий</title>
+
+    <para id="x_a5">Прежде чем вы продолжите чтение, вам следует уяснить, что этот раздел отражает мой опыт, интересы и (да, я осмелюсь сказать это) мои наклонности. Я использовал каждую из перечисленных ниже систем контроля версий в большинстве случаев в течение нескольких лет.</para>
+
+
+    <sect2>
+      <title>Subversion</title>
+
+      <para id="x_a6">Subversion &emdash; популярная система контроля версий, разработанная с целью заменить CVS. Subversion имеет централизованную клиент/серверную архитектуру.</para>
+
+      <para id="x_a7">Subversion и Mercurial имеют похожие команды для одних и тех же операций, так что если вы хорошо знаете одну из этих систем, вам легко будет научиться пользоваться другой. Обе системы портированы на все популярные операционные системы.</para>
+
+      <para id="x_a8">Subversion до версии 1.5 не имел нормальной поддержки слияния. На момент написания книги возможность отслеживания слияний являлась относительно новой, с присущими <ulink url="http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.finalword">сложностями и ошибками</ulink>.</para>
+
+      <para id="x_a9">В каждой операции, производительность которой я измерял, Mercurial обладает большей производительностью, чем Subversion. Скорость больше в 2-6 раз, когда речь идет о <emphasis>локальном</emphasis> репозитории Subversion 1.4.3 (самый быстрый метод доступа). При более реалистичном варианте использования &emdash; сетевой репозиторий, Subversion находится в существенно худшем положении. В силу того, что команды Subversion должны взаимодействовать с сервером и при этом Subversion не имеет полезных средств репликации, производительность сервера и пропускная способность сети становятся узкими местами даже для некрупных проектов.</para>
+
+      <para id="x_aa">Кроме того, Subversion требует дополнительное дисковое пространство для того, чтобы избежать сетевых запросов при выполнении некоторых операций: поиск модифицированных файлов (<literal>status</literal>) и отображение изменений (<literal>diff</literal>). В результате рабочая копия Subversion такого же размера (а то и больше) как репозиторий Mercurial и рабочий каталог вместе взятые, хотя репозиторий Mercurial содержит полную историю проекта.</para>
+
+      <para id="x_ab">Subversion имеет широкую поддержку инструментария сторонних производителей. В этом отношении у Mercurial сейчас существенное отставание. Хотя разрыв сокращается, и некоторые GUI-утилиты для Mercurial превосходят свои аналоги для Subversion. Как и Mercurial, Subversion располагает отличным руководством пользователя.</para>
+
+      <para id="x_ac">Из-за того, что Subversion не хранит историю изменений на клиенте, она хорошо подходит для управления проектами, содержащими большое количество двоичных файлов. Если вы внесете в несжимаемый десятимегабайтный файл 50 изменений, то дисковое пространство, использованное Subversion останется неизменным. Пространство, используемое любой из распределенных систем контроля версий, будет быстро увеличиваться пропорционально количеству изменений, потому что различия между правками большие.</para>
+
+      <para id="x_ad">Кроме того, обычно трудно, а чаще даже невозможно слить разные версии двоичного файла. Subversion позволяет пользователю заблокировать файл, в результате пользователь на время получает эксклюзивные права на внесение изменений в него. Это может быть значительным преимуществом для проекта, в котором широко используются двоичные файлы.</para>
+
+      <para id="x_ae">Mercurial может импортировать историю изменений из репозитория Subversion. Возможен и обратный процесс. Это делает возможным прощупать почву и использовать  Mercurial и Subversion одновременно, прежде чем решить, осуществлять переход или нет. Преобразование истории &emdash; пошаговый процесс, так что вы можете осуществить начальное преобразование, а потом вносить новые изменения.</para>
+
+
+    </sect2>
+    <sect2>
+      <title>Git</title>
+
+      <para id="x_af">Git &emdash; распределенная система контроля версий, которая была разработана для управления исходным кодом ядра Linux. Как и в случае с Mercurial, на начальный дизайн системы оказал влияние Monotone.</para>
+
+      <para id="x_b0">Git предоставляет большой список команд, число которых в версии 1.5.0 достигает 139 уникальных единиц. Он имеет репутацию инструмента, сложного для изучения. В сравнении с Git, Mercurial делает упор на простоту.</para>
+
+      <para id="x_b1">Что касается производительности &emdash; Git очень быстр. В некоторых случаях он быстрее, чем Mercurial (по крайней мере под Linux), а в других быстрее оказывается Mercurial. Однако под Windows как производительность, так и общий уровень поддержки, во время написания этой книги у Git гораздо хуже, чем у Mercurial.</para>
+
+      <para id="x_b2">В то время как репозиторий Mercurial не требует операций по техническому обслуживанию, репозиторий Git требует частых ручных <quote>перепаковок</quote> собственных метаданных. Если этого не делать, производительность начинает падать, наряду с увеличением объёма занимаемого дискового пространства. Дисковый массив сервера, содержащего несколько Git репозиториев, по отношению к которым не выполняется строгое правило частой <quote>перепаковки</quote>, рано или поздно забивается под завязку, в результате чего процесс ежедневного резервного копирования легко может занимать более 24 часов. Только что <quote>запакованный</quote> репозиторий Git занимает немного меньше места, чем репозиторий Mercurial, но объём не перепакованного репозитория будет на несколько порядков больше.</para>
+
+      <para id="x_b3">Ядро Git написано на языке С. Многие команды Git реализованы в виде Shell скриптов или скриптов на языке Perl и уровень качества данных скриптов сильно разнится. Я встречал несколько установок, в которых скрипты тупо продолжали выполнение, несмотря на наличие фатальных ошибок.</para>
+
+      <para id="x_b4">Mercurial предоставляет возможность импорта истории версий из репозитория Git.</para>
+
+
+    </sect2>
+    <sect2>
+      <title>CVS</title>
+
+      <para id="x_b5">CVS, наверное, самая широко распространённая система контроля версий в мире. Благодаря почтенному возрасту, а также бардаку, царящему внутри, он очень слабо поддерживается уже много лет.</para>
+
+      <para id="x_b6">CVS основан на централизованной, клиент-серверной архитектуре. Он не выполняет группировку файловых изменений в атомарные коммиты, тем самым позволяя людям легко <quote>сломать билд</quote>: один человек может успешно внести часть изменений в репозиторий, а затем оказаться заблокированным из-за необходимости выполнения слияния. Это приведёт к ситуации, когда остальные участники увидят только часть из тех изменений, которые они должны были увидеть. Данная особенность также влияет на то, как вы будете работать с историей изменений. Если вы хотите получить все изменения, которые один из членов команды внёс для решения определённой задачи, вам необходимо вручную исследовать описания и дату внесения изменений, произведённых для каждого затрагиваемого файла (если вы вообще знаете, какие файлы были затронуты).</para>
+
+      <para id="x_b7">CVS оперирует довольно запутанными понятиями веток и меток, которые я даже не буду пытаться описать в данной книге. Он не поддерживает переименование как файлов, так и папок, благодаря чему репозиторий может быть достаточно легко повреждён. Так как внутренние механизмы контроля целостности практически отсутствуют, зачастую даже невозможно точно утверждать, повреждён ли репозиторий, и если да, то каким образом. Таким образом я бы не стал рекомендовать CVS для использования в любом из существующих или новых проектов.</para>
+
+      <para id="x_b8">Mercurial предоставляет возможность импорта истории версий CVS. Тем не менее здесь есть несколько подводных камней, с которыми также сталкиваются любые другие инструменты иморта из CVS. Отсутствие атомарных изменений и версионирования иерархических данных файловой системы приводит к невозможности абсолютно точного реконструирования истории изменений CVS, поэтому в некоторых случаях используются допущения, а переименования обычно не отображаются. Так как множество задач по администрированию CVS должны выполняться вручную, что повышает риск ошибок, обычна ситуация, когда средство для импорта из CVS возвращает множество ошибок целостности репозитория (абсолютно нереальные даты изменения версий и файлы, которые остаются заблокированными на протяжении последнего десятка лет &emdash; это лишь пара из наименее интересных проблем, которые я могу вспомнить из собственного опыта).</para>
+
+      <para id="x_b9">Mercurial предоставляет возможность импорта истории версий из репозитория CVS.</para>
+
+
+    </sect2>
+    <sect2>
+      <title>Коммерческий инструментарий</title>
+
+      <para id="x_ba">Perforce основан на централизованной, клиент-серверной архитектуре, при этом данные не кэшируются на клиентской стороне. В отличие от современных средств контроля версий, Perforce требует от пользователя запуска специальной команды, информирующей сервер о каждом файле, который человек собирается редактировать.</para>
+
+      <para id="x_bb">Производительность Perforce вполне достаточна для небольших команд, но стремительно падает, если количество пользователей переваливает за пару дюжин. Умеренно большие установки Perforce требуют развёртывания прокси-серверов для распределения нагрузки, генерируемой пользователями.</para>
+
+
+    </sect2>
+    <sect2>
+      <title>Выбор системы контроля версий</title>
+
+      <para id="x_bc">За исключением CVS, все инструменты, перечисленные выше, имеют уникальные свойства, которые делают их подходящими для определённых стилей ведения проектов. Не существует инструмента, который мог бы быть использован в любой ситуации.</para>
+
+      <para id="x_bd">Например, Subversion является хорошим выбором для работы с часто изменяющимися бинарными файлами, благодаря его централизованной архитектуре и поддержке блокировок на уровне файлов.</para>
+
+      <para id="x_be">Лично меня в Mercurial привлекает простота, производительность и хорошая поддержка процесса слияния &emdash; этот превосходный набор служит мне уже несколько лет.</para>
+
+
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>Переход с других систем контроля версий на Mercurial</title>
+
+    <para id="x_bf">Mercurial поставляется с расширением под названием <literal role="hg-ext">convert</literal>, которое пошагово импортирует историю изменений из некоторых систем контроля версий. Под словом <quote>пошагово</quote> я подразумеваю, что вы за один раз можете сконвертировать историю проекта до определенной даты, а позже запустить преобразование еще раз для получения изменений, произошедших после первичной конвертации.</para>
+
+    <para id="x_c0">Поддерживаются преобразование из следующих систем контроля версий:</para>
+    <itemizedlist>
+      <listitem><para id="x_c1">Subversion</para></listitem>
+      <listitem><para id="x_c2">CVS</para></listitem>
+      <listitem><para id="x_c3">Git</para></listitem>
+      <listitem><para id="x_c4">Darcs</para></listitem></itemizedlist>
+
+    <para id="x_c5">Кроме того, <literal role="hg-ext">convert</literal> может экспортировать изменения из Mercurial в Subversion. Это позволяет использовать Subversion и Mercurial параллельно, без риска потери данных.</para>
+
+    <para id="x_c6">Команда <command role="hg-ext-convert">convert</command> проста в использовании. Просто укажите путь или URL исходного репозитория и имя целевого репозитория (необязательно), и она начнет работу. После первичного преобразования, запустите ту же самую команду для получения новых изменений.</para>
+  </sect1>
+
+  <sect1>
+    <title>Краткая история контроля версий</title>
+
+    <para id="x_c7">Самая известная из старых утилит контроля версий &emdash; SCCS (Source Code Control System, система контроля исходного кода), которую написал Марк Рочкайнд (Marc Rochkind) из Bell Labs, в начале 70-х. SCCS оперировала отдельными файлами и требовала, чтобы каждый человек, работающий над проектом, имел доступ к общему рабочему пространству, существовавшему в единственном экземпляре. Только один человек мог одновременно редактировать файл в один момент времени; конфликты доступа к файлам разрешались блокировками. Обычной ситуацией было забывание снятия блокировки после редактирования, что запрещало доступ к файлу другим людям без помощи администратора.</para>
+
+    <para id="x_c8">Вальтер Тичи (Walter Tichy) разработал свободную альтернативу SCCS в начале 1980-х; он назвал свою программу RCS (Revision Control System, система контроля ревизий). Подобно SCCS, RCS требовала от разработчиков как работы в едином разделяемом рабочем пространстве, так и блокировки файлов для предотвращения одновременного изменения файлов разными людьми.</para>
+
+    <para id="x_c9">Позднее, в 1980-х же годах, Дик Грюн (Dick Grune) использовал RCS как основу для набора shell-скриптов, изначально названных cmt, а позднее переименованных в CVS (Concurrent Versions System, система одновременных версий). Крупное нововведение CVS заключалось в том, что она позволяла разработчикам работать одновременно и, в некоторой степени, независимо в их личных рабочих пространствах. Этими-то пространствами и предотвратились постоянные наступания разработчиков друг другу на пятки, которое было обычным делом в SCCS и RCS. Каждый разработчик имел копию каждого файла проекта, разработчики могли модифицировать свои копии независимо. Им приходилось объединять собственные правки только перед отсылкою изменений в центральное хранилище.</para>
+
+    <para id="x_ca">Брайан Берлинер (Brian Berliner) взял первоначальные скрипты Грюна и переписал их на Си, выпустив в 1989 году код, который впоследствии развился в современную версию CVS. CVS в дальнейшем приобрела возможность работать по сети, обретя клиент-серверную архитектуру. Архитектура CVS является централизованной: только на сервере есть копия истории проекта. Клиентские рабочие копии содержали только экземпляры файлов последней версии и небольшие метаданные для определения местонахождения сервера. Система CVS достигла небывалого успеха: вероятно, она является самой широко используемой системой контроля версий в мире.</para>
+
+    <para id="x_cb">В начале 1990-х годов Sun Microsystems разработала раннюю распределённую систему контроля версий, называвшуюся TeamWare. Каждая рабочая копия TeamWare содержала полную копию истории изменений проекта. Понятие центрального репозитория в TeamWare отсутствовало как таковое. (Подобно CVS, использовавшей RCS для хранения истории, TeamWare использовала SCCS.)</para>
+
+    <para id="x_cc">Шли 1990-ые, росла осведомлённость о нескольких проблемах CVS. Система записывает одновременные изменения нескольких файлов раздельно, а не группирует их в одну логически атомарную операцию. Способ управления файловой иерархией не очень хорош: нетрудно устроить в репозитории беспорядок, переименовывая файлы и каталоги. Более того, исходные коды CVS непросто понимать и поддерживать, что сделало практически непреодолимым <quote>болевой порог</quote> исправления этих архитектурных проблем.</para>
+
+    <para id="x_cd">В 2001 году Джим Бланди (Jim Blandy) и Карл Фогель (Karl Fogel) &emdash; два разработчика, прежде работавшие над CVS &emdash; начали проект по её замене таким средством, которое имело бы архитектуру получше и код почище. Результат &emdash; Subversion &emdash; не отошёл от централизованной клиент-серверной модели CVS, но добавил атомарные коммиты нескольких файлов, лучшее управление пространствами имён и другие возможности, которые сделали Subversion более удобным средством работы, нежели CVS. Со времени выхода первой версии Subversion быстро обретал популярность.</para>
+
+    <para id="x_ce">Более или менее одновременно, Грейдон Хоар (Graydon Hoare) начал работать над амбициозной системой контроля версий, которую назвал Monotone. Эта система не только устраняет множество проблем внутреннего устройства CVS и имеет распределённую архитектуру, но и идёт далее нескольких прежних (и последующих) систем контроля версий в некоторых своих нововведениях. Monotone использует криптографические хеши в качестве идентификаторов и имеет неотъемлемое представление о <quote>доверии</quote> коду из различных источников.</para>
+
+    <para id="x_cf">Жизнь Mercurial началась в 2005 году. В то время как некоторые аспекты его архитектуры были созданы под влиянием Monotone, Mercurial сосредоточен на простоте использования, высокой производительности и масштабируемости до очень больших проектов.</para>
+  </sect1>
+</chapter>
+
+<!--
+local variables: 
+sgml-parent-document: ("00book.xml" "book" "chapter")
+end:
+-->

File ru/ch02-tour-basic.xml

+<!-- vim: set filetype=docbkxml shiftwidth=2 autoindent expandtab tw=77 : -->
+
+<chapter id="chap:tour-basic">
+  <?dbhtml filename="a-tour-of-mercurial-the-basics.html"?>
+  <title>Экскурсия по Mercurial: основы</title>
+
+  <sect1 id="sec:tour:install">
+    <title>Установка Mercurial на вашем компьютере</title>
+
+    <para id="x_1">Прекомпилированные пакеты Mercurial доступны для каждой популярной операционной системы. Это позволяет вам начать использование Mercurial на вашем компьютере немедленно.</para>
+
+    <sect2>
+      <title>Windows</title>
+
+      <para id="x_c">Лучшей версией Mercurial для windows является TortoiseHg, который можно найти на сайте <ulink url="http://tortoisehg.org">http://tortoisehg.org</ulink>. Этот пакет не имеет внешних зависимостей, он <quote>просто работает</quote>. Он позволяет использовать командную строку и графический пользовательский интерфейс.</para>
+
+    </sect2>
+
+    <sect2>
+      <title>Mac OS X</title>
+
+      <para id="x_a">Ли Канти публикует инсталлятор mercurial для mac os x на <ulink url="http://mercurial.berkwood.com">http://mercurial.berkwood.com</ulink>.</para>
+    </sect2>
+
+    <sect2>
+      <title>Linux</title>
+
+      <para id="x_2">В силу того, что каждый дистрибутив Linux использует свои собственные менеджеры пакетов, а также стратегии и темпы разработки, трудно дать подробную инструкции по установке Mercurial. Версия Mercurial, которую вы получите очень зависит от того, насколько активен тот, кто занимается созданием пакетов для вашего дистрибутива.</para>
+
+      <para id="x_3">Чтобы не усложнять процесс, я сфокусируюсь на установке Mercurial из командной строки в наиболее популярных дистрибутивах Linux. Большинство из них располагают менеждерами пакетов с графическим интерфейсом, что позволит вам установить Mercurial нажатием одной кнопки. Пакет для установки называется <literal>mercurial</literal>.</para>
+
+      <itemizedlist>
+	<listitem><para id="x_4">Ubuntu и Debian:</para>
+	  <programlisting>apt-get install mercurial</programlisting></listitem>
+	<listitem><para id="x_5">Fedora:</para>
+	  <programlisting>yum install mercurial</programlisting></listitem>
+	<listitem><para id="x_715">OpenSUSE:</para>
+	  <programlisting>zypper install mercurial</programlisting></listitem>
+	<listitem><para id="x_6">Gentoo:</para>
+	  <programlisting>emerge mercurial</programlisting></listitem>
+      </itemizedlist>
+
+    </sect2>
+    <sect2>
+      <title>Solaris</title>
+
+      <para id="x_9">SunFreeWare, на <ulink url="http://www.sunfreeware.com">http://www.sunfreeware.com</ulink> , предоставляет готовые пакеты Mercurial.</para>
+
+    </sect2>
+
+  </sect1>
+
+  <sect1>
+    <title>Начало работы</title>
+
+    <para id="x_e">Для начала выполним команду <command role="hg-cmd">hg version</command>, чтобы удостовериться, что Mercurial установлен правильно. Какая версия на самом деле &emdash; неважно, главное, что она вообще что-то выводит.</para>
+
+    &interaction.tour.version;
+
+    <sect2>
+      <title>Встроенная справка</title>
+
+      <para id="x_f">У Mercurial есть встроенная справка. Очень сложно переоценить ее наличие, особенно когда ваша работа остановилась из-за того, что вы не можете вспомнить как выполнить какую-то команду. Если Вы застопорились, просто выполните <command role="hg-cmd">hg help</command>, и на экран выведется краткий список команд с описанием назначения каждой из них. Если же вы еще и укажите конкретную команду (см. ниже), выведется подробная информация именно о ней.</para>
+
+	&interaction.tour.help;
+
+	<para id="x_10">Для большей детализации выполните <command role="hg-cmd">hg help <option role="hg-opt-global">-v</option></command>. Опция <option role="hg-opt-global">-v</option> - сокращение от <option role="hg-opt-global">--verbose</option>, заставит Mercurial выводить больше информации, чем обычно.</para>
+
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>Работа с репозиторием</title>
+
+    <para id="x_11">В Mercurial все происходит внутри <emphasis>репозитория</emphasis>. Репозиторий проекта содержит все файлы, которые <quote>относятся</quote> к проекту, а также историю изменений этих файлов.</para>
+
+    <para id="x_12">В репозитории нет никакой магии, это просто каталог в файловой системе, который Mercurial обрабатывает особым образом. Вы можете переименовать или удалить репозиторий в любое время через командную строку или вашим собственным файловым менеджером.</para>
+
+    <sect2>
+      <title>Создание локальной копии репозитория</title>
+
+      <para id="x_13"><emphasis>Копирование</emphasis> репозитория кое-чем отличается. Хотя вы можете скопировать репозиторий как обычный каталог, лучше использовать встроенную команду Mercurial. Она называется <command role="hg-cmd">hg clone</command>, потому что создает идентичную копию существующего репозитория.</para>
+
+      &interaction.tour.clone;
+
+      <para id="x_67c">Одно из преимуществ использования <command role="hg-cmd">hg clone</command> в том, что как мы видим выше, она позволяет клонировать репозитории по сети. Другим является то, что она запоминает, откуда мы его клонировали. Скоро мы убедимся, что это полезно, когда мы захотим принести новые изменения из другого репозитария.</para>
+
+      <para id="x_14">Если клонирование прошло успешно, то у вас должен появится каталог под названием <filename class="directory">hello</filename>. В нем должны быть какие-то файлы.</para>
+
+      &interaction.tour.ls;
+
+      <para id="x_15">У файлов в нашем репозитории то же самое содержимое и история, как и в исходном.</para>
+
+      <para id="x_16">Каждый репозиторий Mercurial полон, самодостаточнен и независим. Он содержит свою собственную копию файлов проекта и их историю. Склонированный репозиторий помнит, откуда он был склонирован, но не общается с тем репозиторием, да и ни с каким другим тоже, до тех пор пока вы ему не скажете.</para>
+
+      <para id="x_17">Это означает, что вы можете свободно экспериментировать с вашим репозиторием. Это безопасно, потому что ваш репозиторий &emdash; <quote>закрытая песочница</quote>, изменения в котором не повлияют ни на что, кроме него самого.</para>
+
+    </sect2>
+    <sect2>
+      <title>Что есть в репозитории?</title>
+
+      <para id="x_18">Когда мы более пристально присмотримся к репозиторию, мы увидим, что он содержит каталог под названием <filename class="directory">.hg</filename>. Это место, где Mercurial хранит все метаданные репозитория.</para>
+
+      &interaction.tour.ls-a;
+
+      <para id="x_19">Содержание каталога <filename class="directory">.hg</filename> и его подкаталогов является собственностью Mercurial. Со всеми остальными файлами и каталогами в репозитории мы можем делать что угодно.</para>
+
+      <para id="x_1a">Строго говоря, каталог <filename class="directory">.hg</filename> &emdash; это и есть <quote>настоящий</quote> репозиторий, а все остальные файлы и каталоги рядом с ним называются <emphasis>рабочим каталогом</emphasis>. Разницу запомнить довольно просто &emdash; <emphasis>репозиторий</emphasis> содержит всю <emphasis>историю</emphasis> вашего проекта, в то время как <emphasis>рабочий каталог</emphasis> содержит <emphasis>слепок</emphasis> вашего проекта в определенной точке истории.</para>
+
+    </sect2>
+  </sect1>
+  <sect1>
+    <title>Путешествие по истории</title>
+
+    <para id="x_1b">Самое первое, что вы захотите сделать с новым, неизвестным репозиторием &emdash; изучить его историю. Команда <command role="hg-cmd">hg log</command> предназначена как раз для этого.</para>
+
+    &interaction.tour.log;
+
+    <para id="x_1c">По умолчанию, эта команда выводит краткую информацию о каждом изменении в проекте, которое было зафиксировано. В терминологии Mercurial мы называем эти зафиксированные события <emphasis>ревизией</emphasis> (<emphasis>changeset</emphasis>), потому что она может содержать изменения в различных файлах.</para>
+
+    <para id="x_1d"><command role="hg-cmd">hg log</command> выводит записи со следующими полями:</para>
+
+    <itemizedlist>
+      <listitem><para id="x_1e"><literal>changeset</literal> (ревизия). Она состоит из десятичного числа, двоеточия и строки шестнадцатеричных цифр. Это <emphasis>идентификаторы</emphasis> ревизии. Строка шестнадцатеричных цифр представляет собой уникальный идентификатор: та же строка шестнадцатеричных цифр будет обозначать этот набор изменений в каждой копии этого хранилища. Номер короче и проще напечатать, чем строку шестнадцатеричных цифр, но он не является уникальным: это же число в двух различных копиях репозитория могут иметь различные ревизии.</para>
+      </listitem>
+      <listitem><para id="x_1f"><literal>user</literal> (пользователь). Идентификатор человека, создавшего ревизию. Там может находится все, что угодно, но чаще это имя человека и адрес электронной почты.</para></listitem>
+      <listitem><para id="x_20"><literal>date</literal>. Дата и время, когда была создана ревизия, а также часовой пояс, в котором она была создана. (Дата и время приведены относительно этого часового пояса, они указывают сколько времени было для того, кто создал ревизию)</para></listitem>
+      <listitem><para id="x_21"><literal>summary</literal>. Первая строка комментария к ревизии, который оставил её автор.</para></listitem>
+      <listitem>
+	<para id="x_67d">Некоторые наборы изменений, таких, как первая, имеют поле <literal>tag</literal> (тэг). Теги это еще один способ идентифицировать набор изменений, придав ему легкое для запоминания имя. (Тег с названием <literal>tip</literal> специальный: он всегда относится к новейшему изменению в репозитарии.)</para>
+      </listitem>
+    </itemizedlist>
+
+    <para id="x_22">По умолчанию <command role="hg-cmd">hg log</command> выв