从Subversion迁移至Git并转换二进制遗留代码、保留提交历史的方案咨询
这个需求完全可以实现,核心思路是先全量拉取SVN的提交历史到Git,再批量重写所有提交的文件内容,把二进制替换为导出的文本,全程保留所有提交元数据。
操作步骤
1. 拉取SVN完整历史到本地Git仓库
使用git svn工具拉取SVN仓库的所有提交,这一步会完整保留原SVN的提交人、提交日期、提交说明、提交顺序:
# 如果需要做SVN账号到Git作者的映射,提前准备authors.txt文件,格式为: # svn用户名 = Git显示名 <邮箱> git svn clone <SVN仓库地址> --authors-file=authors.txt --no-metadata git-svn-temp cd git-svn-temp
拉取完成后可以先核对几个历史提交的元数据是否正确,没有问题再进行下一步。
2. 批量重写历史,将二进制文件转换为文本
使用git filter-repo工具遍历所有历史提交,对每个提交内的遗留二进制文件执行命令行导出,替换为文本格式:
# 请将命令中的后缀、导出命令替换为你实际的使用场景 git filter-repo --tree-filter ' # 遍历所有后缀为.leg的遗留二进制文件 find . -type f -name "*.leg" | while read bin_file; do # 调用遗留编辑器导出为文本 legacy-editor --export-to-text "$bin_file" "$bin_file.tmp" # 删除原二进制文件,将文本文件替换为原文件名 rm "$bin_file" mv "$bin_file.tmp" "$bin_file" done '
3. 校验结果
重写完成后,随机选择多个历史版本校验:
- 提交人、提交日期、提交说明是否与原SVN记录一致
- 每个版本的文本文件内容是否和对应版本二进制文件导出的内容一致
注意事项
- 提前单独测试遗留编辑器的命令行导出功能,确认所有历史版本的二进制文件都可以被正常导出,不会出现版本兼容导致的导出失败
git filter-repo会直接修改仓库历史,操作前请备份好拉取的git-svn-temp仓库- 如果提交量级很大,该工具的执行效率远高于旧版
git filter-branch,无需担心性能问题
内容的提问来源于stack exchange,提问作者lamcro
相关产品推荐
相关产品推荐

