Gerrit介绍

article/2025/9/30 11:59:47

谷歌 Android 开源项目在 Git 的使用上有两个重要的创新,一个是为多版本库协同而引入的 repo,这在之前我们已经详细讨论过。另外一个重要的创新就是 Gerrit —— 代码审核服务器。Gerrit 为 Git 引入的代码审核是强制性的,就是说除非特别的授权设置,向 Git 版本库的推送(Push)必须要经过 Gerrit 服务器,修订必须经过代码审核的一套工作流之后,才可能经批准并纳入正式代码库中…


Gerrit 代码审核服务器

首先贡献者的代码通过 git 命令(或 repo 封装)推送到 Gerrit 管理下的 Git 版本库,推送的提交转化为一个一个的代码审核任务,审核任务可以通过 refs/changes/<change-id> 下的引用访问到。代码审核者可以通过 Web 界面查看审核任务、代码变更,通过 Web 界面做出通过代码审核或者打回等决定。测试者也可以通过 refs/changes/<change-id> 引用获取(fetch)修订对其进行测试,如果测试通过就可以将该评审任务设置为校验通过(verified)。最后经过了审核和校验的修订可以通过 Gerrit 界面中提交动作合并到版本库对应的分支中。

在 Android 项目的网站的代码贡献流程图更为详细的介绍了 Gerrit 代码审核服务器的工作流程。

代码审核工作流


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 中。其中nntask-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  

 

转自:http://www.worldhello.net/2010/11/10/2059.html


http://chatgpt.dhexx.cn/article/LVkZoVRg.shtml

相关文章

Git--GUI

前言 上一篇文章简单的分享了Git 的 Bash Here的使用&#xff0c;以及一些Git常用的命令等。本篇文章要分享的内容为Git GUI Here 的使用。 一、GUI GIT官方网站为了解决部分用户通过命令行对git工具使用时的怨声载道的现象&#xff0c;因此推出了一个GIT的可视化工具Git Gui …

GitLab CI介绍——入门篇

本文将会对Gitlab CI进行简要介绍,包括Gitlab Runner,Gitlab CI中的相关概念以及.gitlab-ci.yml的常用配置。 那么,GitLab CI 是什么? GitLab CI 是GitLab内置的进行持续集成的工具,只需要在仓库根目录下创建.gitlab-ci.yml 文件,并配置GitLab Runner;每次提交的时候,…

Gerrit

开发、提交、push、入库流程&#xff1a; repo init -u ssh://gerrit帐号[ip:port/platform/manifest -b 分支名 repo sync -c -f --no-tags -j1 git commit git push origin HEAD:refs/for/分支名 有的可能是这样push的&#xff1a; git push ssh://usernameip:port/path…

CICD详解(八)——gitlab安装与配置

今天继续给大家介绍Linux运维相关知识&#xff0c;本文主要内容是gitlab的安装与配置。 一、安装环境准备 首先&#xff0c;我们先来安装一下Gitlab的依赖包&#xff0c;执行命令&#xff1a; yum install curl policycoreutils openssh-server openssh-clients postfix -y然…

CICD详解(九)——gitlab简单使用

今天继续给大家介绍Linux运维相关知识&#xff0c;本文主要内容是Gitlab简单使用。 一、Gitlab关闭自动注册 在企业生产环境中&#xff0c;我们一般由项目负责人负责创建用户并分配权限&#xff0c;一般禁止员工私自注册用户&#xff0c;以防给项目开发工作带来安全性上的风险…

GitLab -- 简单使用CICD功能

前提&#xff1a; 新建GitLab 项目&#xff0c;可参考我另一篇博客 GitLab -- 创建项目_DGH2430284817的博客-CSDN博客 安装配置好Runner&#xff0c;可参考我另一篇博客&#xff1a; GitLab -- 安装和配置Runner_DGH2430284817的博客-CSDN博客 创建.gitlab-ci.yml 文件&…

Git Gui

目录 1.什么是Git Gui 2. 什么是ssh key 3. git/github生成密钥并通过 第一步&#xff1a;本地电脑配置 1.配置用户名和邮箱&#xff08;如果已经配置&#xff0c;就跳过&#xff09; 2.检查下自己之前有没有已经生成ssh 3.生成(或删除)秘钥 第二步&#xff1a;远程git…

GitLab CI/CD artifacts 属性的配置与使用

😀最新最全的 GitLab CI/CD 全部关键词解析 请查阅该专栏 GitLab CI/CD 关键词 artifacts用于指定在job 成功或失败 时应附加到作业的文件和目录的列表。 作业完成后,工件将被发送到GitLab,并可在GitLab UI中下载 如 artifacts:paths 路径是相对于项目目录($CI_PROJECT…

CI环境搭建-创建git

添加如下配置&#xff1a; 上图说的需每次启动的即下面这个文件&#xff1a; 默认用户名、密码是admin/admin 创建代码仓库&#xff1a; 选择版本库&#xff1a; 使用方法&#xff1a; 1&#xff0c;创建一个文件夹 选择版本库地址&#xff1a; 也可以通过cmd命令来拉取代码&am…

CI持续集成环境搭建(3)--git的安装与搭建

https://blog.51cto.com/superleedo/2057841 1. 安装git *Note:不要用yum安装git&#xff0c; yum源安装git最新版本是1.8.3&#xff0c;该版本太老&#xff0c;之后用git commit 有可能会报错&#xff1a;git: ‘interpret-trailers’ is not a git command. See ‘git --he…

JS 是怎样运行起来的

这里填写标题 1. Js 是怎样运行起来的?1.1. 前言1.2. V8 引擎1.3. CPU 是如何执行机器指令的?1.4. CPU 执行机器指令的流程1.5. V8 引擎的编译流水线1.6. 完整的分析一段 JavaScript 代码是怎样被执行的1.6.1. 初始化基础环境1.6.2. 解析源码生成 AST 和作用域1.6.3. 依据 AS…

bootstrap+javascript制作体重标准计算器

一、表单编辑 使用bootstrap可以快速创建表单样式。needs-validation 可以验证表单&#xff0c;如果验证不通过&#xff0c;表单不会提交&#xff1b; onSubmit"return false;"使得表单提交不会刷新页面&#xff1b; 下方js代码是用来控制表单验证&#xff1b; &l…

如何白嫖world.js、china.js以及各个省的js和json文件

全是干货&#xff0c;看仔细了。 作者在工作中遇到了绘制世界地图的场景&#xff0c;但是由于现在echarts的官网已经不提供地图文件下载了。 所以需要自己找资源&#xff0c;在csdn中用积分下载的资源还是挺多的。 但是碍于个别同学没有积分或者喜欢白嫖&#xff0c;所以这里…

js中?.、??的具体用法

1、?. &#xff08;可选链运算符&#xff09; 在javascript中如果一个值为null、undefined&#xff0c;直接访问下面的属性&#xff0c; 会报 Uncaught TypeError: Cannot read properties of undefined 异常错误。 而在真实的项目中是会出现这种情况&#xff0c;有这个值就…

JS之BigNumber.js 讲解

JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就要使用BigNumber.js这个库。 至于为什么JavaScript会有精度问题呢,可以看https://github.com/camsong/blog/issues/9。简单来说就是因为:JavaScript中所有的数字(包括整数和…

Js运动

JavaScript之Js运动 在我们进行web开发的过程中&#xff0c;为了与用户进行更加友好、有趣的交互&#xff0c;拥有一套完美的运动框架就能轻松解决。 这次就给大家带来Javascript学习中Js运动的编写和注意事项。实现运动的思想很简单&#xff0c;首先对这个元素获取定位&…

更优雅的编写JavaScript,使用这些函数秒变大神

如果你刚接触JavaScript可能你还没有听说过.map()&#xff0c;.reduce()&#xff0c;.filter()。或者听说过&#xff0c;看过别人用过但是自己在实际项目中没有用过。在国内很多开发项目都是需要考虑IE8的兼容&#xff0c;为了兼容很多JavaScript好用的方法和技巧都被埋没了。但…

JavaScript 计算标准体重的公式

判断标准体重 世卫计算方法&#xff1a; 男性&#xff1a;(身高cm&#xff0d;80)70&#xfe6a;标准体重 女性&#xff1a;(身高cm&#xff0d;70)60&#xfe6a;标准体重 标准体重正负10&#xfe6a;为正常体重 标准体重正负10&#xfe6a;~ 20&#xfe6a;为体重过重或…

ping命令显示时间

awk显示ping的时间ping 127.0.0.1 | awk { print $0"\t" strftime("%Y-%m-%d %H:%M:%S",systime()) } 注释&#xff1a;\t //换行字符 $0 //打印整行{print $0 "\t"} //逐行打印 strftime&#xff08;&#xff09;//时间函数。一般配合系统时间函…

Linux Command date 显示时间

Linux Command date 显示时间 文章目录 Linux Command date 显示时间1. 简介2. 参数3. 日期格式4. 实例 1. 简介 命令功能&#xff1a;date 可以用来显示或设定系统的日期与时间。 2. 参数 -d<字符串>&#xff1a;显示字符串所指的日期与时间。字符串前后必须加上双引…