- Gerrit 本身是一个开源的代码评审工具。
- 我们通常所说的“Gerrit 公司”实际上指的是 Google,因为 Gerrit 是由 Google 开发并开源的项目。
- 目前,Gerrit 项目主要由 Google 的工程师团队负责主导和维护,同时也有一个活跃的开源社区共同贡献。

Gerrit
公司介绍:
产品详情
一、 引言:版本控制之后的挑战与Gerrit的定位
在分布式版本控制系统Git成为软件开发事实标准的今天,团队协作的范式发生了根本性变化。然而,强大的分支和合并能力在带来灵活性的同时,也引入了新的挑战:如何确保提交到主代码库的每一次变更都符合团队的质量标准和规范? 当众多开发者并行工作时,简单的git push操作可能会将未经过审阅、甚至存在严重问题的代码直接注入共享仓库,从而破坏构建的稳定性,增加集成的复杂度。
为了解决这一挑战,代码评审从一项“良好的实践”演变为现代软件工程,尤其是敏捷开发和DevOps流程中不可或缺的强制性环节。而Gerrit,正是为这一环节而生的、一个极具特色的代码评审工具和Git服务器增强解决方案。
Gerrit的核心定位是一个基于网页的、轻量级的代码评审系统,它充当着Git版本库的守门人角色。其最显著的特点是:它强制要求每一次代码变更(通常体现为一个Git提交)都必须通过网页界面进行评审,并获得明确的批准后,才能合并到目标分支(如master)。这种“提交即评审”的模型,使得Gerrit在需要高度代码质量控制和严格审计追踪的项目(如Android开源项目)中备受青睐。
二、 Gerrit的起源与核心理念
1. 诞生背景
Gerrit由Google的工程师Shawn Pearce开发,最初是为了管理Android开源项目的巨大代码库而设计的。Android项目拥有庞大的贡献者群体,包括Google内部员工和全球数千名外部开发者。要维护如此规模项目的代码质量、一致性和安全性,一个强大、自动化、流程化的代码评审系统是必不可少的。Gerrit应运而生,并最终在2009年成为开源项目。
2. 核心理念
- 强制评审:没有“例外”。所有推送到共享仓库的代码都必须经过评审流程。这消除了代码库被意外破坏的风险,奠定了高质量协作的基础。
- 提交(Commit)作为评审单元:与许多以Pull Request(PR)或Merge Request(MR)为单位的系统(如GitLab、GitHub)不同,Gerrit的评审单元通常是单个Git提交。这种细粒度评审鼓励小而专注的变更,使评审者更容易理解代码改动,提高评审效率和质量。
- 纯净的历史:Gerrit倾向于使用
git merge --no-ff(显式合并)或rebase来集成变更,从而在项目历史中为每一次代码评审留下清晰的记录(一个合并提交)。这使得追踪“为何要引入这个变更”变得非常容易。 - 无缝集成持续集成(CI):Gerrit在设计之初就考虑了与CI系统(如Jenkins)的深度集成。CI系统可以自动验证提交是否能够成功编译并通过测试,并将结果反馈回Gerrit,为评审者提供至关重要的客观质量数据。
三、 核心架构与工作原理
要理解Gerrit,需要将其视为一个位于原始Git服务器之前的智能代理。
1. 核心组件
- Gerrit Server:核心服务器,集成了以下功能:
- Git Server:它本身就是一个功能完整的Git服务器,支持
git push等操作。 - Web Server:提供基于Web的图形化用户界面,用于代码差异查看、评论、评分、审批等。
- 数据库(通常使用NoteDB,基于Git本身):存储所有元数据,如评审信息、评论、评分、访问权限等。NoteDB的设计使得这些元数据本身也受版本控制,极大地简化了备份和迁移。
- 访问控制层:Gerrit拥有强大而精细的权限控制系统,基于Google OpenID或LDAP等认证方式,可以精确控制用户/用户组对特定分支、标签、路径的读写、评审权限。
2. 核心概念与工作流程详解
Gerrit引入了一些独特的概念,构成了其工作流的基石:
a. git push到 Ref
这是Gerrit工作流与普通Git工作流最根本的区别。开发者不能直接将代码push到refs/heads/master这样的分支上。取而代之的是,他们需要将提交推送到一个特殊的魔法引用命名空间下,通常是 refs/for/<branch-name>。
- 示例:
git push origin HEAD:refs/for/master - 这个操作的含义是:“请将我的提交推送给Gerrit,并为其创建一个针对
master分支的代码评审请求。” 这个推送动作不会直接更新master分支,而是会在Gerrit中创建一个变更。
b. 变更
变更是Gerrit中的核心概念,代表一个待评审的代码单元。每个变更都包含以下关键信息:
- 一个或多个Git提交:通常是单个提交,但也支持依赖链。
- 目标分支:这个变更希望被合并到哪个分支。
- 状态:如
草稿、新、已合并、废弃。 - 评审信息:评论、评分等。
c. 评分标签系统
Gerrit使用一个可配置的标签系统来进行投票,而不是简单的“批准/拒绝”。最常见的标签是:
- Code-Review:代码质量评分,通常范围为
-2(阻止提交)到+2(看起来不错,准予合并)。 - Verified:验证评分,通常由CI系统自动设置。范围是
-1(验证失败)到+1(验证成功)。这个标签将编译、测试等自动化流程的结果与人工代码质量评审分离开来。
d. 提交规则
一个变更要能够被合并,必须满足预设的提交规则,例如:
- 至少获得一位评审者的
Code-Review: +2投票。 - 至少获得一个
Verified: +1投票(意味着CI构建通过)。 - 没有
Code-Review: -2或Verified: -1的投票。
四、 一个完整的Gerrit工作流示例
假设开发者Alice需要修复一个Bug:
- 克隆与准备:
- Alice克隆项目仓库:
git clone ssh://[email protected]:29418/project.git - 她创建一个本地功能分支(非必须,但推荐):
git checkout -b fix-bug-123 - 进行代码修改,然后提交:
git commit -m "Fix null pointer exception in UserModule"
- 推送变更以进行评审:
- Alice将提交推送到Gerrit以供评审:
git push origin HEAD:refs/for/master - Gerrit接收推送,创建一个新的变更,状态为“新”,并返回一个URL链接。
- 评审周期:
- 评审者Bob收到通知,在Gerrit的Web界面上查看代码差异。
- Bob在代码行上发表行内评论,指出可能的问题。
- Bob给予
Code-Review: -1投票,并要求修改。 - CI系统(如Jenkins)自动检测到新变更,拉取代码进行构建和测试。如果通过,则自动给变更打上
Verified: +1的标签。
- 迭代修改:
- Alice根据Bob的评论修改代码。她不需要创建新的提交,而是使用
git commit --amend来修改原提交。这保证了变更历史的简洁性。 - 她再次推送:
git push origin HEAD:refs/for/master。Gerrit会智能地将这个新的提交识别为原变更的新补丁集,所有历史评论都会得到保留。
- 批准与合并:
- Bob审查新的补丁集,感到满意,将投票改为
Code-Review: +2。 - 此时,变更满足了提交规则(拥有
+2和+1)。 - Bob或具有相应权限的集成者点击 “提交” 按钮。
- Gerrit执行操作,将这次变更通过
rebase或merge的方式集成到master分支中。变更状态变为“已合并”。
五、 Gerrit的核心功能与优势
- 强制性与流程化的代码评审:确保所有代码在入库前都经过人工审视,是保证代码质量的最有效防线。
- 与Git深度集成:工作流完全基于标准Git命令,开发者学习成本相对较低。
- 精细的权限控制:可以精确控制谁可以推送、评审、提交到哪个分支或目录,非常适合大型、权限结构复杂的项目。
- 与CI/CD无缝集成:通过
verified标签,将自动化测试结果作为合并的必要条件,实现了质量门禁的自动化。 - 纯净的线性历史:鼓励使用rebase,可以保持项目历史像一条直线一样清晰可读。
- 强大的变更追踪:每个合并的变更都有完整的评审记录,便于审计和追溯。
- 高性能处理大仓库:经过Android等超大型项目的考验,在处理大型代码库和高并发请求时表现稳定。
六、 Gerrit的挑战与劣势
- 学习曲线陡峭:
refs/for/推送、修改提交(amend)、rebase等概念对Git新手来说较为复杂,容易出错。 - 用户体验相对落后:与现代化的GitHub、GitLab相比,其Web界面显得较为陈旧和笨重,用户体验上有一定差距。
- 以提交为中心的模型可能不灵活:对于需要多个提交才能完成的大型功能,管理起来不如一个包含多个提交的Pull Request方便。虽然Gerrit支持依赖链,但管理复杂度较高。
- 配置和维护复杂性:Gerrit服务器的初始配置和后续维护,包括权限管理、插件安装等,有一定的技术门槛。
- 社区生态相对小众:虽然核心功能强大,但其插件和第三方工具生态不如GitHub或GitLab丰富。
八、 适用场景与总结
Gerrit特别适用于以下场景:
- 对代码质量有极高要求的项目:如操作系统、数据库、嵌入式系统、金融核心系统等。
- 大型、分布式的开发者社区:需要严格的访问控制和贡献者协议。
- 需要强大审计追踪的合规性项目:每一次变更的审批记录都必须清晰可查。
- 已经深度投资于Jenkins等CI系统,并希望将其深度嵌入代码评审流程的团队。
总结
Gerrit并非一个适合所有团队的“万能”工具。它是一个带有鲜明哲学和独特设计的专业化代码质量管理平台。它牺牲了一部分灵活性和用户体验,换来了无与伦比的流程控制力和代码质量保障能力。在软件日益复杂、安全威胁层出不穷的今天,Gerrit所代表的“质量高于一切”的工程理念,对于构建可靠、可维护的核心软件基础设施而言,具有永恒的价值。它就像一位一丝不苟的守门人,默默守护着代码库的大门,确保只有经过千锤百炼的代码才能成为构建数字世界的基石。

点击链接,了解更多产品详情;
登录后查看
案例介绍
版权/专利









