svn迁移至git指南

从SVN迁移至Git

将代码从SVN迁移至Git时,若不关注SVN的历史提交记录,则直接将一份源代码提交至远端Git仓库即可;但对于大多数项目,历史提交则是对团队比较宝贵的记录,若要导出SVN的历史记录,则需要借助Git与SVN是双向桥接的特性,即  git svn1,它允许你使用Git作为连接到SVN有效的客户端,这样你可以使用Git所有本地的功能然后如同正在本地使用SVN一样推送到SVN服务器。

它可以快速的帮你从指定svn中克隆(默认包含所有tags,branches),其中--authors-file可以帮助你解决git与svn的兼容问题(即导入后用户邮箱为不匹配),只需要按如下格式添加svn的用户及邮箱至指定文件(e.g. authors.txt)即可,例如:

当然,你也可以添加指定的命令来完成你的拉取过程,例如 :

--revision 1:HEAD 指定revision的范围

--ignore-paths="^[^/]+/(?:branches|tags)" 忽略所有branch与tags的拉取,更多命令可以参照 git svn1 中内容。

加速你的迁移

git svn clone的执行速度取决于你svn项目的规模以及服役时间的长短,一般项目可以在几十分钟内搞定,但如果是较大的项目,fetch到所有的commits可能需要几小时甚至是几天的时间,这无疑会对迁移会造成一定困扰;在svn迁移至git的过程中,往往并不是所有的tag和branch都是我们需要的,这里也为大家介绍几种踩过坑的方式:

一、直接获取某一分支

svn路径直接指定分支即可,这样最为简单粗暴,好处是拉取后branch直接作为master并保存了所有从这个分支开始的提交记录,缺点是svn中其他分支的信息全部丢失。

二、通过修改git配置文件

我们之前提到的git svn clone命令,其实本质执行了(git svn init 和 fetch)两个步骤,在git svn init的过程中,创建了本地仓库并建立了与svn的映射关系,然后通过git svn fetch拉取svn的commits,我们可以git svn init建立映射后,通过更改$GIT_DIR/config文件中svn的配置,达到缩小分支范围的目的,e.g. 如下配置则将分支范围限定在red和green分支,tags范围则限制在1.0和2.0:

更多参考配置可参考:

git svn config configuration2。

上传至远端仓库

在将svn克隆至本地git仓库时,你会发现本地并未自动创建svn中的branch和tags,而svn的branches和tags显示在了git的远程分支中,如下图所示,究其原理,传送门3给大家:

在svn中,如果你的branch或tag只做发布用,其对应的记录信息对于团队并不重要的话,直接添加远程git仓库并push到master即可。

但若branch或tag中的信息比较重要,你则需要将分支checkout至本地,并push到远端,以免信息丢失;又如果你的团队出于某种原因,已经很久没有在trunk上开发,而一直在branch上开发的话,你又不想在迁移后,存在若干个branch,也尝试直接将branch(事先checkout到本地)覆盖到master。

Tips:  1、如果单次push过程中有超过500M的大文件,推荐走LFS的方式上传即可完美解决。

像SVN一样的代码提交检查(甚至更好)

相信部分团队会利用svn强制关联功能对于check-in会有一些强制约束(例如,不关联需求单或bug单信息则无法提交代码),而针对于本地的commits code平台却难监管,本地提交检测,git hook是一个不错的选择,它提供了各个不同阶段的hook,例如针对commit操作有如下hook(更多的请参考git-hook4):

而本地hook都被存放本地$GIT_DIR中(即.git/hooks),同时也提供了一些例子(shell+perl),当然它也支持python和ruby,接下来以检查是否与tapd关联为例,以一些python代码片段来描述下如何编写本地hook:

1.在.git/hook目录中,将commit-msg.sample重命名为commit-msg,并更改如下内容:

其中$1则为提交信息的临时文件路径。

2.在.git/hook目录中创建commit-msg.py, python脚本中编写对应的验证逻辑,例如下:

若提交不符合规范,则直接提示并本地打回。

依托于本地的hook,我们甚至可以建更多的代码检查放在本地提交代码时,而不是依托各种平台的较长反馈链,例如我们团队,就会在本地提交前运行cpplint并将错误提示给commiter。

文章内附链接如下:

1、 git svn官网:

https://git-scm.com/docs/git-svn

2、 git svn config configuration官网:

https://git-scm.com/docs/git-svn#_configuration

3、传送门官网:

https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80

4、 git-hook官网:

https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

后期我们会根据每个维度陆续写相关的测试文章,如果你有兴趣,请关注我们哦。

原文发布于微信公众号 - 腾讯移动品质中心TMQ(gh_2052d3e8c27d)

原文发表时间:2018-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小狼的世界

Git的深入理解与GitHub托管服务的使用

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间进行区别。这么做的唯一好处就是简单,坏处也不少:有时候会混淆所在的工作目录,一旦弄错...

14830
来自专栏枕边书

linux的“自动化”

linux的“自动化” linux系统的web网站在运营状态时,我们常需要对网站进行维护,例如查看资源剩余并做出响应、日志分割、数据整理,在特定状态执行特定任务...

24890
来自专栏黑泽君的专栏

linux命令 uname -r 和 uname -a 的解释与演示

1、uname -r : 显示操作系统的发行版号 2、uname -a :显示系统名、节点名称、操作系统的发行版号、内核版本等等。

30810
来自专栏韩伟的专栏

可用于集群的开源软件赏:Chef

目前我在腾讯主要负责一个服务器端软件的相关开源项目,所以接下来几天的开源内容是最近工作上积累的一些经验和想法,下图中的内容就是我目前主要的工作内容和一些小小的成...

49560
来自专栏北京马哥教育

让你的Git水平更上一层楼的10个小贴士

最近,我们发表了关于Git基础知识和在团队中使用Git的教程。我们之前讨论的那些命令,已经足够让帮助一个开发者在Git世界里生存了。本篇文章,我们将尝试探索如何...

31750
来自专栏微信公众号:Java团长

分布式之数据库和缓存双写一致性方案解析

首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。

13620
来自专栏java技术学习之道

分布式之数据库和缓存双写一致性方案解析

38130
来自专栏数据和云

墨菲定律:一个参数Drop_caches导致集群数据库实例崩溃

李真旭@killdb Oracle ACE,云和恩墨技术专家 个人博客:www.killdb.com 在墨菲定律里,我们知道,有可能发生的故障就一定会发生,哪怕...

32870
来自专栏python3

python 软件目录结构规范

"设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题。对于这种风格上的规范,一直都存在两种态度:

1.6K10
来自专栏Java架构沉思录

谈谈HTTP状态保持

HTTP协议本身是无状态的,无状态的意思是浏览器发起的每个HTTP请求,对于服务端而言都是彼此独立的,即服务端无法直接通过HTTP协议将用户的多次HTTP请求联...

35060

扫码关注云+社区

领取腾讯云代金券