使用svn2git迁移SVN至Git时遇到的仓库同步异常问题
我来帮你梳理这个迁移异常的排查步骤——从你描述的情况看,svn2git已经生成了.git目录且verbose输出显示历史完整,说明核心的SVN历史导入其实已经完成了,只是工作区未检出文件和后续推送环节出了问题,咱们一步步解决:
1. 先检查本地Git分支的状态
首先在/home/myuser/svn2git/目录下执行这条命令,看看仓库里的分支情况:
git branch -a
svn2git默认会把SVN的trunk对应到Git的master(或main)分支,但有时候会把SVN的分支/主干放在remotes/svn/远程分支下,而本地没有检出对应的分支。如果你看到remotes/svn/trunk但本地没有master或main分支,那就是没把远程分支同步到工作区,执行下面的命令检出:
git checkout master # 如果是main分支就换成git checkout main
执行完这条命令后,你应该就能在当前目录看到SVN上的文件了。
2. 确认本地仓库的提交记录是否存在
就算工作区没文件,也可以先确认迁移的历史是否真的导入成功了,执行:
git log --oneline
如果能看到一串SVN的历史提交记录,那说明迁移完全没问题,只是工作区没同步;如果这里看不到任何提交,那大概率是你执行svn2git时的命令参数有问题——比如指定的SVN仓库路径不对,或者没适配你的SVN仓库结构。
3. 检查svn2git的迁移命令是否正确
如果上面的git log看不到提交,得回顾你用的svn2git命令:
- 如果你的SVN仓库是标准的
trunk/branches/tags结构,正确命令应该是:svn2git https://你的SVN仓库地址 --verbose - 如果你的SVN仓库没有标准结构(比如文件直接在根目录下),必须加上
--no-minimize-url参数,否则svn2git可能会识别错路径:svn2git https://你的SVN仓库地址 --no-minimize-url --verbose
要是你只迁移SVN里的某个子目录,也要确保路径指定准确,别不小心迁移了空目录。
4. 解决推送后远程仓库为空的问题
如果已经检出了本地分支,但推送后远程仓库还是空的,要么是没关联远程仓库,要么是没把本地分支推上去,执行下面的命令:
# 先关联你的Git远程仓库(如果还没关联) git remote add origin https://你的Git仓库地址 # 把本地分支推送到远程,并设置关联 git push -u origin master # 分支名换成你实际用的main或者其他
这样就能把本地的所有历史提交同步到远程Git仓库了。
5. 强制同步工作区与仓库状态
如果检出分支后还是看不到文件,试试强制重置工作区到当前分支的最新状态:
git reset --hard HEAD
这个命令会把工作区的文件完全同步到当前分支的最新提交,确保没有遗漏的未检出文件。
内容的提问来源于stack exchange,提问作者Pravi

