Code-Review

Gerrit-使用指南

2019-12-17  本文已影响0人  tufatao

涉及到的基本操作

  1. 登录 gerrit
  2. 激活邮箱
  3. 获取 http Credentials
  4. 拉取代码
  5. 提交代码
  6. Review & Verify & Submit

初次使用

登录 gerrit -> 激活邮箱 -> 获取并保存 http credentials(提交时要用)

激活邮箱

后续 Push, Review, Verify, Submit, 接收通知 等都需要邮箱的支持。

  1. 登录 -> 进入 Settings -> Email Addresses;
  2. 输入邮箱地址 xxx@xxx.com, Click “Send VERIFICATION” button 发送验证邮件;
  3. 接收邮件 访问 验证链接;
  4. done.
Settings_Gerrit_email png.png

获取 Http credentials

http 方式 Pull, Push 时用。

  1. 登录 gerrit -> 进入 Settings -> HTTP Credentials;
  2. 点击 "GENERATE NEW PASSWORD" Button 获取 password;
  3. done.


    gerrit_http_credentials.png

开发

Pull -> Commit -> Push(带上Change-Id)

拉取代码

BROWSE -> Repositories。

仓库地址在仓库详情页。

Attention

Pull 时选择 "Clone with commit-msg hook" 方式以便 拿到 commit-msg (.git/hooks/commit-msg) 。

提交代码

确保 commit footer 有 Change-Id 信息。

Change-Id 可从通过 commit-msg (.git/hooks/commit-msg) 生成。

Strongly recommended:
只需确保项目目录(.git/hooks/)下有 commit-msg 脚本,再配合对应 的 gerrit 插件即可在 Commit 时完成 Change-Id 的自动生成。

Idea, Eclipse 都有相应的 gerrit 插件。

Change-Id

用于标识 commit。

Have a look

Parent:     65c50d48 (Update Dockerfile base image to 0.1.2)
Author:     xxxx <xxxxx@qq.com>
AuthorDate: 2019-12-12 17:41:51 +0800
Commit:     xxxx <xxxxx@qq.com>
CommitDate: 2019-12-12 17:41:51 +0800

add readme.md;

Change-Id: Iba58fbc6a1a440a9d3e2e48bbd72f898ba3cabc0

Review

Review & Verify & Submit

YOUR -> Changes -> 选择对应的 Change -> REPLY;

gerrit_reply.png
  1. 添加接收者,抄送者,评论,并对 Code-Review, Verified(若有权限) 打分。

  2. 若 Code-Review Verified 对应的分数均符合 Sumbmit 要求,
    则 当前Change 状态变为 Ready to submit, 放出 Sumbim 按钮。

  3. 点击 Submit 按钮 完成 变更往 gerrit 仓库 master 分支的提交。

Git 知识准备

对于一些进阶操作或部分问题的处理,要求对 git 有一定的程度的深入了解。

rebase & merge

rebase(变基), merge

git commit --amend

对前一次 commit 进行微调(打补丁),不产生新的 Commit。

git commit –amend [options]

fetch vs pull

可简单理解为: pull = fetch + merge

git reset

参考文档 git reset

Caution

Problems

一些常见的问题及对应的解决方案。

初次使用 Push 时遇到 鉴权失败

  1. 首先应确保 gerrit 账户名无误;
  2. 检查 Push 密码 是否为 Http Credentials;

初次使用 Push 时遇到 remote rejected

此种情况多是由于 本地 git 配置 name, email 与 gerrit 账户名, 注册邮箱不符。

解决方案:查看并修改 git 配置属性 name, email

# 查看 git 配置
git config --list
# 修改 name 属性
git config -- global user.name '<gerrit_user_name>'
# 修改 email 属性
git config -- global user.email '<gerrit_registered_email>'
# 两次检查 git 配置... done.
git config --list

ref update failed: REJECTED_OTHER_REASON no new changes

问题分析

这个提示表示没有新的提交。Gerrit审核根据commit
id和changeId来判断是否是新的提交。

情况一:如果确实需要提交,比如在初次建立新的分支的时候,两个分支的内容完全一模一样

解决办法:
通过git commit –amend生成新的changeId。

情况二: 合并时,合并的那些历史的 commit 节点,在 gerrit 上都已经评审过了,都是已有的 change 单,所以 gerrit 认为没有新的提交,就不让你提交评审。

解决办法:
在 git merge 的时候,加上 --no-ff 参数,是为了让它生成一个新的 commit,这样就可以提交了~(不过生成的 gerrit change 是看不到改动信息的

结合 Idea gerrit 插件的使用:

  1. 合并时勾选 "No fast forward" 选项;
  2. Push 时,不勾选 "Push to Gerrit" 选项;
Select-No-fast-forward.png No-Push-to-Gerrit.png

because ref update failed: REJECTED_OTHER_REASON commit ff9671c: missing Change-Id in message footer

解决办法:

  1. 通过git commit –amend 生成新的changeId (推荐);
  2. reset 到上一次 Commit, 生成新的changeId,重新提交;

One or more refs/for/ names blocks change upload The remote end hung up unexpectedly

问题描述:相应分支挂起(可简单理解为分支状态异常)

解决方案:

在对应仓库下执行以下命令

git for-each-ref refs/for
# 如果第一条命令执行完后有输出,再执行下面的命令。
for n in $(git for-each-ref --format='%(refname)' refs/for);do git update-ref -d $n; done

! [remote rejected] master -> refs/for/master (you are not allowed to upload merges)

git stash
# 每次 push 前通过 rebase 方式拉代码
git pull --rebase
git push
git stash pop

Gerrit 提示冲突,不能合并代码(git解决远程冲突)

  1. 将存在冲突的 Change Abandon(丢弃)
  2. 在本地处理好冲突(rebase/merge)再提交

以下是 rebase 方式(推荐)

## rebase 方式
git branch   #查看分支情况
git checkout master  #选择分支
git fetch origin  #fetch与pull的区别,自己再搜吧~
git rebase origin/master  #查看有“CONFLICT (content): ”的地方,手工解决冲突后,下一步
git add dev/controller/web/index.php #这只是一个举例,即要先add操作
git rebase --continue
git push origin HEAD:refs/for/master    #OK了

项目管理

迁移旧项目

以 gitlab 为例。

以管理员身份登录 gerrit -> 创建项目仓库 repo_demo -> 进入 gerrit_home/<git_dir> 以 gitlab 中同名项目覆盖之(即删除 repo_demo
-> 再从 gitlab 克隆同名项目)

# 删除 repo_demo
rm -rf repo_demo
# 从 git 仓库全量克隆同名项目
git clone --mirror <repo_url>
# 若 gitlab 仓库代码有更新则 再全量拉取一次 即可
git fetch --all
上一篇 下一篇

猜你喜欢

热点阅读