【发布时间】:2011-09-01 15:39:08
【问题描述】:
使用 TortoiseHg 2.1.3 和 Hg 1.9.2。无论我做什么,父仓库都看不到在子仓库中创建的新文件,除非我首先在子仓库中提交它们。我认为所有提交和推送都应该只在父 repo 上完成?
【问题讨论】:
使用 TortoiseHg 2.1.3 和 Hg 1.9.2。无论我做什么,父仓库都看不到在子仓库中创建的新文件,除非我首先在子仓库中提交它们。我认为所有提交和推送都应该只在父 repo 上完成?
【问题讨论】:
在进一步的测试中,我发现对子存储库中文件的更改已提交,但新文件未提交。这是因为默认情况下提交是 subrepo 感知和递归的,但 hg add 操作不是。您必须将 --subrepo 钩子添加到 hg add 以使其考虑 subrepo。
【讨论】:
不。 Mercurial 将坚持在父级拉取更改之前在子存储库上提交更改。在子存储库提交更改之前,没有现有的更改集要推送到父级。
在 Mercurial 允许上推新的变更集之前,您还可能会被要求下拉自您的子存储库创建以来集成的所有新变更集,并将它们与您的变更合并。
【讨论】:
这是正在发生的事情。
假设您仅更改子存储库中的文件。这将有助于解释。
父存储库和子存储库的唯一关系是父存储库知道它有一个包含子存储库的文件夹,并且它知道子存储库应该是什么变更集。跟踪此信息,这意味着不同版本的父存储库可能具有不同的子存储库,或引用子存储库中的不同变更集。
由于此信息存储在普通文件中,因此适用于检测更改等所有常规规则。如果文件内容与工作文件夹的父变更集相同,则不会对这些文件进行任何更改。
此机制允许您更新回父存储库中的旧变更集,并让它递归地更新(并添加或删除)子存储库到它们各自的变更集,就像它们在父存储库中的变更集被提交时一样.只需查看跟踪此信息的文件并将此知识递归地应用于子存储库即可完成。
因此,您更改了子存储库中的文件,并要求父存储库提交。但是,您没有更改子存储库列表,也没有更改子存储库当前引用的变更集。不考虑子仓库工作文件夹中的更改。
因此,父存储库没有任何更改,因此您无法提交。
另一方面,如果您首先在子存储库中提交,那么该存储库现在将一个新的变更集引用为工作文件夹的父级。
然后,如果你在父存储库中提交,子存储库跟踪代码将在子存储库中看到这个新的变更集,更新在父存储库中跟踪此信息的文件,然后你有更改提交。
【讨论】: