Skip to the content.

Gerrit

本地 Review Patch 指南

[!NOTE] 参考神奇海螺的意见,有待验证

  1. 直接 fetch 并 checkout patch
# 获取特定 patch(假设 patch number 是 1234)
git fetch origin refs/changes/34/1234/1 && git checkout FETCH_HEAD

# 查看代码
# ... 你的 review 操作 ...

# 返回原分支
git checkout -
  1. 使用 git-review 工具(推荐)
# 安装 git-review
# Fedora: sudo dnf install git-review
# Ubuntu: sudo apt install git-review

# 列出待 review 的 patch
git review -l

# checkout 特定 patch 到本地分支
git review -d 1234
  1. 配置 remote 简化操作

.git/config 中添加 fetch 规则:

[remote "origin"]
    url = <gerrit-url>
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/changes/*:refs/remotes/origin/changes/*

然后可以直接:

git fetch origin
git checkout origin/changes/34/1234/1
  1. 下载 patch 文件
# 从 Gerrit 网页获取 patch 的 URL,例如:
curl -o patch.diff https://gerrit.example.com/changes/1234/revisions/1/patch?zip
git apply patch.diff
  1. 使用 tig 或 lazygit 等工具
# 安装后可以直接浏览 cherry-pick 的 patch
tig origin/changes/34/1234/1

再看看,再学学

一个 patch 可以看到一些链表,都是如何关联的:

Relation chain Submitted together Same topic Merge conflicts

gerrit 对于多个 commit 提交的一般处理

在 Gerrit 里,多个 commit 就是多个 change,它们之间形成依赖链(relation chain),按顺序逐个合入。这正是 Gerrit 处理”一个 feature 拆成多个原子改动”的标准方式:

基本做法

正常在本地写一串 commit(每个 commit 的 message 里都会被 commit-msg hook 加上各自的 Change-Id),然后一次推:

  git push gerrit HEAD:refs/for/stable-6.2.0

Gerrit 会为链上每个 commit 各建一个 change,页面上能看到它们之间的父子依赖关系。review 也是逐个进行的——每个 change 独立 review、独立 +2。

合入顺序

修改链中间的 commit

这是 stacked changes 最麻烦的地方。比如要改第 2 个 commit:

  git rebase -i <链的起点前一个 commit>
  # 把要改的 commit 标记为 edit,停下来修改
  git add ...
  git commit --amend          # Change-Id 不变
  git rebase --continue       # 后面的 commit 被 rebase 到新基上,Change-Id 各自不变
  git push gerrit HEAD:refs/for/stable-6.2.0

因为每个 commit 的 Change-Id 都没变,push 后链上每个 change 各得到一个新 patch set,依赖关系自动重建。这正是 Change-Id 机制的价值:SHA 全变了,但逻辑身份不变。

实践建议

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。