Mercurial子存储库-您必须在子存储库中提交,然后在主存储库中提交吗?

Mercurial子存储库-您必须在子存储库中提交,然后在主存储库中提交吗?,mercurial,subrepos,Mercurial,Subrepos,使用龟甲2.1.3和Hg 1.9.2。无论我做什么,父repo都不会看到在子repo中创建的新文件,除非我首先在子repo中提交它们。我以为所有的提交和推送都只应该在父回购上完成?不。Mercurial将坚持在母公司撤销次级回购之前,对次级回购进行变更。在subrepo提交更改之前,没有要推送到父级的现有更改集 在Mercurial允许向上推送新变更集之前,还可能会要求您下拉自创建子回购以来集成的任何新变更集,并将它们与您的变更合并在一起。下面是发生的情况 假设您只更改了subrepo中的一个文

使用龟甲2.1.3和Hg 1.9.2。无论我做什么,父repo都不会看到在子repo中创建的新文件,除非我首先在子repo中提交它们。我以为所有的提交和推送都只应该在父回购上完成?

不。Mercurial将坚持在母公司撤销次级回购之前,对次级回购进行变更。在subrepo提交更改之前,没有要推送到父级的现有更改集


在Mercurial允许向上推送新变更集之前,还可能会要求您下拉自创建子回购以来集成的任何新变更集,并将它们与您的变更合并在一起。

下面是发生的情况

假设您只更改了subrepo中的一个文件。这将有助于解释

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

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

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

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

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

另一方面,如果您首先在子repo中提交,则该存储库现在引用一个新的变更集作为工作文件夹的父项


然后,如果您在父存储库中提交,子存储库跟踪代码将在子存储库中看到这个新的更改集,更新父存储库中跟踪此信息的文件,然后您将有更改提交。

在进一步的测试中,我发现子存储库中的文件更改已提交,但新文件未提交。这是因为提交在默认情况下是子回购感知的和递归的,而hg add操作则不是。您必须在HG ADD中添加-SubRePog挂钩,以便考虑该子项。

谢谢您的回答。只是澄清一下,母公司是持有子回购协议的回购协议,而不是子回购协议的来源?此外,在.hgsub中,它应该映射到远程subrepo还是远程subrepo源?此外,在subrepo的wiki上,它声明“当我们提交时,Mercurial将尝试创建整个项目及其子项目状态的一致快照。它首先尝试在所有修改的子repo中提交,然后记录所有子repo的状态。(默认情况下,提交包括子存储库,因为它旨在创建您在提交之前可能构建和测试的树的原子快照。)“主子存储库wiki明确指出提交是递归的。但我发现hg add并非如此。因此,主repo将找不到添加的新文件。下一个问题是,我知道我可以执行推送操作,它将推送回服务器上的子repo,但我如何在不登录服务器的情况下也将推送回克隆子repo的原始源repo。我需要一个简单的工作流程,以确保我的所有子回购都能在一个子回购中进行更改。