盒子
盒子
文章目录
  1. 准备
  2. 转换
  3. 迁移

将svn迁移至git

自己用Git很长时间,它的分支实在是太用好,自己甚是喜欢。这个世界不是完美的,还有一些公司会是其他的版本控制系统。新公司目前使用的是SVN,好在也有计划迁移至Git。对于SVN的迁移并不是什么难事儿,Git早已为我们想好了。

Git非常好的一个特性就是提供了git svn,它可以实现SVN和Git的双向桥接。它可以让你把Git作为一个SVN服务的客户端,这样就可以在本地使用Git的各种功能,然后把代码推送到SVN。当然也可以使用它来做SVN的迁移。我把整个迁移过程分为三个阶段:准备极端、svn库转换阶段、迁移阶段。

准备

保证本地环境已经包含Gitgit svn,默认情况下git svn是没有安装,因此首先第一步要做的安装它,OS X下执行:

1
brew install git svn

其他系统Google一下也很容易找到安装方法。另外由于svngit的提交的用户记录方式不同,保证转换过来的Git库的用户记录一样,因此需要先导出用户信息。创建一个users.txt文件,然后执行下面命令:

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

上面通过svn的命令得到xml格式的日志文件,然后过滤出用户信息并且排序,并保证写入文件的格式。修改users.txt文件,保证是如下格式:

1
2
schacon = Scott Chacon <schacon@geemail.com>
selse = Someo Nelse <selse@geemail.com>

转换

准备好环境就可以开始把SVN库转换为Git库。SVN版本库的标准目录结构是/trunk、/branches、/tags,若版本库是标准的目录结构,则执行:

1
2
git svn clone --stdlayout --authors-file=users.txt
svn-repo my_project

若是非标准的目录结构,则还需要指定对应的目录,如:

1
2
3
git svn clone --trunk=/trunk --branches=/branches
--branches=/bugfixes --tags=/tags --authors-file=users.txt
svn-repo my_project

如果希望导出的Git库不包含SVN的一些配置信息,则可加上参数--no-metadata。接下来是一些额外处理,清理tag的配置:

1
2
cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
rm -Rf .git/refs/remotes/origin/tags

refs/remotes目录下的references信息移到本地分支下面:

1
2
cp -Rf .git/refs/remotes/* .git/refs/heads/
rm -Rf .git/refs/remotes

这样svn库到git库的转换基本就算完成了。

迁移

其实把转换版本库不难,难的是从SVNGit的这样一个过程。因为GitSVN的差别还是比较大的,如何适应Git库以及用好它,用何种方式的工作流是难点。上面转换完成后,我们可以继续使用git svn把修改提交到SVN中央仓库,也可以添加远程的Git库直接push。这取决目前团队的情况,若团队大部分人早已熟悉Git,那么转换完成之后就添加远程的Git库,然后push停用SVN中央仓库。

支持一下
扫一扫,支持forsigner