Gerrit 工作流程及简单使用

1.Gerrit

Gerrit,一种开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件开发者,可以相互审阅彼此修改后的代码,决定是否能够提交,回退或是继续修改。它使用版本控制系统Git作为底层。[1]

1.1 Gerrit和Gitlab区别

gitlab的特点是一个人维系一个分支。
gerrit的特点是一个团队维系一个分支。

gitlab 可以根据需要创建project,每个团队可以根据自己的需求管理自己的代码,方式更加的灵活。

gerrit比较单一,而且权限配置比较复杂,往往都是要联系管理员做出修改,每个团队很难做到对代码的个性化管理。

代码评审
gitlab是以merge request作为一次review,merge request中可能包含多个 commit,如果review不通过也不需要发起另一次merge request。

gerrit是以commit作为一次review,由于changeId的存在,可以对一次commit反复的进行review。 如果task划分的粒度够细的话,并不会影响各个团队的review习惯。

团队协作
gitlab可以选择公开代码,团队间可以看到互相的代码,有利于团队的协作。
gerrit由于权限控制问题,只能在权限范围内公开代码。

信息共享
gitlab 可以提供issues,wiki等功能方便开发者与使用者之间的沟通,并且gitlab可以无缝的与一些项目管理工具集成,比如:jira。
gerrit 这个方面比较欠缺。
gitlab每个项目都有自己的wiki,很方便查看。

参考:
https://lipeng1667.github.io/2017/01/18/gerrit-guide/
https://blog.csdn.net/bjstyle/article/details/79107086
https://zh.wikipedia.org/wiki/Gerrit

2.工作流程

在这里插入图片描述
如果你使用过git,当我们git add --> git commit --> git push 之后,你的代码会被直接提交到repo,也就是代码仓库中,就是图中橘红色箭头指示的那样。

Gerrit流程:
----》程序员写代码
----》push到gerrit服务器
----》审核人员,在web页面进行代码的审核(review),(可以单人审核,也可以邀请其他成员一同审核),
----》审核通过(approve)之后,
----》提交(submit)到代码仓库(repo)中去。

在使用过程中,有两点需要特别注意下:

  1. 当进行commit时,必须要生成一个Change-Id,否则,push到gerrit服务器时,会收到一个错误提醒。
  2. 提交者不能直接把代码推到远程的master主线(或者其他远程分支)上去。这样就相当于越过了gerrit了。 gerrit必须依赖于一个refs/for/*的分支。
    假如我们远程只有一个master主线,那么只有当你的代码被提交到refs/for/master分支时,gerrit才会知道,我收到了一个需要审核的代码推送,需要通知审核员来审核代码了。

当审核通过之后,gerrit会自动将这条分支合并到master主线上,然后邮件通知相关成员,master分支有更新,需要的成员再去pull就好了。

3.使用

1.用户clone工程

在命令行执行下面的命令,就可以把test2工程给clone下来了

$ git clone ssh://test3@192.168.1.100:29418/test2.git

目录中多了名为test2的文件夹,这个就是我们的工程
在这里插入图片描述

注意:如果从ssh方式clone下来的工程,里面是自带了hooks文件夹的,这个文件夹很重要!!如果不是用ssh://方式克隆下来的,还没有这个文件夹,需要我们自己mkdir

2.提交

$ git add test.md
$ git commit
$ git push  

通过git push命令来推送
在这里插入图片描述
发现推送失败了,提示的错误是:

You are not allowed to perform this operation
[remote rejected] master -> master (prohibited by Gerrit)

Gerrit拒绝了我们直接提交到master的推送!

这就是我们在文章开头提到的问题,我们需要push到refs/for/master那条线上!!

3. push到refs/for/master

解决:
在命令行写入下面的命令:

$ git config remote.origin.push refs/heads/*:refs/for/*

意思是,当执行push命令时,将会推送到refs/for/当前head所在的分支上。
在这里插入图片描述
重新进行push,结果又报错了。。
这次的错误是:
missing Change-Id in commit message footer
这个是提到的第2个问题,commit一定要有Change-Id

4. missing Change-Id in commit message footer

然后我们看到了命令行中给了我们提示,我们可以从hooks文件中拷贝commit-msg文件下来,这样commit时,会自动帮我们生成Change-Id.

在这里插入图片描述
我们可以看一下 git rev-parse --git-dir就是指向的当前git配置的文件,就是.git文件夹
所以我们直接用scp命令从gerrit服务器上拉取当前用户的hooks文件。

$ scp -p -P 29418 test3@192.168.1.100:hooks/commit-msg .git/hooks/

然后我们重新push发现一样的错误,因为我们还停留在上次commit,上次的commit是没有生成Change-Id的!
在这里插入图片描述
我们回退一下,然后重新提交。
回退命令是先用git log找到上一次的commit id, 然后用

git reset --hard commitId

可以看到提交到的分支是refs/for/master

Supongo que te gusta

Origin blog.csdn.net/chentaishan/article/details/119597640
Recomendado
Clasificación