Mercurial Subrepositories - 您是否必须在子存储库中提交然后在主存储库上提交?

时间:2011-09-01 15:39:09

标签: mercurial subrepos

使用TortoiseHg 2.1.3和Hg 1.9.2。无论我做什么,父回购都没有看到在subrepo中创建的新文件,除非我首先在subrepo中提交它们。我认为所有提交和推送只应该在父级回购中完成?

3 个答案:

答案 0 :(得分:3)

在进一步测试中,我发现对subrepo中文件的更改已提交,但新文件未提交。这是因为默认情况下提交是subrepo aware和recursive,但hg add操作不是。你必须将--subrepo hook添加到hg add中,以便考虑subrepo。

答案 1 :(得分:2)

不。 Mercurial将坚持在父母将其拉出之前对subrepo进行更改。在subrepo提交更改之前,没有现有的变更集可以推送到父级。

您可能还会被要求下载自创建子报表以来集成的任何新变更集,并在Mercurial允许新变更集推升之前将其合并到您的更改中。

答案 2 :(得分:1)

以下是发生的事情。

假设您更改子参数中的文件。这将有助于解释。

父存储库和subrepo具有的唯一关系是,父存储库知道它有一个包含subrepo的文件夹,并且它知道subrepo应该是的变更集。跟踪此信息,这意味着父存储库的不同版本可能具有不同的子版本,或者在子库中引用不同的更改集。

由于此信息存储在普通文件中,因此有关检测更改的所有常规规则均适用。如果文件内容与工作文件夹的父变更集相同,则不会对这些文件进行任何更改。

此机制允许您更新回父存储库中的旧变更集,并使其以递归方式更新(并添加或删除)子目录到其各自的变更集,就像它们在父存储库中的变更集提交时一样。只需查看跟踪此信息的文件并将此知识递归应用于子目录即可完成此操作。

因此,您更改了subrepo中的文件,并要求父存储库提交。但是,您尚未更改子目录列表,也没有更改子报表当前引用的变更集。不考虑subrepo的工作文件夹中的更改。

因此,父存储库没有任何更改,因此您无法提交。

另一方面,如果您先在subrepo中提交,那么该存储库现在引用一个新的变更集作为工作文件夹的父变量。

然后,如果你在父存储库中提交,则subrepo跟踪代码将在subrepo中看到这个新的变更集,更新在父存储库中跟踪此信息的文件,然后然后你有更改提交< / em>的