Gerrit-使用指南

涉及到的基本操作

  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) 。

  • Http 方式;
  • ssh 方式;

提交代码

确保 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

  • 共同点:都有整合代码的功能
  • 异同:merge操作会生成一个新的节点(commit)来承载这次整合,之前的提交分开显示。而rebase操作不会生成新的节点(整合在原有的commit 上完成),是将两个分支融合成一个线性的提交。

git commit --amend

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

git commit –amend [options]

fetch vs pull

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

git reset

  • reset --soft

    Does not touch the index file or the working tree at all (but resets the head to <commit>, just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.

    重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。

  • reset --mixed

    Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.

    reset 默认参数 mixed。重置 HEAD 和branch的同时,保留工作目录,并且清空暂存区,并把重置 HEAD 所带来的新的差异放在工作目录。

  • reset --hard

    Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.

    重置 HEAD 和branch的同时,重置stage区和工作目录里的内容

参考文档 git reset

Caution

  • 应总是确保 Commit 有对应的 Change-Id
  • 尽量采用 rebase 方式合并代码, 而非 merge 方式

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容