最近在公司接手了几个项目,当初以为接手就接手呗;等到链接发过来之后,发现是通过svn管理的,瞬间有点傻眼了, 好几年没碰svn了;期间以为也只是维护,不想中间遇到临时发版本需求,感觉svn版本管理用起来总是没这么顺心;刚好最近需求清了一波,空出时间来就将几个svn项目都迁移到git管理,顺带记录下。

准备

  1. svn的仓库地址,账号密码

  2. git的仓库地址,账号密码

  3. 准备user信息映射文件(目的是为了保留历史commit对应的用户信息)

可以在checkout到本地的仓库路径下运行下面命令:

1
2
> # svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' > /root/userinfo.txt
>

其中userinfo.txt 为输出的svn提交用户列表信息

将svn项目转变成git项目

执行以下命令:

1
2
> git svn clone [svn仓库地址]  --authors-file=/root/userinfo.txt  --no-metadata [本地存放目录]
>

关联远程分支

切到本地存放项目目录:

1
2
3
4
> git remote add origin [git仓库地址]
> git remote -v
> git push -u origin master
>

至此,项目已经从svn切到git。

其它

  1. 通过as preferences -> version control 可以直接切换当前项目在idea下版本管理方式
  2. 切换git管理方式后,需关联下远程git仓库:
1
2
3
4
5
> git init
> git remote add origin [git地址]
> git pull origin master
> git branch --set-upstream-to=origin/master master
>

这过程可能遇到error: The following untracked working tree files would be overwritten by checkout错误,

解决方式在项目目录下执行以下命令:

1
2
> git clean -d -fx
>

git clean -d -fx表示:删除 一些 没有 git add 的 文件;

git clean 参数

-n 显示将要删除的文件和目录;

-x —–删除忽略文件已经对git来说不识别的文件

-d —–删除未被添加到git的路径中的文件

-f —–强制运行