有没有一种方法可以将Mercurial仓库用作Git子模块?

60

我一直很高兴地使用子模块来跟踪项目所依赖的所有库。问题是,我正在使用一个名为core-plot的库,它只有一个公共的mercurial存储库。我可能可以在一个只读Git存储库中镜像它,但这是我得到的最好选择吗?我已经看到Mercurial中有模块来跟踪Git中的内容。不知道是否存在相反的情况?


1
可能最简单的方法是将整个已检出的Mercurial存储库放在Git版本控制下。这样,您可以随时通过hg更新库,并仍将其置于项目中的git源代码控制下。 - Clemens
问题在于当您克隆主存储库时下载了它,而子模块则是按需获取的。 - dvicino
哈哈,那么您可以创建一个新的git仓库,将整个mercurial存储放入其中。 这个git仓库可以用作常规的git子模块。问题解决了。 - Clemens
镜像意味着什么,你也可以在你的git镜像中添加一个钩子,在回复之前从hg获取。我只是想检查是否有任何不需要服务器镜像的解决方案。 - dvicino
2个回答

25

使用git-hg

首先确保主存储库下有一个非Mercurial的git子模块。如果您还没有其他子模块,只需为除core-plot之外的某个库创建一个虚拟子模块即可:

main-repo $ git submodule add https://repo.url.com/repo.git repo

其次,将core-plot库克隆到某个目录中。

main-repo $ git-hg clone  https://code.google.com/p/core-plot/ core-plot
将新的仓库添加到子模块列表中。
main-repo $ git submodule add ./core-plot core-plot
main-repo $ git commit -am "added core-plot submodule"

从现在开始,任何克隆这个仓库的人都会拉取两个代码库(在进行submodule init和update后)。

到目前为止我发现的一些问题是:

  • 如果你推送到一个裸仓库(bare),那么仓库链接和目录将会被创建在裸仓库里面,但是核心绘图库并不会被克隆到里面,其他从该裸仓库拉取的人将无法得到core-plot库。
  • 如果需要更新core-plot库,则使用git-hg pull命令进行更新。

相反的问题git submodule from Hg repo?也在StackOverflow上提问过。最好的答案提到了项目hg-git和git-hg。另一个相关的相反问题是如何处理转换为Mercurial格式的仓库中的Git子模块


1
@dvicino,你是用git管理你的主项目,对吧?你想把core-plot包含进去并将其作为子模块处理?但是core-plot的开发人员是用Mercurial来管理它的?在这种情况下,我认为你不需要在core-plot存储库中执行git-hg submodule。你只需要在那里执行git-hg fetch。你应该从主项目的存储库中执行git submodule。这就是我理解《Pro-git 6.6 "Submodules"》的方式。或者我没有理解你的意思? - Jim DeLaHunt
1
听起来不错。所以,您的建议是在可访问的服务器(如github)上创建一个裸仓库,并在具有git存储库的机器上进行cron处理,该存储库从core-plot获取并推送到另一个存储库。然后从我的主要存储库中进行子模块化。对吗? - dvicino
5
为什么需要非mercurial子模块?而且,当git存储库通过远程共享时,似乎无法正常工作:除了原始存储库之外,没有人拥有 ./core-plot 子模块。 - Josh Bleecher Snyder
1
当我尝试使用git submodule add ./core-plot core-plot步骤将子模块添加到模块列表时,会出现“这个答案仍然有效吗?”的问题。但是每当我尝试这样做时,git都会尝试克隆子模块repo,但它失败并告诉我它不存在。我想git-hg clone会处理克隆,而git submodule add不需要进行克隆,我错了吗? - maguirre
@Mischief 这个回答已经有5年的历史了。这相当久远,软件可能已经发生了变化。也许你可以把你当前的情况表述为一个新的StackOverflow问题,并在描述中链接到这里? - Jim DeLaHunt
显示剩余8条评论

15

根据我的经验,大多数活跃的非 git 项目在 GitHub 上都有最新的 git 镜像。看起来 core-plot 也有一个:

https://github.com/djw/core-plot

如果你愿意依赖于设置该镜像的人,似乎这可能是放置子模块的最简单选项。


1
认真地说,这是最好的答案,你只需要点击谷歌搜索结果中出现的第二个链接即可。 - Paul de Lange
4
此外,您可以使用https://githgmirror.com/自动创建这样的镜像。免责声明:我的公司运营Git-hg Mirror。 - Piedone
还需要一个可以信任的人。 - hamster on wheels

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