Gerrit的介绍,安装和使用-[Mac]

介绍

代码审核(Code Review)是软件研发质量保障机制中非常重要的一环,但在实际项目执行过程中,却因为种种原因被 Delay 甚至是忽略。在实践中,给大家推荐一款免费、开放源代码的代码审查软件 Gerrit

1. Code Review 是什么

Code Review 最直观的解释即看代码。常规的做法为自己看,有时代码逻辑问题可能自己看不出来,需要找同事一起看,在大家知识体系相对平均的情况下可能需要花钱专门的公司帮助查看。
为什么要 Code Review, 有什么好处?

  • 有利于统一代码规范, 代码风格,结构写法,注释风格等;
  • 业务逻辑,安全隐患,性能问题等都可以通过 review 的方式发现;
  • 编程的时候,如果你知道有同事会检查你的代码,你的态度就会变的不一样, 你会写出更加整洁,有完整注释的代码;
  • 更早的发现代码中的问题.越往后,Code Review 的效果越差,修复的成本也越来越高;
  • 熟悉别人的代码, 有助于人员备份;

2. Gerrit 简介

GerritGoogleAndroid 系统研发量身定制的一套免费开源的代码审核系统,它在传统的源码管理协作流程中强制性引入代码审核机制,通过人工代码审核和自动化代码验证过程,将不符合要求的代码屏蔽在代码库之外,确保核心代码多人校验、多人互备和自动化构建核验。

Gerrit 之前的系统架构:

image.png

Gerrit 之后的系统架构:

image.png

通过 Gerrit 机制将代码做分隔。

工作流程

image.png

使用过 git 的同学,都知道,当我们git add --> git commit --> git push 之后,你的代码会被直接提交到 repo,也就是代码仓库中,就是图中橘红色箭头指示的那样。

那么 gerrit 就是上图中的那只鸟,普通成员的代码是被先 pushgerrit 服务器上,然后由代码审核人员,就是左上角的 integratorweb 页面进行代码的审核 (review),可以单人审核,也可以邀请其他成员一同审核,当代码审核通过(approve) 之后,这次代码才会被提交 (submit) 到代码仓库 (repo) 中去。

无论有新的代码提交待审核,代码审核通过或被拒绝,代码提交者 (Contributor) 和所有的相关代码审核人员 (Integrator) 都会收到邮件提醒。gerrit 还有自动测试的功能,和主线有冲突或者测试不通过的代码,是会被直接拒绝掉的,这个功能是通过右下角那个老头 (Jenkins) 的来实现的,这里不过多讨论。

整个流程就是上面这样。 在使用过程中,有两点需要特别注意下:

  • 当进行 commit 时,必须要生成一个 Change-Id,否则,pushgerrit 服务器时,会收到一个错误提醒。

  • 提交者不能直接把代码推到远程的 master 主线 (或者其他远程分支) 上去。这样就相当于越过了 gerrit了。 gerrit 必须依赖于一个refs/for/* 的分支。

    假如我们远程只有一个 master 主线,那么只有当你的代码被提交到refs/for/master分支时,gerrit 才会知道,我收到了一个需要审核的代码推送,需要通知审核员来审核代码了。当审核通过之后,gerrit 会自动将这条分支合并到 master 主线上,然后邮件通知相关成员,master 分支有更新,需要的成员再去 pull 就好了。而且这条refs/for/master分支,是透明的,也就是说普通成员其实是不需要知道这条线的,如果你正确配置了 sourceTree,你也应该是看不到这条线的。

这两点很重要!!这两点很重要!!这两点很重要!!

Gerrit 安装和配置

这里安装的gerrit版本是gerrit-3.0.3

1. 环境准备

  • 系统需要基于unix的服务器,包括任何linux风格的、Mac,这里使用 Mac
  • JDK,使用 1.8 版本就行, 官网显示gerrit与java 9或更新版本还不兼容。
  • nginx/apache,作为认证和反向代理服务器;
  • MySQL,其实这个非必须,Gerrit 自带的有 H2 数据库
  • Maven, 非必须,在安装的过程中会下载一些 jar 文件;
  • Git, 用来拉取代码.
  • Gitlab, gerrit就是要配合git使用的

2. Java 环境安装

下载:jdk-8 : https://www.oracle.com/technetwork/java/javase/downloads/index.html
这里下载的是: jdk-8u221-macosx-x64.dmg, 直接点击安装

配置:vim ~/.bash_profile(针对当前用户) 或者 vim /etc/profile(针对所有用户,推荐)

# java
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre"
export JRE_HOME="$JAVA_HOME/jre"
export CLASSPATH="$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH"
export PATH="$JAVA_HOME/bin:$JRE_HOME/bin:$PATH”

3. nginx/git/gitlab安装就不再这里多介绍了

4. gerrit安装和配置

下载 gerrit

$ wget  https://www.gerritcodereview.com/download/gerrit-3.0.3.war

安装 gerrit

$ java -jar gerrit-3.0.3.war init -d /lnmp/gerrit

下面是我从网找到的gerrit配置项,根据你安装的版本不同gerrit会出现的配置项是不同的. 安装时如果你不改配置和不确定是什么,可以直接回车忽略.
gerrit支持的数据库有: H2,PostgreSQL,MariaDB, MySQL. h2是它自带的数据库;
gerrit登录认证类型支持的有: OpenID, OpenID_SSO, HTTP, HTTP_LDAP, CLIENT_SSL_CERT_LDAP, LDAP, LDAP_BIND,OAUTH, DEVELOPMENT_BECOME_ANY_ACCOUNT, 默认是OpenID类型.不过网上很多教程,使用的是HTTP认证类型

1.Create '/home/sela/review_site' [Y/n]? Y
2.Location of Git repositories   [git]:
3.Database server type           [h2]: mysql  #数据库类型
4.Server hostname                [localhost]: #数据库host
5.Server port                    [(mysql default)]: #数据库端口
6.Database name                  [reviewdb]:   #数据库名
7.Database username              [sela]:    #数据库用户名
8.Type                           [LUCENE/?]: 
9.Authentication method          [OPENID/?]: oauth #认证方式
10.Get username from custom HTTP header [y/N]? 
11.SSO logout URL                 :
12.Enable signed push support     [y/N]? 
13.Install Verified label         [y/N]?
14.SMTP server hostname           [localhost]: smtp.163.com     #smtp邮箱配置
15.SMTP server port               [(default)]: 25
16.SMTP encryption                [NONE/?]: 
17.SMTP username                  [sela]:   #写完整的邮箱地址
18.Behind reverse proxy           [y/N]? y
19.Proxy uses SSL (https://)      [y/N]? N
20.Subdirectory on proxy server   [/]: 
21.Listen on address              [*]: http://127.0.0.1     #监听的地址
22.Listen on port                 [8080]:   #监听的端口
23.Canonical URL                  [https://127.0.0.1:8081/]: http://liuxd.gerrit.com #gerrit的主页地址

其他配置...

下面是我安装gerrit-3.0.3时的配置内容

$ java -jar gerrit-3.0.3.war init -d /lnmp/gerrit

Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2019-10-30 11:18:19,458] [main] INFO  com.google.gerrit.server.config.GerritServerConfigProvider : No /lnmp/gerrit/etc/gerrit.config; assuming defaults

*** Gerrit Code Review 3.0.3
*** 
Create '/lnmp/gerrit'          [Y/n]? Y     

*** Git Repositories
*** 
Location of Git repositories   [git]: 

*** Index
*** 
Type                           [lucene/?]: 

*** User Authentication
*** 
Authentication method          [openid/?]: oauth    #认证方式
Git/HTTP authentication        [http/?]: http
Enable signed push support     [y/N]? 

*** Review Labels
*** 
Install Verified label         [y/N]? 

*** Email Delivery
*** 
SMTP server hostname           [localhost]:smtp.163.com     #邮箱配置
SMTP server port               [(default)]: 
SMTP encryption                [none/?]: 
SMTP username                  [edz]:test@163.com     #完整的邮箱
test@163.coms password  :      #邮箱密码
              confirm password :    #确认密码

*** Container Process
*** 
Run as                         [edz]:   #gerrit运行用户
Java runtime                   [/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre]: 
Copy gerrit-3.0.3.war to /lnmp/gerrit/bin/gerrit.war [Y/n]? 
Copying gerrit-3.0.3.war to /lnmp/gerrit/bin/gerrit.war

*** SSH Daemon
*** 
Listen on address              [*]:     #ssh监听地址
Listen on port                 [29418]: #ssh监听端口
Generating SSH host key ... rsa... ed25519... ecdsa 256... ecdsa 384... ecdsa 521... done

*** HTTP Daemon
*** 
Behind reverse proxy           [y/N]? 
Use SSL (https://)             [y/N]? y
Listen on address              [*]: 127.0.0.1  #http监听地址
Listen on port                 [8080]: 8081  #http监听端口
Canonical URL                  [https://127.0.0.1:8081/]: http://liuxd.gerrit.com
Create new self-signed SSL certificate [Y/n]?   #是否生成签名证书
Certificate server name        [liuxd.gerrit.com]: 
Certificate expires in (days)  [365]: 36500

*** Cache   # 缓存文件
*** 


*** Plugins # 安装插件
*** 
Installing plugins.
Install plugin codemirror-editor version v3.0.3 [y/N]? y
Installed codemirror-editor v3.0.3
Install plugin commit-message-length-validator version v3.0.3 [y/N]? y
Installed commit-message-length-validator v3.0.3
Install plugin delete-project version v3.0.3 [y/N]? y
Installed delete-project v3.0.3
Install plugin download-commands version v3.0.3 [y/N]? y
Installed download-commands v3.0.3
Install plugin gitiles version v3.0.3 [y/N]? y
Installed gitiles v3.0.3
Install plugin hooks version v3.0.3 [y/N]? y
Installed hooks v3.0.3
Install plugin plugin-manager version v3.0.3 [y/N]? y
Installed plugin-manager v3.0.3
Install plugin replication version v3.0.3 [y/N]? y
Installed replication v3.0.3
Install plugin reviewnotes version v3.0.3 [y/N]? y
Installed reviewnotes v3.0.3
Install plugin singleusergroup version v3.0.3 [y/N]? y
Installed singleusergroup v3.0.3
Install plugin webhooks version v3.0.3 [y/N]? y
Installed webhooks v3.0.3
Initializing plugins.

Initialized /Users/edz/lnmp/gerrit
Reindexing projects:    100% (2/2) with: reindex --site-path /lnmp/gerrit --threads 1 --index projects
Reindexed 2 documents in projects index in 0.2s (9.7/s)
Executing /lnmp/gerrit/bin/gerrit.sh start
Starting Gerrit Code Review: FAILED
error: cannot start Gerrit: exit status 1
Waiting for server on liuxd.gerrit.com:80 ... OK
Opening http://liuxd.gerrit.com/#/admin/projects/ ...OK

配置文件:/lnmp/gerrit/etc/gerrit.config,配置时可以直接修改配置文件,也可以借助gerrit.war来配置,每次修改记得重启gerrit.

信息文件:/lnmp/gerrit/etc/secure.config,用来记录敏感信息的,如邮箱密码,oauth认证client-secret

配置文件gerrit.config

[gerrit]
        basePath = git  # 存放代码的目录
        #gerrit的主页地址,这个地址要通过nginx反向代理到下面配置的http监听的地址端口上
        canonicalWebUrl = http://liuxd.gerrit.com
        serverId = f8be05a7-f43d-42e2-9866-f121892516b6
[container]
        javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
        javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
        user = edz
        javaHome = /Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/jre
[index]
        type = LUCENE
[auth]
        type = OAUTH    # oauth登录认证类型
        gitBasicAuthPolicy = HTTP
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = smtp.163.com       # 邮箱配置
        smtpUser = test@163.com
        smtpServerPort = 25
        from = test@163.com       # 发送邮箱,这个项目安装配置项内没有,需要手动在配置文件中添加,不然gerrit3.0发送邮件失败
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = http://127.0.0.1:8081/      # 监听地址和端口
[cache]
        directory = cache
[plugin "gerrit-oauth-provider-gitlab-oauth"]   # gitlab oauth认证相关
        root-url = http://liuxd.gitlab.com
        client-id = dd787b8df8c65753e727d3f94b88f9eda2850fda039cdca8c11259b4a6b24f



信息文件secure.config

[auth]
        registerEmailPrivateKey = p7N8E0zAJxeyCde+nl9TVmBTwskkFYNEY=
[sendemail]
        smtpPass = email_passwd     # 邮箱密码
[plugin "gerrit-oauth-provider-gitlab-oauth"]
        client-secret = 74df2494d720da4223141251d9694e4d76a195f86d1a7a96095255c98e5822

5. nginx反向代理

server {
    listen       80;
    server_name  liuxd.gerrit.com;
    index index.html index.htm index.php;
    access_log  /lnmp/log/nginx/gerrit.access.log;
    error_log  /lnmp/log/nginx/gerrit.error.log;
    #allow   all;
    #deny    all;
    #auth_basic "Welcomme to Gerrit Code Review Site!";  #auth=type认证时,弹出验证登录对话框提示
    #auth_basic_user_file /lnmp/gerrit/etc/gerrit.password;    #auth=type认证时,登录认证文件存放路径

    location / {
        # 代理的指向的gerrit监听端口
        proxy_pass http://127.0.0.1:8081;
    }
}

重新加载nginx配置

$ nginx -s reload 

修改hosts

$ vim /etc/hosts
127.0.0.1 liuxd.gerrit.com

6. gerrit配置-HTTP认证(不推荐)

配置 gerrit 账户密码 (http登录验证模式)

# 修改配置文件中的配置项
[auth]
    type = http # http登录认证类型

上面nginx配置中的auth_basic_user_file 登录认证文件。这里我们需要用apachehtpasswd 工具来新建这个文件,这也是为什么我们虽然不用到apache的反向代理,仍然需要apache的原因。Mac系统中已经自带有apache了,所以我们可以直接用 htpasswd 命令

$ touch /lnmp/gerrit/etc/gerrit.password
$ htpasswd -b /lnmp/gerrit/etc/gerrit.password edz 123456  #管理员
$ htpasswd -b /lnmp/gerrit/etc/gerrit.password gerrit1 123456  #普通用户

htpasswd 参数
-c 新增用户, 会提示输入2遍密码, 重复使用会覆盖掉原来的文件
-b 使用命令行中的密码新增用户,而不是提示输入密码。
-m 追加一个用户或修改用户密码

权限问题
由于我的gerrit是安装到了,我的家目录下面, 所以上面的配置的登录用户,只有和我用户名一样的,才能正常登录显示, 不一样的就是登录上了,也是显示403.不过如果你是放到其他目录下的话, 只要权限正常,就能正常访问.

image.png

http认证类型下退出
如果你已经成功登录了gerrit的网页,那么如果你想退出,请直接关闭整个浏览器,gerrit没有做logout的session清除,

7. gerrit配置-oauth认证

Gerrit支持多种类型的oauth认证;

我们这里使用一个gerrit的登录插件gerrit-oauth-provider,这个插件在googlesource上, 如果被墙可以从它的github境像上下载 https://github.com/davido/gerrit-oauth-provider

gerrit-oauth-provider不仅仅支持 GitLab 登录。实际上它还支持 GoogleBitbucketFaceBookGitHub 等其他方式登录

构建安装这个插件需要 Bazel 的支持, 如果你没安装 Bazel,可以看下Bazel-自动化构建工具

Bazel构建需要连接googlesource, 注意是否被墙,如果被墙可以直接下载它在gitlab上最新的release: https://github.com/davido/gerrit-oauth-provider/releases/download/v3.0.0/gerrit-oauth-provider.jar

# 通过bazel安装
$ cd  ~/Downloads
$ git clone https://github.com/davido/gerrit-oauth-provider.git
$ cd gerrit-oauth-provider
$ bazel build gerrit-oauth-provider
$ cp  bazel-genfiles/oauth.jar /lnmp/gerrit/plugins/
# 直接下载构建好的release
$ wget https://github.com/davido/gerrit-oauth-provider/releases/download/v3.0.0/gerrit-oauth-provider.jar

# 注意直接下载jar形式,在copy时一定要将jar的名改成oauth.jar,不然的话oauth回跳的时候是不成功的
$ cp gerrit-oauth-provider.jar /lnmp/gerrit/plugins/oauth.jar

注意直接下载jar形式,在copy时一定要将jar的名改成oauth.jar,不然的话oauth回跳的时候是不成功的.

gerrit跳转到gitlab认证时,自带的回跳 url 就是 /oauth,所以在gitlab上的设置的回跳地址也要是/oauth,如
http://liuxd.gerrit.com/oauth.

详细的gitlab oauth认证见:docker下gitlab 安装配置使用中的应用auth创建部分,注意这里要用到的是系统级别的应用.

再次配置gerrit的配置项, 这次可以不用修改配置项,一直回车,直到oauth设置这里

$ cd /lnmp/gerrit/bin
$ java -jar gerrit.war init -d /lnmp/gerrit
…
…
Use Google OAuth provider for Gerrit login ? [Y/n]? n
Use GitHub OAuth provider for Gerrit login ? [Y/n]? n
Use Bitbucket OAuth provider for Gerrit login ? [Y/n]? n
Use CAS OAuth provider for Gerrit login ? [Y/n]? n
Use Facebook OAuth provider for Gerrit login ? [Y/n]? n
Use GitLab OAuth provider for Gerrit login ? [Y/n]? Y
GitLab Root URL                : http://liuxd.gitlab.com
Application client id          : 5df1920c829ac7d2672c7cf1b08ded84bba4f50734db99fd4ff5ab7f0b380e6c
Application client secret      : 
              confirm password : 
Use Dex OAuth provider for Gerrit login ? [Y/n]? n
Use Keycloak OAuth provider for Gerrit login ? [Y/n]? n
Use Office365 OAuth provider for Gerrit login ? [Y/n]? n
Use AirVantage OAuth provider for Gerrit login ? [Y/n]? n
Initialized /Users/edz/lnmp/gerrit
Reindexing projects:    100% (2/2) with: reindex --site-path /lnmp/gerrit --threads 1 --index projects
Reindexed 2 documents in projects index in 0.5s (4.3/s)
# 重启gerrit
$ ./gerrit.sh restart

再次登录gerrit,将走gitlab认证登录.

8. gerrit配置mysql数据库

gerrit从3.x系统开始采用accountPatchReviewDb配置项来配置数据库,弃用了database配置项,安装时也不在主动让你选择数据库配置了,它默认在站点路径下的db文件夹中创建H2数据库。
如果想更换数据库的话,需要借助MigrateAccountPatchReviewDb来迁移,迁移时要停止gerrit服务.
还要注意,db_name必须是一个新的db,并且不能重用以前2.x站点中的旧reviewdb数据库,否则gerrit的init将删除该表。

下面是官方文档中的说明

1574046178314.jpg

数据库连接配置项

[accountPatchReviewDb]
  url = jdbc:postgresql://<host>:<port>/<db_name>?user=<user>&password=<password>

使用 Mysql 的优势的哪些:

  • 有利于数据数据管理,mysql有丰富的界面和sql语法.
  • 有利于数据的备份,和恢复
  • 有利于服务的扩展,如一台服务器增加到多台服务器

Mysql库和用户创建(如果要采用mysql数据库)
如果准备让gerrit采用mysql数据库的话, 我们要先将gerrit连接的用户和库创建出来


# 创建数据库reviewdb
mysql> create database reviewdb;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE USER 'gerrit'@'localhost' IDENTIFIED BY 'gerrit';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER 'gerrit'@'127.0.0.1' IDENTIFIED BY 'gerrit';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on reviewdb.* to gerrit@localhost identified by 'gerrit';
Query OK, 0 rows affected (0.00 sec)

# 10.*.*.*为部署gerrit服务的内网地址
mysql> grant all privileges on reviewdb.* to gerrit@'10.*.*.*' identified by 'gerrit'; 
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

Gerrit常用命令

  • gerrit.sh {start|stop|restart|check|status|run|supervise|threads}
  • gerrit.sh start #启动
  • gerrit.sh stop #停止
  • gerrit.sh restart #重启

关联Gitlab

  1. 先检测plugins/replication.jar扩展有没有安装,没有安装的话,通过java -jar gerrit.war init -d /lnmp/gerrit来安装扩展.

  2. 配置gerrit下的etc/replication.config文件,如果etc目录下没有这个文件则创建

    [remote "liuxd.gitlab.com"]
    url = ssh://git@liuxd.gitlab.com:222/${name}.git
    push = +refs/heads/:refs/heads/
    push = +refs/tags/:refs/tags/
    push = +refs/changes/:refs/changes/
    timtout = 30
    threads = 3

  3. 配置~/.ssh/config文件,如果.ssh目录下没有这个文件则创建

    Host liuxd.gitlab.com
    User liuxd@163.com
    Port 222
    IdentityFile ~/.ssh/id_rsa
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
    PreferredAuthentications publickey

  1. 重启gerrit

问题

  1. Gerrit ReplicationInvalid privatekey 错误

    原因:id_rsa文件的注释是 -----Begin openssh private key---
    需要生成格式是 -----begin RSA private key---的才行
    解决:1、使用 ssh-keygen -t rsa -m PEM -C 'liuxd@163.com' 命令重新生成id_rsa文件;
    2、将id_rsa.pub重新添加到gerrit管理员账号秘钥中.

  2. logs/error_log文件中没有报错信息,但gerritpushgit. 可以通过查看logs/replication_log中的报错信息来定位

  3. logs/replication_log中push时报错

    Failed replicate of refs/heads/master to ssh://git@liuxd.gitlab.com:222/www/test_project.git, reason: pre-receive hook declined
    权限问题,有可能是gerrit push代码的用户是Develop角色默认下没有远程访问master的权限.
    解决方案:在项目的【Setting】中的【Protected branches】可以设置哪些分支是被保护的,默认情况下【master】分支是处于被保护状态下的,develop角色的人是无法提交到master分支的,在下面的【Developers can push】打上钩就可以了。

    image.png

Gerrit的使用

1. 创建项目

使用 admin 账户来登录;
gerrit 创建的项目名称必须跟gitlab账户下面的项目名称一致:

image.png

上面是创建的项目目录在: /lnmp/gerrit/git/www/test_project.git

2. gitlab代码同步到gerrit

  1. 先再gitlab上给之前配置的gerrit关联Gitlab的用户增加新项目的权限,要是最高权限Maintainer;

  2. 先在其他地方从gitlab拉取一份代码

$ cd ~/
$ git clone ssh://git@liuxd.gitlab.com:222/www/test_project.git
$ git pull
  1. 删除原gerrit项目的git文件
$ cd /lnmp/gerrit/git/www/test_project.git
$ rm -rf *
  1. gitlab代码下的.git目录中的文件复制到gerrit项目中
$ cd ~/test_project
$ cd .git
$ cp -R ./* /lnmp/gerrit/git/www/test_project.git/
  1. 现在gitlab已经同步到gerrit了,可能通过gerrit来拉取代码了

3. 增加SSH Keys

ssh的生成的公钥添加到gerrit

$ cat ~/.ssh/id_rsa.pub 

cat出来的公钥,添加到gerrit -> setting -> SSH Keys

image.png

4. 拉取项目代码

使用开发人员账户来登录gerrit.
通过ssh形式克隆代码, 并且生成勾子文件.git/hooks/commit-msg

image.png

5. gerrit提交代码流程

gerrit提交代码流程如下:

  1. 修改过代码后, 用git add ./来添加修改过的文件;
  2. 然后用 git commit -m "提交注释" 提交到本地分支,并且这时gerrit会通过勾子脚本生成一个Change-Id用于code review使用;
  3. 如果多次提交可以用 git commit --amend 来追加提交;
  4. 提交到gerrit远程分支 git push 远程地址 本地分支:refs/for/远程分支;

具体代码执行如下

$ git add ./
$ git commit -m '12345'
[master f488a3b] 12345
 1 file changed, 1 insertion(+)
 create mode 100644 test.php
 
$ git log
commit f488a3b56bf790e904bc4684621f434745fdcee0 (HEAD -> master)
Author: liuxd<liuxd@163.com>
Date:   Mon Nov 4 18:54:56 2019 +0800

    12345
    
    Change-Id: I394d35d0c2f43fead70b646463e5a806ed5d1ec3

    
$ git push origin master:refs/for/master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Writing objects: 100% (3/3), 279 bytes | 279.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Processing changes: refs: 1, new: 1, done    
remote: 
remote: SUCCESS
remote: 
remote:   http://liuxd.gerrit.com/c/www/test_project/+/1 12345 [NEW]
remote: 
To ssh://liuxd.gerrit.com:29418/www/test_project
 * [new branch]      master -> refs/for/master

6. 简化gerrit提交命令

gerrit的提交命令太长了,也不容易记忆,所以自己写了一个gerrit命令

$ cd /lnmp/gerrit/bin
$ vim gerrit

gerrit命令文件

#/bin/bash
oper=$1;
local_branch=$2;
origin_branch=$3;

if [ $oper = '' ]; then
    echo '请输入要进行的操作';
    exit;
fi

if [ $local_branch = '' ]; then
    echo '请输入本地分支名';
    exit;
fi

if [ $origin_branch = '' ]; then
    echo '请输入远程分支名';
    exit;
fi

/usr/bin/git ${oper} origin ${local_branch}:refs/for/${origin_branch}

gerrit文件增加执行权限,并将它加入到~/.bash_profile文件中

$ chmod a+x gerrit
$ vim ~/.bash_profile

#gerrit
export PATH="/lnmp/gerrit/bin:$PATH"

$ source ~/.bash_profile 

下次再提交就可以用gerrit push 本地分支 远程分支命令来提交了

Gerrit审核 - code review

审核流程

代码提交后,在gerrit的 CHANGES -> OPEN 下可以查看待审核的列表

image.png

在列表中点击要code review的提交记录,进入提交详情页
注意:提交人不能自己审核自己的代码,需要第二个人来审核

image.png

code review后, 再点击SUBMIT提交,gerrit会将代码合并到git的相应分支上

image.png

参考链接:

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