将一个Git子存储库添加到Mercurial

时间:2010-10-30 08:27:03

标签: git version-control mercurial hg-git

我一直在尝试使用bitbucket建立一个项目,该项目依赖项托管在github上。使用Hg-Git Mercurial插件,我几乎可以到达那里。

但是到了推动的时候,事情会变得麻烦。

Mercurial subrepositories州的文档:

  

2.4推送

     

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

但这会引起一个大问题,因为我不想推送所有的子库(我为什么会这样?) - 我只有读取权限,所以github不会允许它。只需要将主存储库推送到远程服务器,但我无法弄清楚如何做到这一点。无论是否有变化,hg都希望控制并推送所有子存储库。有没有办法绕过这个功能

唯一需要推送的内容是.hgsub.hgsubstate。一旦他们通过替代路由推送(更新到不存在子存储库的变更集),就可以更新并从远程存储库中提取更改,但是如果我要在变更集上再次推送子仓库,整个考验重演。

4 个答案:

答案 0 :(得分:12)

为了将来参考,mercurial的开发分支(以及即将发布的1.8版本)现在支持本机git子目录。这个特殊情况非常好地实现,如果不知道其远程存储库是否具有当前提交,则从根存储库推送只会告诉git subrepo推送。

答案 1 :(得分:4)

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

最佳解决方案是更新到子存储库不存在的先前版本,然后推送。这将绕过Mercurial的限制并上传必要的.hgsub.hgsubstate文件。这有点不方便,但是到目前为止我发现Mercurial和Git彼此合作的最佳方式。

将来可能会更新Hg-Git以自动处理此用例。

答案 2 :(得分:2)

我认为你应该使用多个存储库; DVCS的效果更好。

例如,创建一个包含来自github的依赖项的存储库。你只需要用那个仓库来获取变化,你永远不会推动。 然后,您有另一个项目存储库,用于开发。在这里,您可以随意做任何事情。然后链接到您自己的hg repo以获取依赖项。

如果我正确地理解了你的问题以及你想要做什么,那就是这样的。)

答案 3 :(得分:0)

如果子存储库中没有传出的变更集,那么除了从远程存储库中检索最新的变更集列表之外,“推送”实际上应该什么都不做。因此,推动的实际“推动​​”部分不会发生。我已成功使用只读BitBucket存储库作为子模块。