很多公司都会碰到SCM工具转变的问题,时下git是最热门的SCM工具。
下面简单总结我在实施项目由svn转git的实际操作。
这里我们托管git的服务器用的是gitlab。
git提供一条非常有用的命令叫做 git svn, 它基本上就可以满足你完成svn转git的核心工作。git的最新版本都已经自带有git-svn功能可以直接用。
1. 首先在gitlab上创建一个project,权限管理和项目设定这里不展开了。
2. 得到SVN提交用户列表。因为SVN仅简单地列了每个提交的用户名,但是git的提交信息更丰富,最简单的git提交也必须有用户名和email地址。下面这条命令可以帮助你取到svn仓库所有的提交用户列表(user.txt)。
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > user.txt
3.修改提交用户列表,修改编辑每一行,如下例子:
shyingsheng = shyingsheng <shyingsheng>
变成:
shyingsheng = shyingsheng <shyingsheng@example.com>
4. clone svn仓库
git svn clone -T trunk <SVN REPO URL> --username=<svn account> --ignore-paths="^(?:pub|installer|intermediate|framework)" -r 90441:HEAD -A user.txt trunk
我所用到的参数说明:
-T trunk是指仅仅clone trunk一条分支
--username=<svn account>是指用哪个账号执行git svn命令,这个账号必须有svn仓库的clone权限
--ignore-paths="^(?:pub|installer|intermediate|framework)"是指在转换时,忽略掉svn的pub|installer|intermediate|framework这些目录
-r 90441:HEAD是指从90441这个commit开始到HEAD,比90441老的commit全部丢弃
-A user.txt 是指用户账号清单,必须是svn和git两个系统中都存在的用户集合
5. 转换svn:ignore属性到.gitignore
git svn show-ignore > .gitignore
6. 上传到gitlab
git remote add origin <gitlab REPO URL>
git push origin master
7. 如果在转换阶段svn上又有提交的时候可以同步到git上
git svn fetch
git merge remotes/trunk #如果有冲突解决冲突,并且git commit
git push origin master
8. 当然如果你仓库里一些代码脚本hardcode了svn相关东西,请做相应修改。还有你的Jenkins CICD 工程
至此,完成一个svn仓库到git的转换。
references:https://john.albin.net/git/convert-subversion-to-git