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芯片的功耗,例如在系统对任务压力较小时,通过调整处理器工作频率与输入电压的…...
C++之模版初阶
目录 前言 1.泛型编程 2.函数模版 2.1函数模版概念 2.2函数模版格式 2.3函数模版的原理 2.4函数模版的实例化 2.5模版参数的匹配原则 3.类模版 3.1类模版的定义格式 3.2类模版的实例化 结束语 前言 前面我们学习了C的类与对象和内存管理,接下来我们继续学习…...
飞桨paddle API函数scatter详解
飞桨的scatter函数,是通过基于 updates 来更新选定索引 index 上的输入来获得输出,具体官网api文档见: scatter-API文档-PaddlePaddle深度学习平台 官网给的例子如下: >>> import paddle>>> x paddle.to_tens…...
RCE漏洞复现
PHP命令执行常用函数 回调函数必须是命令执行和代码执行的函数,有两个条件 必须是函数,而且需要有函数运行的参数 危害:可以直接删除文件,添加文件,甚至可以添加用户 system --执行外部程序,并且显示输…...
Qt QTabWidget之创建标签页的多页面切换
QTabWidget 用来分页显示 重要函数: 1.void setTabText(int, QString); //设置页面的名字. 2.void setTabToolTip(QString); //设置页面的提示信息. 3.void setTabEnabled(bool); //设置页面是否被激活. 4.void setTabPosition(QTabPosition::South); //设置页面名字的位置. 5.…...
【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出
【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出 文章目录 【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出1.简介2.验证用例3.软件代码4.链接脚本5.编译脚本6.仿真结果6.1 复位结束6.2 运行成功6.3 终端打印 7.总结 1.简介 本文将详细阐述如何利用 printf 来打印字符串…...
时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention
时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention 文章目录 前言时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention 一、VMD-TCN-BiLSTM-Attention模型1. **…...
Python知识点:如何使用Godot与Python进行游戏脚本编写
在Godot中使用Python进行游戏脚本编写,你需要通过一个插件来实现,因为Godot原生支持的脚本语言是GDScript、VisualScript和C#。这个插件被称为Godot-Python,它允许你在Godot引擎中使用Python编写脚本。以下是详细的步骤指导你如何配置和使用G…...
Spring MVC数据绑定和响应学习笔记
学习视频:12001 数据绑定_哔哩哔哩_bilibili 目录 1.数据绑定 简单数据绑定 默认类型数据绑定 简单数据类型绑定的概念 参数别名的设置 PathVariable注解的两个常用属性 POJO绑定 自定义类型转换器 xml方式 注解方式 数组绑定 集合绑定 复杂POJO绑定 属性为对象类…...
Vulnhub JIS-CTF靶机详解
项目地址 https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/ 修改靶机的网卡 开机时长按shift,进入此页面 选择root模式进入 将只读模式改为读写模式 mount -o remount,rw / 查看本机的网卡名称 …...
FPGA资源评估
FPGA资源评估 文章目录 FPGA资源评估前言一、资源评估1.1 资源有哪些1.2 资源统计 二、 FPGA 的基本结构三、 更为复杂的 FPGA 架构 前言 一、资源评估 大家在项目中一般会要遇到需要资源评估的情况,例如立了新项目,前期需要确定使用什么FPGA片子&…...
asp购物网站/推广网站有效的方法
完成一次完整的CA请求时在linux 用户需要执行的操作依次如下 : 调用TEEC_InitializeContext函数打开op-tee驱动文件,获取到操作句柄并存放到TEE_Context类型的变量中。调用TEEC_OpenSession函数,通过获取到的TEE_Context类型的变量创建一个特定CA与特定TA之间进行通信的通道…...
wordpress 食谱网站/乌海网站seo
建立一个可以实现整数数组的操作类(Array),而后在里面可以操作的数组的大小由外部决定,而后在Array类里面需要提供有数组的如下处理: 进行数据的增加(如果数据满了则无法增加)、可以实现数组的…...
网站增加导航栏/百度推广怎么登陆
嵌入式Linux下NAND flash上根文件系统构建嵌入式Linux下NAND flash上根文件系统构建摘要:针对嵌入式Linux操作系统,通常选择NAND Flash烧录根文件系统的情况。说明了常用嵌入式文件系统的类型及NANDflash的特点;通过在三星的ARM9 2410S平台上…...
如何建个人摄影网站/搜一搜百度
vector vect; vector::iterator it vect.begin(); 首先定义了一个int类型的向量;然后定义了一个具有int元素的迭代器类型。it的类型就是vector::iterator。 vector vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型…...
南宁做网站哪家公司好/北京网站优化快速排名
2019独角兽企业重金招聘Python工程师标准>>> EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合Junit的标准,可直接在Junit中运行。得到了Google和Yourkit的支持。 随着单元测试的…...
专业商城网站制作/外包网站有哪些
Remove K Digits题目:给出一个非负的整数num, 用字符串表示,去掉k个digits之后得到一个最小的新数字 思路: Zuo-生成窗口最大值数组 - 239. Sliding Window Maximum 给出一个整型数组arr和一个大小为w的窗口,从左向右滑动窗口&…...