分支名称含空格导致SVN转Git迁移失败的解决求助
解决SVN带空格分支导致的svn2git/git svn迁移失败问题
首先咱们得揪出问题根源:SVN里的分支名VS2010 Port带空格,被Git自动URL编码成VS2010%20Port,svn2git在解析这个引用时出现格式错误,直接打断了迁移流程。你之前的尝试要么没彻底清理残留的错误引用,要么忽略分支的规则没写对,才会出现“只有.git文件夹、无代码文件”的尴尬情况。下面给你两个可行的解决路径:
路径一:修复svn2git迁移
彻底清理旧仓库
先把之前生成的Git仓库整个删掉,避免残留的隐藏pack文件、引用缓存干扰后续操作——之前你删除分支后重新运行,但可能还有没清干净的遗留数据,从头开始最稳妥。精准忽略编码后的分支
重新运行svn2git时,--ignore-refs要匹配Git里实际存储的编码后分支名,而不是SVN里的原始空格名:
svn2git https://my/svn/url --verbose --authors authors.txt --ignore-refs 'refs/remotes/svn/VS2010%20Port'
注意:之前用--exclude是针对SVN的路径规则,不是Git的引用,所以没生效;这次用--ignore-refs直接指定要跳过的Git远程引用,就能精准避开那个有问题的分支。
路径二:用git svn clone完成迁移(推荐)
如果你打算换用git svn,这是更可控的方案,关键是要正确指定SVN布局+精准排除问题分支,绝对不能误删主干代码:
- 标准SVN布局的克隆命令
如果你的SVN仓库是标准的trunk/branches/tags结构,用下面的命令:
git svn clone https://my/svn/url \ --trunk=trunk \ --branches=branches \ --tags=tags \ --authors-file=authors.txt \ --ignore-refs='^refs/remotes/svn/VS2010%20Port$' \ --verbose
--trunk/--branches/--tags:明确告诉git svn你的SVN目录结构,这是避免“无代码文件”的核心——之前可能没指定布局,导致git svn找不到主干代码。--ignore-refs:用正则^$精确匹配那个编码后的分支引用,确保只排除它,不会影响主干和其他正常分支。
非标准SVN布局的调整
如果你的SVN分支不在branches目录下,比如在project/branches,就把--branches=project/branches对应修改,同理调整trunk和tags的路径。后续转换分支和标签
git svn克隆后,分支和标签会以远程引用的形式存在,需要转换成标准的Git分支和标签:
- 转换分支(跳过问题分支):
for branch in $(git branch -r | grep -v 'VS2010%20Port' | grep -v 'tags'); do git branch "${branch#svn/}" "$branch" done - 转换标签:
for tag in $(git branch -r | grep 'tags/'); do git tag "${tag#svn/tags/}" "$tag" git branch -r -d "$tag" done
关键注意点
- 确保
authors.txt格式正确:每行是SVN用户名 = Git用户名 <邮箱>,比如john_doe = John Doe <john.doe@example.com>,避免迁移时作者映射出错。 - 如果还是出现无代码的情况,立刻检查SVN布局参数是否正确——git svn默认假设标准布局,如果你的仓库结构特殊,必须手动指定trunk/branches/tags的路径。
内容的提问来源于stack exchange,提问作者Fizz
相关产品推荐
相关产品推荐

