如何确认SVN转Git迁移成功?提交数不符问题排查
SVN转Git迁移后提交数不匹配的问题排查
一、先明确:Git提交数≠SVN版本数是正常情况
你之前的理解有误,SVN和Git的版本模型本质不同,两者的提交/版本数没有必然相等的关系,核心原因包括:
- SVN的空版本:如果某个SVN版本没有修改任何文件(仅修改日志、属性,或空提交),Subgit默认不会生成对应的Git提交。
- SVN分支/标签的创建:SVN中创建分支/标签是通过复制目录生成的版本,Git里分支是指针、标签是引用,不需要生成独立提交,这类SVN版本不会被转换。
- 迁移过滤配置:如果迁移时用了
excludePaths配置排除部分路径,或只指定了部分分支迁移,对应SVN版本不会被转换。 - 特殊合并场景:Subgit处理SVN的合并操作时,可能生成额外的Git合并提交,但这种情况较少,更多是前几种情况导致Git提交数更少。
二、裸仓库与克隆仓库提交数差异的原因
裸仓库包含所有分支、标签、隐藏提交的完整历史,统计的是全仓库的提交总数;而克隆仓库默认仅拉取默认分支的提交,其他分支需要手动拉取,所以你统计的是单分支的提交数,两者差异是正常现象。
你可以在克隆仓库中执行git log --all --oneline | wc -l,统计所有分支的提交总数,这个结果会和裸仓库的提交数基本一致。
三、检查Git中是否缺失内容的具体步骤
1. 验证分支/标签映射完整性
- 执行
subgit status查看Subgit的分支映射配置,确认所有需要迁移的SVN分支都已对应到Git分支。 - 列出SVN所有分支:
svn ls <你的SVN仓库地址>/branches,对比Git的全部分支:git branch -a,检查是否有遗漏的分支未迁移。
2. 检查特定SVN版本的迁移状态
- 针对怀疑缺失的SVN版本,执行
subgit find-svn-rev <SVN版本号>,如果返回空,说明该版本未被迁移;如果返回Git提交ID,说明已成功转换。 - 反向验证:用
subgit find-git-rev <Git提交ID>查看对应的SVN版本,确认映射关系是否正确。
3. 分析未迁移的SVN版本内容
- 对未迁移的SVN版本,执行
svn log -v -r <SVN版本号>查看该版本的修改内容,判断是否属于Subgit会忽略的类型:比如空提交、仅修改文件属性、修改的路径在迁移时被排除等。
4. 查看Subgit迁移日志
- 打开Subgit迁移目录下的
subgit/logs/文件夹,查看迁移日志文件,搜索Skipping empty revision、Excluded path等关键字,找到被跳过的版本记录。
5. 验证关键文件的历史一致性
- 挑选几个核心业务文件,在Git中执行
git log -- <文件路径>查看历史,对比SVN中svn log <文件路径>的版本记录,检查是否有缺失的修改版本。
内容的提问来源于stack exchange,提问作者Maryo David
相关产品推荐
相关产品推荐

