非标准布局SVN仓库迁移Git时分支重命名失败排查
核心结论
- 不使用
--stdlayout参数的选择是完全正确的:你的SVN仓库不存在标准的trunk/branches/tags三级目录,使用该参数会导致git svn无法正确识别路径,出现拉取内容缺失或报错。 - 你对
-T参数的使用存在路径逻辑偏差,且后续操作没有匹配非标准布局clone后的分支结构,是报错的根本原因。
报错原因拆解
从你步骤4的push输出就能看到问题:push时只创建了origin/trunk这个远端跟踪分支,本地仓库并不存在名为trunk的本地分支,因此执行git branch -m trunk master时会提示找不到对应引用。
出现这个现象的原因是:当你用-T参数直接指定SVN项目的根目录作为trunk路径时,git svn clone完成后不会自动为你创建名为trunk的本地分支,只会保留remotes/origin/trunk的远端跟踪引用,原指南是基于标准SVN布局编写的,默认clone后会生成本地trunk分支,直接套用步骤就会出错。
修正操作步骤
- 清理之前生成的错误临时文件:
rm -rf ~/temp.git ~/new-bare.git - 重新执行clone操作,两种写法都可以,效果一致:
写法一(不需要提前进入SVN项目目录):
写法二(进入project1目录执行):git svn clone file:///<你的SVN仓库根路径> -T project1 --no-metadata --authors-file=authors-transform.txt ~/temp.gitcd <repo root>/project1/ git svn clone file:///<repo root>/project1 -T . --no-metadata --authors-file=authors-transform.txt ~/temp.git - 进入临时仓库,基于远端跟踪分支直接创建本地master分支,跳过不存在的trunk重命名步骤:
cd ~/temp.git git checkout -b master origin/trunk - 按原流程创建裸仓库、推送代码即可:
git init --bare ~/new-bare.git git remote add bare ~/new-bare.git git config remote.bare.push 'refs/heads/*:refs/heads/*' git push bare
后续迁移project2、project3等其他平级项目时,只需要把上述命令里的project1替换成对应项目名,换个临时目录和裸仓库目录重复操作即可。
内容的提问来源于stack exchange,提问作者athanassis
相关产品推荐
相关产品推荐

