Gerrit 配置及使用要点
简述:
Gerrit的原理是由Gerrit介入git提交的流程,开发者从Gerrit提供的地址获取代码,修改的代码往Gerrit的特定分支提交,便可自动成为Gerrit中的审查项;
审查者审查通过后,Gerrit会自动将代码merge到正式分支。
之后开发者从正式分支pull即可获得最新的代码。
创建开发者帐号
Gerrit的原理是由Gerrit介入git提交的流程,开发者从Gerrit提供的地址获取代码,修改的代码往Gerrit的特定分支提交,便可自动成为Gerrit中的审查项;
审查者审查通过后,Gerrit会自动将代码merge到正式分支。
之后开发者从正式分支pull即可获得最新的代码。
帐号管理
系统的auth type选择DEVELOPMENT_BECOME_ANY_ACCOUNT时,首个创建的帐号即为admin,号享有系统管理和approve等权限。
其他的帐号根据需要创建、并赋予权限。
注意:username选择后便不可更改,需谨慎。full name是供显示用的,可以更改。
(原想在project owner组下添加用户以获得approve权限,但该组不是用于此用途的,故弃用。)
创建reviewer角色(组):用于最终确认代码修改、提交合并到主干。
参照http://blog.csdn.net/csfreebird/article/details/7920304
简单归纳为:
系统的auth type选择DEVELOPMENT_BECOME_ANY_ACCOUNT时,首个创建的帐号即为admin,号享有系统管理和approve等权限。
其他的帐号根据需要创建、并赋予权限。
注意:username选择后便不可更改,需谨慎。full name是供显示用的,可以更改。
(原想在project owner组下添加用户以获得approve权限,但该组不是用于此用途的,故弃用。)
创建reviewer角色(组):用于最终确认代码修改、提交合并到主干。
参照http://blog.csdn.net/csfreebird/article/details/7920304
简单归纳为:
- 添加组名Reviewer
- 在项目All projects的Access中,对引用refs/*添加Reviewer组的Label Code-Review和Submit权限。
- 给该组添加的用户,即拥有最终approve权限。
Push Tag
若需要push tag权限,例如指定给Administrator组,则需在refs/tags/*下分配Create Reference权限给Administrator组:
(在TortoiseGit中,push tag的操作需要通过sync对话框找到)
创建开发者帐号
- 指定username后,取代码、提交代码都需以该username进行。
- 需在系统中配置该开发者的email,并且在开发者commit代码前需预先指定该email,否则会被系统拒绝。(若用命令:git config --global user.email "you@example.com"; git config --global user.name "Your Name"。若是TortoiseGit可在Settings-Git中配置)
- 若选用ssh方式访问代码,可通过web录入该账户对应的id_rsa.pub公钥,以免每次输入密码。
- 若选用http方式访问代码(例如使用TortoiseGit),需在系统Settings页面 - HTTP Password中生成密码。在获取代码之后可将用户名密码填到settings - Git - Remote - origin中,形如(http://user1:password1@gerritserver:9000/prj1),也可免去每次输入密码。也可以在获取代码时直接填写地址http://user1:password1@gerritserver:9000/prj1。
与现有git repo集成
- 若已存在现有的git repo、想要集成到Gerrit中,只需在Gerrit中创建新项目(建议与该repo同名,以便管理,例如repo1,则会生成
/git/repo1.git),之后将原git repo强行链接到名称repo1.git即可。 - 访问之前已有的branch:一般情况下clone出来后可以正常列出之前已有的branch(可通过TortoiseGit的Switch/Checkout菜单来浏览),与使用原始git一样操作。但如果无法列出,则可以通过手工指定branch的方式来clone,同样可以找回需要的branch。
开发者流程
复查者相关
特性:
Gerrit and code review best practiceshttp://gerrit-training.scmforge.com/target/gerrit-and-code-review-best-practices/index.html
http://johnshen0708.iteye.com/blog/1440860
- 进入Gerrit页面,根据相应项目的git clone链接,用git命令行或GUI工具例如TortoiseGit获取代码。
- (通过特定scp命令*)获取commit-msg,放在<工程>/.git/hook/下。(该hook用于自动生成每次commit的Change-Id,用于Gerrit内部维护changeset的关系。若没有该hook,默认设置下Gerrit会阻止push)
- 若想避免每次git clone时都手工放置commit-msg文件:对于TortoiseGit,可以获得一份commit-msg以后,拷到
\share\git-core\templates\hooks;对于linux,可拷到/usr/share/git-core/templates/hooks/ 并确保可执行权限。这样在新git clone的项目中即可自动带有该hook。
- 若想避免每次git clone时都手工放置commit-msg文件:对于TortoiseGit,可以获得一份commit-msg以后,拷到
- 修改完代码并commit后,须push到特定分支:refs/to/master;命令行为git push origin HEAD:refs/for/master。(默认系统会阻止直接往master的push)。注:这里的master为分支名。如果是工作在别的分支,相应修改。建分支可以临时获得Admin权限,然后push all来创建。
- 若想避免每次用命令行push时都敲这些参数,可在.git/config的[remote "origin"]段,添加push = HEAD:refs/for/master,这样每次push只需要敲git push即可。
- 待review完成后,系统会自动将代码变动merge到master。
- 若review不通过,开发者重新修改代码,commit时选择Amend last commit,以便为Gerrit保留该次commit时的Change-Id。之后照常push、提交review。
- 从master pull,即可获得最新的代码。
*命令:scp -p -P 29418 @:hooks/commit-msg /.git/hooks/
(见http://gerrit-documentation.storage.googleapis.com/Documentation/2.8.1/cmd-hook-commit-msg.html#_obtaining)
若想避免每次git clone时都手工放置commit-msg文件:对于TortoiseGit,可以获得一份commit-msg以后,拷到 \share\git-core\templates\hooks;对于linux,可拷到 /usr/share/git-core/templates/hooks/ 并确保可执行权限。这样在新git clone的项目中即可自动带有该hook。
复查者相关
特性:
- 若开发者提交了多个有前后依赖关系的版本,而review可以不按照依赖关系进行,系统仍会根据依赖关系按照正确的顺序自动进行merge。
邮件通知设置
除了在java -jar gerrit.war init配置smtp server/user之外,还需要在生成的etc/gerrit.config中[sendemail]段添加:
否则很可能被现在主流的smtp服务器拒绝。(通过 tail -F logs/* 可排查问题)
中文问题
安装时 reviewdb要选UTF8。
如果不幸选用了latin1,也没关系,可以手动对逐个表进行修改:
ALTER TABLE `changes`CONVERT TO CHARSET utf8;
ALTER TABLE `change_messages`CONVERT TO CHARSET utf8;
...
附:比较好的git和gerrit介绍资料
http://gerrit-training.scmforge.com/git-gerrit-workshop.html#git-infoGerrit and code review best practiceshttp://gerrit-training.scmforge.com/target/gerrit-and-code-review-best-practices/index.html
http://johnshen0708.iteye.com/blog/1440860