Сращивание по разрывам на временной шкале хранилища Mercurial - PullRequest
7 голосов
/ 01 марта 2011

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

Я реорганизовал репозиторий Subversion дважды в началедни проекта: сначала преобразовать один корневой каталог проекта в макет ствола / ветвей / тегов, а затем добавить второй связанный проект во вторую корневую папку со своими собственными стволом / ветками / тегами.

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

Теперь я понимаю, что у меня есть две дополнительные головки, каждая из которых соответствует местуистория изменений по существу начинается заново:

r0 ... r16 | (r17) r18 ... r61 | (r62) r63 ... tip

Результаты двух ревизий после перерывов, r17 и r62, идентичны по содержанию соответствующей ревизии до перерывов - они полностью состоят из операций добавления файлов сточно такое же содержание, как и в предыдущих ревизиях.Значимые изменения начинаются только в следующих ревизиях (r18 и r63 соответственно).

Я перепутал расширение Mercurial Transplant в попытке объединить r17 и r62, но он объединяет объединенные наборы изменений всеНа кончике ветки по умолчанию (r405 на данный момент).

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

Может кто-нибудь дать какой-нибудь совет, как подойти к этому?Я просто получаю неправильные флаги команд или использую не тот инструмент?Должен ли я использовать вместо этого расширение Rebase?Как насчет какого-либо процесса dump-edit dumpfile-reload, который мы все делали с Subversion?

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

1 Ответ

5 голосов
/ 21 марта 2011

Команды расширения rebase и collapse должны помочь.Рассмотрим следующий небольшой репозиторий в качестве примера:

$ hg glog -p

o  changeset:   3:bc701d12d956
|  tag:         tip
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello world
|  +hello big world
|
o  changeset:   2:2bb8c95d978e
   parent:      -1:000000000000
   summary:     history breaking svn reorganization

   diff --git a/file b/file
   new file mode 100644
   --- /dev/null
   +++ b/file
   @@ -0,0 +1,1 @@
   +hello world

@  changeset:   1:b578b2ec776b
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello
|  +hello world
|
o  changeset:   0:c3d20f0b7072
   summary:     initial

   diff --git a/file b/file
   new file mode 100644
   --- /dev/null
   +++ b/file
   @@ -0,0 +1,1 @@
   +hello

Он в основном напоминает вашу ситуацию, то есть есть две несвязанные строки истории, где первая редакция второй строки (r2) представляет собой простое дополнение всегоприсутствует в последней ревизии первой строки (r1).

Вы можете поместить вторую строку на первую с помощью rebase:

$ hg rebase -s 2 -d 1
$ hg glog

@  changeset:   3:020d1b20caa8
|  summary:     hack
|
o  changeset:   2:2a44eb4b74c3
|  summary:     history breaking svn reorganization (empty changeset now)
|
o  changeset:   1:b578b2ec776b
|  summary:     hack
|
o  changeset:   0:c3d20f0b7072
   summary:     initial

AsВы видите, две линии были объединены.Редакция 2 теперь является устаревшим пустым набором изменений.Вы можете избавиться от него, используя команду collapse, чтобы объединить ревизии 1 и 2:

$ hg collapse -r 1:2
<edit commit message>
$ hg glog -p

@  changeset:   2:d283fe96a5e6
|  tag:         tip
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello world
|  +hello big world
|
o  changeset:   1:c486d8191bf0
|  summary:     hack
|
|  diff --git a/file b/file
|  --- a/file
|  +++ b/file
|  @@ -1,1 +1,1 @@
|  -hello
|  +hello world
|
o  changeset:   0:c3d20f0b7072
   summary:     initial

   diff --git a/file b/file
   new file mode 100644
   --- /dev/null
   +++ b/file
   @@ -0,0 +1,1 @@
   +hello

Теперь несвязанные строки истории объединяются осмысленным образом.

...