第一步,用 git svn转换成git仓库

第二步,把git仓库提交到git服务器上。

本来是很快乐的事情,然而勇者在买装备的时候遇到了麻烦,在git svn的时候环境出错了,后面补mac迁移踩坑记。我这里先介绍windows。

注意:如果想要保留svn分支和完整的提交记录,需要拿到svn服务器权限,和对应svn用户名和git用户名和邮箱,我这里是以管理员的身份自己在SVNBucket创建的svn项目迁移到自己的git上面的教程,如果没权限或者太麻烦请直接翻到最后面的暴力迁移一句话。

一、准备工作

首先把项目拉下来

svn checkout svn://svnbucket.com/candy_girl/candy_test/

在项目目录下创建一个 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分支上,切换分支继续开发。

  •