如何正确迁移分支根目录在子文件夹的SVN仓库至Git
解决SVN分支根目录为子文件夹的Git迁移问题
核心问题
你的SVN仓库中,trunk包含Folder1、Folder2等顶层目录,但分支BranchA基于trunk/Folder1创建,迁移到Git后,BranchA的内容直接显示为sub1.1、sub1.2等子目录,丢失了Folder1的层级结构,无法与trunk的目录结构对齐。
方法一:迁移时通过规则配置直接修正(推荐)
如果使用svn2git,可通过自定义规则文件,将分支内容映射到对应子目录下,确保目录结构与trunk一致。
- 创建规则文件
rules.txt,内容如下:
match /trunk/ rewrite /trunk/(.*) /$1/ match /branches/BranchA/ rewrite /branches/BranchA/(.*) /Folder1/$1/ # 如有其他类似分支,添加对应的match和rewrite规则 match /tags/ rewrite /tags/(.*) /$1/
- 规则说明:将
trunk内容直接映射到Git根目录;将BranchA的所有内容映射到Git的Folder1目录下,与trunk结构匹配。
- 执行迁移命令(替换为你的SVN仓库地址和用户映射文件):
svn2git http://your-svn-repo-url --rules rules.txt --authors authors.txt
方法二:迁移后重写分支历史修正
如果已完成基础迁移,可通过git filter-repo(替代老旧的git filter-branch)重写分支历史,补全目录层级:
切换到目标分支:
git checkout BranchA重写该分支的所有提交,将所有文件移动到
Folder1目录下:git filter-repo --to-subdirectory-filter Folder1若有其他类似分支,重复上述两步操作。
将修正后的分支推送到Git远程仓库(重写历史后需强制推送):
git push origin BranchA --force
注意事项
- 两种方法都会修改提交历史,迁移前务必备份SVN仓库和临时Git仓库。
- 若有多个非根目录分支,需为每个分支添加对应规则或执行重写操作。
- 无需双向同步的情况下,完成修正后即可直接使用Git仓库,无需保留
git svn关联。
内容的提问来源于stack exchange,提问作者Adrian Maire
相关产品推荐
相关产品推荐

