svn代码库迁移到git
背景:
公司主要使用git作为代码管理仓库,现需要把部分使用svn管理的代码迁移到git。
需求:
需要保留所有 branches、主干、tags的历史记录。
迁移方法:
使用git官方提供的git svn命令
- 参考链接:官方文档
系统环境:
- OS: macOS 10.13.3
- SVN:1.9.4
- GIT:2.16.2
迁移步骤:
- 获取指定svn代码库涉及的开发同学名单并转换:
svn log $SVN_URL –xml | grep author | sort -u | perl -pe ‘s/.>(.?)<.*/$1 = /‘ > user.txt
user.txt内容如下:
dev1_name =
dev2_name =
因为svn只有用户名,而git需要提供用户名和邮箱,所以我们需要做下用户转换。
修改上述命令得到的user.txt如下:
dev1_name = dev1_name
dev2_name = dev2_name
2. 使用git svn cloned代码库到本地:
git svn clone $SVN_URL –no-metadata –authors-file=user.txt -s
3. 调整本地库目录结构:
cd $project_dir
mv .git/refs/remotes/origin/tags/$tags_name .git/refs/tags/
mv .git/refs/remotes/origin/$branches_name .git/refs/heads/
rm -rf .git/refs/remotes/origin
4. 上传本地库到remote仓库:
git remote add origin $GIT_URL
git push origin –all
git push origin –tags
PS:
- 如果svn历史记录太多,而且并不需要很久之前的版本的话,可以选择从指定版本进行转换。
git svn clone $SVN_URL -r $指定版本:HEAD - 较新版本的git都原生带了 git svn命令,如果你使用的git版本没有此命令,建议升级新版git或者单独安装git-svn命令。
- git clone命令执行时间主要和 原SVN库大小、log多少有关。
- svn迁移git后需要注意git不支持空目录,需要使用在空目录增加隐藏文件来上传,通常使用.gitkeep文件。
- 如果原SVN库结构不是规范的branches、tags、trunk结构
git svn clone $SVN_URL –branches=–tags= –trunk=
如果没有tags的话–tags可以不写,branches同理;subdir写相对路径即可
上面使用的-s参数表示的是–stdlayout适合标准结构的SVN项目。