• 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 <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 在网易云中的落地优化实践

  • 相关阅读:
    UVA 10827 Maximum sum on a torus 最大矩阵和
    UVA 11100 The Trip, 2007 水题一枚
    编程之美2015测试赛 题目1 : 同构
    UVA 10801 Lift Hopping Floyd
    UVA 11389 The Bus Driver Problem 贪心水题
    UVA 11039 Building designing 贪心
    UVA 11636 Hello World! 水题
    poj 3070 Fibonacci 矩阵快速幂
    hdu 1757 A Simple Math Problem 矩阵快速幂
    了解常见的 Azure 灾难
  • 原文地址:https://www.cnblogs.com/163yun/p/9707656.html
Copyright © 2020-2023  润新知