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
相关产品推荐
相关产品推荐

