转载:http://www.scmeye.com/thread-1665-1-1.html

入门
Gerrit简介
Gerrit是一个建立在Git版本控制系统之上,基于Web的代码审查工具,但如果你已经阅读过该指南,那么你可能已经知道了。介绍的目的就是然你回答这个问题,Gerrit是适合我的工具吗?它是否适合我团队的工作流程。
Gerrit是什么?
我假设,如果你正在读这篇文章,并且你已经相信一般的代码评审的好处,但需要一些技术支持是它容易。代码评审,对不同的人意味着不同的事情。对于某些人,是一个一台投影机和整个团队通过一行行代码的正式会议。对于另外的人,是在代码提交之前的浏览代码。
Gerrit提供一个重量轻框架,每次提交被接受合入代码库之前,对进行代码评审。变更上传到Gerrit,但实际上并没有成为该项目的一部分,直到他们已经评审和接受。在许多方面,这是简单的工具,以支持提交的补丁被应用到代码库之前,被该项目的成员评审过标准的开源过程。然而Gerrit进了一步使项目所有提交以确保真正接受之前所有的变更都被检查变的简单。因为Gerrit对于如闭源的商业开发的情况,所有用户都是被信任提交者同样是有用的。无论哪种方式,它仍然是可取的代码评审,以提高代码的质量和可维护性。毕竟,如果只有一个人看过的代码,当人离开后它可能是有点难来维护。
Gerri首先是一个临时存储区域,变更成为一个代码库的一部分之前,可以被检查。它也是这一评审进程的推动者,获取变更的笔记和备注来对变更进行讨论。对于不能面对面交流的分布式团队,这是特别有用的。即使位于同底协作小组有评审工具,作为一个选择也是有益的,因为每次评审对于评审人员是很方便的。允许开发人员创建评审和解释的变更,当他们的想法还很新鲜的时候。如果没有这样的工具,他们要么需要打断别人来评审代码,或者切换内容来解释变更,这时他们已经转移到下一个任务了。
这也创造持久的谈话记录,用来回答不可避免的“我知道我们修改的原因”问题。

Gerrit的适用范围
任何多成员团队都具有某种形式的中心代码库(或他们应该有)。Git可以理论上没有这样的中心库,但在实践中通常有一个中心库。这服务器充当了实际项目的权威副本。中心服务器是允许大家获取和上传代码,一般是构建服务器和其他类似工具获取源。
特性1:中心代码库
Gerrit部署在这个中心库上,并增加了一个额外的概念,存储待定的变更。所有人仍然从权威的库中获取代码,但是推送到待定变更位置来代替直接推送到权威库中。当变更被评审和接受后,才允许提交到权威库中作为项目被接受的一部分。
特性2:代替中心库
像任何库的托管解决方案一样,Gerrit具有强大的访问控制模型。用户甚至可以被授予权限直接推入中心库,完全绕过代码评审。Gerrit甚至可以没有代码评审,只用于管理库和访问控制。但一般只是更简单和更安全通过评审过程,甚至允许用户直接推送。

创建评审
一旦你完成修改并提交到本地,这就是时候推送修改到Gerrit上去评审啦。推送到Gerrit服务器就完成了。因为我们直接从Gerrit克隆到本地仓库的源没有重新定义remote地址。
$ <work>
$ git commit
[master 9651f22] Change to a proper, yeast based pizza dough.
1 files changed, 3 insertions(+), 2 deletions(-)
$ git push origin HEAD:refs/for/master1
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 542 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:2 
remote: New Changes:
remote:   http://gerrithost:8080/68
remote:
To ssh://gerrithost:29418/RecipeBook.git
* [new branch]      HEAD -> refs/for/master
唯一的不同之处是refs/for/master分支。这是一个神奇的分支,创建评审目标的master分支。每一个分支都跟踪有一个神奇推送的refs/for/<branch_name>,来创建评审。你会注意这个命令的输出,正是我们要推送到的Gerrit服务器的HTTP连接地址。我们正是在这个web地址上评审这次提交。我们打开连接看看能看到什么。

特性3:Gerrit代码评审屏幕
Gerrit代码评审的屏幕上就会有人来评审变更。这里看不到太多,你可以看看你的变更的差异,添加一些注释说明你做了什么,为什么,你甚至可以添加一组人评审变更。
评审者可以通过各种方式指导需要评审的变更。Gerrit拥有强悍搜索功能,项目负责人(或其他任何人)找到需要评审的变更。用户还可以通过搜索表达式来设定Gerrit项目设置关注,这样Gerrit会通知他们匹配的变化。

评审变更
评审者的生活始于评审屏幕上的代码。可以有多种方式到达这里,但由于某些原因,他们已经决定将评审这一变更。特别值得注意的是此屏幕上的两个“Need”的行:
* Need Verified
* Need Code-Review
Gerrit默认的工作流程在变更被接受前有两个检查。Code-Review是人的看代码,以确保它符合项目的方针,意图等。Verify检查的是实际代码的编译、通过单元测试等。Verify通常是由一个自动构建的服务器完成,而不是一个人。有一个Gerrit Trigger Jenkins Plugin插件对每一次上传的变更自动构建,并更新相应的verify分数。重要注意的是,Gerrit中Code-Review和Verify的权限是不同,允许这些任务分开。例如:自动的过程可以有Verify权限,但是没有Code-Review权限。因为我们是代码评审者,需要评审代码。要做到这一点,我们可以在Gerrit Web界面上选择合适的方式查看代码,或者完整的文件或者两边差异的试图。在下面的图例中,我们选择了两边差异的试图方式。在这些试图中,你可以通过双击要备注的行上添加备注(或单击行号)。一旦发布这些备注所有人都能查看,允许对变更讨论。

特性4:两边补丁评审
代码评审者最终花了很多时间浏览这些画面,查看和评论这些变更。为了使这个操作尽可能高效,Gerrit有大多数快捷键操作(甚至有些操作只能通过热键访问)。在任何时候,你可以打’?’键关来查看键盘快捷键。
特性5:Gerrit热键帮助
一旦我们检查完变更,我们需要完成提交评审。我们可以在我们初始进入的变更屏幕上点击Review 按钮。这使我们能够输入一个代码评审标签和消息。

特性6:评审变更
评审人员选择的标签,决定了下一步会发生什么。’+1’和’-1’只是一个意见,但是’+2’和’-2’是允许或阻塞变更。为了变更被接受,它必须有最少一个’+2’并没有’-2’。 虽然这些数值,但是他们不能计算;两个+1并不等同于+2。不管什么标签被选中,一旦” Publish Comments ”按钮被点击,封面信息和文件的任何意见所有都用户可见。在这种情况下,变更不被接受,创作者需要返工。因此,让我们的切换角色到我们开始创造者。

变更返工
只要我们设置了Change-Id commit-msg钩子,在我们上传的变化之前,重新工作是很容易。所有我们需要上传返工的变更,推送另一个具有相同Change-ID提交。由于钩子再我们最初的提交中添加了Change-ID,我们可以简单的检出和修改提交。然后以之前创建评审时同样的方式推送到Gerrit上,如下。
$ <checkout first commit>
$ <rework>
$ git commit --amend
$ git push origin HEAD:refs/for/master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 546 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://gerrithost:29418/RecipeBook.git
* [new branch]      HEAD -> refs/for/master
请注意这一次输出略有不同。我们并没有得到一个新的评审记录,因为我们追加到了已存在的评审记录上了。返工提交上传完成,我们可以回到Gerrit界面查看我们的变更。

特性7:评审返工提交
如果你仔细观察,你会发现这个变更有两个patch set,一个最初提交和返工提交。而不是重复我们的操作,假设这次补丁被代码评审人员给了+2。
尝试变更 
Gerrit的默认工作流有两种签收机制,Code Review和Verify。Verify是指检查实际工作的变更。这通常会检查代码编译,单元测试合格及类似检查。项目真的可以决定,他们要在这里做的多或少。这也许没什么价值,这仅仅是Gerrit的默认工作流,Verify检查实际上可以被删除或增加其他验证。正如在Code Review部分中提到,Verify通常是一个自动化过程,使用Gerrit Trigger Jenkins Plugin插件或类似。但有时代码需要手动Verify,或者评审人员需要检查一些实际工作内容或工作原理。这些都需要有人将变更取到他们的开发环境中。Gerrit让这个过程变容易,通过显示每一个变化作为一个git分支。因此,所有的评论人员需要做的是,从Gerrit获取和检出该分支,他们将拥有变化。
我们不需要把这想的太难,如果你看过前面的Gerrit Code Review屏幕屏幕截图,你会发现一个” download ”命令。我们获取变更需要做的就是,是复制粘贴此命令,并运行它在我们的Gerrit检出。
$ git fetch http://gerrithost:8080/p/RecipeBook refs/changes/68/68/2
From http://gerrithost:8080/p/RecipeBook
* branch            refs/changes/68/68/2 -> FETCH_HEAD
$ git checkout FETCH_HEAD
Note: checking out 'FETCH_HEAD'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b new_branch_name

HEAD is now at d5dacdb... Change to a proper, yeast based pizza dough.
这么简单,现在我们的工作副本已经有这个变更了,一起玩。你可能感兴趣 refspec数字意味着什么。
•        第一个68是变更号模100的编号。这个初始数的唯一原因以减少在git仓库内的任何给定的目录的文件数量。
•        第二个68是变更的完整编号。你会发这个编号在Gerrit评审屏幕的URL中。
•        2是本次变更内的patch-set数。在这个例子中,我们上传了一些修正,所以我们希望是第二个补丁集而不是最初被拒绝的。

手动的Verify变更
为简单起见,我们只是要手动Verify变更。Verify的人可以与Code review的人相同也可以是完全不同的人,这真的取决于项目的规模和工作内容。如果你已经有Verify权限,然后当您单击Gerrit Web界面的Review 按钮,你会要求验证得分。
特性8:Verify变更
跟Code review不同Verify检验没有+2和-2,只有成功或者失败,必须有一个+1才允许提交(并且不能有-1)。
Submit变更'
你可能已经注意到,在验证的屏幕截图中,有两个按钮提交比分,” Publish Comments”和” Publish and Submit”。 ” Publish and Submit”按钮始终是可见的,但只满足提交条件才可以生效(例如已经Verify和Code Review过了)。所以这是很方便来张贴评审评分,以及通过点击一个按钮提交变更。如果你这时候只选择发布意见,然后分数将被保存,但变更尚未被代码库接受。在这种情况下,住屏幕上会有一个“Submit Patch Set X”按钮。正如Code Review和Verify,可以通过不同的用户做不同的操作,第三个提交操作可以通过另一组用户控制。
激活Publish and Submit 或者Submit Patch Set X 按钮,将变更合入到主库中,成为项目被接受的一部分。获取git仓库后,这个人会接受这种变化作为主分支的一部分。Fetch git仓库后,会接受变更作为主分支的一部分。

•        默认工作流
Android开源项目(AOSP)使用Gerrit是基于Web的代码审查工具。下面的图片是一个流程图,详细说明一个补丁被写入后会发生什么情况。虽然它可能会有点复杂,下面的步骤大部分是在Web应用程序上进行的。
对于如何安装和使用Gerrit和git的完整说明,请参阅提交补丁页面。

转:Gerrit 学习的更多相关文章

  1. gitlab & gerrit & git & repo & jenkins

    Omnibus GitLab documentation(中文安装说明) 在自己的服务器上部署 GitLab 社区版->较为全面 GIT & REPO & GERRIT (三) ...

  2. Gerrit 系统初探 (已转移到 https://steemit.com/gerrit/@linvictor88/gerrit )

    Gerrit 使用简介        Gerrit,一种免费.开放源代码的代码审查软件,使用网页界面.利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或 ...

  3. 关于OpenStack的学习路线及相关资源汇总

    首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更 ...

  4. git学习(这个我没有整理,是我不断在学习的过程中,自己总结的,对象是我,不过有问题的,我们可以相互交流)

    每次git提交,都会有一个parent指针,指向上一次的commit ,   如果合并,master就和hotfix河道一起,就直接删除hotfix就OK     此时,虽然操作一样,大底层实现不一样 ...

  5. gerrit git使用

    有关git的參考资料 pro git中文版, 最好的git书籍 http://git-scm.com/book/zh 图解git http://marklodato.github.com/visual ...

  6. sourceTree+gerrit管理代码

    第一次接触gerrit,会对这种代码管理方式非常排斥,尤其是习惯了用sourceTree配合git进行代码管理的同学.不爽归不爽,代码还得写,我们的目标是让开发过程爽起来. 关于gerrit的知识,移 ...

  7. TortoiseGit推送代码到Gerrit的过程

    gerrit的安装不在本博客的说明范围中,本博客阐述的是使用TortoiseGit 提交代码到gerrit上的步骤和配置. 一.Git 说明:这个工具只要用来做一个仿真的linux环境,可以执行大部分 ...

  8. CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接

    原文地址https://www.cnblogs.com/kevingrace/p/5651447.html 近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更 ...

  9. Android repo 学习参考

    /*************************************************************************** * Android repo 学习参考 * 说 ...

随机推荐

  1. python开发_tkinter_菜单的不同选项

    python的tkinter模块中,菜单也可以由你自定义你的风格 下面是我做的demo 运行效果: ====================================== 代码部分: ===== ...

  2. Xcode 几个图标解释

    File.让您指定串联图的常规信息. Quick Help.提供有关对象的实用文稿. Identity.让您指定对象的自定类并定义其辅助功能属性. Attributes.让您自定对象的可视化属性. S ...

  3. Python学习笔记(二):条件控制语句与循环语句及常用函数的用法

    总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...

  4. Linux下LoadGenerator的搭建

    前提说明: 测试架构:controller部署在windows操作系统下(windows下安装loadrunner的过程,可以去网上搜下,这里不做解释),loadgenerator部署在linux下. ...

  5. dea工具debug断点红色变成灰色

    没事别瞎点,禁用了断点当然不走了

  6. Major GC 是清理老年代。 Full GC 是清理整个堆空间—包括年轻代和老年代。

    Major GC 是清理老年代. Full GC 是清理整个堆空间—包括年轻代和老年代.

  7. C#编程(十)----------C#预处理器

    原文链接:http://blog.csdn.net/shanyongxu/article/details/46491757 C#中的预处理器指令 #IF 如果 C# 编译器遇到最后面跟有 #endif ...

  8. Arcgis Runtime for andriod 100 Simple marker symbol

    GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); 58 mMapView.getGraphicsOverlays().add(graph ...

  9. Excel向上取整

    CEILING函数语法:CEILING(number,significance)

  10. springboot 启动类CommandLineRunner(转载)

    在Spring boot项目的实际开发中,我们有时需要项目服务启动时加载一些数据或预先完成某些动作.为了解决这样的问题,Spring boot 为我们提供了一个方法:通过实现接口 CommandLin ...