谷歌 Android 开源项目在 Git 的使用上有两个重要的创新,一个是为多版本库协同而引入的 repo,这在之前我们已经详细讨论过。另外一个重要的创新就是 Gerrit —— 代码审核服务器。Gerrit 为 Git 引入的代码审核是强制性的,就是说除非特别的授权设置,向 Git 版本库的推送(Push)必须要经过 Gerrit 服务器,修订必须经过代码审核的一套工作流之后,才可能经批准并纳入正式代码库中…
6.7 Gerrit 代码审核服务器
首先贡献者的代码通过 git 命令(或 repo 封装)推送到 Gerrit 管理下的 Git 版本库,推送的提交转化为一个一个的代码审核任务,审核任务可以通过 refs/changes/<change-id> 下的引用访问到。代码审核者可以通过 Web 界面查看审核任务、代码变更,通过 Web 界面做出通过代码审核或者打回等决定。测试者也可以通过 refs/changes/<change-id> 引用获取(fetch)修订对其进行测试,如果测试通过就可以将该评审任务设置为校验通过(verified)。最后经过了审核和校验的修订可以通过 Gerrit 界面中提交动作合并到版本库对应的分支中。
在 Android 项目的网站的代码贡献流程图更为详细的介绍了 Gerrit 代码审核服务器的工作流程。
代码审核工作流
6.7.1 Gerrit 的实现原理
SSH 协议的 Git 服务器
Gerrit 本身基于 SSH 协议实现了一套 Git 服务器,这样就可以对 Git 数据推送进行更为精确的控制,为强制审核的实现建立了基础。
Gerrit 提供的 Git 服务的端口并非标准的 22 端口,缺省是 29418 端口。可以访问 Gerrit 的 Web 界面得到这个端口。对 Android 项目的代码审核服务器,访问 https://review.source.android.com/ssh_info 就可以查看到 Git 服务的服务器域名和开放的端口。下面我们用 curl 命令查看网页的输出。
$ curl -L -k http://review.source.android.com/ssh_info review.source.android.com 29418
特殊引用 refs/for/<branch-name> 和 refs/changes/nn/<task-id>/m
Gerrit 的 Git 服务器,禁止用户向refs/heads 命名空间下的引用执行推送(除非特别的授权),即不允许用户直接向分支进行提交。为了开发者能够向 Git 服务器提交修订,Gerrit 的 Git 服务器只允许用户向特殊的引用refs/for/<branch-name> 下执行推送,其中<branch-name> 即为开发者的工作分支。向refs/for/<branch-name> 命名空间下推送并不会在其中创建引用,而是为新的提交分配一个 ID,称为 task-id ,并为该 task-id 的访问建立如下格式的引用refs/changes/nn/<task-id>/m ,其中:
task-id 为 Gerrit 为评审任务顺序分配的全局唯一的号码。
nn 为 task-id 的后两位数,位数不足用零补齐。即 nn 为 task-id 除以 100 的余数。
m 为修订号,该 task-id 的首次提交修订号为 1,如果该修订被打回,重新提交修订号会自增。
Git 库的钩子脚本 hooks/commit-msg
为了保证已经提交审核的修订通过审核入库后,被别的分支 cherry-pick 后再推送至服务器时不会产生新的重复的评审任务,Gerrit 设计了一套方法,即要求每个提交包含唯一的 Change-Id,这个 Change-Id 因为出现在日志中,当执行 cherry-pick 时也会保持,Gerrit 一旦发现新的提交包含了已经处理过的Change-Id ,就不再为该修订创建新的评审任务和 task-id,而直接将提交入库。
为了实现 Git 提交中包含唯一的 Change-Id,Gerrit 提供了一个钩子脚本,放在开发者本地 Git 库中(hooks/commit-msg)。这个钩子脚本在用户提交时自动在提交说明中创建以 “Change-Id: ” 及包含git hash-object 命令产生的哈希值的唯一标识。当 Gerrit 获取到用户向refs/for/<branch-name> 推送的提交中包含 “Change-Id: I…” 的变更 ID,如果该 Change-Id 之前没有见过,会创建一个新的评审任务并分配新的 task-id,并在 Gerrit 的数据库中保存 Change-Id 和 Task-Id 的关联。
如果当用户的提交因为某种原因被要求打回重做,开发者修改之后重新推送到 Gerrit 时就要注意在提交说明中使用相同的 “Change-Id” (使用 –amend 提交即可保持提交说明),以免创建新的评审任务,还要在推送时将当前分支推送到refs/changes/nn/task-id/m 中。其中nn 和task-id 和之前提交的评审任务的修订相同,m 则要人工选择一个新的修订号。
以上说起来很复杂,但是在实际操作中只要使用 repo 这一工具,就相对容易多了。
其余一切交给 Web
Gerrit 另外一个重要的组件就是 Web 服务器,通过 Web 服务器实现对整个评审工作流的控制。关于 Gerrit 工作流,参见在本章开头出现的 Gerrit 工作流程图。
感受一下 Gerrit 的魅力?直接访问 Android 项目的 Gerrit 网站: https://review.source.android.com/ 。
Android 项目代码审核网站
Android 项目的评审网站,匿名即可访问。点击菜单中的 “Merged” 显示了已经通过评审合并到代码库中的审核任务。下面的一个界面就是 Andorid 一个已经合并到代码库中的历史评审任务。
Android 项目的 16993 号评审
在该界面我们可以看到:
URL 中显示的评审任务编号为 16993。
该评审任务的 Change-Id 以字母 I 开头,包含了一个唯一的 40 位 SHA1 哈希。
整个评审任务有三个人参与,一个人进行了检查(verify),两个人进行了代码审核。
该评审任务的状态为已合并:“merged”。
该评审任务总共包含两个补丁集: Patch set 1 和 Patch set 2。
补丁集的下载方法是:repo download platform/sdk 16993/2 。
如果使用 repo 命令获取补丁集是非常方便的,因为封装后的 repo 屏蔽掉了 Gerrit 的一些实现细节,例如补丁集在 Git 库中的存在位置。如前所述,补丁集实际保存在 `refs/changes` 命名空间下。使用 `git ls-remote` 命令,从 Gerrit 维护的代码库中我们可以看到补丁集对应的引用名称。
$ git ls-remote ssh://review.source.android.com:29418/platform/sdk refs/changes/93/16993* 5fb1e79b01166f5192f11c5f509cf51f06ab023d refs/changes/93/16993/1 d342ef5b41f07c0202bc26e2bfff745b7c86d5a7 refs/changes/93/16993/2
接下来我们就来介绍一下 Gerrit 服务器的部署和使用方法。
转自:http://blog.ossxp.com/2010/11/2059/
相关推荐
#### 二、Gerrit介绍 Gerrit是一款开源的代码审查工具,基于Git版本控制系统设计。Gerrit提供了强大的功能来支持代码审查流程,包括: - **提交前审查**:在代码合并到主分支之前,先进行审查。 - **更改集管理**...
gerrit平台介绍PPT
下面是Gerrit搭建及权限配置的详细介绍: 安装JDK 在安装Gerrit之前,需要先安装JDK。可以使用压缩包安装或bin包安装。压缩包安装方法是下载JDK的压缩包,解压到/usr/java目录下,然后设置环境变量。bin包安装方法...
本篇文档将详细介绍如何在Gerrit系统中添加新用户,以及后续的相关设置。 首先,我们需要登录到运行Gerrit服务的服务器。通常,这可以通过SSH客户端如SecureCRT完成。登录后,使用普通用户账户登录,然后切换到具有...
要详细了解这些变化,最好查阅官方发布的发行说明,其中会详细介绍每个版本的更新内容和改进。部署 "gerrit-3.5.1.war" 后,团队可以体验这些新特性并根据需要进行配置调整,以适应他们的开发流程。
本文档详细介绍了如何在linux系统下安装ldap、gerrit、gitweb的安装流程。还包括gerrit的ldap认证配置,gerrit+gitweb集成化安装部署流程。
ldap+mysql+gerrit环境搭建,简单介绍如何搭建gerrit代码检视系统
本篇文章将详细介绍每个步骤的配置过程,旨在帮助读者快速搭建一个功能完善的代码服务器。 代码服务器搭建步骤 名词解释 在开始搭建之前,需要了解一些基本概念: * 服务器端(Server):指代码服务器的服务器端...
本文将详细介绍如何在Linux环境中搭建Gerrit服务器。 首先,我们需要准备以下软件包: 1. Gerrit的最新稳定版:可以从Gerrit的官方存储库下载,例如`gerrit-2.8.6.war`。 2. Java开发工具包(JDK):Gerrit依赖于...
本手册主要围绕Gerrit的使用流程展开,从环境搭建、注册秘钥、下载及管理代码库等方面进行了详细介绍。以下将根据提供的文档内容,逐条解析并拓展其中的关键知识点。 #### 一、本地下载与安装最新Git服务 **知识点...
gerrit使用教程 Gerrit是⼀个Git服务器,为托管的Git存储库提供访问控制,并提供Web前端进⾏代码审查。...本资源是Gerrit+简介+安装配置+使用教程合集,里面详细的介绍了gerrit使用,如果有需要的小伙伴可以下载学习。
本文主要介绍了如何使用Repo工具从远端下载镜像,以及如何将这些镜像推送到本地的Gerrit服务器上。过程中涉及到了查询、创建仓库、设置权限、推送分支和tags等关键步骤。通过本文的学习,读者能够掌握如何有效地管理...
以下是关于Gerrit和Repo的详细知识介绍: 1. **Gerrit简介** - Gerrit是基于Web的代码审查系统,支持多用户协作,提供直观的网页界面来查看、评论和批准代码变更。 - 它利用Git的分支模型,允许开发者在本地提交...
本教程将详细介绍Gerrit的主要功能、使用方法以及相关的术语。 ##### 1.1 主要功能 Gerrit的核心功能包括: - **侧边对比视图**:提供一种直观的方式,让用户能够轻松查看代码更改前后的差异。 - **内联评论**:...
文档主要介绍git gerrit repo的基本功能,及搭建流程和代码评审流程
gerrit-rest-java-client, Gerrit代码审查的Java REST客户端 gerrit-rest-java-client 简介Gerrit代码审查工具 REST API的Java实现。仅支持 Gerrit 2.6或者更新版本的( 。旧版本中缺少/不完整的REST API ) 。
本文将详细介绍如何搭建一个完整的Gerrit服务器,包括环境配置、安装步骤以及后续的一些基本操作。 #### 二、环境准备 在开始搭建Gerrit之前,需要确保以下环境已经准备好: - **操作系统**:推荐使用Linux系统...
gerrit操作手册 本手册主要讲解了gerrit的安装、使用以及与git的集成配置,通过apache实现代理访问。下面将详细介绍每个步骤的...本手册详细介绍了gerrit的安装、使用以及与git的集成配置,通过apache实现代理访问。
本文档旨在详细介绍如何利用Gerrit进行自动化脚本的评审过程,包括必要的软件安装、SSH连接初始化、TortoiseGIT的使用以及具体的代码评审流程。 #### 二、软件安装与配置 ##### 2.1 GIT软件安装 - **下载地址**:...