Отмена случайного изменения hg в верхней части очереди Mercurial

Следующая последовательность команд требует, чтобы расширение Mercurial Queues было включено, а также расширение Evolve (для hg amend, псевдоним hg refresh).

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

Теоретически эту ошибку сделать довольно легко: просто введите hg ref вместо hg qref, но я сделал это недавно после нескольких лет использования Mercurial Queues. Несмотря на это, я не нашел чистого способа исправить это и вернуть исходное состояние.

Обратите внимание, что простой hg rollback работает в моем примере, но я не уверен, что он будет работать в моем случае, потому что я пробовал другие вещи, пытаясь это исправить. В любом случае, на hg rollback полагаться не стоит. Итак, как мне отменить hg amend и вернуть примененный патч MQ?

#!/bin/sh                                                                                                                                                                

hg init test
cd test
echo "This is foo" >> foo
hg add
hg ci -m "Add foo"
hg init --mq
echo "Line 2 of foo" >> foo
hg qnew p
hg ci --mq -m "Add patch p"
hg ref


hg log -vG --hidden
@  changeset:   2:f7f038d3aab5
|  tag:         tip
|  parent:      0:9d3a95922194
|  user:        Faheem Mitha <[email protected]>
|  date:        Sun Mar 11 16:38:51 2018 +0530
|  files:       foo
|  description:
|  [mq]: p
|
|
| x  changeset:   1:e467a2433c7f
|/   tag:         p
|    tag:         qbase
|    tag:         qtip
|    user:        Faheem Mitha <[email protected]>
|    date:        Sun Mar 11 16:38:50 2018 +0530
|    obsolete:    rewritten using amend as 2:f7f038d3aab5 by Faheem Mitha <[email protected]> (at 2018-03-11 16:38 +0530)
|    obsolete:    rewritten by Faheem Mitha <[email protected]> as f7f038d3aab5 (at 2018-03-11 16:38 +0530)
|    files:       foo
|    description:
|    [mq]: p
|
|
o  changeset:   0:9d3a95922194
   tag:         qparent
   user:        Faheem Mitha <[email protected]>
   date:        Sun Mar 11 16:38:50 2018 +0530
   files:       foo
   description:
   Add foo

person Faheem Mitha    schedule 11.03.2018    source источник


Ответы (1)


Это не то, что я получаю с вашим тестовым случаем. мне нужен дополнительный

echo "Line 3" >> foo

перед hg исх. Кроме того, версия вашего mq кажется здесь неуместной; Я думаю, вы можете удалить строки hg init --mq и hg ci --mq.

hg amend действительно должен заблокировать это. Но если вы хотите исправить ситуацию вручную, отредактируйте .hg/patches/series и замените устаревший хэш на хеш-преемник. (Просто убедитесь, что вы используете 20-байтовый хеш, например, hg log -T '{node}\n').

Предупреждение: когда я попробовал это с вашим тестовым случаем и qpopped, что-то таинственным образом вернуло старую головку в негодность, и выдается странное предупреждение о том, что текущий каталог не является головкой (несмотря на то, что hg log -r 'head()' перечисляет его). Но, по крайней мере, у вас есть ваша очередь обратно в рабочее состояние.

person sfink    schedule 14.03.2018
comment
Спасибо за ответ. Некоторые комментарии... Во-первых, я не понимаю, зачем вам нужна дополнительная строка в foo. Вы можете перепроверить это? - person Faheem Mitha; 15.03.2018
comment
потому что если я этого не сделаю, то hg refresh просто скажет, что ничего не изменилось (правильно). - person sfink; 16.03.2018
comment
Если быть точным, мой репродукционный случай hg init test; cd test; echo line1 > foo; hg add foo; hg commit -m init; echo line2 >> foo; hg qnew mypatch; echo line3 >> foo; hg amend; hg qpop - person sfink; 16.03.2018
comment
(и соответствующим исправлением будет замена последней строки .hg/patches/status выводом hg log -r . -T '{node}:mypatch\n') - person sfink; 16.03.2018