背景
公司使用Gerrit作为代码托管平台。
Gerrit除了设置项目权限外,还提供了很好的code review功能。
下面分别简单介绍普通Git用法和code review用法
普通Git使用方法:
如上图所示:
Git仓库主要分为:本地仓库(各位clone到本机)和远端仓库(scm负责维护的,搭建在一台服务器上面);
绝大多数的命令都不需要和远端的git仓库打交道,本地执行即可;
1 | git clone :克隆一个远端git仓库到本地 |
Code Review使用方法:
如上图所示:
使用Gerrit进行code review一言蔽之就是Gerrit加了个中间层;
本地仓库的变更执行git push提交到Gerrit;code reviewer可以在gerrit上面对本次提交进行review并给出评价;
管理员在review评估ok(至少有一个+2)后,在gerrit上面点击submit,会把本次变更推送到远端仓库。
PS:+1 +2 -1 -2 0不是数字意义!!!(两个reviewer都给了+1评论并不代表已经+2了)
原理解析:
为了实现上面所说的功能,gerrit引入了change_id和for空间;
我们执行git push到for空间;
如果大家的本地git config没有做过配置,那么咱们执行git push的完整命令是:
git push origin HEAD:refs/heads/master
推送当前本地最新代码到远端(origin)master分支
使用code review的话执行git push完整命令是:
git push origin HEAD:refs/for/master
推送当前本地最新代码到for空间的master分支供gerrit识别
PS:以上写的都是git原始命令供大家更好的理解,实际使用中可以简写!!!
Gerrit根据change-Id识别你的patch;
我们需要引入commit-msg钩子文件到本地代码库:
(这个是gerrit原生提供的通过scp命令实现)
在本地代码库下运行(将weilong.wang改成自己的用户名),执行一次即可
gitdir=$(git rev-parse –git-dir); scp -p -P 29418 weilong.wang@Gerrit_Server_Ip:hooks/commit-msg ${gitdir}/hooks/
commit-msg钩子的作用和使用:
1.Dev正常本地修改代码,git add,git commit 会自动在message后面增加算出一个唯一的change-id
例如: Change-Id: I45088f6b73bf53b62b2ee3b09c005952e9838548
2.如果本次patch提交到gerrit后,review不通过:本地修改代码, git add, git commit –amend
(更新新的修改到当前commit;同时可以修改commit message;不要对message的最后一行change-id做修改!!!)
接着push到gerrit:因为change-id并没有改变,所以还是同一个地方,patch set增长1
PS:建议合并最新版本代码到本地:使用git pull –rebase
如果使用git pull: merge点不自动产生change-id!!!
喜闻乐见简化配置:
根据上面的解释大家应该发现想使用gerrit进行code review还得手工做些事情:
- git clone远端代码库到本地
- 从远端服务器下载commit-msg钩子到本地仓库.git/hooks/目录
- 每次都要本地git commit后执行git push origin HEAD:refs/for/master
- 去gerrit上面添加code reviewers
这并不是我想要的生活。。。
一劳永逸方法:
- git clone远端代码库到本地
- 从远端服务器下载commit-msg钩子到本地仓库.git/hooks/目录
- 修改本地代码库config vi .git/config增加下面内容
[remote “review_master”]
url = 代码库地址
push = HEAD:refs/for/master%r=weilong.wang@memblaze.com,r=dev1@memblaze.com - 本地git commit后执行git push review_master即可
会自动提交到refs/for/master并增加weilong和dev1作为code reviewers;
PS: remote “review_master” 这个可以换成你喜欢的其他字符串;假如改成remote “haha” 那么最终push的时候执行 git push haha
PS: pushurl这个请自行替换成各位执行git clone的地址
PS: 自动添加code reviewers请自行替换成各位项目的同事