本文主要介绍如何把项目从svn迁移到git。

迁移

不保留历史记录

如果不需要保留历史记录,那么只要svn checkout干净版本后推送到git仓库即可。

1
2
3
4
5
6
7
8
svn checkout svn仓库路径 本地文件夹名

cd 本地文件夹
git init
git add .
git commit -m "svn迁移到git"
git remote add origin git仓库路径
git push -u origin master

保留历史记录

1
git svn clone svn仓库路径 本地文件夹名 其他参数

如果svn仓库是标准布局可以使用 -s 或者 --stdlayout 参数。
svn仓库不是标准布局,则需要用到 -T, -b, -t 参数。
另外如果只是迁移,建议加上 --no-metadata 参数。

1
2
3
4
5
6
7
8
# 标准布局 trunk branches tags
git svn clone svn仓库路径 本地文件夹名 -s --no-metadata

# 非标准布局 trunk/modX branches/modX tags/modX
git svn clone svn仓库路径 本地文件夹名 -T trunk/modX -b branches/modX -t tags/modX --no-metadata

# 非标准布局,且没有branches、tags
git svn clone svn仓库路径 本地文件夹名 --no-metadata

通过 git log 查看提交者信息,如果不对则参考 FAQ 处理。
后续就是推送到git仓库即可:

1
2
3
git remote add origin git仓库路径
git push -u origin --all
git push origin --tags

FAQ

  • svn external怎么处理?
    转化为git submodule处理:

    1
    2
    3
    
    git submodule add 外部git仓库 当前仓库内相对路径
    # 注意带--recursive参数才能把submodule代码一并拉取
    git clone --recursive git仓库路径
    
  • 提交者的信息不对怎么处理?
    git svn clone时通过 --authors-prog 参数指定转换脚本。示例脚本如下:

    1
    2
    3
    
    #!/bin/sh
      
    echo "$1 <$1@example.com>"
    

参考链接