什么是Gerrit?

  Gerrit 是一个基于 web 的代码评审工具, 它基于 git 版本控制系统。Gerrit 旨在提供一个轻量级框架, 用于在代码入库之前对每个提交进行审阅。‎‎更改将上载到 Gerrit, 但实际上并不成为项目的一部分, 直到它们被审阅和接受。它是标准开源过程的一个简单工具来支持提交补丁程序, 然后由项目成员在应用到代码库之前进行评审。‎Gerrit 首先是一个临时区域, 在提交的代码成为代码库的一部分之前, 可以对其修改进行检查。‎‎

Gerrit适用场景?

  任何具有多个成员的团队都有某种类型的中心源存储库 (或者应该这样做)。Git 可以理论上工作, 没有这样的中心位置, 但实际上通常有一个中央存储库。这是项目中权威内容的副本。这是每个人获取源代码或者推送的源库,, 通常是这里也集成了build服务器和其他一些工具。

figure 1. 通常的

  Gerrit部署在中心库的位置并且添加了新的功能和作用。具体看下图。

figure 2.

Gerrit中一个change的生命周期:使用方法

1、克隆源码到本地

  代码编辑后在本地进行提交,Gerrit没有参与这个阶段,只是标准的修改和git操作。。

2、创建一个review

  一旦你在本地完成commit,就需要把他push到Gerrit,这样才能被review。这就需要git push到Gerrit server。

  从下图中可以看到HEAD被推送到refs/for/master,这是master的的魔幻分支,用于创建review。对于每一个分支,Gerrit都会追踪一个魔幻分支refs/for/<branch_name>。在review视图你可以diff 你的change,也可以加入一些为什么你要这么做的注释,也可以添加一个reviewer的列表。

3、使用同一个change ID重新提交

  经过一次upload会在commit中生成change ID,如果需要把重新修改的change提交到Gerrit,我们只需要在commit msg中加入上次使用的change ID。或者使用git commit --amend命令可以把这次commit的信息与上次的commit合并起来。注意remote返回的信息,显示是Update Changes,而上次是New Changes。如果你再仔细观察,你会在看到2个 patch set 关联到了一个change ID。更新可能是通过判断commit ID识别的,虽然change ID一样,但是git commit --amend会生成不同的commit ID。

If you look closely you’ll notice that there are now two patch sets associated with this change, the initial submission and the rework. Rather than repeating ourselves lets assume that this time around the patch is given a +2 score by the code reviewer.

4、下载和验证change

  正如代码审查部分所述,验证通常是使用Gerrit Trigger Jenkins Plugin或类似程序的自动化过程。但是有时候需要手动验证代码,或者审阅者需要检查某些内容是否有效,或者它是如何工作的。 Gerrit通过将每个更改变为git分支来使这个过程变得简单。 所以所有的评论者需要做的是从Gerrit获取并签出该分支,他们将会有所改变。在review界面可以看到download command,我们所需要做的就是复制粘贴这个命令并在我们的Gerrit checkout中运行它。

遇到的问题

我最近工作遇到了如下问题,公司的开发环境架构是 repo(git)+ gerrit代码审查软件 + CI持续集成服务器,我同步代码到本地,第一次提交代码正常,第二次就有可能出现merge conflict的问题。问题原因在下面的注释里。

情况1

git commit 1  //代码修改第一次完成,commit第一次,commit ID为1。

repo upload  //第一次提交代码到gerrit服务器,正常。gerrit 生成review,change ID 1,下面关联了1个 patch set 1。

git commit 2  //代码修改第二次完成,commit第二次,commit ID为2。

repo upload  //第二次提交代码到gerrit,生成另个一review,change ID 2。其实注意观察这时,change ID会多出一个 patch set 2。

问题:

  结果①:如果两次修改了相同文件的相同位置,就会出现merge conflict错误;

  结果②:修改的内容不同,不会报错。

原因分析:

  change ID 2是基于change ID 1的,因此可以看到它的review界面的dependencies下有change ID 1的链接。而且change ID 1的review界面needed by有change ID 2的链接,change ID 1和change ID 2的关系是merge合并的关系,因此如果对相同位置做了不同的修改,就会报merge conflict错误。注意这里第2次repo upload没有更新change ID 1的信息,因为两次的commit ID相同。

情况2

git commit 1  //代码修改第一次完成,commit第一次,commit ID为1。

git commit 2  //代码修改第二次完成,commit第二次,commit ID为2。

repo upload  //有可能出现 merge conflict 问题

问题:

  结果①:如果两次修改了相同文件的相同位置,就会出现merge conflict错误;

  结果②:修改的内容不同,不会报错。

原因分析:

  这种提交代码的方式,会一次产生两个change ID,也就是gerrit会根据commit ID的个数生成多个change ID。change ID的作用就是用来识别不同的 code review,那为什么gerrit会根据commit ID来进行生成changge ID呢?

  试着回答一下,因为commit msg中包含了change ID的信息,Gerrit会首先查找现存的review中有没有一样的change ID并把把具有相同change ID的commit组成一个 patch set,正如下面的来自Gerrit官方文档描述的那样。

因此情况1与情况2的不同之处是

  情况1会把change ID 1更新,并且生成patch set 2。

  情况2一次生成两个 patch set ,没有更新change ID 1。

参考文章

Gerrit的官网总参考:https://gerrit.asterisk.org/Documentation/index.html#_tutorial

Gerrit的快速介绍:https://gerrit.asterisk.org/Documentation/intro-quick.html

转载于:https://www.cnblogs.com/lvzh/p/9030610.html

gerrit的简单介绍相关推荐

  1. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  2. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  3. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  4. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  5. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  6. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  7. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  8. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  9. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

最新文章

  1. 任艳频 | 竞赛12年纪念文集--后记
  2. 小程序读取富文本mysql存储_微信小程序API 富文本·EditorContext实例
  3. spring配置xml遇到的一些错误,最后修改的版本
  4. 创建简单的xslt transformation
  5. (pytorch-深度学习)通过时间反向传播
  6. python编写网页游戏脚本_[大数据]用Python脚本做一些网页游戏中力所能及的自动化任务 - 码姐姐找文...
  7. Python——迭代器的几个高级用法
  8. centos php管理面板,CentOS Web Panle控制面板PHP Version Switcher
  9. IAR移植FreeRTOS
  10. 从“断臂求生”到一骑绝尘,航运巨头马士基如何利用区块链技术力挽狂澜?
  11. uniapp-小程序与H5压缩图片上传
  12. 彩印包装印刷行业erp-轻松、易用
  13. 金蝶K3系统单据对应ICTemplate表单ID信息
  14. 解决gradle下找不到符号错误
  15. 检查xml写的格式是否正确的方法
  16. 英语社交可以这样说吗?He's fat. 课本说可以!
  17. 二进制文件漏洞挖掘 IDA插件VulFi安装使用
  18. U盘启动安装CentOS Linux系统
  19. tomcat配置url跳转_架构成长之路:还不清楚原理就晚了,Java技术大咖带你手写Tomcat...
  20. MQTT3-常见的MQTT服务器介绍

热门文章

  1. smartbi 移动版报注册失败错误
  2. Vert.x系列(一)--Vert.x介绍
  3. 图像复原matlab心得,基于MATLAB的图像复原的论述
  4. 12:Integer to Roman(数字转为罗马数字)
  5. Gatling:环境搭建、脚本录制、脚本回放、报告查看
  6. 中国电子携手IBM发力环保大数据
  7. 中国为什么没有自己的编程语言?哲学、数学和语言学是关键
  8. Windows系统设置电源模式为平衡时关闭CPU睿频
  9. canvas绘制弧形
  10. 我赌你不懂系列:char占几个字节