Git与Mercurial存储库的互操作性

Hug*_*ira 194 git version-control mercurial interop dvcs

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

问题始终在于互操作性.大多数人都使用SVN,这对我来说很棒.Git SVN开箱即用,是一个没有多余装饰的解决方案.人们可以继续愉快地使用SVN,我不会丢失我的工作流程,也不会丢失我的工具.

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

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

Fel*_*peC 114

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

Meritial和Bazaar的Git桥梁支持

只需将git-remote-hg复制到$ PATH,使其成为可执行文件,就是这样,没有依赖项(Mercurial除外):

git clone hg::https://www.mercurial-scm.org/repo/hg/
Run Code Online (Sandbox Code Playgroud)

您应该能够从它推送和拉出,就像它是一个本机Git存储库一样.

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

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

  • 嘿菲利普,这不完全正确,你需要一个工作版本的mercurial作为依赖 (14认同)
  • 确保将其命名为`git-remote-hg`(即没有`.py`后缀). (5认同)
  • 请注意,您需要python 2.因此,如果python 3是您系统的默认设置(或者如果您不运行Debian并希望将来证明),请将第一行更改为`#!/ usr/bin/env python2`. (4认同)
  • 当hg存储库也是子模块时工作. (3认同)
  • 请注意,因为Mercurial 3.2 @FelipeC的git-remote-hg不再起作用(https://github.com/felipec/git-remote-hg/issues/27),直到修复问题的分支是合并(参见https://github.com/fingolfin/git-remote-hg) (3认同)
  • 在[https://github.com/fingolfin/git-remote-hg](https://github.com/fingolfin/git-remote-hg)上有一个原始存储库的分支,它解决了这个问题.我可以确认它有效.我的测试是用Git v2.5.0和Mercurial 3.4完成的.我不希望原作者回归生活来合并补丁. (2认同)

Abd*_*uni 106

你应该能够使用hg-git.

hg clone <hg repository>
Run Code Online (Sandbox Code Playgroud)

编辑~/.hgrc并添加:

[extensions]
hgext.bookmarks =
hggit =
Run Code Online (Sandbox Code Playgroud)

创建一个书签,这样你就有了一个mastergit:

cd <repository>
hg bookmark -r default master
Run Code Online (Sandbox Code Playgroud)

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

[git]
intree = true
Run Code Online (Sandbox Code Playgroud)

现在你可以创建git仓库了:

hg gexport
Run Code Online (Sandbox Code Playgroud)

并且您可以将结果目录用作git clone.从mercurial拉出来的将是:

hg pull
hg gexport
Run Code Online (Sandbox Code Playgroud)

并推动mercurial:

hg gimport
hg push
Run Code Online (Sandbox Code Playgroud)

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

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

  • 别忘了先运行easy_install hg-git (3认同)
  • 只是一个fyi,在本地hg repo上执行此过程一次(并且做错了)我无法使用git克隆生成的repo.我不得不"hg克隆"源hg repo,按照新的hg repo上的步骤,然后git克隆新的hg repo. (3认同)

dub*_*jim 59

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

  1. 安装Mercurial和hg-git扩展.您可以使用包管理器或使用包管理器来执行后者easy_install hg-git.然后确保以下内容在〜/ .hgrc中:

    [extensions]
    hggit = 
    
    Run Code Online (Sandbox Code Playgroud)

    您可能会在bookmarks这里看到一些关于指定扩展名的引用,但是从1.8开始就已经内置到Mercurial中.以下是有关在Windows上安装hg-git的一些提示.

    一旦你有了hg-git,就可以像上面发布的Abderrahim Kitouni一样使用命令.自2009年以来,这种方法已得到改进和调整,并且有一个友好的包装器:git-hg-again.这使用toplevel目录作为Mercurial和Git的工作目录.它创建一个Mercurial书签,它与defaultMercurial存储库中(未命名的)分支的提示保持同步,并从该书签更新本地Git分支.

  2. git-remote-hg是一个不同的包装器,也基于Mercurialhg-git扩展.这另外利用了git-remote-helpers协议(因此得名).它仅将forplevel目录用于Git工作目录; 它保持其Mercurial存储库裸露.它也保持了第二裸Git仓库,使Git和水银更安全,更惯用gitlike之间synching.

  3. 混帐-HG脚本(前身为维护这里)使用不同的方法的基础上,hg-fast-export快速出口项目.与方法2一样,这也保留了一个简单的Mercurial存储库和一个额外的裸Git存储库.

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

    一些评论讨论这个工具只是hg-> git,但它声称已经在2011年12月7日合并了git-> hg push支持.正如我在对这些工具的回顾中解释的那样,这个工具试图实现的方式推动支持似乎不可行.

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

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

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

我鼓励你尝试一下,然后自己决定什么是最好的.我很高兴听到这些工具破裂的情况.我会尽力让他们在与上游的变化同步,并确保上游作者都知道,我认为是有用的调整的.

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

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

  • 我自己使用方法#2,或者更确切地说是我的调整版本.总的来说,在我看来,这是最可靠和最灵活的方法(我试过的方法).有关详细信息,请参阅我的评论/源包的链接. (2认同)
  • 还有[Kiln Harmony](https://news.ycombinator.com/item?id=5362643). (2认同)

syk*_*ora 15

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

你需要安装mercurial.

  • 这将hg repo转换为git repo,非常感谢! (4认同)

Mar*_*ler 9

由于HG-Git是一个2个三通桥,它也可以让你从Git的变更推到水银.


ral*_*nja 6

Hg-Git Mercurial插件.我自己没试过,但可能值得一试.

  • 这是一个插件,允许mercurial用户从git repos推送和拉取,而不是相反,这是OP想要的. (7认同)

Mik*_*nen 6

git-hghttps://github.com/cosmin/git-hg取得了巨大的成功(也需要工作安装hg).它支持fetch,pull和push,对我来说比hg-git(hggit中的类似功能)更稳定.

有关用法示例,请参阅https://github.com/cosmin/git-hg#usage.用户界面非常相似git-svn.

git-hg要求每个克隆的汞回购额外的磁盘空间.该实现使用完整的mercurial clone,一个额外的git bare clone和实际的git repo.所需的磁盘空间大约是正常git使用量的3倍.额外的副本存储在.git工作目录的目录下(或GIT_DIR通常指向的位置).

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

任何工具,声称之间建立可互操作的桥梁git,并hg应说明它是如何去应对这种阻抗匹配.然后,您可以决定所选解决方案是否符合您的需求.

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