从SVN迁移到Git(包括SVN历史纪录)【最系统的讲解】

从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 < [email protected]>
svn_user2 = git_user2 < [email protected]>

每行一个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目录了。


这个命令一般都是没问题的。但是就如上面所说,如果SVN是本地服务器有时候就不行了,要么报错,要么只生成一个空的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

你可能感兴趣的:(杂)