8
  1. 我有根 Mercurial repo(网站)。
  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会尝试推送 subrepo(预期行为),但我无法理解为什么它会在 subrepo 上完全失败:

  1. 没有变化
  2. 无论如何都有只读来源

如何让它明白我想要这个特定的修订版并且我不希望它弄乱 Git 子存储库?

4

1 回答 1

4

您将在此设置中遇到一些问题。

首先,似乎mercurial 无法处理带有分离 HEAD 的 git subrepos

当你执行时git checkout 3.4.1,你的 repo 进入一个分离的 HEAD状态(当你执行命令时你应该已经看到了一个警告)。此时,如果您运行git branch,您会看到它(no branch)被列为活动分支。当 mercurial 试图推动时,它会在这种状态下窒息。您可以询问mercurial 开发人员列表为什么会发生这种情况,但这可能是现有 subrepo 实现的限制。

其次,mercurial 使用 push 命令来同步 git subrepos

如果你要运行git checkout -b <integration_branch> 3.4.1,它会将 git 移出分离的 HEAD 状态。但是,当您尝试时hg push,它会尝试实际推送到远程 git 存储库。对于 mercurial 子存​​储库,即使您没有对远程的推送访问权限,它也可以检查传出更改。但是,GitHub 要求您进行身份验证,然后它才会告诉您两个存储库是否同步。因此,如果您没有对 git 远程的推送访问权限,那么这将失败。这是 mercurial 的 subrepo 策略设计的一部分。

如果您需要继续此设置,您可能应该执行以下操作:

  1. 在 GitHub 上创建您自己的 WordPress 存储库的分支。
  2. 将你的 fork 克隆到 mercurial subrepo 目录中。
  3. git checkout -b <branch_name> 3.4.1
  4. 从那里继续

在这个相关问题中有一些附加信息。

于 2012-07-13T15:02:25.970 回答