You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mercurial转Git迁移后如何自动化验证历史完整性?

绝对有靠谱的自动化交叉校验方案,毕竟迁移大项目最怕漏历史,我整理了几个亲测有效的方法,从基础到深度校验都覆盖了:

1. 先做基础提交数比对

这是最直观的第一步,先确认两边的提交总数是否匹配:

  • 在Mercurial仓库里执行:
    hg log --template '{node}\n' | wc -l
    
  • 在Git仓库里执行:
    git log --pretty=format:'%H' | wc -l
    

如果数字一致,说明提交数量没问题,但这只是基础——还要确保每个提交的内容和映射关系都对。

2. 利用fast-export的映射文件做精准校验

fast-export会生成一个hg2git.map文件,里面记录了每个Mercurial节点对应的Git提交哈希。你可以写个简单的脚本遍历这个文件,逐个校验提交的内容完整性:

比如这个bash脚本思路(可以根据自己的需求调整):

#!/bin/bash
while read hg_node git_hash; do
  # 获取Mercurial提交的所有文件哈希
  hg_manifest=$(hg manifest --debug -r "$hg_node" | awk '{print $1 " " $2}')
  # 获取Git提交的所有文件哈希
  git_tree=$(git ls-tree -r "$git_hash" | awk '{print $3 " " $4}')
  
  # 对比两者是否一致
  if [ "$hg_manifest" != "$git_tree" ]; then
    echo "Mismatch found: HG node $hg_node -> Git hash $git_hash"
    exit 1
  fi
done < hg2git.map
echo "All commits content match!"

这个脚本会对比每个提交下所有文件的哈希值,确保内容完全一致。

3. 校验分支与标签的完整性

分支和标签很容易在迁移中遗漏,别忘单独校验:

  • 分支校验:
    Mercurial端:hg branches
    Git端:git branch -a
    确保所有Mercurial分支都在Git里存在,并且分支指向的提交对应映射文件里的哈希。
  • 标签校验:
    Mercurial端:hg tags
    Git端:git tag
    同样,要验证每个标签指向的提交在映射文件里有对应的记录,避免标签挂错位置。
4. 补丁全量对比(终极校验)

如果项目不是特别大,或者你想做最彻底的校验,可以把两边的提交都导出成补丁文件,对比内容:

  • Mercurial导出所有补丁:
    hg export --all > hg-all-patches.txt
    
  • Git导出所有补丁(从根提交开始):
    git format-patch --root > git-all-patches.txt
    

然后对比两个文件,注意忽略一些格式差异(比如Mercurial补丁里的# HG changeset patch头,Git里的From <hash> <date>头),核心看diff内容是否一致。

小提示

如果是超大型项目,建议分分支校验,比如先校验主分支,再逐个校验其他分支,这样即使出问题也能快速定位范围。

内容的提问来源于stack exchange,提问作者andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:28