我在 Mac 上使用 GIT。说够了。我有工具,我有经验。我想继续使用它。这里没有战争...
问题总是与互操作性有关。大多数人使用SVN,这对我来说很棒。Git SVN 开箱即用,是一个简单的解决方案。人们可以继续愉快地使用 SVN,而且我的工作流程和工具都不会丢失。
现在......有些人和Mercurial一起来了。对他们来说很好:他们有他们的理由。但我找不到任何开箱即用的 GIT HG。我不想切换到 HG,但我仍然需要与他们的存储库互操作。
你们中的任何人都知道一个简单的解决方案吗?
我在 Mac 上使用 GIT。说够了。我有工具,我有经验。我想继续使用它。这里没有战争...
问题总是与互操作性有关。大多数人使用SVN,这对我来说很棒。Git SVN 开箱即用,是一个简单的解决方案。人们可以继续愉快地使用 SVN,而且我的工作流程和工具都不会丢失。
现在......有些人和Mercurial一起来了。对他们来说很好:他们有他们的理由。但我找不到任何开箱即用的 GIT HG。我不想切换到 HG,但我仍然需要与他们的存储库互操作。
你们中的任何人都知道一个简单的解决方案吗?
有一个新的 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。
您应该能够使用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 如果您对此工作流程有任何疑问,请提交错误。
从 2012 年 6 月开始更新。目前,当开发人员想要从 git 端工作时,似乎有以下 Git/Hg 互操作性方法:
安装 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 分支。
git-remote-hg是一个不同的包装器,同样基于 Mercurialhg-git扩展。这还利用了git-remote-helpers协议(因此得名)。它仅将顶层目录用于 Git 工作目录;它保持其 Mercurial 存储库裸露。它还维护了第二个裸 Git 存储库,以使 Git 和 Mercurial 之间的同步更安全,更符合 git 的习惯。
git-hg脚本(以前在此处维护)使用hg-fast-export不同的方法,基于快速导出项目。与方法 2 一样,这也保留了一个裸 Mercurial 存储库和一个额外的裸 Git 存储库。
对于拉取,此工具会忽略 Mercurial 书签,而是将每个命名的 Mercurial 分支导入 Git 分支,并将默认(未命名的)Mercurial 分支导入 master。
一些评论将此工具讨论为仅 hg->git,但它声称已于 2011 年 12 月 7 日合并到 git->hg 推送支持中。不过,正如我在对这些工具的评论中解释的那样,该工具尝试实现的方式推送支持似乎不可行。
还有另一个名为 git-remote-hg 的项目。与上面列出的版本不同,这个版本不依赖 hg-git,而是直接访问 Mercurial Python API。目前,使用它还需要一个修补版本的 git。我还没试过这个。
最后,Tailor是一个在各种不同 VCS 之间进行增量转换的项目。听起来这方面的发展不会积极地继续下去。
这些方法中的前三种看起来很轻巧,足以说服我进行调查。我需要以某种方式调整它们以使它们在我的设置上运行,我看到了一些进一步调整它们以改进它们的方法,然后我进一步调整它们以使它们的行为更像彼此,以便我可以评估他们更有效。然后我认为其他人可能也希望进行这些调整,以进行相同的评估。因此,我制作了一个源代码包,使您能够安装我的前三个工具中的任何一个版本。它还应该注意安装所需的hg-fast-export部件。(您需要自行安装hg-git。)
我鼓励您尝试一下,然后自己决定最有效的方法。我很高兴听到这些工具损坏的案例。我将尝试使它们与上游更改保持同步,并确保上游作者了解我认为有用的调整。
正如我上面提到的,在评估这些工具时,我得出的结论git-hg是仅可用于从 Mercurial 中拉取,而不能用于推送。
相关地,这里有一些 Git 和 Mercurial 之间有用的比较/翻译手册,在某些情况下针对已经了解 Git 的用户:
你可以试试hg2git,它是 python 脚本,是快速导出的一部分,你可以在http://repo.or.cz/w/fast-export.git找到。
不过,您需要安装 mercurial。
由于 hg-git 是一个双向桥接器,它还允许您将变更集从 Git 推送到 Mercurial。
Hg-Git Mercurial 插件。自己没有尝试过,但可能值得一试。
我git-hg从https://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
任何声称在两者之间创建可互操作的桥梁的工具git都hg应该解释它将如何处理这种阻抗匹配。然后,您可以决定所选解决方案是否符合您的需求。
使用的解决方案git-hg是丢弃所有 hg 书签并将命名分支转换为 git 分支。此外,它将 git master 分支设置为默认的未命名 hg 分支。
试过hggit。对我有用,因为我必须应付 git'ers 和 hg'ers 的工作。特别是对于评论,这很棒。
关于该主题的一个小问题/警告:
我试图用 hg 克隆一个稳定的 linux 内核存储库。这些存储库在 git 中维护,通常其中包含大量文件。
这是非常缓慢的。我花了 2 天时间完全克隆和更新工作副本。
我在mutt 的 hg repo上再次尝试了 cosmin 的 git-hg和abourget 的 git-hg- ,似乎后者很好地尊重了合并的顺序,前者有点随机。您可以从下面的屏幕截图中看到。



从上面可以看出,abourget 的 git-hg-again的第二张图非常接近原始的 hgk 图,实际上反映了 mutt 的真实工作流程。
我发现 git-hg-again 的一个缺点是它没有添加“hg”远程,而是将其所有引用作为本地标签导入,git-hg 有一个很棒的“hg”远程代表上游 hg 存储库。
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 遥控器。
使用hg2git和git2hg命令允许将 git commit sha1s 转换为 mercurial 变更集并返回。更多文档可在 github 页面上找到。