svn2git/svn-all-fast-export转换SVN仓库时未生成.git目录问题
问题根因
报错核心原因是KDE版svn2git(svn-all-fast-export)默认生成裸Git仓库(bare repository)。这类仓库本身不附带工作区,所有Git内部元数据直接存放在仓库根目录,不会生成标准.git文件夹,自然无法执行git status、git checkout这类依赖工作区的命令。
你手动创建.git目录移动文件后仍报错,是因为裸仓库默认配置core.bare = true,Git不会将其识别为带工作区的普通仓库。另外你的转换规则、前置dump操作没有问题,1分钟完成转换属于svn-all-fast-export的正常速度,分支能正常列出说明提交转换已经成功。
解决方法
二选一即可,优先推荐方案一,不会破坏原始转换产物:
方案一:克隆裸仓库得到可用工作仓库(推荐)
在testrepo目录的上级路径执行命令:
git clone ./testrepo project-workspace
执行完成后进入project-workspace目录,就是带完整工作区的普通Git仓库,所有分支、提交历史、迁移元数据都完整保留,可正常执行所有Git操作,原始testrepo裸仓库可以留作备份。
方案二:直接将裸仓库转为普通工作仓库
如果不想额外克隆占空间,直接在testrepo目录操作:
- 如果你之前手动创建过
.git目录并移动了元数据,先确认objects、refs、HEAD、config这些核心文件/目录都完整放在.git目录下,没有遗漏;如果没移动过文件,先在testrepo根目录手动创建.git文件夹,把所有Git元数据(之前散落在根目录的Git相关文件,不要把新建的.git目录嵌套移入)移到.git目录内。 - 在testrepo根目录执行命令关闭裸仓库标识:
git config core.bare false - 执行检出命令拉取master分支文件到工作区:
git reset --hard master
操作完成后即可正常切换分支、查看状态。
后续迁移优化建议
后续转换其他仓库时,可以在svn-all-fast-export的执行参数里加上--no-bare,直接生成非裸的普通仓库,省去后续转换步骤。生产环境迁移还是建议先生成裸仓库做备份,再克隆出工作副本使用,避免误操作损坏转换好的提交记录。
内容的提问来源于stack exchange,提问作者zemog
相关产品推荐
相关产品推荐

