使用具有子存储库(“内部”)的 Mercurial 存储库(“外部”)时,通常会遇到问题,即您尝试在外部进行合并,但由于“未提交的更改”而失败当没有明显变化时(hg st
外部显示没有变化)。
问题归结为子存储库状态:该.hgsubstate
文件包含子存储库的变更集 ID,它实际上与子存储库工作副本变更集不同(或者,简单地说,子存储库中有未提交的更改)。
我可以在它发生时修复它,但是任何人都可以推荐一个用于拉取和合并的 Mercurial 工作流程,它总是可以避免这个问题吗?我可以通过玩测试回购等来解决它,但如果他们已经知道的话,也许有人可以为我和其他人节省一些时间。
工作流程越简单越好,因为这是针对一个小团队而不仅仅是一个人。
问题示例:
更新 - 关于 .hgsubstate 工作原理的说明
更新文件的唯一两个操作.hgsubstate
(使用命令行时)如下:
如果你拉取外部项目的一个版本,你会得到任何 .hgsubstate 被签入(显然)
如果您提交外部项目,则将
.hgsubstate
更新为内部项目的当前父变更集
如果您更新子存储库但未对外部项目进行任何更改,那么如果您这样做,外部将不会显示任何更改hg status
。但是,如果您运行hg status -S
,您将获得子存储库(以及外部项目)的文件状态。显示的子存储库的文件状态是以下几种的混合:
a)对 subrepo 中文件的任何未提交的工作副本更改
b)对子存储库的任何已提交的比更改集 ID 更新的更改.hgsubstate
如果您尝试提交外部项目,即使没有hg st
显示任何更改,如果 subrepo 确实具有更新的提示变更集,它也将允许您提交 .hgsubstate 文件的更新版本。因此,一个关键的策略是使用hg st -S
它将显示您的子存储库中是否有任何待处理的内容,例如工作副本更改或比 in 中命名的 id 更新的更改集.hgsubstate
。