将Git子仓库添加到Mercurial

17

我一直在尝试使用Bitbucket设置一个项目,该项目的依赖项托管在GitHub上。 使用Hg-Git Mercurial插件,我几乎可以实现它。

但是当到达推送时间时,问题就变得棘手了。

Mercurial子仓库的文档说明:

2.4 推送

当您推送时,Mercurial将自动尝试首先推送当前仓库的所有子仓库。这将确保在被顶级仓库引用时,子仓库中的新变更集可用。

但这会导致一个大问题,因为我不想推送所有的子仓库(我为什么要这样做呢?)--我只有对它们的读取访问权限,所以GitHub不允许这样做。只有主仓库需要推送到远程服务器,但我无法找出如何做到这一点。hg想要控制并推送所有的子仓库,无论是否有变更。是否有绕过此“功能”的方法?

唯一需要推送的是.hgsub.hgsubstate。一旦它们通过另外的途径被推送(更新到不存在子仓库的变更集),就可以从远程仓库更新和拉取变更,但是如果我在存在子仓库的变更集上再次推送,整个过程会重复。

4个回答

12

供参考,Mercurial的开发分支(也就是即将发布的1.8版本)现在支持原生的Git子仓库。这种情况实现得非常好,来自根仓库的推送只会告诉Git子仓库进行推送,除非其远程仓库已知具有当前提交。


这是有关Mercurial原生支持Git子仓库的一些详细信息:http://mercurial.selenic.com/wiki/Subrepository#Git_subrepositories - Alex KeySmith

4

由于Mercurial的推送方法,这是不可能的。这是一个“按设计”错误。

最好的解决方案是更新到之前不存在子仓库的版本,然后再进行推送。这将绕过Mercurial的限制并上传必要的.hgsub.hgsubstate文件。这有点不方便,但是这是我迄今为止发现的Mercurial和Git相互配合的最佳方式。

也许在未来,Hg-Git会被更新以自动处理这种用例。


这是在使用GitHub、hg-git和子存储库功能时出现的错误,尝试使用本地的git子存储库。 - Łukasz Gruner

2

我认为你应该使用多个代码仓库;分布式版本控制系统就是这样更好用。

例如,创建一个仓库来存储从GitHub获取的依赖项。你只需要拉取该仓库以获得更改,而无需推送。 然后你可以创建另一个仓库用于开发项目。在这里,你可以自由进行任何操作。然后将你自己的hg仓库链接到依赖项中。

以上是基于我正确理解了你的问题和你想要做的事情 :)


1
抱歉,我不明白。我的问题是我需要让Mercurial和Git彼此协作——它们确实可以。但hg的所谓功能使事情有点麻烦。 - summatix
这不是所谓的“功能”,而是使用hg时必不可少的步骤。推送/拉取将本地仓库与远程仓库同步。我的建议是,您可能需要为您尝试做的事情配置不同的存储库;在使用git / mercurial时,为项目拥有多个存储库是很常见的。在您的mercurial存储库中进行推送不应影响您想从github获取的内容,当然您也不应该将其推送到github存储库中。 - Alex Florescu

0
如果您在子存储库中没有任何传出的变更集,那么“push”实际上除了从远程存储库检索最新的变更集列表之外,不会执行任何其他操作。因此,推送的实际部分将不会发生。我已经成功地将只读的BitBucket存储库用作子模块。

是的,它应该这样做,这正是它所做的——然而推送确实发生了,只是如果没有更改,则不会上传任何内容。Github在检查是否有更改之前强制您进行身份验证。因此,为使其正常工作,推送需要完全忽略。 - summatix

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