我在Mac上使用GIT。说够了。我有工具,我有经验。而且我想继续使用它。这里没有战争...
问题总是与互操作性有关。大多数人都使用SVN,这对我来说很棒。Git SVN开箱即用,是一种简洁的解决方案。人们可以继续快乐地使用SVN,并且我不会失去工作流程和工具。
现在...有些人和水星一起来。对他们很好:他们有他们的理由。但是我找不到现成的GIT HG。我不想切换到HG,但是我仍然需要与他们的存储库进行互操作。
你们中有人知道一个简单的解决方案吗?
我在Mac上使用GIT。说够了。我有工具,我有经验。而且我想继续使用它。这里没有战争...
问题总是与互操作性有关。大多数人都使用SVN,这对我来说很棒。Git SVN开箱即用,是一种简洁的解决方案。人们可以继续快乐地使用SVN,并且我不会失去工作流程和工具。
现在...有些人和水星一起来。对他们很好:他们有他们的理由。但是我找不到现成的GIT HG。我不想切换到HG,但是我仍然需要与他们的存储库进行互操作。
你们中有人知道一个简单的解决方案吗?
Answers:
从2012年6月开始更新。当开发人员希望从git端进行工作时,目前似乎有以下方法可实现Git / Hg互操作性:
安装Mercurial和hg-git扩展。您可以使用软件包管理器或通过进行后者easy_install hg-git
。然后确保在您的〜/ .hgrc中包含以下内容:
[extensions]
hggit =
您可能还会在bookmarks
此处看到一些有关指定扩展名的参考,但这是自v1.8起内置在Mercurial中的。以下是有关在Windows上安装hg-git的一些技巧。
有了hg-git后,就可以使用上面类似的命令Abderrahim Kitouni了。自2009年以来,此方法已经过改进和调整,并且有一个友好的包装器:git-hg-again。它将顶级目录同时用作Mercurial和Git的工作目录。它创建一个Mercurial书签,使其与default
Mercurial存储库中(未命名)分支的尖端保持同步,并从该书签更新本地Git分支。
git-remote-hg是一个不同的包装器,也基于Mercurialhg-git
扩展名。此外,这还使用了git-remote-helpers
协议(因此得名)。它仅将顶层目录用于Git工作目录;它保持其Mercurial存储库裸露。它还维护了第二个裸Git存储库,以使Git和Mercurial之间的同步更加安全,并且更像gitlike。
该混帐-HG脚本(前身为维护这里)使用不同的方法的基础上,hg-fast-export
从快速出口项目。与方法2一样,这也保留了一个裸露的Mercurial存储库和一个附加的裸露Git存储库。
对于拉动,此工具将忽略Mercurial书签,而是将每个命名的Mercurial分支导入Git分支,并将默认的(未命名)Mercurial分支导入master。
一些评论将该工具仅作为hg-> git进行了讨论,但它声称已于2011年12月7日合并到git-> hg push支持中。不过,正如我在对这些工具的评论中所解释的那样,该工具试图实现的方式推送支持似乎不可行。
还有另一个名为git-remote-hg的项目。与上面列出的版本不同,该版本不依赖hg-git,而是直接访问Mercurial Python API。目前,使用它还需要git的修补版本。我还没有尝试过。
最后,Tailor是一个在各种不同的VCS之间进行增量转换的项目。听起来这种发展不会积极地继续下去。
这些方法中的前三种看上去很轻巧,足以说服我进行调查。我需要以某种方式对它们进行调整,以使它们在我的设置上运行,然后我看到了一些调整它们以进一步改进它们的方法,然后我进一步调整了它们以使它们的行为彼此相似,以便我可以进行评估他们更有效。然后,我认为其他人可能也希望进行这些调整,以进行相同的评估。因此,我制作了一个源软件包,使您可以安装前三个工具中任何一个的版本。它还应注意安装所需的hg-fast-export
零件。(您需要自行安装hg-git
。)
我鼓励您尝试一下,并自己决定最有效的方法。我很高兴听到这些工具损坏的情况。我将尝试使它们与上游更改保持同步,并确保上游作者意识到我认为有用的调整。
如上所述,在评估这些工具时,我得出的结论git-hg
是,仅可用于从Mercurial中提取,而不能用于推送。
相关地,以下是一些有用的Git与Mercurial之间的比较/翻译手册,在某些情况下,这些手册是针对已经了解Git的用户的:
有一个新的git-remote-hg提供了本机支持:
只需将git-remote-hg复制到$ PATH,使其可执行,就可以了,没有依赖关系(除了Mercurial):
git clone hg::https://www.mercurial-scm.org/repo/hg/
您应该能够将其推入并拉出,就像它是本机Git存储库一样。
当您按下新的Git分支时,将为其为其创建Mercurial书签。
有关更多信息,请参见git-remote-hg Wiki。
git-remote-hg
(即没有.py
后缀)。
#!/usr/bin/env python2
。
您应该可以使用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克隆。从水银中拉出将是:
hg pull
hg gexport
并推向水银:
hg gimport
hg push
(是的,您需要在此工作流程中使用hg,但是您的黑客攻击全都在git中)
PS:如果您对此工作流程有疑问,请提交错误。
git status
致命命令$ git status时出现错误:此操作必须在工作树中运行这是在hg gexport
新克隆的hg存储库中发出了一个之后。如何解决裸存储库? 更新。显然,Rock Burt的建议有效。谢谢
您可以尝试hg2git
,它是python脚本,是快速导出的一部分,可以在http://repo.or.cz/w/fast-export.git中找到它。
您将需要安装Mercurial。
hg-fast-export
运行良好
hg-fast-export
脚本调度到hg2git
。我还没有找到全部。请注意,这些工具仅允许从Hg-> Git进行操作,而不能相反。
Hg-Git Mercurial插件。我自己还没有尝试过,但可能值得一试。
我git-hg
从https://github.com/cosmin/git-hg获得了巨大的成功(也需要工作安装hg
)。它支持fetch,pull和push,并且对我来说比hg-git
(与hg
git 类似的功能)更稳定。
有关用法示例,请参见https://github.com/cosmin/git-hg#usage。用户界面与十分相似git-svn
。
该git-hg
要求每个克隆的汞回购额外的磁盘空间。该实现使用完整的Mercurial克隆,一个额外的Git裸克隆和实际的Git回购。所需的磁盘空间大约是普通git用法的3倍。多余的副本存储在.git
工作目录的目录下(或GIT_DIR
照常指向的位置)。
注意:git-hg
尝试解决的基本问题是git
和hg
功能之间没有1:1映射。最大的问题是git分支和hg未命名分支与hg命名分支和hg书签之间的阻抗不匹配(所有这些看起来都像是git
用户的分支)。一个相关的问题是,hg
尝试将原始命名的分支名称保存在版本历史记录中,而git则默认情况下仅将分支名称添加到模板提交消息中。
任何工具,要求建立可互操作之间的桥梁git
,并hg
应说明它是如何去应对这种阻抗匹配。然后,您可以决定所选解决方案是否符合您的需求。
使用的解决方案git-hg
是丢弃所有hg书签,并将命名的分支转换为git分支。另外,它将git master分支设置为默认的未命名hg分支。
git-hg
仅适用于从汞中拉出,而不适用于推入(请参见我在答案中链接的说明)。您是否找到了可以在两个方向上成功使用它的方法?至于额外的空间,我所熟悉的所有技术都涉及工作目录+一份git db / metadata副本+一份hg db / metadata副本。是的,添加第二个git db / metadata副本确实会占用更多磁盘空间,但是相对而言,它并没有看上去那么糟糕。
git-hg
不适合推送。我修改了我的答案,以使其更清楚地表明push
其不够稳定。
尝试过hggit。为我工作,因为我必须应付git'ers和hg'ers的工作。特别是对于评论,这很棒。
关于该主题的次要问题/警告:
我试图用hg克隆一个稳定的linux内核存储库。这些存储库都保存在git中,并且通常其中包含大量文件。
非常慢。我花了2天的时间来完全克隆和更新工作副本。
hggit
或hg
速度太慢而无法正常使用?
我已经在mutt的hg repo上再次尝试了cosmin的git-hg和abourget的git-hg-a,似乎后面的人很好地遵守了合并的顺序,前者有点随机。您可以从下面的屏幕截图中看到。
从上面可以看到,abourget的git-hg-again的第二张图非常接近原始的hgk图,并且实际上反映了mutt的实际工作流程。
我发现git-hg-again的一个缺点是它没有添加'hg'远程,而是将其所有引用导入为本地标签,git-hg有一个很棒的'hg'远程代表上游hg存储库。
gitk
)应该能够相同地呈现两个历史记录。唯一明显缺失的是hg/stable
abourget版本中的分支。我猜这是Mercurial中命名分支,未修改分支和书签之间的问题。