第一步,用 git svn转换成git仓库
第二步,把git仓库提交到git服务器上。
本来是很快乐的事情,然而勇者在买装备的时候遇到了麻烦,在git svn的时候环境出错了,后面补mac迁移踩坑记。我这里先介绍windows。
注意:如果想要保留svn分支和完整的提交记录,需要拿到svn服务器权限,和对应svn用户名和git用户名和邮箱,我这里是以管理员的身份自己在SVNBucket创建的svn项目迁移到自己的git上面的教程,如果没权限或者太麻烦请直接翻到最后面的暴力迁移一句话。
一、准备工作
首先把项目拉下来
svn checkout svn:
在项目目录下创建一个 users.txt 的文件包含像下面这种格式的映射:
schacon = Scott Chacon <schacon@geemail.com>
selse = Someo Nelse <selse@geemail.com>
获得 SVN 使用的作者名字列表,可以运行这个
svn log --xml --quiet | grep author | sort -u | \
perl -pe 's/.*>(.*?)<.*/$1 = /'
作用:将Subversion 用户到 Git 用户的映射
注意:要把users.txt移到要执行git svn clone的目录下,如果创建与svn项目同级的git可以执行
cp users.txt ../
二、使用git svn clone命令拉取svn库
命令:git svn clone svn库地址 --authors-file=users.txt --no-metadata --prefix "" -s 目标文件夹名称
// 我的项目的命令
git svn clone svn://svnbucket.com/candy_girl/candy_test/ --authors-file=users.txt --no-metadata --prefix "" -s candy_test_git
作用:将svn库以git形式拉取下来 --authors-file 指定作者信息转换文件,--no-metadata 去除 git-svn-id 等信息
注意:当你想要将 Git 仓库中的提交镜像回原 SVN 仓库中时,需要保留元数据就不要加 --no-metadata 选项
三、处理tag
for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; done
作用:将svn库的tags目录下的标签目录转换成git的标签
四、处理分支
for b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; done
作用:将svn库的branches目录下的分支目录转换成git的分支
五、处理 peg-revisions (可选)
for p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; done
作用:处理经过分支处理后有些分支的后缀是 @xxx (其中 xxx 是一个数字)
六、删除多余的 trunk 分支(master和trunk重复)
git branch -d trunk
七、给git库添加远程仓库地址
git remote add origin 远程仓库地址
八、推送到远程仓库
git push origin --all
git push origin --tags
也是比较常见的迁移方式,晚上下班前所有人提交之后合并到主干,迁移主干到git,第二天所有人拉git之后再进行开发,如果svn上还有开发中的分支需要持续开发,在git上切一个新的分支,把svn的分支的代码迁移到git分支上,切换分支继续开发。