【问题标题】:Mercurial Subrepositories - Do you have to commit in the subrepository and then commit on the main repository?Mercurial Subrepositories - 您是否必须在子存储库中提交,然后在主存储库中提交?
【发布时间】:2011-09-01 15:39:08
【问题描述】:

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

【问题讨论】:

    标签: mercurial subrepos


    【解决方案1】:

    在进一步的测试中,我发现对子存储库中文件的更改已提交,但新文件未提交。这是因为默认情况下提交是 subrepo 感知和递归的,但 hg add 操作不是。您必须将 --subrepo 钩子添加到 hg add 以使其考虑 subrepo。

    【讨论】:

      【解决方案2】:

      不。 Mercurial 将坚持在父级拉取更改之前在子存储库上提交更改。在子存储库提交更改之前,没有现有的更改集要推送到父级。

      在 Mercurial 允许上推新的变更集之前,您还可能会被要求下拉自您的子存储库创建以来集成的所有新变更集,并将它们与您的变更合并。

      【讨论】:

      • 感谢您的回答。只是为了澄清,父母是持有子回购的回购,而不是子回购的来源?另外,在 .hgsub 中,它应该映射到远程 subrepo 还是远程 subrepo 源?
      • 此外,在子存储库的 wiki 上,它指出“当我们提交时,Mercurial 将尝试创建整个项目及其子存储库状态的一致快照。它首先尝试提交所有修改的子存储库,然后记录所有子存储库的状态。(提交默认包括子存储库,因为它旨在创建您可能在提交之前构建和测试的树的原子快照。)“
      【解决方案3】:

      这是正在发生的事情。

      假设您更改子存储库中的文件。这将有助于解释。

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

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

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

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

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

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

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

      【讨论】:

      • 主子存储库 wiki 明确指出提交是递归的。我发现的是 hg add 不是。所以添加的新文件不会被主仓库找到。下一个问题,我知道我可以进行推送,它会推送回服务器上的子存储库,但是我如何才能在不登录服务器的情况下将其推送回克隆子存储库的原始源存储库。我需要一个简单的工作流程来确保我的所有子存储库都能在其中一个中进行更改。
      猜你喜欢
      • 2011-03-05
      • 2013-07-30
      • 2011-08-11
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 2019-04-17
      • 2015-04-28
      • 1970-01-01
      相关资源
      最近更新 更多