2010-07-09 76 views
11

我正在使用Mercurial 1.6。我有一个有几个subrepos(11)的回购。我想在不推送子回购的情况下将父回购推送到默认的远程回购。原因想要做到这一点包括:推送mercurial repo而不推送subrepos

  • 我正在使用SSH回购,并且它需要很长时间才能建立连接,并没有推送到每个subrepos。
  • 我有subrepos提交我不想传播到远程回购(还)。
  • Subrepos命名的分支不应传播到repote回购站(显然没有办法将分支名称传递给subrepos的推送操作)。

但是,我一直无法找到一种方法来实现这一点。我尝试删除.hgsub和.hgsubstate(不提交)的内容,但mercurial仍坚持推送subrepos。

我该如何推动从本地仓库到远程仓库的更改并暂时忽略子仓库?

回答

4

我认为你需要制作subrepos的本地克隆。

推动主要回购没有推动subrepos的问题是,subrepos的内容不是主要回购的一部分 - 只有它们的状态。内容参考.hgsub中指定的原始位置。所以你的主要回购的.hgsubstate说“subrepo A在修订abcd1234”,但abcd1234是你所做的改变,你不想推动......现在如果你克隆主回购会发生什么?它会尝试从其原始位置克隆子报告并将其更新到abcd1234,但该修订不存在于原始位置,因此克隆将失败。

相反,您可以制作每个外部存储库的本地克隆,并参考那些作为subrepos的外部位置。然后当您推动主repo时,subrepo更改将只传播到您的本地克隆。当您准备好分享这些更改时,只需转到本地克隆并从那里推入,即可通过分支名称等。

+0

这是有道理的,它让我觉得我们不是按照他们打算使用的方式使用subrepos。我们主要使用它们来轻松地检出一个回收集合......而我们的.hgsubstate始终引用subrepos的NULL修订版本。看起来,hgforest扩展(现已弃用)对于我们的目的比subrepos更好。 – 2010-12-22 14:26:30

+2

这很有道理,但Mercurial似乎过于热忱。即使该修订(或其任何后代)在'.hgsubstate'中被调用,它也会尝试推送'abcd1234'。即使'hg out --S -r .'('-S'用于'rererse into subrepos')也不会列出subrepo的变化。 – weberc2 2014-12-22 15:03:16

+0

我们可以告诉它,如果所有变更集的阶段都是公开的,那么我们可以告诉它不推动,因为这表明(只要我们没有手动设置公共阶段)它已经被推送。 – 2016-02-17 15:18:34