Восстановление истории в hg, когда движение не сделано должным образом - PullRequest
10 голосов
/ 19 октября 2011

Итак, кто-то из нашей команды переместил всю папку в подкаталог, не используя функцию переименования hg. Структура каталогов такая, какая нам нужна, но история исчезла до переезда. Это показывает, как новый файл, когда произошло перемещение. С тех пор произошло множество крупных слияний, и поэтому не очень практично возвращаться назад во времени и делать это правильно.

Я пробовал hg log --follow, и это не помогает, так как hg не знает о переименовании. Есть ли какой-нибудь способ вручную связать файлы со старыми удаленными версиями после свершившегося факта, или есть какое-то средство, например способ, которым git может определять ходы и переименования на основе хуеристики? Было бы неплохо, если бы был какой-то способ явно сказать: «Этот файл является продолжением этого старого удаленного файла», даже если для исправления ситуации все равно потребуется некоторое время.

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

Ответы [ 3 ]

13 голосов
/ 19 октября 2011

Вам необходимо правильно повторить перемещение, явно указав Mercurial, какие файлы были перемещены, а затем объедините поврежденные наборы изменений. Таким образом, вы восстановите путь истории к исходным файлам.

Шаги, предполагая, что <x> - это ревизия хода, а <y> - текущая ревизия головы.

  1. Обновление до ревизии перед переездом: hg update <x-1>
  2. Повторите ход, но теперь правильно, используя hg rename или hg rename --after
  3. Commit
  4. Объединить с первоначальной ревизией хода (hg merge <x>), в этом случае не должно быть конфликтов, но при отмене всех изменений.
  5. Commit
  6. Объединить с остальными наборами изменений после переезда (если есть) (hg merge <y>)
  7. Commit

Вот основной процесс, показанный в командной строке:

$ mkdir move-merge-test
$ cd move-merge-test
$ hg init
$ echo "x" > a
$ hg add a
$ hg commit -m "initial revision"

Двигаться неправильно:

$ mv a b
$ hg remove a
$ hg add b
$ hg status --copies
A b
R a
$ hg commit -m "incorrect move"
$ hg log --follow b
changeset:   1:b22f3e94133b
tag:         tip
user:        Laurens Holst <...>
date:        Wed Oct 19 14:41:37 2011 +0200
summary:     incorrect move

Исправьте ход:

$ hg update 0
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg rename a b
$ hg status --copies
A b
  a
R a
$ hg commit -m "correct move"
created new head
$ hg log --follow b
changeset:   2:5deabbcb5480
tag:         tip
parent:      0:b82f89f0c7d9
user:        Laurens Holst <...>
date:        Wed Oct 19 14:46:35 2011 +0200
summary:     correct move

changeset:   0:b82f89f0c7d9
user:        Laurens Holst <...>
date:        Wed Oct 19 14:36:35 2011 +0200
summary:     initial revision

Объединить его со сломанным ходом:

$ hg merge 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "merge with broken move"
$ hg log --follow b
changeset:   3:ce65fc7b35e4
tag:         tip
parent:      2:5deabbcb5480
parent:      1:b22f3e94133b
user:        Laurens Holst <...>
date:        Wed Oct 19 14:47:13 2011 +0200
summary:     merge broken branch

changeset:   2:5deabbcb5480
parent:      0:b82f89f0c7d9
user:        Laurens Holst <...>
date:        Wed Oct 19 14:46:35 2011 +0200
summary:     correct move

changeset:   1:b22f3e94133b
user:        Laurens Holst <...>
date:        Wed Oct 19 14:41:37 2011 +0200
summary:     incorrect move

changeset:   0:b82f89f0c7d9
user:        Laurens Holst <...>
date:        Wed Oct 19 14:36:35 2011 +0200
summary:     initial revision

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

3 голосов
/ 19 октября 2011

Мне повезло с такими вещами: я удалил новый («перемещенный») файл, затем вернулся к ревизии, когда файл все еще был на месте, выполнил перемещение правильно (включая фиксацию) и объединил два элемента.головы.

1 голос
/ 19 октября 2011

Существует опция --after для hg rename, которая позволяет сообщить Mercurial о переименовании после факта, но это необходимо сделать до совершения переименования.

Вы можете попробовать сделать hg convert в хранилище и указать параметр --filemap, который позволит вам переименовать файлы и каталоги.

https://www.mercurial -scm.org / вики / ConvertExtension # A - filemap

...