背景:

公司主要使用git作为代码管理仓库,现需要把部分使用svn管理的代码迁移到git。

需求:

需要保留所有 branches、主干、tags的历史记录。

迁移方法:

使用git官方提供的git svn命令

系统环境:

  • OS: macOS 10.13.3
  • SVN:1.9.4
  • GIT:2.16.2

迁移步骤:

  1. 获取指定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:

  1. 如果svn历史记录太多,而且并不需要很久之前的版本的话,可以选择从指定版本进行转换。
    git svn clone $SVN_URL -r $指定版本:HEAD
  2. 较新版本的git都原生带了 git svn命令,如果你使用的git版本没有此命令,建议升级新版git或者单独安装git-svn命令。
  3. git clone命令执行时间主要和 原SVN库大小、log多少有关。
  4. svn迁移git后需要注意git不支持空目录,需要使用在空目录增加隐藏文件来上传,通常使用.gitkeep文件。
  5. 如果原SVN库结构不是规范的branches、tags、trunk结构
    git svn clone $SVN_URL –branches= –tags= –trunk=
    如果没有tags的话–tags可以不写,branches同理;subdir写相对路径即可
    上面使用的-s参数表示的是–stdlayout适合标准结构的SVN项目。