文章目录
一、Gerrit介绍
Gerrit 是建立在 git 版本控制系统之上的,基于 web 的代码审核工具。
Gerrit 是免费的,开源的,有一个可视化界面可供用户操作。
主要用于代码审核,gerrit强制引入了代码审核机制, 通过人工代码审核和自动化代码验证的方式, 确保核心代码多人校验、多人互备和自动化构建核验 。
二、Gerrit和Git区别
- Git是一种版本控制系统;而Gerrit是一种基于web的代码审查软件。
- Git 用于代码的存储和版本控制;Gerrit 用于团队间相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。
三、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 这个方面比较欠缺。
四、Gerrit工作流程
git的流程:git add
-> git commit
-> git pish
-> 远程仓库 (repositoriies)
gerrit的流程:
- 开发编写代码
- push到gerrit服务器
- 审核人员在web服务器review(可以多人review)
- 审核通过(approve)后
- 提交(submmit)代码到远程仓库(repositoriies)
在使用过程中,有两点需要特别注意下:
- 当进行 commit 时,必须要生成一个 Change-Id,否则,push 到 gerrit 服务器时,会收到一个错误提醒。
提交者不能直接把代码推到远程的 master 主线(或者其他远程分支)上去。这样就相当于越过了 gerrit了。 gerrit 必须依赖于一个 refs/for/*的分支。假如我们远程只有一个 master 主线,那么只有当你的代码被提交到 refs/for/master 分支时,gerrit 才会知道,我收到了一个需要审核的代码推送,需要通知审核员来审核代码了。 - 当审核通过之后,gerrit 会自动将这条分支合并到 master 主线上,然后邮件通知相关成员,master 分支有更新,需要的成员再去pull就好了。
五、Gerrit的SSH配置
5.1git下载与安装
参考文档:git的下载与安装
5.2配置SSH
1.打开Git Bash,执行以下命令:
git config --global user.name "[name]" //设置用户名
git config --global user.email "[email address]" //设置邮箱
2.生成ssh key,执行以下命令:
ssh-keygen -t rsa //提示就直接回车,在用户目录下生成.ssh目录:里面有id_rsa.pub(公钥)、id_rsa(私钥)
3.打开.ssh目录,复制id_rsa.pub文件里面的内容。
4.打开Gerrit网站,找到settings -> SSH Keys -> add new ssh keys,将刚复制的公钥复制在这,就成功了。
5.3测试ssh
- 点击Project-> Create New Project
- 设置project name :Test1
- 创建用户组 dev verify review , People->Create New Group,创建三个组,dev组用于提交代码/verify用于验证代码/review组用于code review
- 在Project->access中设置权限,点击edit
- 开发提交代码
- 此时在all->open能够看到一次修改的提交,all->代表已经合并的提交,Abandon代表拒绝的提交 ,其中状态标志CR代表code review情况,V代表verify情况
- 点击蓝色按钮后,code review通过
- 点击蓝色按钮,V通过
- 当两者通过后,admin的submit功能出现
- 点击完成后,all->open看不到了,all->merged出现本次提交纪录
六、Gerrit的使用
1.选定一个存放git项目的目录,右键打开Git Bash
2.初始化git仓库
git init
3.clone远程仓库代码
git clone [http/ssh]
4.更新代码
执行git pull
或者git fetch
来更新代码
注意:
git pull -v -progress "orgin"
命令可以显示更详细的信息,git pull
命令会fetch所有的远程分支信息到本地,同时当前本地分支会进行合并- 如果本地有修改文件,并且远程也修改了文件,pull就会报错,需要手动处理冲突。
5.修改代码
使用git checkout
来切换分支,再修改代码,修改完后使用git add
把文件修改的内容添加到暂存区,在执行git commit
命令提交到本地库。
- 提交某个文件:
git commit 文件 -m "注释"
- 提交多个文件:
git commit 文件1 文件2 -m "注释"
- 提交全部文件:
git commit -m "注释"
删除文件:
git rm 文件
git add 文件
git commit 文件 -m "注释"
移动文件:
git mv 源文件路径 目标文件路径
注意:
- 每次add和commit之前都要执行pull操作,避免后面push时产生冲突合并
6.push代码到服务器
将代码从本地branchX传到远端branchX
git checkout branchX
git pull
git push orgin HEAD:refs/for/branchX
或者git push orgin branchX:refs/for/branchX
push完后需要上Gerrit管理界面邀请代码审核人员来review。
orgin:远程仓库名称,用git remove -v
可以查看所有的远程仓库名称。
7.切换分支
切换到branchX
git checkout branchX
注意:
- 切换分支时,如果本地有未commit的文件,则使用
git stash
命令将当前分支的改动临时保存起来。然后再切换分支。 - 切换回之前分支时,需要恢复被临时保存的改动。使用命令:
8.查看分支
git branch
:只显示本地分支名,当前分支名前有星号。git branch -v
:显示本地分支名,当前分支名前有星号,显示commit id。git branch -w
: 显示本地分支名,当前分支名前有星号。显示commit id,显示追踪的远程分支名git branch -a
:显示所有分支名(包含远程分支名)git branch -r
:查看远程分支名
9.合并分支
再Gerrit里合并时请不要采用fast-forward快进方式,以把master分支合并到当前分支为例
git merge --no--ff -m "注释" master
其中–no–f表示不采用fast-forward快进方式。
10.暂存和恢复本地修改
暂存本地修改:
git stash -u
恢复本地修改:
- 先用
git stash list
查看有多少个临时保存的改动 - 再用
git stash apply --index stash@{n}
,n为git stash list
查看到的改动的数字。 - 再用
git stash drop stash@{n}
删除该临时保存的改动。