Hg-Git插件:实现Mercurial与Git的无缝协作
概述
Hg-Git是一款专为Mercurial设计的插件,允许开发者直接在Mercurial环境中与Git代码仓库进行交互。通过该工具,用户可以直接从Mercurial客户端推送(Push)或拉取(Pull)Git服务器上的代码,实现跨版本控制系统的协作开发。这一功能为混合使用Git和Mercurial的团队提供了高效的工作流支持。
核心优势
-
无损转换:Hg-Git能够将提交记录(Commits/Changesets)在Git与Mercurial之间无损转换。即使通过Mercurial推送代码,其他Hg客户端拉取时仍能保持节点ID一致性。 -
双向兼容:支持以Git服务器作为协作枢纽,同时服务于Git和Mercurial开发者。 -
书签同步:Mercurial的书签(Bookmarks)会被自动映射为Git的分支(Branches),实现双向同步。
环境要求与安装指南
依赖项
-
Mercurial 6.6及以上:基础版本控制系统。 -
Dulwich 0.21.6及以上:纯Python实现的Git协议库。 -
Python 3.8及以上:运行环境。
建议使用较新版本以获得更好的兼容性和功能支持。
安装步骤
通过pip安装
python -m pip install hg-git
手动安装
-
克隆仓库: hg clone https://foss.heptapod.net/mercurial/hg-git/ cd hg-git
-
本地安装: python -m pip install .
启用插件
在Mercurial配置文件(.hgrc
或hgrc
)中添加:
[extensions]
hggit =
基础操作与实战示例
克隆Git仓库
直接从Mercurial克隆Git项目:
hg clone git://github.com/hg-git/hg-git.git
此命令会将Git仓库转换为Mercurial格式,本地生成对应的Hg仓库。
推送Mercurial仓库到Git服务器
-
在Mercurial仓库的配置文件中添加Git路径: [paths] git-server = git@github.com:yourname/repo.git
-
执行推送: hg push git-server
该操作会将Mercurial的提交记录转换为Git对象并推送到目标仓库。
拉取Git更新
hg pull
此命令会同步Git服务器的最新提交,并在本地生成新的分支头(Head)以便合并。
高级应用:仓库转换与分支管理
将Mercurial仓库迁移至Git
-
初始化Git仓库: mkdir git-repo && cd git-repo git init cd ..
-
在Mercurial仓库中创建书签: hg bookmarks hg
-
推送至Git仓库: hg push ../git-repo
-
在Git中切换主分支: cd git-repo git checkout -b master hg
后续更新时,重复执行hg push
并合并即可。
忽略文件规则
-
若存在 .hgignore
,则优先使用其规则,忽略.gitignore
。 -
若仅有 .gitignore
,则直接采用其规则。 -
注意:Mercurial不支持以 !
开头的排除模式,此类规则将触发警告。
替代方案对比
原生Git扩展(Mercurial 5.4+)
自Mercurial 5.4起内置的git
扩展可直接与Git仓库交互,无需中间转换。
优点:
-
提交ID与Git哈希一致,减少存储冗余。 -
数据仅存储一次,节省磁盘空间。
局限性:
-
无法处理包含“章鱼合并”(Octopus Merge,即多于两个父节点的合并提交)的仓库。 -
不支持与Mercurial仓库交互。
Convert扩展
Mercurial自带的convert
扩展也支持Git仓库转换,但功能较为基础。
Git用户的解决方案
Git开发者可使用git-remote-hg
工具访问Mercurial仓库,实现反向兼容。
社区与贡献
开发与反馈
-
主仓库:托管于Heptapod。 -
讨论渠道: -
邮件列表:hg-git@googlegroups.com -
Matrix群组:#hg-git:matrix.org
-
贡献指南
总结
Hg-Git插件为跨版本控制系统的协作提供了强大的工具链。无论是需要临时访问Git项目的Mercurial用户,还是长期维护混合仓库的团队,均可通过该工具实现无缝衔接。其无损转换特性确保了数据的完整性,而灵活的配置选项则适应了多样化的开发场景。
对于希望进一步探索的读者,可通过hg help -e hggit
和hg help hggit-config
命令查看详细文档。