代碼檢視工具Gerrit的日常使用

1, Gerrit是什么蜕琴?

Gerrit實(shí)際上一個Git服務(wù)器扬虚,它為在其服務(wù)器上托管的Git倉庫提供一系列權(quán)限控制,以及一個用來做Code Review是Web前臺頁面涡尘。當(dāng)然惕鼓,其主要功能就是用來做Code Review筋现。

2, Gerrit用戶配置

  • Email激活
    Gerrit賬戶的設(shè)置界面,點(diǎn)擊“Contact Information”進(jìn)入Email Register頁面箱歧,輸入自己的郵箱賬戶(此郵箱需要與自己的Git配置一致)矾飞。可以配置多個Email賬號呀邢。
Contact Information
  • SSH key配置
    通過以下命令生成并讀取本機(jī)ssh key:
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub

Copy key的內(nèi)容洒沦,在Gerrit賬戶的設(shè)置頁面“SSH Public Key”中加入即可。

ssh-key

3, Gerrit日常使用

3.1 獲取代碼庫

登錄Gerrit后在Projects-->List, 選擇相應(yīng)工程your_project价淌,進(jìn)入該工程的General界面申眼。
選中“clone with commit-msg hook”和“SSH”:

git clone ssh://your_account@review.xxxxx.com:29418/your_project && scp -p -P 29418 your_account@review.xxxxx.com:hooks/commit-msg cic-android/.git/hooks/

拷貝以上命令在自己本地Git命令行窗口執(zhí)行即可拉取庫代碼瞒津。

3.2 Gerrit工作流程

3.2.1 上傳一個commit

Gerrit相對Git提供了一個特有的命名空間“refs/for/”用來定義我們的提交上傳到哪個branch,且可以用來區(qū)分我們的commit是提交到Gerrit進(jìn)行審核還是直接提交到Git倉庫括尸,格式如下:

refs/for/<target-branch>

Push一個Commit到Gerrit:

$ git commit
$ git push origin HEAD:refs/for/master

直接Push一個commit到Git倉庫:(我們默認(rèn)配置成不允許)

$ git commit
$ git push origin HEAD:master

當(dāng)我們的commit Push到Gerrit等待review時巷蚪,Gerrit會將此commit保存在一個名為“refs/changes/xx/yy/zz”的一個暫存branch中。
其中zz為這個commit的patch set號濒翻,yy是change號屁柏,xx是change號的后兩位。

例如我們工程中的這個大明同學(xué)的提交:

http://review.xxxxx.com:9090/#/c/545/

一共提交了9次patch有送,那么第9個patch就保存在一個名為“refs/changes/45/545/9”的branch中淌喻。

可以通過Gerrit頁面中該commit右上角的Download按鈕驗(yàn)證,比如說我們選擇“Cherry Pick”, 命令如下:

git fetch ssh://your_account@review.xxxxx.com:29418/your_project refs/changes/45/545/9 && git cherry-pick FETCH_HEAD

在此,有必要說下幾個概念雀摘,以便理解:

  • Change
    一個Change包含一個Change-Id裸删,這個Id就是通過我們拉取代碼庫的時候所拷貝的hooks(hooks/commit-msg)自動生成的。
    包含一個或多個Patch Set阵赠,以及諸如Owner涯塔,Project,Target branch,Comments等信息清蚀。

  • Change-Id
    Change-Id是一串SHA-1字符串伤塌。有hooks自動生成在我們的commit message下面:

Feature:Music play.
BugId:/
Description:Music play.

Change-Id: I3d087f04d9d94bfaa93b8609b988b300af537497

在一個project的每個branch中Change Id是唯一的。

  • Patch Set
    一個Patch Set就是一次commit轧铁,Gerrit會將其生成一個Branch暫存每聪。Change中的每提交一個Patch Set表示這個Change的一個新的版本,自動覆蓋前一個Patch Set齿风, 默認(rèn)情況下药薯,僅最后一個Patch Set是有意義的。Code Review通過時救斑,也僅僅是最后一個Patch Set會合并到指定的branch中童本。

個人Git工作原則一
** 永遠(yuǎn)是基于遠(yuǎn)程庫的最新代碼工作,盡量每一步操作(特別是add/commit/push)都通過git pull --rebase獲取一下當(dāng)前最新版本脸候。**

根據(jù)以上原則穷娱,建議在將本地commit push到Gerrit之后,立馬reset掉运沦,或者重新切換一個新的分支工作泵额。

3.2.2 上傳一個新的patch set

當(dāng)我們的commit被reviewer打回來時,我們可能需要修改并重新提交携添。
如果我們的代碼在本地分支已經(jīng)reset掉嫁盲,可以通過Gerrit頁面提供的Download方式獲取:

// fetch and checkout the change
// (checkout command copied from change screen)
$ git fetch ssh://your_account@review.xxxxx.com:29418/your_project refs/changes/45/545/9 && git checkout FETCH_HEAD

如果之前是通過切換分支方式工作的烈掠,可以重新切換回包含此commit的分支而無需執(zhí)行上述命令羞秤,然后可以在此代碼基礎(chǔ)上進(jìn)行修改缸托,重新add,amend commit:

// rework the change
$ git add <path-of-reworked-file>
...

// amend commit
$ git commit --amend

// push patch set
$ git push origin HEAD:refs/for/master

3.2.3 添加Reviewers

在Change界面添加相關(guān)reviewers.可以考慮使用自動添加reviewers的插件

3.2.4 提交Change

Change一般配置成只有在Code-Review +2 以及Verified +1 的情況下才可以Submit瘾蛋。

Submit時可能會有沖突俐镐,界面會提示“Cannot Merge”字樣,此時可以先嘗試Gerrit頁面提供的Rebase功能做一次Rebase操作哺哼,如果提示沖突京革,則需在本地解決沖突后重新提交一個Patch Set到該Change上。

本地Rebase的一種流程:

// update the remote tracking branches
$ git fetch

// fetch and checkout the change
// (checkout command copied from change screen)
$ git fetch ssh://your_account@review.xxxxx.com:29418/your_project  refs/changes/74/67374/2 && git checkout FETCH_HEAD

// do the rebase
$ git rebase origin/master

// resolve conflicts if needed and stage the conflict resolution
  ...
$ git add <path-of-file-with-conflicts-resolved>

// continue the rebase
$ git rebase --continue

// push the commit with the conflict resolution as new patch set
$ git push origin HEAD:refs/for/master  

3.3 多Feature并行開發(fā)

Code Review需要時間幸斥,開發(fā)人員可以在此期間開發(fā)其他feature,這就產(chǎn)生了多feature并行開發(fā)的狀態(tài)咬扇。

為了保證減少沖突和依賴甲葬,每一個feature都應(yīng)該是在該feature自己的本地分支開發(fā),且此分支是基于遠(yuǎn)程分支(target branch)的當(dāng)前HEAD的懈贺。 也就是基于遠(yuǎn)程庫的最新代碼開發(fā)经窖,而不應(yīng)該依賴于code review中的某個、某些Change梭灿。

當(dāng)然画侣,如果必要,你也可以基于一個正在code review的Change開發(fā)新的feature堡妒,這樣會產(chǎn)生依賴配乱,可以在Gerrit中該Change的頁面看到“Related Changes”。這就要求reviewer也需要關(guān)注這個依賴關(guān)系皮迟,調(diào)整review時序搬泥。

根據(jù)以往的使用經(jīng)驗(yàn),強(qiáng)烈建議不要產(chǎn)生這種依賴伏尼,盡量使每一個Change提交都是無依賴的忿檩,避免Change的連環(huán)失敗導(dǎo)致各種解沖突的工作。

個人Git工作原則二
** 盡可能保證每一個Change的完整性以及獨(dú)立性爆阶,且越小越好燥透。**

4, 進(jìn)階功能

4.1 Web頁面代碼修改

Gerrit提供了直接在Web頁面修改我們的patch代碼的功能,這對于我們做一些小的問題修改(比如格式化問題辨图,命名不對班套,多余的空格等)非常方便。

Edit

點(diǎn)擊Edit后故河,該工具欄顯示如下:

toolbar

可以在此對patch的文件進(jìn)行修改孽尽,刪除等。
如果想對文件中的某處進(jìn)行編輯忧勿,點(diǎn)擊進(jìn)入該文件的review界面:

page_edit

點(diǎn)擊編輯按鈕杉女,進(jìn)入編輯模式瞻讽,編輯完save:

save

會在Change頁面看到,點(diǎn)擊Publish Edit按鈕熏挎,Gerrit會自動幫你生成一個包含剛剛修改的patch速勇。

publish
patch

4.2 草稿箱功能

Gerrit可以作為一個自己的Change草稿箱,我們可以將一些還未完成坎拐,或者還不想提交review的Change上傳至此處烦磁。一來可以作為一個備份,另外在多人互相協(xié)助完成同一個功能哼勇,或是自己在多臺電腦(家里都伪、辦公室)上處理未完成的工作。
不同于提交一個正式Change的“refs/for/”協(xié)議积担,提交一個Change到草稿箱的協(xié)議方式為“refs/drafts/”,如下:

$ git commit
$ git push origin HEAD:refs/drafts/luckyair

在Gerrit頁面的Drafts欄:

draft

草稿箱中的Change也可以很方便的轉(zhuǎn)換為正式的Change陨晶,而無需重新用“refs/for/”來提交,點(diǎn)擊Publish按鈕轉(zhuǎn)換為正式Change帝璧,也可以在此刪除此草稿先誉。

publish draft
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市的烁,隨后出現(xiàn)的幾起案子褐耳,更是在濱河造成了極大的恐慌,老刑警劉巖渴庆,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铃芦,死亡現(xiàn)場離奇詭異,居然都是意外死亡襟雷,警方通過查閱死者的電腦和手機(jī)杨帽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗤军,“玉大人注盈,你說我怎么就攤上這事⌒鹱” “怎么了老客?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長震叮。 經(jīng)常有香客問我胧砰,道長,這世上最難降的妖魔是什么苇瓣? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任尉间,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哲嘲。我一直安慰自己贪薪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布眠副。 她就那樣靜靜地躺著画切,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囱怕。 梳的紋絲不亂的頭發(fā)上霍弹,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音娃弓,去河邊找鬼典格。 笑死,一個胖子當(dāng)著我的面吹牛台丛,可吹牛的內(nèi)容都是我干的耍缴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼齐佳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了债沮?” 一聲冷哼從身側(cè)響起炼吴,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疫衩,沒想到半個月后硅蹦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闷煤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年童芹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲤拿。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡假褪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出近顷,到底是詐尸還是另有隱情生音,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布窒升,位于F島的核電站缀遍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饱须。R本人自食惡果不足惜域醇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧譬挚,春花似錦锅铅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚪腋,卻和暖如春丰歌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屉凯。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工立帖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悠砚。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓晓勇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親灌旧。 傳聞我的和親對象是個殘疾皇子绑咱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容