Gerrit 使用教程
一、Gerrit简介
Gerrit,一种开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的程序员,可以相互审阅彼此修改后的代码,决定是否能够提交,退回或是继续修改。它使用版本控制系统Git作为底层。
Gerrit 与 Git 区别
- Git 是一种版本控制系统;而 Gerrit 是一种基于 Web 的代码审查软件。
- Git 用于代码的存储和版本控制;Gerrit 用于团队间相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。
理论上Git虽然是一个分布式版本管理系统,不需要中心代码库就能相互同步数据。而在实际的操作过程中,为了方便一个团队的多名开发人员通常需要指定一个确定的代码库用于提交和相互同步代码。所以我们开发团队代码管理一般使用如下结构:
图片
在引入Gerrit代码审核机制后,我们的代码提交和同步的方式发生了变化。
图片
二、工作流程
如果你使用过 git,当我们 git add --> git commit --> git push 之后,你的代码会被直接提交到 repo,也就是代码仓库中。 而 Gerrit 的流程是:
- 程序员编写代码。
- push 到 gerrit 服务器。
- 审核人员,在 web 页面进行代码的审核(review),(可以单人审核,也可以邀请其他成员一同审核)。
- 审核通过(approve)之后。
- 提交(submit)到代码仓库(repo)中去。
android项目的源代码就是使用Gerrit进行管理的,在 Android 项目的网站的代码贡献流程图更为详细的介绍了 Gerrit 代码审核服务器的工作流程。
图片
相信在阅读完上面Gerrit的工作流程图后,大家对Gerrit有个大致的了解,接下来我们将进入实际的操作步骤,细致讲解如何利用Git完成上诉流程。我们已经准备了一个叫Gerrit-Base的测试项目供大家练手。
三、克隆代码仓库
Gerrit仓库提供了HTTP和SSH两种服务供大家从远程服务器获取代码,获取方式可在项目基本信息页面查看。
图片
当然,为个人账户安全,建议选择SSH协议获取代码,使用SSH协议需要配置本机密钥。
$ git clone ssh://[username]@[hostname]:[port]/Gerrit-BaseCloning into Gerrit-Base...
remote: Counting objects: 2, done
remote: Finding sources: 100% (2/2)
remote: Total 2 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (2/2), done.
Checking connectivity... done.
四、创建审查
本步骤操作前默认已完成了创建、删除或修改本地文件,并将修改添加、提交到本地版本库。
$ git statusOn branch master
Your branch is up-to-date with 'origin/master'.Untracked files:(use "git add <file>..." to include in what will be committed)hello_gerrithello_gerrit.cnothing added to commit but untracked files present (use "git add" to track)$ git add .
$ git commit -m "this is a new change"
$ git push origin HEAD:refs/for/master
在初次克隆代码时需要从服务器下载hook脚本用于每次审查自动生成change-id。
$ scp -p -P [port] [username]@[hostname]:hooks/commit-msg Gerrit-Base/.git/hooks/
$ git commit --amend
$ git push origin HEAD:refs/for/master
创建一个审核后,服务器的状态也会发送变化:
图片
五、审查代码
当提交修改成功后,默认情况下项目的所有者、管理员能够指定代码的审核人。指定审核人后,Gerrit会给审核人发送邮件提醒有审核任务。
审核代码的流程:
- 浏览代码增量,并给出注释;
- 浏览完成所有代码,并给出综合评价和评分(-2, -1, 0, 1, 2)。
多人评审后当总分>=2时,表示审核通过,进入下一步的代码验证流程;否则需要提交者返工修改。
图片
图片
这些根据规则的不同,可以进行对应的配置修改,例如不用评分。
六、返工修改
根据上面Gerrit流程图,当代码审核、确认未通过或合并的过程中出现冲突,这个时候就需要返工修改后再提交。
返工流程有三步:
- 获取未通过的代码到本地工作目录;
- 修改代码;
- 再提交审核。
对应的Git命令实现为:
$ git fetch http://[username]@[hostname]/Gerrit-Base refs/changes/35/35/1
$ git checkout FETCH_HEAD... // 修改代码
$ git add <path-of-reworked-file>// amend commit
$ git commit --amend// push patch set
$ git push origin HEAD:refs/for/master
修改后的提交,change-id不会发生变化,而仅仅是patch-id加1。因此对返工后的修改引用为“refs\/changes\/35\/35\/2”。
图片
七、验证、提交修改
新提交的修改,如果已经通过代码审核,下一步流程则是代码验证。验证之前需要代码测试人员先将修改获取到本地,然后对代码进行测试。代码测试后,则投票对本次修改做出评价。
图片
当代码成功通过Review和Verified后,此时这段修改后的代码片段就可以合并到主分支里面去了。
图片
八、常用命令
参考:Gerrit Code Review - Command Line Tools
gerrit ls-projects
显示项目名称列表,每行一个,调用用户帐户已被授予“读取”访问权限。 如果调用者是特权“管理员”组的成员,则会列出所有项目。
ssh -p <port> <host> gerrit ls-projects[--show-branch <BRANCH> …][--description | -d][--tree | -t][--type {code | permissions | all}][--format {text | json | json_compact}][--all][--limit <N>][--prefix | -p <prefix>][--has-acl-for GROUP]
选项说明:
- --show-branch:该命令将显示每个项目的 sha 的分支。该命令可能有多个 --show-branch 参数,在这种情况下,将为每个分支显示 sha。如果用户没有对某个分支的 READ 访问权限或该分支不存在,则-显示存根(40 个符号)。如果用户无权访问项目中的任何分支,则不会显示整个项目。
- --description允许列出项目及其各自的描述。对于文本格式输出,所有不可打印的字符(ASCII 值 31 或更小)都根据 C、Python 和 Perl 等语言中使用的约定进行转义,使用标准序列(如\nand \t),以及 \xNN所有其他语言。在 shell 脚本中,该printf命令可用于取消转义输出。
- --tree:以树状格式显示项目继承。此选项不能与 show-branch 选项一起使用。
- --type:仅显示指定类型的项目。如果未指定,则默认为all. 支持的类型:code:任何可能包含用户文件的项目。permissions:使用--permissions-only标志创建的项目。all:任何类型的项目。
- --format:显示结果的输出格式。text:简单的基于文本的格式。json:描述每个项目的 JSON 对象的映射。json_compact:最小化 JSON 输出。
-
- --all:显示调用用户帐户可访问的所有项目。除了调用用户帐户已被授予“读取”访问权限的项目外,这包括调用用户帐户拥有的所有项目(即使这些项目的“读取”访问权限未分配给调用用户帐户)。
- --limit:将结果数限制为前 N 个匹配项。
- --prefix:将结果限制为以指定前缀开头的项目。
- --has-acl-for:仅显示直接分配了该组访问权限的项目。仅继承该组访问权限的项目未列出。
- 使用此选项,您可以了解在哪些项目上使用了一个组。
gerrit query
Gerrit 的 gerrit query 命令就是要查询 Gerrit 的 changes 数据库。默认,查询结果是根据 changes 的更新时间,由近及远排序。对于有多个 patch set 的 change,默认查询结果只包含最后的 patch set。如果查询结果有很大,则默认只返回有限个查询结果,可以设置 limit:参数指定查询结果包含的 changes 数量。
ssh -p <port> <host> gerrit query[--format {TEXT | JSON}][--current-patch-set][--patch-sets | --all-approvals][--files][--comments][--commit-message][--dependencies][--submit-records][--all-reviewers][--start <n> | -S <n>]<query>[limit:<n>]
选项说明:
- format=TEXT,默认
- format=JSON
- current-patch-set,给出当前 patch set 的信息
- patch-sets,给出所有 patch set 的信息
- commit-message,给出 change 的完整 commit message
- all-reviewers,给出所有 reviewer 的 name 和 email
举个例子:查询某个提交的信息, 可以得到这次提交的,项目名字,owner, uploader,commit 信息,更新时间,code-reviewer,appover等。
ssh -p 29418 {gerrit_server} gerrit query --format=text change:123456 --current-patch-set
其他常用命令:
-
git review:将本地代码推送到Gerrit进行审查。
-
git review -s:设置Gerrit的地址。
-
git review -d :下载Gerrit上的代码变更。
-
git review -m :查看Gerrit上的代码变更。
-
git review -s :提交对Gerrit上的代码变更的评论。
-
git review -R :提交对Gerrit上的代码变更的审批。
-
git review -l :列出Gerrit上的指定仓库的代码变更。
相关文章:

Gerrit 使用教程
一、Gerrit简介 Gerrit,一种开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的程序员,可以相互审阅彼此修改后的代码,决定是否能够提交,退回或是继续修改。它使用版本控制系统Git作为底…...

sudu提权命令账号安全控制(su命令)执行单个命令并返回原用户、执行多个命令并返回原用户、保持当前环境变量、配置文件/etc/sudoers
su命令 su 命令是 Linux 和 Unix 系统中用于切换用户身份的命令。它允许一个用户变成另一个用户并以该用户的权限运行命令或启动新的 shell 会话。 基本语法 su [选项] [用户名] 用途: su[选项][-][用户[arg]…] 将有效用户id和组id更改为user的id。 A merely-im…...
【线性代数】【二】2.7 矩阵的秩
文章目录 前言一、向量组的秩二、矩阵的秩三、矩阵的可逆性与秩总结 前言 在前面的内容中,我们已经陆陆续续地给出了秩的概念。本文可以看成是对以往概念与性质的总结,那专门针对秩进行分析。 一、向量组的秩 在笔记2.2中,我们学习了极大线…...

计算机网络部分基础知识
网络协议的意义 单台主机内部的设备之间需要发送和接收消息,那么和相隔很远的两台主机之间发送消息有什么区别呢?两台主机通过网络发送消息,相当于两个网卡设备之间进行通信,最大的区别在于距离变长了。而距离变长带来的结果就是&…...

WESWOO合作的出海企业(一)
分享一些我们在shopify开发上合作的品牌介绍1. **韶音科技(SHOKZ)**: - WESWOO为韶音科技设计了多个产品页面,如OPENFIT、OPENSWIMPRO等,这些页面展示了产品特点、滑动特效、比较功能等,并通过品牌VI统一&a…...

vue 项目中 使用vxe-grid 表格中给表格的表头设置特殊的格式 , 并且给指定的列文字设置颜色
项目场景: 相关背景: vue 项目中 使用vxe-grid 表格中给表格的表头设置特殊的格式,并为指定的列文字设置颜色 实现方案: 具体实现方法及步骤: 一、给表格的表头设置特殊的格式 实现方式一: :header-row-s…...

基于SpringBoot的企业资产管理系统
TOC springboot117基于SpringBoot的企业资产管理系统 系统概述 1.1 研究背景 智慧养老是面向居家老人、社区及养老机构的传感网系统与信息平台,并在此基础上提供实时、快捷、高效、低成本的,物联化、互联化、智能化的养老服务。 随着科技进步&#…...
ps快捷键,学习
ps快捷键图片变的特别大,归位,ctrl0背景图层锁住 选中图层,点击顶部图层,新建,背景图层,确定,就解开了,想在锁住,在点一次...
python代码模拟服务器实验2:IO多路复用select
实验代码的环境是在windows,和linux是有差别的 在Windows系统上,select模块需要传递特定的对象类型,而不是文件描述符。在Unix-like系统上,文件描述符是一个整数,而在Windows上,select期望得到的是socket对…...
修改ubuntu的终端显示语言为英文,界面保持为中文
修改ubuntu的终端显示语言为英文,界面保持为中文 sudo nano /etc/default/locale LANGzh_CN.UTF-8nano ~/.bashrc 在文件未尾加入下列两行 export LANGen_US.UTF-8 export LANGUAGEen在终端执行 source ~/.bashrc之后提示语言就变成英文了...

重塑园区生态,引领产业智慧化新飞跃
中服云智慧园区平台基于工业物联网平台,在园区场景中集中运用云计算、物联网、大数据、人工智能、数字孪生、边缘计算等新一代信息技术。秉承产业主导、业务主导、效率主导的理念,通过一体化子系统集成、智慧化业务管理、可视化运营分析、人性化客户服务…...

WSL 忘记ubuntu的密码
文章目录 1. 以管理员身份打开 PowerShel2.输入命令 wsl.exe -d Ubuntu-20.04 --user root3.输入命令 passwd username 修改用户密码,username即待重置的用户的名称 1. 以管理员身份打开 PowerShel 2.输入命令 wsl.exe -d Ubuntu-20.04 --user root 注意版本号是自…...
github项目-创建一个新分支
在远程仓库创建一个分支实际上是在本地创建一个分支,然后将该分支推送到远程仓库。这是因为在 Git 中,您不能直接在远程仓库创建分支,而需要先在本地创建分支,然后将该分支推送到远程仓库。 以下是创建并推送新分支到远程仓库的步…...
Java设计模式中介者模式的优势与局限性分析
Java设计模式中介者模式的优势与局限性分析 一、引言 在软件工程中,设计模式是一种经过验证的解决方案,用于解决软件开发中常见的问题。设计模式的使用可以提高代码的复用性、可维护性和可扩展性。中介者模式(Mediator Pattern)…...

一、软件工程概述
软件工程概述 1. 软件的概念和特点2. 软件危机的产生3. 软件工程的概念和发展过程4. 软件工程知识体系与职业道德 1. 软件的概念和特点 软件定义 软件程序数据文档。 软件生存周期 问题定义:要解决的问题是什么?可行性分析:对于上阶段所确定…...
第六天:java设计模式、GUI编程与面向对象设计原则
第六天:设计模式、GUI编程与面向对象设计原则 1. 设计模式概述 设计模式的定义:回顾设计模式的定义,即解决特定设计问题的通用解决方案。常见设计模式:了解并掌握几种常见的设计模式,如单例模式、工厂模式、策略模式…...

解读RPA自动化流程机器人
RPA全称Robotic Process Automation,即机器人流程自动化,基于人工智能和自动化技术,能够将大量重复、规则明确的日常事务操作实现自动化处理,通常被形象地称为“数字员工”。本文金智维将深入探讨RPA的主要价值和应用领域…...

Redis17-服务端优化
目录 持久化配置 慢查询 什么是慢查询 如何查看慢查询 命令及安全配置 内存配置 集群优化 持久化配置 Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议: 用来做缓存的Redis实例尽量不要开启持…...
Web语义化及实际应用
你好同学,我是沐爸,欢迎点赞、收藏和关注!今天一起了解下Web语义化及其应用吧! 是什么? 使用合适的标签、属性,让页面能“说话“,让人和机器都能快速理解网页内容。 为什么? 有…...

Linux系统调试课:CPUFreq 中央处理器频率调节技术
文章目录 一、CPUFreq组成二、用户接口三、设备树配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中央处理器频率调节(Central Processing Unit frequency,CPUFreq)技术可以降低ARM芯片的功耗,例如在系统对任务压力较小时,通过调整处理器工作频率与输入电压的…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...

Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...

VSCode 没有添加Windows右键菜单
关键字:VSCode;Windows右键菜单;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意,实际使用的时候发现 VSCode 在 Windows 菜单栏…...