Gerrit 使用教程

news2024/9/21 23:09:19

一、Gerrit简介

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

Gerrit 与 Git 区别

  • Git 是一种版本控制系统;而 Gerrit 是一种基于 Web 的代码审查软件。
  • Git 用于代码的存储和版本控制;Gerrit 用于团队间相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。

理论上Git虽然是一个分布式版本管理系统,不需要中心代码库就能相互同步数据。而在实际的操作过程中,为了方便一个团队的多名开发人员通常需要指定一个确定的代码库用于提交和相互同步代码。所以我们开发团队代码管理一般使用如下结构:

图片


在引入Gerrit代码审核机制后,我们的代码提交和同步的方式发生了变化。

图片

二、工作流程

如果你使用过 git,当我们 git add --> git commit --> git push 之后,你的代码会被直接提交到 repo,也就是代码仓库中。 而 Gerrit 的流程是:

  1. 程序员编写代码。
  2. push 到 gerrit 服务器。
  3. 审核人员,在 web 页面进行代码的审核(review),(可以单人审核,也可以邀请其他成员一同审核)。
  4. 审核通过(approve)之后。
  5. 提交(submit)到代码仓库(repo)中去。

android项目的源代码就是使用Gerrit进行管理的,在 Android 项目的网站的代码贡献流程图更为详细的介绍了 Gerrit 代码审核服务器的工作流程。

图片

相信在阅读完上面Gerrit的工作流程图后,大家对Gerrit有个大致的了解,接下来我们将进入实际的操作步骤,细致讲解如何利用Git完成上诉流程。我们已经准备了一个叫Gerrit-Base的测试项目供大家练手。

三、克隆代码仓库

Gerrit仓库提供了HTTP和SSH两种服务供大家从远程服务器获取代码,获取方式可在项目基本信息页面查看。

图片


当然,为个人账户安全,建议选择SSH协议获取代码,使用SSH协议需要配置本机密钥。

$ git clone ssh://[username]@[hostname]:[port]/Gerrit-Base


Cloning 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 status


On 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_gerrit
    hello_gerrit.c


nothing 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会给审核人发送邮件提醒有审核任务。

审核代码的流程:

  1. 浏览代码增量,并给出注释;
  2. 浏览完成所有代码,并给出综合评价和评分(-2, -1, 0, 1, 2)。

多人评审后当总分>=2时,表示审核通过,进入下一步的代码验证流程;否则需要提交者返工修改。

图片

图片


这些根据规则的不同,可以进行对应的配置修改,例如不用评分。

六、返工修改

根据上面Gerrit流程图,当代码审核、确认未通过或合并的过程中出现冲突,这个时候就需要返工修改后再提交。

返工流程有三步:

  1. 获取未通过的代码到本地工作目录;
  2. 修改代码;
  3. 再提交审核。

对应的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 

其他常用命令:

  1. git review:将本地代码推送到Gerrit进行审查。

  2. git review -s:设置Gerrit的地址。

  3. git review -d :下载Gerrit上的代码变更。

  4. git review -m :查看Gerrit上的代码变更。

  5. git review -s :提交对Gerrit上的代码变更的评论。

  6. git review -R :提交对Gerrit上的代码变更的审批。

  7. git review -l :列出Gerrit上的指定仓库的代码变更。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2037015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW光伏微网实验系统

开发了一个基于LabVIEW的光伏微网实验系统&#xff0c;系统主要服务于工程教育和技术研究&#xff0c;以提高学生对分布式电力系统的理解和操作能力。该实验系统能够模拟光伏微网的各种运行状态&#xff0c;包括能量的生成、存储和消费等&#xff0c;特别是在无电网状态下的独立…

Datawhale AI夏令营-大模型技术(微调)Task2打卡

1 输出结果要求 input&#xff1a;阅读文章本体与完成QAG的prompt target&#xff1a;题干、题目选项及答案 2 数据处理 2.1 Python 正则表达式 需要将文件中的数据读取出来&#xff0c;将语文数据与英语数据整理好后存储成可以微调的数据格式&#xff08;csv与jsonl类型&a…

el-checkbox 状态不更新

文章目录 数据处理代码片段 &#x1f330; 大概举例原因解决方法 - 深拷贝forceUpdate - 强制更新 今天遇到了checkbox不更新的问题&#xff0c;相同的功能在其他地方正常使用&#xff0c;有些地方不能用。数据处理代码片段 &#x1f330; 大概举例 从现有数据中过滤出新的数据…

MySQL学习[4] ——MySQL锁

四、MySQL锁 4.1 MySQL有哪些锁&#xff1f; 4.1.1 全局锁 全局锁就是**对整个数据库实例加锁&#xff0c;主要用于全库逻辑备份**等场景。 flush tables with read lock # 加全局锁unlock tables # 解锁加上全局&#xff08;读&#xff09;锁后&#xff0c;整个数据库都…

网络安全-第二阶段-linux操作系统01

一. linux介绍: windows,mac,linux都是由unix系统发展而来。 linux:类unix系统; 二. Centos系统的安装: 可以去清华大学开源软件镜像站下载: 输入ip addr: 可以看到自己电脑的ip地址; 1. ssh远程连接linux: 使用windows或者linux的物理机或者虚拟机都可以连接上它,…

MPU6050+OLED读取姿态角(超级细讲)

STM32F103C8T6读取陀螺仪MPU6050的角度数据&#xff0c;使用6050自带DMP库姿态解算出各个方向的角度&#xff0c;并使用OLED实时刷新显示&#xff0c;同时可以将数据通过串口发送到计算机&#xff0c;每一组数据50ms。本操作过程简单&#xff0c;方便移植&#xff0c;显示屏接P…

ppt中添加页码(幻灯片编号)及问题解决方案

在幻灯片母版中&#xff0c;选择插入 幻灯片编号 右下角显示幻灯片编号 问题一&#xff1a;母版中没有显示编号 原因可能是母版版式中没有设置显示&#xff0c;勾选即可。 问题二&#xff1a;子母版中没有显示幻灯片 将母版中的编号复制到子母版中。 问题三&#xff1a;应用…

Element-UI自学实践

概述 Element-UI 是由饿了么前端团队推出的一款基于 Vue.js 2.0 的桌面端 UI 组件库。它为开发者提供了一套完整、易用、美观的组件解决方案&#xff0c;极大地提升了前端开发的效率和质量。本文为自学实践记录&#xff0c;详细内容见 &#x1f4da; ElementUI官网 1. 基础组…

2024年7月文章一览

2024年7月编程人总共更新了5篇文章&#xff1a; 1.2024年6月文章一览 2.《Programming from the Ground Up》阅读笔记&#xff1a;p19-p48 3.《Programming from the Ground Up》阅读笔记&#xff1a;p49-p74 4.《Programming from the Ground Up》阅读笔记&#xff1a;p75…

深入理解Kafka核心设计与实践原理_03

深入理解Kafka核心设计与实践原理_03 03_消费者3.1消费者与消费者组3.2客户端开发3.2.1 必要的参数配置3.2.2 订阅主题与分区 草稿 03_消费者 与生产者对应的是消费者&#xff0c;应用程序可以通过KafkaConsumer来订阅主题&#xff0c;并从订阅的主题中拉取消息。不过在使用Ka…

Redis17-服务端优化

目录 持久化配置 慢查询 什么是慢查询 如何查看慢查询 命令及安全配置 内存配置 集群优化 持久化配置 Redis的持久化虽然可以保证数据安全&#xff0c;但也会带来很多额外的开销&#xff0c;因此持久化请遵循下列建议&#xff1a; 用来做缓存的Redis实例尽量不要开启持…

springboot项目打包jar 并打包为exe启动

springboot项目打包jar 并打包为exe启动&#xff08;在无jdk环境下运行&#xff09; 环境 SpringBoot Windows IDEA 实现 1.springboot打包为可执行jar&#xff08;这里使用maven install&#xff09; maven工具栏选择项目->Plugins ->install 注&#xff1a;如果…

Golang | Leetcode Golang题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; func findItinerary(tickets [][]string) []string {var (m map[string][]string{}res []string)for _, ticket : range tickets {src, dst : ticket[0], ticket[1]m[src] append(m[src], dst)}for key : range m {sort.Strings(m[key])…

python对接vertx中踩的坑

需求 因为我们的硬件sdk只提供了python的版本&#xff0c;故需要python作为采集端来获取数据&#xff0c;然后将数据发送给java作为数据中心处理。 分析 这里就涉及到跨语言跨进程的数据的中转。有以下的几种解决方法 tcp:基于tcp自己拆包粘包&#xff0c;做心跳。一看就pa…

PV 与 PVC 状态迁移

文章目录 一、概述1、PV2、PVC 二、状态变化三、实例1、单独创建 PV1.1、创建并应用 PV1.2、查看刚创建的 PV 状态 2、单独创建 PVC2.1、创建并应用 PV2.2、查看刚创建的 PVC 状态 3、等待绑定4、删除 PV4.1、查看 PV&#xff0c;PVC 状态4.2、真正删除 PV4.3、查看PV PVC 状态…

PaLM-E: An Embodied Multimodal Language Model

发表时间&#xff1a;arXiv 6 Mar 2023 作者单位&#xff1a;Robotics at Google Motivation&#xff1a;大型语言模型已被证明可以执行复杂的任务。然而&#xff0c;在现实世界中启用一般推理&#xff0c;例如对于机器人问题&#xff0c;提出了落地的挑战。 解决方法&#…

探索全新AI编码代理框架:Agent Zero

引言 在科技的不断进步中&#xff0c;人工智能&#xff08;AI&#xff09;正越来越多地融入我们的日常生活。今天&#xff0c;我要为大家介绍一款全新的AI编码代理框架——Agent Zero。这款框架不仅可以自动化处理编码任务&#xff0c;还能操作文本、应用程序前端等&#xff0…

【微信小程序】页面导航和导航传参

什么是页面导航 小程序中实现页面导航的两种方式 1.声明式导航 (1). 导航到 tabBar 页面 (2). 导航到非 tabBar 页面 (3).后退导航 2.编程式导航 (1).导航到 tabBar 页面 示例代码如下&#xff1a; (2).导航到非 tabBar 页面 示例代码如下&#xff1a; (3).后退导航 示例…

WSL2Linux 子系统(十)

WSL 中启用图形界面 上一篇文章 《WSL2Linux 子系统(九)》 讲解详细讲 WSL&#xff08;Windows Subsystem for Linux&#xff09;解几种常见硬盘挂载方法。本篇讲述 WSL 显示画面的几种方法。WSL 本身不直接支持图形界面&#xff0c;在 WSL 环境中播放视频画面需要额外处理或者…

进程的执行和进程的结束

exec函数族&#xff1a; 作用&#xff1a;可以在一个程序中启动另外一个功能,用新的进程段替换当前进程的段. exec函数族用于替换当前进程的映像&#xff0c;允许程序在运行时加载并执行新的程序代码。 execl: l:list path:要执行的文件的路径 arg:要执行的文件的参数&a…