本文来自网易云社区
作者:孙有军
前言
目前同步开发有好几个项目,有的采用svn管理,有的采用git管理,一想也知道svn管理的项目都比较老,每次切换工程开发都要改变提交代码的方式。因此就打算把svn管理的项目迁移到git上,其实前面说的都不是重点,重点是svn服务器有时不稳定,所以才打算迁移到git上。
迁移过程
说干就干,问题是之前都没有迁移过啊!这都难不倒我,有万能的google,随便搜索关键字svn迁移到git,随便出来都是一大堆文章,看起来确实没有几步,那就开干吧!
clone代码
很多文章上来第一步就是:
git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --authors-file=userinfo.txt --trunk=trunkprojectname
wtf? 这是啥!后面的参数都是些啥?不得已又翻下一遍找到了上面的参数的解释:
--no-metadata: 就是拉取的时候,不需要拉取svn的metadata信息,这样可以保证提交到git项目比较干净 --authors-file=userinfo.txt: 表示提交的作者映射,将svn中提交记录的作者都映射到新的名字 --trunk=trunkprojectname:表示svn上trunk分支,后面是trunk分支的名称
作者映射
这里我们首先创建一个txt文档来映射所有的提交者, 格式如下:
loginname = Joe User <user@example.com>
如果有多个,那就多行,不需要符号换行:
loginname = Joe User <user@example.com> loginname1 = Jone User <guest@example.com>
将所有的提交者都做一次映射。那我们接着clone代码吧!
--trunk
作者映射创建好了,但是--trunk这个又怎么写?
svn是采用trunk,branches,tags来管理代码的, 如果你的项目是完全按照trunk,branches,tags来管理的,迁移的命令可以写作如下:
git svn clone https://xxxxx/xxxxxx/ --no-metadata --authors-file=userinfo.txt --trunk=trunkname --branches=branches --tags=tags
也可以写作如下:
git svn clone https://xxxxx/xxxxxx/ --no-metadata --authors-file=userinfo.txt -s 这里的-s就相当于上面三个参数的组合,还可以写成--stdlayout
但是我clone的地址只需要迁移其中一个项目,况且我trunk下面还有好几个项目,类似如下:
https://xxxxx/xxxxxx/trunk/android/project1https://xxxxx/xxxxxx/trunk/android/project2
我只需要迁移其中的project1,这里完全不符合--trunk=trunkprojectname,这种情况又怎么办?我是加这参数还是不加这个参数?实践是检验真理的唯一方式,两种情况我都尝试一次,首先输入如下的命令:
git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --no-minimize-url --authors-file=userinfo.txt --trunk=project1 demo
这里的demo是项目迁移下来本地文件夹名称,开始clone输出如下:
Initialized empty Git repository in /Users/doc/Test/Demo/.git/Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/androidW: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/xxxxxxbranch/android' path not foundW: 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
等待许久,执行完毕,去本地Demo文件夹一看啥都没有,妥妥的失败了,这里主要出现了两个错误第一个是默认使用了更高level的url,但是我并不想从更高的url来迁移,第二是输出This may take a while on large repositories,最终结果就是失败了。
我们先来解决第一个问题:
Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/android
可以在命令行加入--no-minimize-url,主要是不缩小输入的地址,加入该命令后我们继续clone,输入的命令变成了如下:
git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --no-minimize-url --authors-file=userinfo.txt --no-minimize-url --trunk=project1 demo
加入参数后,不会才出现Using higer level of URL的错误了,根据提交记录的多少,这个等待时间可能是不确定的,经过良久的等待之后,成功的出现了如下错误:
Initialized empty Git repository in /Users/doc/Test/Demo/.git/W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/xxxxx/branch/android/dev_tv' path not foundW: 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 URL access forbidden for unknown reason: Access to '/xxxxxx/default' forbidden at /Applications/Xcode.app/Contents/Developer/usr/share/git-core/perl/Git/SVN.pm line 179.
既然加了trunk参数不行,那这里就不加这个参数,命令如下:
git svn clone https://xxxxx/xxxxxx/trunk/android/project1 --no-metadata --no-minimize-url --authors-file=userinfo.txt --no-minimize-url demo
再一次长久的等待,真正的是好事多磨,这次终于成功了。其实在这之间还出现了一次错误,就是代码在clone的时候,当迁移到某一初时,出现了name that does not exist in the authors-files,这是是因为userinfo中未列全所有提交者。
push
代码已经clone到本地了,那之后就是push到git上去了。至于怎么在上创建项目啥的,这里就不在赘述了,假设这里已经有给一个远程库地址了,地址如下:
https://xxxx/Sample.git
有了远程库地址,我们就可以将本地的工程push到远程地址,命令如下:
git remote add origin https://xxxx/Sample.git
关联了地址后,最后一步就是将代码给push上去:
git push -u origin master
之后你刷新git,会发现已经有了工程,不过在我这又出现了一次幺蛾子,怎么刷都没有,提交日志显示已经成功,wtf,最后我手动改了一个文件,在提交一次,才将所有东西刷出来。
附录
这里是一个Android项目,采用as打开后,在编译会出现很多额外的文件,我们怎么才能将这些不必要的文件提交到远程呐?手动添加.gitignore文件,将要排除的文件都列入到.gitignore中。
后记
看别人文章本来是想抄一个近道,但是花的时间更长,每个项目管理的方式不一样,所以不是每个方法都通用,只是可气的是,网上每篇文字都大同小异,难道他们的管理方式都一模一样!!
我去搜索官方文档,苦心人天不负,官方文档才是正道。
文章中地址都用xxx来替代了。
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区
相关文章:
【推荐】 Kubernetes 在网易云中的落地优化实践