通過 git-repo 提交代碼評審
本文主要幫助您熟悉如何使用git-repo工具高效地提交代碼進行評審,從而提高團隊協(xié)作效率。
單倉庫代碼評審
大多數(shù)用戶參與的項目是一個代碼倉。對于單倉庫操作, git-repo
提供了如下命令擴展:
git peer-review 或git pr:創(chuàng)建代碼評審。
git abandon:清理當前完成評審發(fā)起的分支。
git download:下載評審的代碼到本地。
git peer-review
git-repo
針對常用的單倉庫的工作區(qū),提供了快捷的創(chuàng)建代碼評審的命令:git peer-review
。該命令可以簡寫為 git pr
或者 git review
。
1. 創(chuàng)建代碼評審
使用 git peer-review
命令創(chuàng)建代碼評審的步驟如下:
1.1 克隆遠程倉庫到工作區(qū)
克隆遠程倉庫到本地工作區(qū),例如克隆本git-repo網(wǎng)站的倉庫。 (如果工作區(qū)中已經(jīng)存在該倉庫,則忽略此步驟。)
$ git clone gi**@codeup.aliyun.com:codeup/codeup.git
切換到本地倉庫的工作區(qū):
$ cd codeup
1.2 創(chuàng)建特性分支
在本地工作區(qū)中創(chuàng)建新的工作分支。這個步驟不是必須的,使用當前分支(如 master 分支)也可以。但是如果需要在一個工作區(qū)目錄切換不同特性的開發(fā),則創(chuàng)建分支是需要的,否則多個特性的代碼可能混在同一個代碼評審任務中,或相互覆蓋。
$ git checkout -b topic1 origin/master
上面命令的兩個參數(shù)要重點說明一下:
參數(shù)
-b topic1
設定了新的工作分支的名稱。最后的
origin/master
參數(shù),則是為了將新建分支和上游的master分支建立關聯(lián)。這個參數(shù)很重要,如果忘了添加該參數(shù),則在用git peer-review
創(chuàng)建代碼評審時,會提示補救措施。
1.3 工作區(qū)內(nèi)開發(fā)和提交
在工作區(qū)中進行代碼開發(fā)工作,使用標準的 Git 命令進行提交。
1.4 發(fā)起代碼評審
當完成本地開發(fā)后,需要將代碼推送到上游倉庫,并創(chuàng)建代碼評審時,執(zhí)行如下命令:
$ git pr
該命令的參數(shù)有很多,可以設置代碼評審需要的各項參數(shù),例如:
指定評審者和關注者。多個用戶郵箱之間可以用(半角)逗號分開。
$ git pr --reviewers ja**@gmail.com,ro**@gmail.com --cc car**@gmail.com
設定代碼評審處于草稿狀態(tài),可以發(fā)表評審意見,但是不能合入。
$ git pr --draft
如果希望退出草稿狀態(tài),可以在“合并請求”詳情內(nèi),點擊標題進行編輯,刪除標題的”WIP“前綴后,保存即可退出草稿狀態(tài)。如果當前分支相比遠程分支沒有新提交,則不會創(chuàng)建代碼評審,顯示提示信息如下:
$ git pr
NOTE: no branches ready for upload
如果已經(jīng)發(fā)起過一次代碼評審,且之后沒有代碼改動,也不會執(zhí)行。
顯示的提示信息如下:
$ git pr
NOTE: no change in project . (branch topic1) since last upload
NOTE: no branches ready for upload
如果本地分支未跟蹤某一個遠程分支,則 git peer-review 命令不知道該向哪個遠程分支發(fā)起代碼評審。必須設置本地分支和遠程分支的跟蹤,才可以發(fā)起代碼評審。命令報錯信息如下:
$ git pr
FATAL: upload failed: cannot find tracking branch
Please run command "git branch -u <upstream>" to track a remote branch. E.g.:
git branch -u origin/master
參照提示信息中的命令,建立工作區(qū)本地分支和遠程分支的跟蹤關系。
1.5 代碼評審的編輯界面
輸入 git pr
命令后,會打開一個編輯器,內(nèi)容是此次代碼評審的各項可定制的參數(shù),內(nèi)容如下:
##############################################################################
# Step 1: Input your options for code review
#
# Note: Input your options below the comments and keep the comments unchanged
##############################################################################
# [Title] : one line message below as the title of code review
# [Description] : multiple lines of text as the description of code review
# [Issue] : multiple lines of issue IDs for cross references(暫未支持,僅占位)
# [Reviewer] : multiple lines of user names as the reviewers for code review
# [Cc] : multiple lines of user names as the watchers for code review(暫未支持,僅占位)
# [Draft] : a boolean (yes/no, or true/false) to turn on/off draft mode
# [Private] : a boolean (yes/no, or true/false) to turn on/off private mode(暫未支持,僅占位)
##############################################################################
# Step 2: Select project and branches for upload
#
# Note: Uncomment the branches to upload, and not touch the project lines
##############################################################################
#
# project ./:
branch topic1 ( 3 commit(s)) to remote branch master:
# 03c01e211122b49fe05f48e08fd3e1dd1c52e57e
# ec78989440697fbc13bfbd3ea082fe9b3fc5f2d7
# 4e599aa284ed64ba12ba1b5b06fbbd3199846434
其中以字符 "#" 開始的行是注釋,不要改動注釋行,因為 git-repo
要根據(jù)注釋行的內(nèi)容判斷用戶輸入內(nèi)容用于更改哪項代碼評審的參數(shù)設置。 例如:
在 "# [Title]" 行的下面添加的內(nèi)容,成為代碼評審的標題。默認用提交說明的標題作為代碼評審標題。
在 "# [Description]" 行的下面添加的內(nèi)容,成為代碼評審的詳細描述。默認用提交說明的內(nèi)容作為代碼評審的詳細描述。
在 "# [Reviewer]" 行的下面添加代碼評審者在云效已綁定的主郵箱,一個一行,或者用逗號分隔。
在 "# [Draft]" 行的下面如果輸入yes,則表明要創(chuàng)建一個草稿模式的代碼評審。
在最下面的 "Step 2" 區(qū)域,顯示當前項目將要上傳到遠程倉庫的分支和提交列表。檢查提交列表,如果不想創(chuàng)建此次代碼評審,則將 "branch ..." 的行注釋掉,或者刪掉,則此次創(chuàng)建代碼評審的任務終止。
[Issue] [Cc] [Private] 當前未支持。
保存內(nèi)容,退出編輯器,則開始向服務端推送代碼,并開始代碼評審的創(chuàng)建。
編輯的內(nèi)容會以模板的方式保存,以便在下一次執(zhí)行 git peer-review
時復用。
1.6 完成代碼評審的創(chuàng)建
git peer-review
命令執(zhí)行完畢后,顯示代碼評審創(chuàng)建成功的消息,示例如下:
remote: +-----------------------------------------------------------------------------+
remote: | Merge Request #888 was created or updated. |
remote: | View merge request at URL: |
remote: | https://codeup.aliyun.com/codeup/codeup/merge_request/888 |
remote: +-----------------------------------------------------------------------------+
To ssh://codeup.aliyun.com/codeup/codeup.git
* [new branch] topic1 -> refs/for/master/master
注意到提示信息中包含創(chuàng)建成功的代碼評審的 URL 地址,通過瀏覽器訪問該地址,顯示創(chuàng)建好的代碼評審。
1.7 服務器端倉庫的變化
通過命令行工具在服務器端創(chuàng)建代碼評審,服務端不會創(chuàng)建新的分支,但是為了方便用戶遠程下載評審代碼,倉庫中生成了一個特殊的引用。
例如上面創(chuàng)建的第 888 號代碼評審,會創(chuàng)建包含該評審 ID 號的,名為 refs/merge-requests/888/head
的特殊引用。下載該待評審的代碼,可以使用如下命令:
$ git fetch origin refs/merge-requests/888/head
From codeup.aliyun.com:codeup/codeup
* branch refs/merge-requests/1452262/head -> FETCH_HEAD
檢出相關代碼:
$ git checkout FETCH_HEAD
2. 評審作者重新發(fā)送,刷新代碼評審
代碼評審很少一蹴而就,針對評審者的意見,開發(fā)者(評審任務的創(chuàng)建者)往往需要重新上傳代碼刷新代碼評審。對于Codeup上創(chuàng)建的代碼評審任務,重復執(zhí)行 git peer-review
命令即可。
開發(fā)者首先在本地工作區(qū)修改代碼。
執(zhí)行如下命令,向遠程倉庫推送并刷新代碼評審任務:
$ git pr
3. 下載和更新代碼評審
除了代碼評審的作者,評審者們也可以對評審進行更新,讓一個代碼評審的相關人員可以協(xié)同工作,提升效率。
例如,一個用戶作為上面創(chuàng)建的第 888 號代碼評審的review,可以通過下面的命令將代碼評審下載到本地:
$ git clone gi*@codeup.aliyun.com:codeup/codeup.git
$ cd codeup
$ git download 888
評審下載成功后,HEAD會自動切換到代碼評審的最新提交版本(作為detached引用),如果希望在一個分支下工作,可以執(zhí)行。
$ git checkout -b topic1
review可以正常工作,提交代碼后執(zhí)行以下命令對第 888 號代碼評審進行更新。
$ git pr --change 888
4. 命令行創(chuàng)建和更新代碼評審的授權(quán)
git-repo針對集中式評審設計了新的授權(quán)模型:
對于
創(chuàng)建評審
操作,用戶只要擁有倉庫的讀取權(quán)限,就能向倉庫發(fā)起代碼評審,實現(xiàn)了倉庫的人人可寫。對于
更新評審
操作,用戶需要為評審的author或reviewer,方可對評審進行更新。
5. 第三方應用覆蓋了別名命令
OpenStack 社區(qū)的代碼評審工具名為 git-review
,如果系統(tǒng)中安裝了 OpenStack 社區(qū)的 git-review
工具,則執(zhí)行 git-repo
注冊的別名命令 git-review
在運行時被覆蓋。
執(zhí)行 git repo
命令,如果發(fā)現(xiàn)存在別名命令被覆蓋的情況,會顯示警告信息。
$ git repo
WARNING: you cannot use the git-repo alias command 'git-review', it is overrided by '/usr/local/bin/git-review' installed
... ...
遇到這種情況,請使用其它未占用的別名命令,如:git pr
。