需求
工作里打算将代码从svn迁移到git,但svn毕竟用了一段时间,提交记录、tag、release等信息希望还能继续保留。
方案
git官方本身就给了一个教程,参见: Git与其他系统-迁移到Git
教程本身就交代了前因后果,我就不再赘述,基本按照流程走就可以,我这里只是说下我的步骤以及遇到的坑。
准备users.txt文件
我直接手写的,毕竟提交人不算多,也可以执行官方提供的命令:
svn log ^/ --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt
准备好users.txt之后,执行git svn clone命令
输入git svn clone命令后,在windows上后依次弹出3个输入框,依次输入:
– windows用户验证框:输入windows登录密码
– svn用户名
– svn密码
输入后等待即可。
我执行的命令如下:
git svn clone svn://xxx.xxx.xxx.xxx/yyy/ –no-metadata –authors-file=users.txt –no-minimize-url -s xxx
git网页上给的命令,有提到--no-metadata
是去掉svn的元数据,但如果不加入--no-minimize-url
命令,git svn clone这条命令可能会去扫描更上层的svn目录。会有类似这样的提示信息:
Initialized empty Git repository in /Users/doc/Test/Demo/.git/ Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/android W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/xxxxxxbranch/android' path not found W: Do not be alarmed at the above message git-svn is just searching aggressively for old history. This may take a while on large repositories ^Cecked through r290000
我记得如果你没权限的话会报错。保险起见,还是在命令行加入–no-minimize-url参数吧,主要是不缩小输入的地址。
报错:Author: xx not defined in users.txt file
如果你输入的authors.txt中用户映射没列全、svn的用户有遗漏,可能有如下报错:
Author: xx not defined in users.txt file
此时记得修改authors.txt文件,删除整个文件夹,重新执行git svn clone命令。
注意
- 请在一个空白的、没有与git或是svn关联的文件夹(最好就是新建一个文件夹)中执行git svn clone这条命令,否则操作结果可能比较怪,我一开始没留意,在一个git库中执行这命令,结果有点奇怪,就不多提了。
- 这条命令的执行时间依赖于你的svn版本库内容的多寡,比如我迁移的svn大概用了半年多吧,提交记录、tag比较多,结果执行git svn clone这条命令大概执行了3个多小时……执行该命令时确保网络状况良好,然后你就可以去做别的事情了
git svn clone执行结束、没报任何错误的话,你会在你指定的文件夹内看到你想迁移的svn代码。接下来,按照git给的说明,继续执行后续命令,基本就没啥坑了,汇总命令列表见下面汇总
。
汇总
- 准备users.txt文件
- 准备好users.txt之后,执行git svn clone命令
- git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag “$tagname” “tags/$tagname”; git branch -r -d “tags/$tagname”; done
- git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch “$branchname” “refs/remotes/$branchname”; git branch -r -d “$branchname”; done
- git remote add origin xxxx 这里需要写上你自己的git远端地址,比如gitlab上你创建的项目地址
- git push origin –all
- git push origin –tags
基本流程就这样,还是比较简单的