svn是一款非常简便,易用的源代码管理工具,用了这么多年,对它情有独钟。都说习惯最难改,那为何要搬移到gitlab上呢? 喜欢尝试新东西,前提还是git比较强大,svn有的它都有,svn没有的它也有。

  这次是把公司有7年历史的svn项目搬移到gitlab上,期间各种折腾,有几点原因:

1、第一次使用git。

2、gitlab托管到linux服务器上,对命令不熟悉。

3、跟着前人的路走,以为这样能少走弯路,结果方法没对,没搞懂原理就跟随。

4、svn服务器上很多历史版本已经损毁。

  后来才知道以上问题跟转移库其实没多大关系,刚开始都想的复杂了,接触“新事物”还是需要不断尝试,成功之后总结的步骤:

1、安装工具:Git-1.9.0-preview20140217.exe、Git-1.7.0.2-preview20100309.exe

2、转换现有svn为git库(所谓的克隆),任何一台机器上都可以操作,只要能访问到svn库所在的服务器。

3、登录gitlab;创建项目库;拷贝项目库地址;切换到本地机器将本地克隆好的git库提交到gitlab上的项目库。

  克隆SVN库命令,克隆成功整个任务就已经完成90%了

git svn clone svn_url --authors-file=c:\users.txt 库保存路径

  svn_url:指定你的svn服务器地址, 如:http://×.×.×.×:88/svn/trd/trd_work/Carpa.NET

库路径 : 如:D:\gitclone\CarpaNET(指定克隆库保存路径)

  users.txt:存储svn账号与gitlab上账号的关联性,如下:

VisualSVN Server = wssf2014<zqhym***@gmail.com>
yqdong = yqdong<×××@163.com>
user11 = yqdong<×××@163.com>
yyong = yyong<×××@gmail.com>
msfei = mashifei<×××fei@foxmail.com>............

格式: svn用户名 = git用户名<git用户对应的邮箱帐号>
  注意: svn里面有的账号必须要做关联,否则clone会失败.比如上面的user11找不到是哪个开发人员,也不知道它该对应哪个git账号,那就随便指定一个git账号就行了,这样做的目的其实就是将user11在svn里面的所有提交日志关联到yqdong的git账号下。 转到git之后,原svn账号就无关紧要,各司其职了。
 
  绑定user.txt的意义仅在于,将svn里面的提交者日志,注意是提交者,不是svn里面所有的用户信息都得关联,仅仅是往项目提交过代码的svn账号,将这些svn账号找出来,然后关联到现有的git账号,一旦转到git上之后,每个git用户就能看到自己过去在svn里面提交的日志,绕了这么大一圈,现在明白了吧?
 

通过svn里面的log工具,可以找出svn项目里面所有的提交者,完成上面的user.txt(必须步骤,应该有命令),点击下图的“Show All”之后,按Author排序,就可以很方便的找出所有的提交者,然后做关联。

注意:凡是执行了一次git svn clone命令,不管成功失败,第二次执行该命令前,请删除前一条命令中指定的库路径(避免重复,只要库路径不相同就可以)

如果以上克隆没有遇到问题,那恭喜你已经成功了,不需要进行下一步。

  下一步

问题在于svn_url对应的服务器本身,服务器有6w多条日志,其中部分日志已经损坏,导致整个克隆失败,而一次克隆命令至少要执行一个小时,上面有7年的log日志,是很宝贵的东西,因此无论如何也要想办法把它们抓出来。其实就是想删除1-6w条日志中部分有问题的日志,这样clone时候就不会出现中断的情况,这个方法亲自尝试过,非常之麻烦,不提倡这种做法,google半天没有找到别人的经验,这事反复折腾了Two days.

  后来发现git有合并功能,这下简单了,换了做法,不去纠结svn服务器的问题,只要git svn clone能执行就ok(毫无顾虑),其它事情就跟提交代码到git一样简单。

新步骤:

1、先克隆svn上1~5000版本号,存放到库1;  git svn clone -r0:5000 svn_url --authors-file=c:\users.txt 库保存路径1(不能重复)

2、克隆svn上5010~最新,存放到库2;         git svn clone -r5010:HEAD svn_url --authors-file=c:\users.txt 库保存路径2(不能重复)

3、将库1提交到分支1

4、将库2提交到分支2

5、本地合并分支1、2,合并分支的时候必然会有冲突,而且冲突不少,全部处理就行了,都是历史记录没什么影响。

这样做就跳过了svn上某些版本导致无法克隆的问题,舍弃一小部分日志没影响,要顾全大局。

git库推送图解:

如果安装了工具,还是不能执行git svn clone命令,请乖乖设置环境变量吧!

1、gitlab上创建Group.

2、在group上创建project.

3、copy服务器创建的git项目地址:

4、进入本地库1所在路径,使用GitExtensions工具推送代码,同理操作库2、库3....

5、合并库1和库2分支,最后提交.

gitlab取代svn,势不可挡啊!!!看图!!!

svn搬移到gitlab及使用的更多相关文章

  1. 重构第2天:方法搬移(Move Method)

    现在就重构来说是非常普通的,虽然我们经常会漏掉或忽略一些需要重构的地方.方法搬移,正如所定义的那样,把方法搬移到更适合他的位置.让我们看看下面这一段重构前的代码: 理解:方法搬移,正如所定义的那样,把 ...

  2. hdu3487 伸展树(区间搬移 区间旋转)

    对于区间旋转使用lazy思想就能解决.然后对于区间搬移,先把a-1结点做根,b+1作为它的右孩子,这样ch[ch[root][1]][0]就是区间[a,b],现将他取出. 然后在将当前的树伸展,把c结 ...

  3. poj3580 伸展树(区间翻转 区间搬移 删除结点 加入结点 成段更新)

    好题.我做了很久,学了大牛们的区间搬移.主要的代码都有注释. #include<cstdio> #include<cstring> #include<iostream&g ...

  4. 【Java重构系列】重构31式之搬移方法

    重构第二式:搬移方法 (Refactoring 2: Move Method) 毋容置疑,搬移方法(Move Method)应该是最常用的重构手段之一,正因为太常用而且较为简单,以至于很多人并不认为它 ...

  5. 代码从stepping stone搬移到内存

    为什么要搬移代码?如何搬移代码?arm启动流程回顾:2440:这里我们分析的是从nand flash 启动.2440的启动主要依赖于一个部件(SRAM),又名stepping stone.它的地址为0 ...

  6. 重构改善既有代码设计--重构手法11:Move Field (搬移字段)

    你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段.        动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...

  7. 重构改善既有代码设计--重构手法10:Move Method (搬移函数)

    你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或被后者调用.在该函数最常用引用的类中建立一个有着类似行为的新函数.将旧函数编程一个单纯的委托函数,或是将旧函数完全移除. 动机: ...

  8. Part9---代码搬移不可少

    1.回顾ARM启动流程就可知道需要执行代码搬移 2.代码搬移 1)起点:NAND FLASH,今天的起点是SRAM垫脚石.为什么?因为我们要从nandflash取搬移数据需要先对其进行初始化,二而我们 ...

  9. uboot搬移部分和重定位部分的代码分析

    来看一下搬移部分和重定位部分的代码: relocate: /* 把U-BOOT重新定位到RAM*/          //r0=0; adr r0, _start /* r0是代码的当前位置*/ ld ...

随机推荐

  1. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  2. 一个关于AdaBoost算法的简单证明

    下载本文PDF格式(Academia.edu) 本文给出了机器学习中AdaBoost算法的一个简单初等证明,需要使用的数学工具为微积分-1. Adaboost is a powerful algori ...

  3. js中substring与substr的学习。

    今天在工作的过程中,看到js中两个双胞胎函数.分别是substring与substr.顿时被两个可恶的家伙给迷惑住了,不知道具体有什么作用.. 先来看看substring手册是怎么介绍的. 手册解释的 ...

  4. JavaWeb学习总结-09 JDBC 学习和使用

    一 JDBC相关概念介绍 1.1 数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  5. Docker入门教程(八)Docker Remote API

    Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...

  6. JavaWeb---总结(十)JSP标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  7. 分析setting源代码获取sd卡大小

    分析setting源代码获取sd卡大小 android系统有一个特点,即开源,我们可以得到任何一个应用的源代码,比如我们不知道这样的android代码怎么写,我们可以打开模拟器里面的设置(settin ...

  8. MYSQL数据库的常用数据类型

    列类型 说明 tinyint/smallint/mediumint int(integer)/bigint 1字节.2字节.3字节.4字节.8字节整数,又可分有符号和无符号两种.这些整数类型的区别仅仅 ...

  9. js 实现动态key value(JSON字符串注意事项:key和value都要用双引号,官网指定用双引号)

    1.JSON字符串注意事项:key和value都要用双引号,官网指定用双引号,如下: var mapStr='{"a":"a","b":&q ...

  10. Runner之记计帐项目的典型用户和用户场景

    项目任务:编写日历选择界面和查明细界面(查看某一天的具体收支出状况) 1.背景 ①典型用户 (1)姓名:张云 (2)年龄:17~23 (3)收入:家长给的生活费与自己兼职(1500元/月) (4)代表 ...