51

SVN 迁移至 Git 指南

 5 years ago
source link: https://mp.weixin.qq.com/s/gnXoY9M09YycJyhwVVpmIA?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

nInieia.gif

从SVN迁移至Git

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

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

IjAFNfF.png!web

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

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

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

加速你的迁移

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:

fA7j2ib.png!web

更多参考配置可参考:

git svn config configuration 2

上传至远端仓库

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

yqM3IjF.jpg!web

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

MnMN3iY.png!web

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

nANR7fZ.png!web

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

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

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

AvaeMfa.jpg!web

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

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

32aEJnQ.png!web

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

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

FNRFjyA.png!web

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

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

UrIzuaU.jpg!web

文章内附链接如下:

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

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

长按指纹识别图中的二维码,获取更多测试干货分享!将我们公众号置顶  JJzIr2Z.jpg!web 不会漏掉我们的原创干货哦!

mmyqMzA.gif
iIZ7baZ.jpg!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK