200

我在 Mac 上使用 GIT。说够了。我有工具,我有经验。我想继续使用它。这里没有战争...

问题总是与互操作性有关。大多数人使用SVN,这对我来说很棒。Git SVN 开箱即用,是一个简单的解决方案。人们可以继续愉快地使用 SVN,而且我的工作流程和工具都不会丢失。

现在......有些人和Mercurial一起来了。对他们来说很好:他们有他们的理由。但我找不到任何开箱即用的 GIT HG。我不想切换到 HG,但我仍然需要与他们的存储库互操作。

你们中的任何人都知道一个简单的解决方案吗?

4

11 回答 11

115

有一个新的 git-remote-hg 提供原生支持:

Git 中对 Mercurial 和 Bazaar 的桥接支持

只需将git-remote-hg复制到您的 $PATH 中,使其可执行,仅此而已,没有依赖项(Mercurial 除外):

git clone hg::https://www.mercurial-scm.org/repo/hg/

您应该能够像本地 Git 存储库一样对其进行推送和拉取。

当您推送新的 Git 分支时,将为它们创建 Mercurial 书签。

有关更多信息,请参阅git-remote-hg wiki

于 2012-11-13T02:52:03.413 回答
106

您应该能够使用hg-git

hg clone <hg repository>

编辑~/.hgrc并添加:

[extensions]
hgext.bookmarks =
hggit =

创建一个书签,以便您master在 git 中有一个:

cd <repository>
hg bookmark -r default master

在存储库中编辑.hg/hgrc并添加:

[git]
intree = true

现在您可以创建 git 存储库:

hg gexport

您可以将生成的目录用作 git clone。从 mercurial 中提取将是:

hg pull
hg gexport

并推动 mercurial :

hg gimport
hg push

(是的,您需要在此工作流程中使用 hg,但您的黑客攻击将全部在 git 中)

PS 如果您对此工作流程有任何疑问,请提交错误。

于 2009-07-06T21:06:31.573 回答
63

从 2012 年 6 月开始更新。目前,当开发人员想要从 git 端工作时,似乎有以下 Git/Hg 互操作性方法:

  1. 安装 Mercurial 和hg-git 扩展。您可以使用包管理器或使用easy_install hg-git. 然后确保您的 ~/.hgrc 中有以下内容:

    [extensions]
    hggit = 
    

您也可能会看到一些关于在bookmarks此处指定扩展名的参考资料,但自 1.8 版以来,这已内置于 Mercurial 中。以下是有关在 Windows 上安装 hg-git 的一些提示

拥有 hg-git 后,您可以使用大致类似于上面发布的 Abderrahim Kitouni 的命令。不过,自 2009 年以来,此方法已得到改进和调整,并且有一个友好的包装器:git-hg-again。这同时使用顶级目录作为 Mercurial 和 Git 的工作目录。它创建一个 Mercurial 书签,它与 Mercurial 存储库中(未命名)分支的尖端保持同步default,并从该书签更新本地 Git 分支。

  1. git-remote-hg是一个不同的包装器,同样基于 Mercurialhg-git扩展。这还利用了git-remote-helpers协议(因此得名)。它仅将顶层目录用于 Git 工作目录;它保持其 Mercurial 存储库裸露。它还维护了第二个裸 Git 存储库,以使 Git 和 Mercurial 之间的同步更安全,更符合 git 的习惯。

  2. git-hg脚本(以前在此处维护)使用hg-fast-export不同的方法,基于快速导出项目。与方法 2 一样,这也保留了一个裸 Mercurial 存储库和一个额外的裸 Git 存储库。

对于拉取,此工具会忽略 Mercurial 书签,而是将每个命名的 Mercurial 分支导入 Git 分支,并将默认(未命名的)Mercurial 分支导入 master。

一些评论将此工具讨论为仅 hg->git,但它声称已于 2011 年 12 月 7 日合并到 git->hg 推送支持中。不过,正如我在对这些工具的评论中解释的那样,该工具尝试实现的方式推送支持似乎不可行。

  1. 还有另一个名为 git-remote-hg 的项目。与上面列出的版本不同,这个版本不依赖 hg-git,而是直接访问 Mercurial Python API。目前,使用它还需要一个修补版本的 git。我还没试过这个。

  2. 最后,Tailor是一个在各种不同 VCS 之间进行增量转换的项目。听起来这方面的发展不会积极地继续下去。

这些方法中的前三种看起来很轻巧,足以说服我进行调查。我需要以某种方式调整它们以使它们在我的设置上运行,我看到了一些进一步调整它们以改进它们的方法,然后我进一步调整它们以使它们的行为更像彼此,以便我可以评估他们更有效。然后我认为其他人可能也希望进行这些调整,以进行相同的评估。因此,我制作了一个源代码包,使您能够安装我的前三个工具中的任何一个版本。它还应该注意安装所需的hg-fast-export部件。(您需要自行安装hg-git。)

我鼓励您尝试一下,然后自己决定最有效的方法。我很高兴听到这些工具损坏的案例。我将尝试使它们与上游更改保持同步,并确保上游作者了解我认为有用的调整。

正如我上面提到的,在评估这些工具时,我得出的结论git-hg是仅可用于从 Mercurial 中拉取,而不能用于推送。

相关地,这里有一些 Git 和 Mercurial 之间有用的比较/翻译手册,在某些情况下针对已经了解 Git 的用户:

于 2012-06-24T15:31:43.540 回答
15

你可以试试hg2git,它是 python 脚本,是快速导出的一部分,你可以在http://repo.or.cz/w/fast-export.git找到。

不过,您需要安装 mercurial。

于 2009-05-19T15:39:10.313 回答
9

由于 hg-git 是一个双向桥接器,它还允许您将变更集从 Git 推送到 Mercurial。

于 2009-05-20T21:34:06.010 回答
6

Hg-Git Mercurial 插件。自己没有尝试过,但可能值得一试。

于 2009-05-19T15:32:52.330 回答
6

git-hghttps://github.com/cosmin/git-hg获得了巨大的成功(也需要工作安装hg)。它支持获取、拉取和推送,并且对我来说比hg-git(与hggit 类似的功能)更稳定。

有关使用示例,请参阅https://github.com/cosmin/git-hg#usage。用户界面与git-svn.

每个克隆的git-hghg 存储库都需要额外的磁盘空间。该实现使用完整的 mercurial 克隆、一个额外的 git 裸克隆和实际的 git repo。所需的磁盘空间大约是普通 git 使用量的 3 倍。额外的副本存储在.git您的工作目录(或GIT_DIR通常指向的位置)的目录下。

注意:试图解决的基本问题是和特征git-hg之间没有 1:1 的映射。最大的问题是 git 分支和hg 未命名分支以及hg 命名分支hg 书签之间的阻抗不匹配(所有这些看起来很像用户的分支)。一个相关的问题是尝试将原始命名分支名称保存在版本历史记录中,而不是 git,其中分支名称默认情况下仅添加到模板提交消息中。githggithg

任何声称在两者之间创建可互操作的桥梁的工具githg应该解释它将如何处理这种阻抗匹配。然后,您可以决定所选解决方案是否符合您的需求。

使用的解决方案git-hg是丢弃所有 hg 书签并将命名分支转换为 git 分支。此外,它将 git master 分支设置为默认的未命名 hg 分支。

于 2012-06-27T09:59:04.950 回答
3

试过hggit。对我有用,因为我必须应付 git'ers 和 hg'ers 的工作。特别是对于评论,这很棒。

关于该主题的一个小问题/警告:

我试图用 hg 克隆一个稳定的 linux 内核存储库。这些存储库在 git 中维护,通常其中包含大量文件。

这是非常缓慢的。我花了 2 天时间完全克隆更新工作副本。

于 2011-08-04T06:45:39.750 回答
2

我在mutt 的 hg repo上再次尝试了 cosmin 的 git-hg和abourget 的 git-hg- ,似乎后者很好地尊重了合并的顺序,前者有点随机。您可以从下面的屏幕截图中看到。

cosmin 的 git-hg导入的 mutt 合并历史图:

在此处输入图像描述

abourget 的 git-hg-again导入的 mutt 合并历史图:

在此处输入图像描述

hgk 在 mutt 的 hg 存储库上绘制的实际历史图表:

在此处输入图像描述

从上面可以看出,abourget 的 git-hg-again的第二张图非常接近原始的 hgk 图,实际上反映了 mutt 的真实工作流程。

我发现 git-hg-again 的一个缺点是它没有添加“hg”远程,而是将其所有引用作为本地标签导入,git-hg 有一个很棒的“hg”远程代表上游 hg 存储库。

于 2014-01-01T17:51:27.823 回答
0

2021 年的最新答案似乎git cinnabar是 Firefox,例如 Firefox。

此页面上建议的其他脚本要么未维护,要么需要过时的软件才能运行(通常是 python 2.7)。相比之下,cinnabar 与 python 3.5+ 一起工作,并且至少保持到写作之日。

安装 cinnabar 后,您可以通过以下前缀直接克隆 mercurial 存储库hg::

git clone hg::https://hg.mozilla.org/mozilla-unified

或添加或设置遥控器

git remote set-url origin hg::https://hg.mozilla.org/mozilla-unified
git fetch origin

您可以推送到 mercurial 遥控器。

使用hg2gitgit2hg命令允许将 git commit sha1s 转换为 mercurial 变更集并返回。更多文档可在 github 页面上找到

于 2021-10-17T06:59:41.920 回答
-1

使用Git-hg Mirror服务也可以实现双向 hg-git(和 git-git、hg-hg)同步。它在幕后使用 hg-git(以及其他),其代码也是开源的。


免责声明:我来自它背后的公司。

于 2017-04-30T16:36:23.487 回答