Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
hgbook.pdf
Скачиваний:
50
Добавлен:
17.03.2015
Размер:
3.15 Mб
Скачать

Управление изменениями

сMercurial Queues

игде она была исправлена. Вы можете использовать команду hg annotate чтобы посмотреть, какие ревизии или патчи изменили данную строку исходного файла. И так далее.

12.4. Понимание патчей

Потому что MQ не скрывает свой патч-ориентированный характер, было бы полезно, понять, что такое патчи, а также немного о том, какие инструменты работают с ними.

Традиционная команда unix diff сравнивает два файла и выводит список различий между ними. Команда patch понимает эти различия, как изменения которые нужно внести в файл. Посмотрите ниже на простом примере из этих команд в действии.

$ echo 'this is my original thought' > oldfile $ echo 'i have changed my mind' > newfile

$ diff -u oldfile newfile > tiny.patch $ cat tiny.patch

--- oldfile 2012-02-02 14:09:55.119150885 +0000

+++ newfile 2012-02-02 14:09:55.119150885 +0000 @@ -1 +1 @@

-this is my original thought +i have changed my mind

$ patch < tiny.patch patching file oldfile $ cat oldfile

i have changed my mind

Тип файла, который генерирует diff patch принимает в качестве входных данных), называется «patch» или «diff» нет никакой разницы между patch и diff. (Мы используем термин «patch», так как он чаще используется.)

Патч может начинаться с произвольного текста; команда patch игнорирует этот текст, но MQ использует его в качестве сообщения фиксации при создании ревизии. Чтобы найти начало содержания патча, patch ищет первую строку, которая начинается со строки «diff -».

MQ работает с унифицированным diff (patch может принять некоторые другие форматы просмотра, но MQ не умеет). Унифицированный формат содержит два вида заголовков. Заголовок файла описывает измененные файлы, он содержит имя файла для модификации. Когда patch видит новый заголовок файла, он ищет файл с таким именем, чтобы начать изменения.

После заголовка файла идет серия порций. Каждая порция начинается с заголовка, который определяет диапазон номеров строк в файле, которые изменяет данная порция. После заголовка, порция начинается и заканчивается через несколько (обычно три) не измененных строки текста из файла, которые называются контекстом для порции. Если имеется только небольшой разрыв между последовательными порциями, diff не печатает новый заголовок порции, он просто объединяет порции вместе, вставляя несколько строк из контекста между изменениями.

Каждая строка в контексте начинается с пробела. В порции строку, которая начинается с «-» означает «удалить эту строку», а строка, которая начинается с «+» означает «вставить эту строку» Например, изменившаяся строка представлена одним удалением и одной вставкой.

Мы вернемся к некоторым из наиболее тонких аспектов патчей позже (в разделе Раздел 12.6, «Более подробно о патчах»), но теперь вы должны иметь достаточно информации, для использования MQ прямо сейчас.

12.5. Начало работы с Mercurial Queues

Потому что MQ реализован в виде расширения, вы должны явно разрешить его, перед тем как использовать. (Вам не нужно ничего скачивать; MQ поставляется в стандартном пакете Mercurial.) Для того чтобы включить MQ, отредактируйте файл ~/.hgrc, и добавьте следующие строки.

[extensions] hgext.mq =

После включения расширения, будет доступен ряд новых команд. Чтобы убедиться, что расширение работает, вы можете использовать hg help для помощи по команде qinit.

141

Управление изменениями с Mercurial Queues

$ hg help qinit hg qinit [-c]

init a new queue repository (DEPRECATED)

The queue repository is unversioned by default. If -c/--create-repo is specified, qinit will create a separate nested repository for patches (qinit -c may also be run later to convert an unversioned patch repository into a versioned one). You can use qcommit to commit changes to this queue repository.

This command is deprecated. Without -c, it's implied by other relevant commands. With -c, use "hg init --mq" instead.

options:

-c --create-repo create queue repository

use "hg -v help qinit" to show more info

Вы можете использовать MQ с любым Mercurial репозиторием, и его команды работают только с тем, что находится в хранилище. Чтобы начать работу, просто подготовьте репозиторий используя команду qinit.

$ hg init mq-sandbox $ cd mq-sandbox

$ echo 'line 1' > file1

$ echo 'another line 1' > file2 $ hg add file1 file2

$ hg commit -m'first change' $ hg qinit

Эта команда создает пустую папку с именем .hg/patches, где MQ будет хранить свои метаданных. Как и во многих командах Mercurial, команда qinit ничего не печатает, если всё проходит успешно.

12.5.1. Создание нового патча

Чтобы начать работу над новым патчем, используйте команду qnew. Эта команда имеет один аргумент, имя patch- а для создания.

MQ будет использовать в качестве фактических имена файлов в директории .hg/patches, как вы можете увидеть ниже.

$ hg tip

 

changeset:

0:bf7787dcd87d

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Thu Feb 02 14:10:01 2012 +0000

summary:

first change

$ hg qnew first.patch

$ hg tip

 

changeset:

1:322557d9d523

tag:

first.patch

tag:

qbase

tag:

qtip

tag:

tip

user:

Bryan O'Sullivan <bos@serpentine.com>

date:

Thu Feb 02 14:10:01 2012 +0000

summary:

[mq]: first.patch

$ ls .hg/patches first.patch series status

Кроме того, сейчас в директории .hg/patches есть два файла, series и status. Файл series содержит список всех исправлений, которые знает MQ для этого репозитория, с одним патчем в каждой строке. Mercurial использует файл status для внутренней бухгалтерии; он отслеживает все патчи, которые MQ применил в этом репозитории.

142

Управление изменениями с Mercurial Queues

Примечание

Вам может иногда понадобиться изменить файл series вручную, например, чтобы изменить последовательность, в которой применяются некоторые патчи. Тем не менее, вручную редактировать файл status почти всегда плохая идея, так как легко повредить данные MQ о происходящем.

После того как вы создали свой новый патч, вы можете редактировать файлы в рабочем каталоге, как вы это обычно делаете. Все нормальные команды mercurial, такие как hg diff и hg annotate работают так же, как раньше.

12.5.2. Обновление патча

Когда вы достигаете точки, где вы хотите сохранить свою работу, используйте команду qrefresh для обновления патча с которым вы работаете.

$ echo 'line 2'

>> file1

 

 

$ hg diff

 

 

 

diff -r 322557d9d523 file1

 

 

--- a/file1 Thu

Feb 02 14:10:01

2012

+0000

+++ b/file1 Thu

Feb 02 14:10:02

2012

+0000

@@ -1,1

+1,2 @@

 

 

 

line 1

 

 

 

 

+line 2

 

 

 

 

$ hg qrefresh

 

 

 

$ hg diff

 

 

 

$ hg tip --style=compact --patch

 

 

1[first.patch,qbase,qtip,tip]

919b9524323d 2012-02-02 14:10 +0000 bos

[mq]: first.patch

 

 

diff -r bf7787dcd87d -r 919b9524323d file1

--- a/file1 Thu

Feb 02 14:10:01

2012

+0000

+++ b/file1 Thu

Feb 02 14:10:02

2012

+0000

@@ -1,1 +1,2 @@

 

 

 

line 1

 

 

 

 

+line 2

 

 

 

 

 

 

 

 

 

Эта команда помещает сделанные вами изменения в рабочем каталоге на ваш патч, и обновляет свою соответствующую ревизию которая содержит эти изменения.

Вы можете запускать qrefresh так часто, как вам нравится, так что это хороший способ сохранять «контрольные точки» вашей работы. Обновляйте патч в подходящее время, попробуйте экспериментировать, и если эксперимент не получится, hg revert откатит ваши изменения обратно до последнего обновления.

$ echo 'line 3' >> file1 $ hg status

M file1

$ hg qrefresh

$ hg tip --style=compact --patch

1[first.patch,qbase,qtip,tip] 52117437a1b0 2012-02-02 14:10 +0000 bos [mq]: first.patch

diff -r bf7787dcd87d -r 52117437a1b0 file1

--- a/file1 Thu Feb 02 14:10:01 2012 +0000

+++ b/file1 Thu Feb 02 14:10:02 2012 +0000 @@ -1,1 +1,3 @@

line 1 +line 2 +line 3

12.5.3. Укладка и отслеживания патчей

После того как вы закончили работу над патчем, или нужно работать с другим, вы можете использовать команду qnew еще раз для создания новых патчей. Mercurial сделает патч верхним из ваших существующих патчей.

$ hg qnew second.patch

143

 

Управление изменениями

 

 

 

 

с Mercurial Queues

 

 

$ hg log --style=compact --limit=2

 

 

 

2[qtip,second.patch,tip]

d535b10fd01c

2012-02-02 14:10 +0000

bos

[mq]: second.patch

 

 

 

 

1[first.patch,qbase] 52117437a1b0 2012-02-02 14:10 +0000

bos

 

[mq]: first.patch

 

 

 

 

$ echo 'line 4' >> file1

 

 

 

 

$ hg qrefresh

 

 

 

 

$ hg tip --style=compact --patch

 

 

 

2[qtip,second.patch,tip]

e933fc1784a2

2012-02-02 14:10 +0000

bos

[mq]: second.patch

 

 

 

 

diff -r 52117437a1b0 -r e933fc1784a2 file1

--- a/file1 Thu Feb 02 14:10:02 2012 +0000

+++ b/file1 Thu Feb 02 14:10:03 2012 +0000 @@ -1,3 +1,4 @@

line 1 line 2 line 3 +line 4

$ hg annotate file1

0:line 1

1:line 2

1:line 3

2:line 4

Обратите внимание, что патч содержит изменения в нашем предыдущем патче в качестве части своей контекста (вы можете увидеть это более четко в выводе hg annotate).

Пока, за исключением qnew и qrefresh, мы осторожно использовали только обычные команды Mercurial. Тем не менее, MQ предоставляет множество команд, которые проще использовать, когда вы думаете о патчах, как показано на рисунке ниже.

$ hg qseries first.patch second.patch $ hg qapplied first.patch second.patch

Команда qseries перечисляет все патчи, о которых знает MQ в этом репозитории, от старых к новым (созданным совсем недавно).

Команда qapplied перечисляет все исправления, которые MQ применил в этом репозитории, опять от старых к новым.

12.5.4. Манипуляция стеком патчей

Предыдущее обсуждение предполагает, что должна быть разница между «знанием» и «применением» патчей и она есть. MQ может управлять патчами применёнными без него к репозиторию.

Применять патч соответствующей ревизии в репозитории, и последствия патча и ревизия видны в рабочей директории. Вы можете отменить применение патча использованием команды qpop. MQ до сих пор знает о, или управляет, извлеченными патчами, но патч уже не имеет соответствующего набора изменений в репозитории, и рабочий каталог не содержит изменения сделанные патчем. Рисунок 12.1, «Применение и отмена патчей в стеке патчей MQ» иллюстрирует разницу между применёнными и отслеживаемыми патчами.

144

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]