如何修复Mercurial坚持Git subrepo推?

时间:2012-07-11 16:45:23

标签: git mercurial github mercurial-subrepos

  1. 我有根Mercurial repo(网站)。
  2. 我将WordPress从GitHub mirror克隆到/wp子目录。
  3. 由于我需要非常具体(稳定)的WP版本,但没有正在进行的开发,我会git checkout 3.4.1(其中3.4.1是标记)。
  4. 我将它设置为根Mercurial repo和commit中的subrepo(WP版本在.hgsubstate中被捕获得很好)。
  5. 这里麻烦开始了。我做hg push,当它到达WP:

    no branch checked out in subrepo wp
    cannot push revision e9bc63e25dc40c07ac3a6778dc2b48e1aa486e36
    

    然后就退出了。甚至没有尝试推送根目录。

    我理解为什么Mercurial 尝试推动subrepo(预期的行为),但我无法理解为什么它设法完全失败,因为:

    1. 没有变化
    2. 无论如何都有只读来源
    3. 如何理解我想要这个特定的修订,我不想让它搞乱Git subrepo?

1 个答案:

答案 0 :(得分:2)

这个设置会遇到一些问题。

首先,似乎 mercurial无法使用分离的HEAD处理git子目录

执行git checkout 3.4.1时,您的仓库进入detached HEAD状态(执行命令时应该会看到相应的警告)。此时,如果您运行git branch,则会看到(no branch)被列为活动分支。当mercurial试图推动时,它会扼杀这种状态。您可以问mercurial developer list为什么会发生这种情况,但这可能是对现有子实施的限制。

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

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

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

  1. 在GitHub上创建自己的WordPress仓库分支。
  2. 将您的fork克隆到mercurial subrepo目录。
  3. git checkout -b <branch_name> 3.4.1
  4. 从那里继续
  5. related question中还有一些其他信息。