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

手动安装

  1. 克隆仓库:

    hg clone https://foss.heptapod.net/mercurial/hg-git/
    cd hg-git
    
  2. 本地安装:

    python -m pip install .
    

启用插件

在Mercurial配置文件(.hgrchgrc)中添加:

[extensions]
hggit =

基础操作与实战示例

克隆Git仓库

直接从Mercurial克隆Git项目:

hg clone git://github.com/hg-git/hg-git.git

此命令会将Git仓库转换为Mercurial格式,本地生成对应的Hg仓库。

推送Mercurial仓库到Git服务器

  1. 在Mercurial仓库的配置文件中添加Git路径:

    [paths]
    git-server = git@github.com:yourname/repo.git
    
  2. 执行推送:

    hg push git-server
    

该操作会将Mercurial的提交记录转换为Git对象并推送到目标仓库。

拉取Git更新

hg pull

此命令会同步Git服务器的最新提交,并在本地生成新的分支头(Head)以便合并。


高级应用:仓库转换与分支管理

将Mercurial仓库迁移至Git

  1. 初始化Git仓库:

    mkdir git-repo && cd git-repo
    git init
    cd ..
    
  2. 在Mercurial仓库中创建书签:

    hg bookmarks hg
    
  3. 推送至Git仓库:

    hg push ../git-repo
    
  4. 在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仓库,实现反向兼容。


社区与贡献

开发与反馈

贡献指南

  1. 参考Heptapod的补丁提交指南
  2. 或遵循Mercurial官方的贡献流程

总结

Hg-Git插件为跨版本控制系统的协作提供了强大的工具链。无论是需要临时访问Git项目的Mercurial用户,还是长期维护混合仓库的团队,均可通过该工具实现无缝衔接。其无损转换特性确保了数据的完整性,而灵活的配置选项则适应了多样化的开发场景。

对于希望进一步探索的读者,可通过hg help -e hggithg help hggit-config命令查看详细文档。