sed. Every user account is a member of one or more groups, and access and privileges are granted to those groups. Access rights cannot be granted to individual users.
在gerrit中權(quán)限控制是基于群組的. 每個用戶有一個或者多個群組, 訪問權(quán)限被賦予這些群組.訪問權(quán)限不能賦予個人用戶.
System Groups
在Gerrit系統(tǒng)
自帶下面的群組
- Anonymous Users
- Change Owner
- Project Owners
- Registered Users
Anonymous Users
所有用戶都是匿名用戶
成員, 所有用戶都能繼承Anonymous Users
所有訪問權(quán)限.
當(dāng)前只有Read access
權(quán)限值得賦予給Anonymous Users
群組, 因為其他權(quán)限都需要認(rèn)證.

Project Owners
Project Owners
的訪問權(quán)限在Project
范圍內(nèi)有效

Change Owner
Change Owner
的訪問權(quán)限在Change
范圍內(nèi)有效
Registered Users
所有在頁面上登錄成功的用戶都會自動注冊為gerrit用戶,屬于Registered Users
群組
Registered Users
群組通常被賦予Code-Review -1..+1
權(quán)限, 允許給需要審查代碼投票, 但不會引起審查被批準(zhǔn)和拒絕

Predefined Groups
system groups
在Gerrit系統(tǒng)內(nèi)部就定義好了, 而普通群組信息被保存在ACCOUNT_GROUPS
表中,Predefined groups
群組信息也保存在ACCOUNT_GROUPS
表中. Predefined groups
群組在Gerrit初始化時創(chuàng)建并且擁有唯一的UUID
值
All-Projects -> meta/config -> groups
文件內(nèi)容
5210215f92225c45a5ad123016c8706336f55a7d Administrators
df9b717d413c614cb51e39525619b311f077ec15 Non-Interactive Users
global:Anonymous-Users Anonymous Users
global:Project-Owners Project Owners
global:Registered-Users Registered Users
Gerrit
自帶兩個predefined groups
:
- Administrators
- Non-Interactive Users
Administrators
Administrators
是Gerrit root
角色, 在Gerrit初始化時Administrate Server
權(quán)限被賦予給這個Predefined Groups
群組.
在Administrators
組的成員可以管理所有項目, 但是不意味著任何其他權(quán)限. Administrators
組不會自動獲得代碼審查批準(zhǔn)和提交權(quán)限.
Non-Interactive Users
Interactive Users
比如在web頁面上審查代碼, 在提交/獲取代碼的用戶
Non-Interactive Users
是可以通過Gerrit接口進(jìn)行操作的組, 在Gerrit初始化時Priority BATCH
和Stream Events
權(quán)限被賦予給這個Predefined Groups
組.
Non-Interactive Users
和Interactive Users
使用不同的線程池, 防止交互式用戶搶占線程. 當(dāng)系統(tǒng)資源緊張時確保了交互式的用戶可以繼續(xù)工作.
Project Access Control Lists
All Projects
在All Projects
項目中的訪問權(quán)限會自動被其他項目繼承, 只有Administrate Server capability
能夠編輯All-Projects
權(quán)限.

Per-Project
先計算子項目的訪問權(quán)限, 再計算All Projects
的訪問權(quán)限, 允許一些權(quán)限可以被覆蓋.
對一個群組賦予DENY
限制時, 通常只對READ
權(quán)限有效.

Special and magic references
refs/heads/*
和refs/tags/*
是Git常用的引用命名空間, 一個用來存儲分支一個用來標(biāo)簽
在refs/*
命名空間下的引用都是有效的,Gerrit在refs/*
有一些特殊用處的命名空間和引用
Special references
這些特殊的引用的內(nèi)容由Gerrit生成或者包含重要的項目配置信息
refs/changes/*
refs/meta/config
refs/meta/dashboards/*
refs/notes/review
Magic references
refs/for/<branch ref>
refs/publish/*
refs/drafts/*
添加新的補(bǔ)丁
git fetch ssh://admin@localhost:29418/gerrit_ci refs/changes/03/3/1
git branch fix_xxx FETCH_HEAD && git checkout fix_xxx
vi README
git add README
git commit --amend
git push origin HEAD:refs/for/master
查看遠(yuǎn)程引用
git ls-remote ssh:
61fd289472707d79f73289216a4c5f0ca4cee4e1 HEAD
eeaef9da4ea27d7c23bfb5f9a2ed1b5357ebbba8 refs/changes/01/1/1
5f8ed98b0f88787c22e705595e2818db62874f56 refs/changes/02/2/1
bfdb700f4aab3afc32ec79a29b0e25f8be758f8f refs/changes/03/3/1
effa7b004eec0b85e722fe10be6468e4ed9b78d3 refs/changes/03/3/2
61fd289472707d79f73289216a4c5f0ca4cee4e1 refs/heads/master
9f282c08d5108c6817dd1504e8bec0e94ba59d47 refs/meta/config
405030285eed7406b1ac7cfa6a5211331165b8e2 refs/notes/review
修改項目配置文件
git clone ssh://admin@localhost:29418/All-Projects && scp -p -P 29418 admin@localhost:hooks/commit-msg All-Projects/.git/hooks/
git fetch origin refs/meta/config:refs/remotes/origin/meta/config
git checkout meta/config
git add .
git commit -m "modify config"
git push origin meta/config:meta/config
Access Categories
Abandon
代碼審查時允許用戶丟棄這個審查。如果對change
有push
權(quán)限,同時具有push
,abandon
,restore
權(quán)限
Create Reference
用戶可以創(chuàng)建新的references
, branches or tags
, 創(chuàng)建時引用必須不存在,不能刪除已經(jīng)創(chuàng)建的引用
如果僅僅推送標(biāo)簽,給refs/tags/*
賦予Create Reference
權(quán)限
這個權(quán)限通常用在創(chuàng)建某個命名空間下的分支, 如:某個部門自由創(chuàng)建分支權(quán)限refs/heads/hello/*
給某用戶自由創(chuàng)建分支權(quán)限, 給refs/heads/sandbox/${username}/*
賦予Create Reference
權(quán)限
如果你這樣賦予Create Reference
權(quán)限,記得同時賦予push force
權(quán)限, 這樣擁有清理

Forge Author && Forge Committer && Forge Server
查看提交中Author
和Committer
git log --format=full
commit 2dfae738781a3ba641ee06c913fd51162335a941
Author: admin <c2290910211@163.com>
Commit: gerrit_test <c2290910211@aliyun.com>
admin gerrit_test
Change-Id: I0830cf061306101e977f9adf55270c9b3a3f59c4
Author
一般表示誰創(chuàng)建了這個提交,也可以用git commit --amend --reset-author
等命令修改
Committer
一般表示誰修改了這個提交,在使用git commit --amend
等命令時修改
通常Gerrit需要在Author
和提交的Committer
認(rèn)證信息中至少一個,與uploading user
注冊過的郵箱地址匹配,Forge Author
和Forge Committer
允許用戶繞過提交時的身份驗證
Forge Author
允許提交中Author
信息不經(jīng)過驗證, 這個權(quán)限在下面場景非常有效,通過郵件接收第三方補(bǔ)丁,cherry-pick
其他人的分支提交,審查合并前修改其他人的一些次要問題.
默認(rèn)在All-Projects
賦予Registered Users
組Forge Author
權(quán)限.
Forge Committer
允許提交中Committer
信息不經(jīng)過驗證和不驗證匿名標(biāo)簽對象,通常在需要其他服務(wù)器自動提交時有用
Forge Server
允許在提交中Committer
信息使用Server
的用戶名和郵箱. 這個權(quán)限在強(qiáng)制推送git filter-branch
修改過信息的提交和由這個Gerrit Code Review server
創(chuàng)建的合并提交時有用.
在etc/gerrit.config
可以配置Server
的用戶名和郵箱,user.name
默認(rèn)值Gerrit Code Review
, user.email
默認(rèn)值在啟動時生成gerrit@hostname

Owner
允許修改項目以下配置:
- 改變項目描述
- 通過SSH創(chuàng)建新的分支
- 通過Web界面創(chuàng)建和刪除分支
- 賦予和撤銷任何訪問權(quán)限,包括
Owner
權(quán)限
子命名空間的所有權(quán)可以通過命名空間格式來委派. 要委派以qa/
開始的所有分支權(quán)限給QA群組,給refs/heads/qa/*
添加Owner
權(quán)限。 QA小組的成員可以進(jìn)一步細(xì)分訪問權(quán)限,但只能對refs/heads/qa/
開始的分支有效.
Push
這類分支控制用戶如何上傳提交到Gerrit. 根據(jù)命名空間賦予的Push
權(quán)限, 可以允許繞過代碼審查直接推送到分支, 也可以允許創(chuàng)建新的change
進(jìn)行代碼審查.
Direct Push
在Direct Push
權(quán)限下,任何已經(jīng)存在的分支都接收fast-forward
提交,創(chuàng)建新的分支需要Create Reference
權(quán)限. 刪除已經(jīng)存在的分支會被拒絕,因為在這個最安全的模式下, 提交不會被丟棄.
Force選項
允許分支被刪除. 由于force push
實(shí)際上刪除分支后會創(chuàng)建這個分支,但是這是個原子操作并且會被記錄,也允許force push
更新分支. 帶有force
選項會導(dǎo)致項目歷史中的提交被丟棄.
force
選項對只想使用Gerrit訪問權(quán)限功能而不需要代碼審查的項目有效, 對于需要進(jìn)行代碼審查的項目不應(yīng)該分配這個權(quán)限.
Upload To Code Review
Upload To Code Review
權(quán)限授權(quán)在refs/for/refs/heads/BRANCH
命名空間上,允許用戶上傳non-merge
提交到refs/for/BRANCH
命名空間,創(chuàng)建新的change
進(jìn)行代碼審查.
用戶在自己環(huán)境下提交代碼需要clone/fetch
項目代碼,所以必須賦予Read
權(quán)限
對于開源公開的Gerrit安裝方式,All-Projects
中refs/for/refs/heads/*
通常給Registered Users
賦予Read
和Push
權(quán)限. 很多私有安裝, 通常refs/for/refs/heads/*
通常給all users
簡單的賦予Read
和Push
權(quán)限.
force
選項賦予refs/for/refs/heads/*
命名空間沒有作用.
Push Merge Commits
Push Merge Commits
權(quán)限允許用戶上傳merge commits
.這是Push
附加的訪問權(quán)限,所以只賦予Push Merge Commits
權(quán)限是不夠的. 一些項目希望只能由Gerrit自動合并提交, 可以通過只賦予Push
權(quán)限而不賦予Push Merge Commit
權(quán)限.
賦予Push Merge Commit
權(quán)限通常必須以refs/for/
為前綴,例如refs/for/refs/heads/BRANCH
. refs/heads/BRANCH
作為補(bǔ)充, 賦予Read
權(quán)限后允許直接推送non-merge
提交,賦予Push Merge Commit
權(quán)限后也允許直接提交一個merge
提交.
Push Annotated Tag
允許推送帶注釋的標(biāo)簽
到遠(yuǎn)程倉庫, 標(biāo)簽必須帶有注釋
.
#創(chuàng)建帶注釋的標(biāo)簽
git tag -a <tagname> -m <comment>
#提交標(biāo)簽到遠(yuǎn)程倉庫
git push origin --tags
#獲取標(biāo)簽
git fetch --tags
標(biāo)簽的email
一定會與提交者的郵箱進(jìn)行驗證,如果推送其他人的標(biāo)簽需要同時賦予Push Annotated Tag
和Forge Committer Identity
權(quán)限.
git show v1.0
tag v1.0
Tagger: username <email>
如果需要推送輕量級標(biāo)簽
(不帶注釋
), 給refs/tags/*
命名空間賦予Create Reference
權(quán)限, 輕量級標(biāo)簽就像Git中的分支一樣.
如果需要刪除或者重寫標(biāo)簽, 給refs/tags/*
命名空間賦予帶force選項的Push
權(quán)限,刪除標(biāo)簽需要和刪除分支一樣的權(quán)限.
Push Signed Tag
允許推送PGP簽證
的標(biāo)簽到遠(yuǎn)程倉庫
git tag -u "gpg-key-id" -m "tag comment" <tagname>
Read
Read
權(quán)限控制查看項目的change
,comment
,code diff
和通過SSH或者HTTP協(xié)議訪問倉庫的權(quán)限
這個權(quán)限非常特殊, 先計算項目中的Read
權(quán)限, 再計算all-projects
的Read
權(quán)限.
如果項目中賦予DENY Read
權(quán)限,all-projects
項目不管是否賦予ALLOW READ
都將無效.這個權(quán)限對于隱藏一些項目非常有用.
Rebase
允許用戶在web頁面上進(jìn)行rebase changes
, change
作者和提交者可以通過頁面進(jìn)行rebase changes
(盡管沒有賦予Rebase
權(quán)限)
Remove Reviewer
允許用戶從審查者列表中移除其他用戶.
Change owners
能夠移除那些審查分?jǐn)?shù)為0或者負(fù)數(shù)的審查者.(盡管沒有賦予Remove Reviewer
權(quán)限)
Project owners
和site administrators
能夠移除任何審查者(盡管沒有賦予Remove Reviewer
權(quán)限)
其他用戶只能將他們自己從審查者列表中移除.
Review Labels
在項目中配置label My-Name
,label My-Name
和定義好的范圍分?jǐn)?shù)相關(guān)聯(lián). 同時也關(guān)聯(lián)labelAs-My-Name
權(quán)限, 可以允許編輯用戶定義的label
.
Gerrit帶有配置好的Code-Review
標(biāo)簽
[access "refs/heads/*"]
label-Code-Review = -2..+2 group Administrators
label-Code-Review = -2..+2 group Project Owners
label-Code-Review = -1..+1 group Registered Users
[label "Code-Review"]
function = MaxWithBlock
defaultValue = 0
copyMinScore = true
copyAllScoresOnTrivialRebase = true
value = -2 This shall not be merged
value = -1 I would prefer this is not merged as is
value = 0 No score
value = +1 Looks good to me, but someone else must approve
value = +2 Looks good to me, approved
Submit
允許用戶提交審查通過的提交. 提交審查代碼后會合并到對應(yīng)的分支上.
The label that the reviewer selects determines what can happen next. The +1 and -1 level are just an opinion where as the +2 and -2 levels are allowing or blocking the change. In order for a change to be accepted it must have at least one +2 and no -2 votes. Although these are numeric values, they in no way accumulate; two +1s do not equate to a +2.
Code-Review
標(biāo)簽+2
是通過,-2
是否定, -1~+1
只是代表意見并不會影響投票, 審查被通過至少需要一個+2
投票并且沒有-2
投票. 兩個+1
并不會等于+2

[access "refs/heads/*"]
submit = group Administrators
submit = group Project Owners
View Drafts
允許用戶查看其他人提交的draft changes
.
draft changes
作者和添加為審查者都能看見draft changes
(盡管沒有賦予View Drafts
權(quán)限)
Publish Drafts
允許用戶公開其他人提交的draft changes
.
draft changes
作者可以公開draft changes
(盡管沒有賦予Publish Drafts
權(quán)限)
Delete Drafts
允許用戶刪除其他人提交的draft changes
.
draft changes
作者可以刪除draft changes
(盡管沒有賦予Delete Drafts
權(quán)限)
Edit Topic Name
允許修改change
的主題topic
change owner, branch owners, project owners, and site administrators
可以修改主題(盡管沒有賦予Edit Topic Name
權(quán)限)
Enforcing site wide access policies
通過賦予一個群組Owner
訪問權(quán)限在refs/*
命名空間, Gerrit管理員可以委派這個項目的訪問控制權(quán)限給這個群組.
如果需要沒有一個人能更新或者刪除標(biāo)簽, 連項目owners
都沒有權(quán)限. ALLOW
和DENY
規(guī)則并不能達(dá)到這樣的目的, 因為項目owners
可以賦予任何他們自己想要的訪問權(quán)限. 覆蓋任何從All-Projects
或者其他父項目繼承的權(quán)限是非常有效的方法.
在父項目中BLOCK
權(quán)限, 使得就算是子項目owners
也不能設(shè)置block
權(quán)限為ALLOW
. 盡管這樣, 也應(yīng)該保留owners
所有non-blocked
權(quán)限.
- Gerrit管理員能夠集中精力管理
site wide
策略并且提供有意義的默認(rèn)訪問權(quán)限. - 在不違反
site wide
策略的情況下, 項目owners
可以管理他們自己項目的訪問權(quán)限.
‘BLOCK’ access rule
BLOCK
規(guī)則是全局范圍的權(quán)限. 子項目不能重載繼承的BLOCK
規(guī)則. 從父項目鏈表中搜索BLOCK
規(guī)則, 忽略在訪問區(qū)域中的獨(dú)占(Exclusive
)標(biāo)志.
push
權(quán)限賦予BLOCK
規(guī)則, push
和force push
等推送都將被阻塞. force push
權(quán)限賦予BLOCK
規(guī)則只有force push
被阻塞, 但是如果push
權(quán)限具有ALLOW
規(guī)則的話可以進(jìn)行non-forced
提交.
BLOCK
也可以賦予label
投票范圍. 下面的配置可以阻塞group X
投+2
和-2
票,仍然可以投-1 ~ +1
的票.
[access "refs/heads/*"]
label-Code-Review = block -2..+2 group X
在這個阻塞規(guī)則min..max
范圍的目的是: 阻塞-INFINITE..min
和max..INFINITE
投票,也意味著-1..+1
投票范圍不受阻塞影響.
BLOCK’ and ‘ALLOW’ rules in the same access section
當(dāng)相同訪問區(qū)域同時包含BLOCK
和ALLOW
規(guī)則, ALLOW
規(guī)則會重載BLOCK
規(guī)則.
[access "refs/heads/*"]
push = block group X
push = group Y
如果群組X
和群組Y
都包含了同一個用戶, 這個用戶依然能夠push
到refs/heads/*
命名空間.
在同一個項目的同一個訪問區(qū)域,ALLOW規(guī)則才會重載
BLOCK規(guī)則.在同一個項目不同訪問區(qū)域和子項目的同一個訪問區(qū)域, ALLOW
規(guī)則不會重載BLOCK
規(guī)則.
BLOCK
規(guī)則示例
確保沒有人能夠更新或者刪除tag
在All-Projects
中阻塞Anonymous Users
組的push
權(quán)限
[access "refs/tags/*"]
push = block group Anonymous Users
由于所有人都是Anonymous Users
組成員, 所以可以阻塞所有人.
可能項目owner
需要創(chuàng)建tag
權(quán)限
[access "refs/tags/*"]
push = block group Anonymous Users
pushTag = group Project Owners
pushSignedTag = group Project Owners
某個命名空間只讓一個特殊的群組投票
假設(shè)提交到發(fā)布分支Release-Process
需要更為嚴(yán)格的過程, 假設(shè)我們需要確信只有Release Engineers
群組可以投票,就算是項目owner
權(quán)限也不可以投票. 在All-Projects
我們定義下面的規(guī)則.
[access "refs/heads/stable*"]
label-Release-Process = block -1..+1 group Anonymous Users
label-Release-Process = -1..+1 group Release Engineers
Global Capabilities

Access Database
允許用戶通過gsql
命令訪問數(shù)據(jù)庫, 以及包含代碼審查信息的分支refs/notes/review
Administrate Server
影響Gerrit中owner
和administrator
角色. 賦予administrateServer
能力能夠賦予任何群組訪問權(quán)限.
Priority
Gerrit中有兩類線程池用來給INTERACTIVE Users
和Non-Interactive Users
使用,防止搶占線程.
允許其他用戶使用Non-Interactive Users
的保留線程池.
- 默認(rèn)配置, 用戶默認(rèn)使用
INTERACTIVE
線程池 - BATCH, 賦予這個群組的用戶使用獨(dú)立的
Non-Interactive
線程池 - INTERACTIVE, 除非用戶賦予了
BATCH
選項,否則使用INTERACTIVE
線程池
Stream Events 允許執(zhí)行Gerrit觸發(fā)的事件流.
獲取All-Projects
中refs/meta/config
分支并修改權(quán)限配置
git clone ssh://admin@localhost:29418/All-Projects && scp -p -P 29418 admin@localhost:hooks/commit-msg All-Projects/.git/hooks/
git fetch origin refs/meta/config:refs/remotes/origin/meta/config
git checkout meta/config
git add .
git commit -m "modify config"
git push origin meta/config:meta/config
在公司文檔看到大神寫的很不錯的一小段話
code review的目的是團(tuán)隊成員在一起共同學(xué)習(xí),而不是相互”挑錯”.將code review稱為代碼回顧
好一些, 如果大家放棄”挑錯”來共同學(xué)習(xí),那么代碼回顧中學(xué)習(xí)什么呢?
代碼回顧的學(xué)習(xí)重點(diǎn)是團(tuán)隊成員共同識別模式,這里的模式是指程序員編寫代碼的習(xí)慣,包括”好模式”和”反模式”. 像富有表達(dá)力的命名, 單一職責(zé)的方法, 良好的格式縮進(jìn)等,都是”好模式”. 團(tuán)隊成員通過閱讀最近編寫的測試代碼和生產(chǎn)代碼來識別”好模式”和”反模式”.既是團(tuán)隊成員之間相互學(xué)習(xí)的過程, 也是團(tuán)隊整體達(dá)成整潔代碼共識的過程.