Mercurial workflow для subrepos, чтобы избежать «Невозможно объединиться из-за незафиксированных изменений»

При работе с репозиторием Mercurial («внешний»), который имеет субрепозитор («внутренний»), часто вы можете столкнуться с проблемой, при которой вы пытаетесь выполнить слияние на внешнем, но сбой из-за «незафиксированных изменений», когда никаких изменений не видно ( hg st для внешних показывает отсутствие изменений).

Проблема сводится к состоянию subrepository: файл .hgsubstate содержит идентификатор набора изменений для подрепо, который на самом деле отличается от набора изменений рабочей копии подрепо (или, что тривиально, в подпоре есть незафиксированное изменение ).

Я могу исправить это, когда это произойдет, но может ли кто-нибудь рекомендовать рабочий процесс Mercurial для притяжения и слияния, который всегда избегает этой проблемы? Я могу работать, играя с тестовыми репозиториями и т. Д., Но, возможно, кто-то может спасти меня и других, если они уже знают.

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

Примеры проблемы:

Обновление - заметки о работе .hgsubstate

Только два действия, которые обновляют файл .hgsubstate (при использовании командной строки), следующие:

  1. Если вы вытаскиваете версию внешнего проекта, вы получаете все, что было отмечено .hgsubstate (очевидно)

  2. Если вы выполняете проект external , .hgsubstate обновляется до текущего родительского набора изменений для внутреннего проекта

Если вы обновите subrepo, но не внесите никаких изменений во внешний проект, внешний элемент не будет отображаться без изменений, если вы выполните hg status . Однако , если вы запустите hg status -S , вы получите статус файла для subrepo (а также внешнего проекта). Статусы файлов показанного подрепортажа представляют собой смесь:

a) любые неуправляемые изменения рабочей копии в файлах в subrepo

b) any committed changes to subrepo that are newer than the changeset id in .hgsubstate

Если вы попытаетесь выполнить внешний проект, даже если hg st не показывает никаких изменений, это позволит вам зафиксировать иудействующую версию файла .hgsubstate, если у subrepo действительно есть новый набор изменений чаевых. Поэтому ключевой стратегией является использование hg st -S , который покажет, есть ли что-либо в вашем подпоре, например, изменения рабочей копии или изменения, более новые, чем идентификатор, указанный в .hgsubstate .

1
nl ja de
У меня обычно есть другое репо, клонированное на моей машине, что чисто. Я могу вытащить из своего локального репо, затем слить, а затем нажать, не имея дело с незафиксированными изменениями.
добавлено автор nlucaroni, источник
@nlucaroni Я не понимаю, как это помогает; можете ли вы объяснить больше, пожалуйста? Вы имеете в виду способ остановить работу внутреннего хранилища, чтобы предотвратить внесение изменений в внешнее репо? Я знаком с этой стратегией, но это не касается моей проблемы.
добавлено автор occulus, источник
@occulus: вы говорите, что можете исправить это, когда это произойдет. Как вы это исправите?
добавлено автор m4l490n, источник