我可以将多个mercurial子目录的更改提交到新的命名分支吗?

时间:2010-11-17 12:45:41

标签: mercurial branching-and-merging subrepos

我有一个mercurial存储库,里面有多个子存储库。存储库有一个visual studio解决方案,其中包含存储库和子存储库中的项目。

假设我想实现一个新功能,该功能需要更改存储库中的主项目,并更改其中某个依赖项目的解决方案(比方说,在依赖项中添加新的共享接口,以及实现主项目中的界面)。

然后我想提交更改,但是对于一个新的命名分支,因为它未完成,将在稍后合并。使用tortoiseHg我在存储库中提交更改,指定要创建的新分支。提交依次提交子仓库的更改,但在我的测试中,它不会在其存储库中创建新分支,而只是将变更集添加到当前分支。

我可以显式执行对子仓库的提交并在那时指定分支名称,但我希望能够一次性将整个变更集提交到每个存储库中的新分支,这样我的工作流程就更清晰了。这可能吗?

1 个答案:

答案 0 :(得分:6)

首先提交子仓库并在那里创建一个命名分支。

之后,主提交应该继续在与之前相同的分支中提交该子repo。

首先,您应该将两个存储库视为独立的,完全独立的。换句话说,您在一个存储库中执行某些操作并提交它。然后你在另一个存储库中做一些事情,并提交它。

两个存储库之间的关系是主存储库存储一个文件,即.hgsubstate文件,该文件包含每个子存储库的工作文件夹的父级的哈希值。

换句话说,子存储库本身并不了解它是更大图景的一部分。但是,主存储库知道该子存储库中当前检出的修订。这些知识作为正常提交的一部分提交到存储库中。

这意味着如果您在子存储库中执行某些操作,则提交该子存储库,现在该子存储库处于新版本。当您稍后在主存储库中提交时,子存储库中新修订版的哈希值将更新为.hgsubstate文件,然后提交。

这背后的目的当然是如果您更新到主存储库中的旧版本,则.hgsubstate文件的旧副本也会被带入工作文件夹,然后子库将更新为该修订版本具有将时钟回溯到子仓库在进行修改时的样子的效果。

此外,主存储库上的命令有时也适用于子存储库。如果您推入主存储库,也会推送子存储库,以确保克隆主存储库的其他人也可以安全地依赖于能够克隆子存储库的相应内容。

所以在评论中回答你的问题。

如果您在子存储库中创建了一个名称或其他名称的分支,您将继续在该分支下提交新的变更集。在某些时候,您需要合并,您需要在子存储库和主存储库中合并。

首先,您将合并到子存储库中。这以提交结束,这意味着子存储库现在处于提交合并的变更集。然后,您将合并到主存储库并提交,其中存储了该知识,即现在正在使用的子存储库中的更改集。

所以是的,你需要在以后合并两者。