从SVN迁移到git有很多方法,最简单的就是使用git包自带的git svn命令(git v1.7及以上)。除此之外还有一些第三方的专门的转换工具如http://www.subgit.com/,https://www.atlassian.com/git/tutorials/migrating-overview/等。但是由于是第三方工具,感觉能不用就不用。
使用git svn命令最经典的就是
$git svn clone --stdlayout --no-metadata -A users.txt svn://hostname/path dest_dir
其中:
--stdlayout就是说你使用的是标准的"trunk/, branches/, tags/" 等标记;
--no-metadata命令是为了不要svn的额外的commit信息(UUID),一般也不需要,所以都带这个参数;
users.txt是把SVN的用户转成git用户的文件,这个文件可以用SVN的命令生成(如果用户很少自己写也可以),文件的形式如下:
svn_user1 = git_user1 < git_user1_mail@xxx.com>
svn_user2 = git_user2 < git_user2_mail@xxx.com>
每行一个user,等号左边是SVN的用户(区分大小写),等号右边就是git的用户,git的用户必须存在用户名和邮箱。如果用户比较多,可以使用下命令创建:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt
然后编辑user.txt为上面的格式。
后面的url就是你的SVN checkout的url,支持的协议有SVN://,http://,https://,(如果你是做的本地服务器用的file:///形式的,有时候是不行的)
dest_dir就是目标git目录了。
其实这个命令是一个合成版本,可以使用它的拆分版,即:
$mkdir dest_dir && cd dest_dir
$git svn init file:///xxxxx/xxxx/xxxx --no-metadata
$git config svn.authorsfile ../users.txt
$git svn fetch
参数和git svn clone是一样的,其实就是git svn的分解版。
如果你的SVN没有其他的branch,到这里就完了。如果有其他的branch,还需要手动创建git的branch迁移。
然后就可以把刚才的git push到远程服务器,当然,只在本地用也是可以commit的,不影响使用。(这是git和svn的一个很大的区别)
参考资料:http://stackoverflow.com/questions/79165/how-to-migrate-svn-repository-with-history-to-a-new-git-repository