gerrit用户代码审核提交流程

简介

Gerrit,一种免费、开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。

本文主要记录一个gerrit的用户如何拉取代码,并做修改提交,等待审核的一个过程。
如果你是一个刚接触gerrit的用户使用者,可以继续往下阅读。如果你已经是一名old bird可以忽略~~~

注册gerrit用户

注册Gerrit账户,需给联系Gerrit管理者获取账号。
假如你已经有了账号,请登录你的gerrit服务。

注册账户邮箱

一旦你登录了账号,并且没有设置过邮箱,那么请注册:
用户注册邮箱请参考这里

配置秘钥

如果你是一个新用户,请将你工作的本机秘钥添加到你的gerrit账号下,以便可以正确拉取推送项目。

1.获取秘钥

  • Linux系统
# 查看当前用户是否存在秘钥, 如果不存在需要通过ssh-keygen进行生成
# 秘钥生成
ssh-keygen -t rsa -C "youemail@xxx.com"
# 复制秘钥
cat ~/.ssh/id_rsa.pub

如果提示权限问题:可能是版本级别太高,通过以下方式生产秘钥
ssh-key -t ed25519 -C "youemail@xxxx.com"
  • Windows系统
    进入C:\Users\USER.ssh目录确认是否有秘钥, 如果没有通过以下命令生成
# 打开CMD DOS生成秘钥
ssh-keygen -t rsa -C "youemail@xxx.com"

在这里插入图片描述拷贝id_rsa.pub公钥。

2.设置秘钥

当获取到了公钥之后,登录到gerrit服务,将公钥添加到gerrit账户中:
在这里插入图片描述复制公钥:
在这里插入图片描述

开发人员

1.拉取项目

用户开发者一旦获取到自己的gerrit账号后,就已经有了自己相应的权限了。
开发者可以通过BROWES->Respositories中查看自己账号下挂载了的项目情况。
我们可以看到下图显示了只有一个tinyalsa的项目
在这里插入图片描述那么我们如何拉取项目呢。 只有点击tinyalsa进入界面就可以看到有两种拉取方式:

  • with commit-msg hook
    commit-msg 是一个脚本文件,该脚本对于 Gerrit 的使用非常重要,使用 Gerrit 必须要有此脚本,否则在本地的修改版本无法提交至 Gerrit 中,会报错:missing change-id in commmit message footer,表示该版本提交没有 change-id。
    所以我们必须使用这一种方式,不然无法得到审核。

  • without commit-msg hook
    这一种也是我们常用的git克隆方式,应该很熟悉。 如果项目被设置了权限,该方法是无法进行修改提交的,必须拉取commit-msg hook脚本才行

在这里插入图片描述

到这里,开始克隆代码

# 我们先创建一个测试目录
mkdir -p ~/mtk/test_gerrit/own/user2
# 开始clone
git clone "ssh://test_user2@10.66.xxx.xx:29418/tinyalsa" && scp -p -P 29418 test_user2@10.66.xxx.xx:hooks/commit-msg "tinyalsa/.git/hooks/"
cd tinyalsa
release@release:~/mtk/test_gerrit/own/user2/tinyalsa$ ls
Android.bp  MODULE_LICENSE_BSD  NOTICE  README  include  mixer.c  pcm.c  tinycap.c  tinyhostless.c  tinymix.c  tinypcminfo.c  tinyplay.c
release@release:~/mtk/test_gerrit/own/user2/tinyalsa$

2.修改提交项目

我们那到了代码之后, 修改和提交完全和git的操作一样。
如下,我们对README进行修改并提交:

# 修改README,增加test code review by user2 modfiy
release@release:~/mtk/test_gerrit/own/user2/tinyalsa$ vi README
release@release:~/mtk/test_gerrit/own/user2/tinyalsa$ git add README
# 提交到版本库
release@release:~/mtk/test_gerrit/own/user2/tinyalsa$ git commit -m "test code view user2"
[master 19d61bc] test code view user2
 1 file changed, 1 insertion(+)
# 推送到远程仓 
release@release:~/mtk/test_gerrit/own/user2/tinyalsa$ git push origin HEAD:refs/for/master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 48 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 359 bytes | 359.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2)
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote:   http://10.66.xxx.xx:8081/c/tinyalsa/+/41 test code view user2 [NEW]
remote:
To ssh://localhost:29418/tinyalsa
 * [new reference]   HEAD -> refs/for/master
release@release:~/mtk/test_gerrit/own/user2/tinyalsa$

以上开发者有没有注意到最后推送到远程仓用的是

# 用的是
git push origin HEAD:refs/for/master  
# 而不是我们常用的
git push origin master or git push  

那是因为我们clone with commit-msg hook,推送代码必须得到审核,不经过审核的代码是没有权限直接推送到远程仓的。
HEAD:refs/for/master - 就是将本地HEAD推送到refs/for/master这个临时仓中待审核, 审核通过后自动推送到远程仓中并同步到gitlab远程服务器中。

  • 错误的做法,将会得到提示
release@release:~/mtk/test_gerrit/own/user2/abandoned/tinyalsa$ git push origin HEAD:refs/for/master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 48 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 311 bytes | 311.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2)
remote: Processing changes: refs: 1, done
remote: ERROR: commit c8d5423: missing Change-Id in message footer
remote:
remote: Hint: to automatically insert a Change-Id, install the hook:
remote:   gitdir=$(git rev-parse --git-dir); scp -p -P 29418 test_user2@10.66.xx0.xx:hooks/commit-msg ${gitdir}/hooks/
remote: and then amend the commit:
remote:   git commit --amend --no-edit
remote: Finally, push your changes again
remote:
To ssh://10.66.xxx.xx:29418/tinyalsa
 ! [remote rejected] HEAD -> refs/for/master (commit c8d5423: missing Change-Id in message footer)
error: failed to push some refs to 'ssh://10.66.xxx.xx:29418/tinyalsa'

3.增加审核人员

当代码正确提交到分支 refs/for/* 后,需要登录Gerrit界面为刚才的提交添加相应的审核者。

1.这时我们登录到gerrit账户后,通过YOUR->Changer就可以看到刚才的提交记录:

在这里插入图片描述

2.查看状态,发现有一条需要被审核:
在这里插入图片描述3. 点击进去设置审核者
在这里插入图片描述如此,我们增加了一个gerrit的账号进行审核。
在这里插入图片描述这样我就等待审核就可以了,如果项目提交顺利通过该过程就结束了。
如果审核被打回,那我们就需要重新修改在提交。

审核结果

当一个提交被审核者审批之后,会有相应的邮件通知,或者通过gerrit WebUI进行查看状态。
主要有以下几个状态:

  • Active 等待审核者审核
  • Ready to submit 审核者已经审核,但还 没有提交到远程仓
  • Merge 审核者已经审核,并同意推送远程仓
  • abandoned 审核者驳回

审核人员

一旦开发者提交了审核,相应的审核人员将会接收到邮件提示通知,或者通过YOUR->Changes->Incomming reviews查看有待审核记录并做相应的审批。

审核提交查看

  • 邮件通知
    在这里插入图片描述
  • gerrit账号查看
    在这里插入图片描述

审核确认

以上知道了有哪些待审核的提交之后,我们就可以针对这些提交做批示。

在Incomming reviews中选择一个待提交的申请,点击进入:
我们选择test code view user2这个提交:
在这里插入图片描述
审核者认为可以通过审核,可以点击右上角 CODE-REVIEW+2确认通过审核了。同时左上角的状态也将跟着变成Active->Ready to submit. 同时状态的改变都会有邮件通知。
在这里插入图片描述最后由审核者确认SUBMIT同意合并,一旦合并将会同步到gitlab远程服务器中。
在这里插入图片描述
登录gitlab进行确认一下,确实已经被提交了:
在这里插入图片描述

QAQ总结

1.提交被打回

当开发者的一个提交被审核者打回了,怎么办?
主要分两种情况:

  • 只提交了一个commitA,被审核者驳回,本地没有其他提交

  • 已经提交了一个commitA, 之后又提交了commitB, 但是commitA被审核者打回

2.提交后发生冲突

大多情况下一个项目都是有多人维护开发,有时自己刚修改好了某一功能,在提交后,在gerrit中状态中显示Merger conflict, 这是因为在你提交之前已经有其他人优先于你的提交。

  • 1.那么接下来我们能做的就是,自己撤回abandon
    在这里插入图片描述
  • 2.然后在本地工作目录中进行解决冲突,和git的操作一样
    在这里插入图片描述冲突的文件
    在这里插入图片描述- 3.冲突解决后重新做一次推送,gerrit WebUI查看
    在这里插入图片描述
  • 4.审核者gerritWebUI查看

在这里插入图片描述

  • 5.审核完后,开发者gerrit WebUI查看状态

在这里插入图片描述

3.push服务端是失败

  • 当修改完代码进行push推送时报下面错误:
    错误提示 ‘error: failed to push some refs to xxxx’
release@release:~/mtk/test_gerrit/own/user2/abandoned/tinyalsa$ git push origin master
To ssh://10.66.xxx.xx:29418/tinyalsa
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'ssh://10.66.xxx.xx:29418/tinyalsa'

这是因为你在拉取gerrit的代码是没有权限直接推送远端服务器,必须要经过审核才行。
正确的做法应该是:

git push origin HEAD:refs/for/master   # master是要推送的分支名, 如developer
  • 当推送gerrit仓进行审核时报错:
    错误信息: ! [remote rejected] HEAD -> refs/for/master (commit c8d5423: missing Change-Id in message footer)
# 修改文件
release@release:~/mtk/test_gerrit/own/user2/abandoned/tinyalsa$ vi README
release@release:~/mtk/test_gerrit/own/user2/abandoned/tinyalsa$ git add README
# 提交文件到本地仓
release@release:~/mtk/test_gerrit/own/user2/abandoned/tinyalsa$ git commit -m "test without ci-msg"
[master c8d5423] test without ci-msg
 1 file changed, 1 insertion(+)
 # 推送到远端gerrit仓
release@release:~/mtk/test_gerrit/own/user2/abandoned/tinyalsa$ git push origin HEAD:refs/for/master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 48 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 311 bytes | 311.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2)
remote: Processing changes: refs: 1, done
remote: ERROR: commit c8d5423: missing Change-Id in message footer
remote:
remote: Hint: to automatically insert a Change-Id, install the hook:
remote:   gitdir=$(git rev-parse --git-dir); scp -p -P 29418 test_user2@10.66.xxx.xx:hooks/commit-msg ${gitdir}/hooks/
remote: and then amend the commit:
remote:   git commit --amend --no-edit
remote: Finally, push your changes again
remote:
To ssh://10.66.xxx.xx:29418/tinyalsa
 ! [remote rejected] HEAD -> refs/for/master (commit c8d5423: missing Change-Id in message footer)
error: failed to push some refs to 'ssh://10.66.xxx.xx:29418/tinyalsa'
release@release:~/mtk/test_gerrit/own/user2/abandoned/tinyalsa$

这时因为你在拉取gerrit仓时没有同步hook/commit-msg脚本文件, 这个文件对需要审核的gerrit必须要有。
解决:
方法一: 在拉取代码时直接通过gerrit WebUi提供的download连接克隆工程
在这里插入图片描述方法二: 已经拉取了代码并也做了修改,此时不想在重新拉取工程。那么可以在原有的工程下只拉取commit-msg

# 进入工程目录 tinyalsa,执行以下命令
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 test_user2@10.66.xxx.xx:hooks/commit-msg ${gitdir}/hooks/

在这里插入图片描述

4.推送出现权限问题

当你在做push的时候提示邮箱地址不匹配:

remote: ERROR: commit bebf9e6: email address djzheng@xxxx.com.cn is not registered in your account, and you lack ‘forge committer’ permission.

这是因为你gerrit账号没有注册邮箱,或者已经注册了但是本地git 配置中的user.email和注册的邮箱不一致所致。
解决方法:

# 1, 首先注册gerrit邮箱, 请参考邮箱注册小节
# 2, 修改本地git user.email 配置
git config user.email xxxx@xxx.com
  • 如下截图显示,没有注册邮箱:
    在这里插入图片描述
  • 已经注册了, 但是和git config user.email 不匹配。
    在这里插入图片描述
  • 重新push
    在这里插入图片描述
  • 16
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当使用Gerrit进行代码提交时,通常需要按照以下步骤进行操作: 1. 克隆代码库:首先,你需要将代码库克隆到本地开发环境中。你可以使用`git clone`命令来完成此操作。 2. 创建新分支:在进行代码更改之前,最好在本地创建一个新的分支。你可以使用`git checkout -b <branch-name>`命令来创建并切换到新分支。 3. 进行更改:在本地分支上进行代码更改和修改。 4. 提交更改:完成代码更改后,使用`git add`命令将更改的文件添加到暂存区,然后使用`git commit`命令提交更改。确保你的提交消息清晰明了,描述了你所做的更改。 5. 推送到Gerrit服务器:在将更改推送到Gerrit服务器之前,确保你的本地分支是最新的。使用`git pull`命令拉取最新的变更。然后,使用`git push origin HEAD:refs/for/<branch-name>`命令将更改推送到Gerrit服务器上的相应分支。 6. 提交代码审阅请求:打开Gerrit网页界面,选择你刚才提交的变更,然后点击"提交代码审阅请求"。确保你提供了适当的标题和描述,以便审阅人员理解你的更改。 7. 进行代码审阅:等待其他开发人员或团队成员进行代码审阅。他们将仔细检查你的更改,并提供反馈意见。 8. 处理反馈:如果有人提出了修改建议或指出了问题,请根据反馈进行相应的更改和修复。 9. 审阅通过:一旦代码审阅通过,你的更改将被合并到主分支中。 请注意,上述步骤可能会根据你所使用的具体工作流程和团队规范而有所不同。因此,在实际操作中,你可能需要根据自己的情况进行一些调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值