Gerrit 是什么?
Gerrit 是一款免费、开源、基于Web的团队代码协作工具。它与 Git 紧密集成,并为您的代码库充当严格的守门人。与开发人员合并功能分支的更常见的拉取请求(pull-request)模型不同,Gerrit 的工作流以单个提交(变更)为中心。每个提交在合并到官方项目历史之前都必须经过审查、验证和批准,从而确保一个线性和干净的主分支。它被像 Android 开源项目(AOSP)这样的大型项目广泛使用。
主要功能
- 基于Web的代码审查: 提供清晰的界面来审查代码、添加内联评论和对变更进行投票。
- 严格的访问控制: 在项目和分支级别提供细粒度的权限,控制谁可以提交、审查和合并变更。
- Git 仓库管理: 可以作为主要的 Git 服务器,通过 SSH 和 HTTP 管理所有仓库访问。
- 自动化验证: 与 Jenkins 或 GitLab CI 等 CI/CD 系统无缝集成,自动构建和测试每个提议的变更,并提供“+1 已验证”或“-1 失败”的分数。
- 基于变更的工作流: 每个提交都是一个具有唯一变更ID(Change-ID)的可审查单元。这使得跟踪迭代和查看特定变更的历史变得容易。
- 可扩展的插件架构: 支持广泛的插件,以添加新功能、集成和UI增强。
使用场景
- 大型企业项目: 非常适合需要严格、可审计和高质量代码提交流程的组织。
- 具有线性历史的开源项目: 被 Android、Go 和 Eclipse 等优先考虑干净、无分支提交历史的项目使用。
- 受监管行业: 适用于每个变更在集成前都必须被记录和批准的环境。
- 提交前验证: 非常适合那些在通过自动化测试和人工审查之前,任何内容都不能进入主分支的工作流。
入门指南
Gerrit 的工作流与标准的 Git 拉取请求不同。您不是推送一个分支然后打开一个 PR,而是将一个提交推送到一个特殊的“魔法”引用。
-
克隆仓库: 您需要从 Gerrit 克隆仓库,这会安装一个
commit-msg钩子,自动为您的提交添加唯一的变更ID。# 替换为您的 Gerrit 服务器、项目和用户名 git clone ssh://user@gerrit-server:29418/project.git cd project -
进行并提交您的变更: 创建您的代码变更并像平常一样提交。钩子会在您的提交信息中添加一行
Change-Id:。echo "我的新功能" >> new_feature.txt git add new_feature.txt git commit -m "添加我超棒的新功能" -
推送以供审查: 与正常的
git push不同,您将提交推送到refs/for/<branch>目的地。这会告诉 Gerrit 创建一个新的代码审查。# 将当前提交推送到 'main' 分支以供审查 git push origin HEAD:refs/for/main
Gerrit 将返回一个指向新创建的审查的 URL,您和您的团队可以在那里讨论、测试和批准该变更。
定价
Gerrit 是完全免费和开源的,根据 Apache 2.0 许可证分发。您需要负责托管和维护自己实例的成本。
Gerrit vs. 拉取请求
一个关键的区别是 Gerrit 关注提交,而拉取请求模型关注分支。
- Gerrit: 一次审查是应用于单个提交的一系列补丁集。目标是在合并前完善一个提交。这会产生一个干净、线性的历史。
- 拉取/合并请求: 一次审查基于一个可能包含许多提交的分支。讨论在分支级别进行,整个分支被合并,通常会创建一个“合并提交”。
这使得 Gerrit 的学习曲线更陡峭,但它提供了对提交历史无与伦比的控制。