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