SVN迁移到GIT

Posted 163yun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SVN迁移到GIT相关的知识,希望对你有一定的参考价值。

本文来自网易云社区

作者:孙有军


前言

目前同步开发有好几个项目,有的采用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 <[email protected]>

如果有多个,那就多行,不需要符号换行:

loginname = Joe User <[email protected]>
loginname1 = Jone User <[email protected]>

将所有的提交者都做一次映射。那我们接着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 在网易云中的落地优化实践








以上是关于SVN迁移到GIT的主要内容,如果未能解决你的问题,请参考以下文章

SVN如何迁移到Git?

如何同步迁移之后继续在SVN提交的代码到Git

SVN迁移到GIT

SVN迁移到git

聊聊如何从 SVN 迁移源码到 Git 仓库

从svn迁移到git