Mercurial: каковы последствия смены фазы?

В Mercurial фаза ревизии может быть изменена произвольно. Каковы последствия изменения фазы для всех возможных переходов (общедоступный, черновой, секретный) x (общедоступный, черновой, секретный)? Какие фазовые переходы безопасны? Что может вызвать проблемы и какие проблемы? Какие из них более или менее бесполезна?


person mstrap    schedule 25.10.2012    source источник


Ответы (2)


Фаза фиксации по умолчанию — draft, так они обрабатывались, когда фаз не существовало. При нажатии набора изменений draft mercurial автоматически меняет свою фазу на public. Вы можете использовать его, чтобы узнать, какие наборы изменений вы уже опубликовали, а какие нет.

Но реальная проблема заключается в том, что когда набор изменений находится в фазе public, mercurial не позволит вам изменить их с помощью расширений редактирования истории (таких как mq, rebase и т. д.). Это действительно важно, потому что редактирование истории происходит только в локальном репозитории, они не распространяются с помощью pull/push операций. Итак, когда набор изменений опубликован, он выходит из-под контроля, его опасно менять.

Вы можете перейти из любой фазы в любую другую фазу. «Нормальный поток» заключается в переходе на более высокую фазу (секрет-> черновик-> общедоступная), но Mercurial позволяет перейти на более низкую фазу с помощью опции --force. Само по себе изменение фазы безвредно. Например, единственное, что происходит при переходе с public на draft или secret, это то, что сбрасывается защита редактирования истории, больше ничего, pull и push будут по-прежнему работать нормально, Mercurial никогда не сможет запутаться в наборах изменений, потому что они имеют уникальные идентификаторы. . Действие по редактированию истории, которое происходит после подобного фазового изменения, может вызвать проблемы. Вот почему Mercurial выдает предупреждение при изменении фазы и требует опцию --force в качестве подтверждения того, что вы действительно этого хотите.

Как правило, опубликованные коммиты не должны изменяться, это то, что пытаются обеспечить этапы. Но, возможно, у вас есть контроль над всеми репозиториями. Или, может быть, вы что-то толкнули и знаете, что это еще никто не тянул. Какой бы ни была причина, у вас есть возможность принудительно вернуть фазу наборов изменений к черновику и отредактировать их. Но это издание должно быть сделано в каждом репозитории, в котором есть наборы изменений.

person Rafael Piccolo    schedule 25.10.2012
comment
Спасибо за эти подробности, однако это не отвечает на мой вопрос: что происходит при изменении фазы существующего набора изменений? Например. с общедоступного на секретный для набора изменений, который уже был отправлен? Это работает или может запутать Mercurial? - person mstrap; 29.10.2012
comment
Вы можете перейти с любой фазы на любую другую. Что происходит, так это то, что если вы пытаетесь перейти на более низкую фазу, вы должны подтвердить это с помощью --force. Само изменение фазы не вызывает никаких проблем. Что может вызвать проблему, так это то, что вы делаете после изменения фазы. Когда вы меняете с public на draft, вы снимаете защиту редактирования истории, это позволяет вам все испортить. - person Rafael Piccolo; 30.10.2012
comment
А как насчет Mercurial — может ли он запутаться при переходе с общедоступного на черновик? - person mstrap; 31.10.2012
comment
Mercurial не смутит изменение фазы. Что вызывает путаницу, так это редактирование опубликованных наборов изменений. Это проблема любой системы контроля версий, не только Mercurial. Что Mercurial пытается сделать с фазами, так это предотвратить подобные проблемы. Но тем не менее, вы можете принудительно изменить фазу и сделать вид, что набор изменений никогда не публиковался, сняв защиту и открыв двери, чтобы устроить беспорядок. Но опять же, проблема вызвана редактированием истории, а не изменением фазы. Эта штука с фазой была там просто как предупреждение, чтобы этого не делать. - person Rafael Piccolo; 31.10.2012
comment
Худшее, что может случиться, это то, что всегда происходило с версиями mercurial, которые не использовали фазы: если вы редактируете историю, которая уже была отправлена, вы создаете несоответствия с нижестоящими репозиториями. Другими словами, хлопотно, но обычно это не имеет большого значения. - person alexis; 01.11.2012
comment
Хорошо, мы можем поместить эту информацию в ответ (поскольку это был мой фактический вопрос), а затем отметить этот вопрос галочкой? - person mstrap; 01.11.2012
comment
Значит, единственный способ сделать фазу секретной — это ненормальный переход? Хотя черновик -> секрет всегда безопасен, или секрет как-то небезопасен? - person ctrl-alt-delor; 21.02.2014
comment
@richard Draft -› секрет всегда в безопасности. Я почти уверен, что предупреждение при выполнении этого перехода считается ошибкой. - person Brilliand; 23.05.2014

  • Общедоступную редакцию нельзя редактировать с помощью инструментов редактирования истории (например, mq, rebase).
  • Ревизию secret нельзя отправить в другой репозиторий (она будет проигнорирована, когда вы дадите команду push или когда другой репозиторий попытается извлечь).
  • Редакция черновик допускает и то, и другое, но автоматически становится общедоступной, если она будет перемещена в другой репозиторий.

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

Все фазовые изменения более или менее бесперспективны; это просто маркер, указывающий, что безопасно, а что небезопасно делать с ревизией.

person Brilliand    schedule 25.07.2013