如何修复Mercurial在Git子仓库推送时卡住的问题?

8
  1. 我有一个根Mercurial仓库(网站)。
  2. 我从GitHub镜像克隆了WordPress到/wp子目录中。
  3. 由于我想要一个非常特定的(稳定的)WP版本,但不需要进行开发,所以我执行 git checkout 3.4.1(其中3.4.1是标签)。
  4. 我将它设置为根Mercurial仓库的子仓库并提交(WP修订版在.hgsubstate中被很好地捕获)。

然后麻烦就开始了。当我做 hg push 时,它会到达WP:

no branch checked out in subrepo wp
cannot push revision e9bc63e25dc40c07ac3a6778dc2b48e1aa486e36

然后它就退出了。甚至没有尝试推送到根仓库。

我理解Mercurial试图推送子仓库的原因(这是预期行为),但我不明白为什么它在以下情况下完全无法完成对子仓库的操作:

  1. 没有任何更改
  2. 无论如何都是只读的远程源

如何让Mercurial明白我想要这个特定版本,并且不想让它干扰Git子仓库?

1个回答

4
你在这个设置中会遇到几个问题。
首先,似乎Mercurial无法处理带有分离头的Git子仓库。
当你执行git checkout 3.4.1时,你的仓库进入了一个分离头状态(当你执行该命令时应该会看到警告)。此时,如果你运行git branch,你会看到(no branch)被列为活动分支。当Mercurial尝试推送时,它会卡在这个状态上。你可以问Mercurial开发者列表为什么会出现这种情况,但这可能是现有子仓库实现的限制。
其次,Mercurial使用push命令来同步Git子仓库。
如果您运行git checkout -b <integration_branch> 3.4.1,它会将git从分离的HEAD状态中移出。但是,当您尝试hg push时,它将尝试实际推送到远程git repo。对于mercurial子存储库,即使您没有推送访问权限,它也可以检查传出更改。但是,GitHub要求您进行身份验证,然后才会告诉您这两个repo是否同步。因此,如果您没有推送访问权限,则此操作将失败。这是mercurial子存储库策略设计的一部分。
如果您需要继续使用此设置,则应执行以下操作:
  1. 在GitHub上创建自己的WordPress repo分支。
  2. 将您的分支克隆到mercurial子存储库目录中。
  3. git checkout -b <branch_name> 3.4.1
  4. 从那里继续
相关问题中还有一些其他信息。

是的,看起来分离头是问题所在(尽管我认为这是Git的缺点而不是Mercurial——如果它没有任何东西可以推送,那么活动分支有什么关系?..)。你的第二个观点似乎不是问题,然而,其他GitHub子存储库更新到顶部修订版都可以正常工作。我的当前解决方案是创建并使用WordPress的Mercurial镜像,但仍然有兴趣了解是否可以将此分离的内容作为子存储库而无需克隆和分支处理... - Rarst
@Rarst:只要你的其他 GitHub 子仓库指向“tip”,就没问题。但是,一旦你创建了一个本地 Git 分支以使用早期修订版本(例如,使用较旧的标签而不是分离的 HEAD),你将会遇到相同的错误。 - Tim Henigan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接