之前給 Go 語言項目源碼提交過一些 commits,期間閱讀他們的官方指導文檔的時候以爲這篇指導文檔能夠做爲絕佳的關於大型軟件項目的規範管理的參考,由於最近又提交了幾個 commits,就又把這篇文檔再看了一遍,有感於 Go 團隊在項目管理和工程實踐上的一些寶貴經驗,就把文檔翻譯成了中文;一來爲了更加深刻地理解 Go 語言團隊的項目工程最佳實踐,二來則是爲了給其餘有意給 Go 語言源碼提交貢獻的開發者提供一點參考。
Go 語言項目歡迎全部的代碼貢獻者。html
這是一份指導你完成向 Go 語言項目貢獻代碼整個流程的文檔,會略微跟其餘開源項目所使用的指導文檔有所不一樣。咱們假設閱讀者已經對 Git 和 Go 有基本的理解以及具有相關的基礎知識。前端
除了這裏所介紹的信息,Go 語言社區也維護了一份關於代碼評審的 wiki 頁面。在你學習評審流程期間,歡迎隨時給這份 wiki 貢獻、補充新內容。git
請注意, gccgo
前端的文檔在另外一處;看這裏:Contributing to gccgo。github
第一步須要註冊成爲一個 Go contributor 以及配置你的環境。這裏有一份包含了所需步驟的清單:golang
git
已經正確配置了這個帳號的郵箱地址,以便後續提交 commits。go get -u golang.org/x/review/git-codereview
命令安裝 git-codereview
工具。若是你圖省事的話,能夠直接用自動化工具幫你完成上面的所有步驟,只需運行:shell
$ go get -u golang.org/x/tools/cmd/go-contrib-init $ cd /code/to/edit $ go-contrib-init
這個章節的後面部分將會更加詳盡地闡述上面的每個步驟。若是你已經完成上面的全部步驟(無論是手動仍是經過自動化工具),能夠直接跳到貢獻代碼以前部分。安全
每個提交到 Go 語言的代碼貢獻都是經過一個綁定了特定郵箱地址的 Google 帳號來完成的。請確保你在整個流程中自始至終使用的都是同一個帳號,固然,後續你提交的全部代碼貢獻也是如此。你可能須要想好使用哪種郵箱,我的的仍是企業的。郵箱類型的選擇將決定誰擁有你編寫和提交的代碼的版權。在決定使用哪一個帳戶以前,你大概要和你的僱主商議一下。bash
Google 帳號能夠是 Gmail 郵箱帳號、G Suite 組織帳號,或者是那些綁定了外部郵箱的帳號。例如,若是你想要使用一個已存在且並不屬於 G Suite 的企業郵箱,你能夠建立一個綁定了外部郵箱的 Google 帳號。服務器
你還須要確保你的 Git 工具已經正確配置好你以前選定的郵箱地址,用來提交代碼。你能夠經過 Git 命令來進行全局配置(全部項目都將默認使用這個配置)或者只進行本地配置(只指定某個特定的項目使用)。能夠經過如下的命令來檢查當前的配置狀況:cookie
$ git config --global user.email # check current global config $ git config user.email # check current local config
修改配置好的郵箱地址:
$ git config --global user.email name@example.com # change global config $ git config user.email name@example.com # change local config
在你發送第一個代碼變動到 Go 語言項目(進行評審)以前,你必須先簽署下面兩種證書協議的其中之一。最後的代碼版權歸屬於誰,將決定你應該簽署哪種協議。
你能夠在 Google Developers Contributor License Agreements 網站上檢查當前已簽署的協議以及再簽署新的協議。若是你代碼的版權持有方以前已經在其餘的 Google 開源項目上籤署過這些協議了,那麼就不須要再重複簽署了。
若是你代碼的版權持有方更改了--例如,若是你開始表明新的公司來貢獻代碼--請發送郵件到 golang-dev
郵件組。這樣咱們能夠知悉狀況,接着準備一份新的協議文件以及更新 做者
文件。
Go 語言的主倉庫位於 go.googlesource.com,這是一個 Google 自建的 Git 服務器。Web 服務器上的認證信息是經過你的 Google 賬戶生成的,不過你仍是須要在你的我的電腦上安裝配置 git
來訪問它。按照如下的步驟進行:
accounts.google.com
去登錄。.gitcookies
的文件裏。若是你使用的是 Windows 電腦,那你應該複製並運行黃色方格里的腳本,而不是下面那個通用的腳本。Gerrit 是 Go 語言團隊所使用的一個開源工具,用來進行討論和代碼評審。
要註冊一個你本身的 Gerrit 帳號,訪問 go-review.googlesource.com/login/ 而後使用你上面的 Google 帳號登錄一次,而後就自動註冊成功了。
不管是誰,提交到 Go 語言源碼的代碼變動在被接受合併以前,必需要通過代碼評審。Go 官方提供了一個叫 git-codereview
的定製化 git
命令行工具,它能夠簡化與 Gerrit 的交互流程。
運行下面的命令安裝 git-codereview
命令行工具:
$ go get -u golang.org/x/review/git-codereview
確保 git-codereview
被正確安裝到你的終端路徑裏,這樣 git
命令才能夠找到它,檢查一下:
git codereview help
正確打印出幫助信息,並且沒有任何錯誤。若是發現有錯誤,確保環境變量 $PATH
裏有 $GOPATH/bin
這個值。
在 Windows 系統上,當使用 git-bash 的時候你必須確保 git-codereview.exe
已經存在於你的 git
exec-path 上了。能夠運行 git --exec-path
來找到正確的位置而後建立一個軟連接指向它或者直接從 $GOPATH/bin
目錄下拷貝這個可執行文件到 exec-path。
Go 語言項目歡迎提交代碼補丁,可是爲了確保很好地進行協調,你應該在開始提交重大代碼變動以前進行必要的討論。咱們建議你把本身的意圖或問題要不先提交到一個新的 GitHub issue,要不找到一個和你的問題相同或相似的 issue 跟進查看。
無論你是已經明確了要提交什麼代碼,仍是你正在搜尋一個想法,你都應該先到 issue 列表 看一下。全部 Issues 已經被分門別類以及被用來管理 Go 開發的工做流。
大多數 issues 會被標記上如下衆多的工做流標籤中的其中一個:
你可使用 GitHub 的搜索功能去搜尋一個 issue 而後搭把手幫忙解決它。例子:
is:issue is:open label:NeedsInvestigation
is:issue is:open label:NeedsFix
is:issue is:open label:NeedsFix "golang.org/cl"
is:issue is:open label:NeedsFix NOT "golang.org/cl"
除了一些很瑣碎的變動以外,全部的代碼貢獻都應該關聯到一個已有的 issue。你隨時能夠新開一個 issue 來討論你的相關計劃。這個流程可讓全部人都可以參與驗證代碼的設計,同時幫忙減小一些重複的工做,以及確保這個想法是符合這門語言和相關工具的目標和理念的。還有就是能在真正開始寫代碼以前就檢查這個代碼設計是否合理;代碼評審工具不是用來討論高層次問題的。
在規劃你的代碼變動工做的時候,請知悉 Go 語言項目遵循的是 6 個月開發週期。在每個 6 個月週期的後半部分是長達 3 個月的新功能特性凍結期:這期間咱們只接受 bug 修復和文檔更新相關的變動。在凍結期內仍是能夠提交新的變動的,可是這些變動的代碼在凍結期結束以前不會被合併入主分支。
那些針對語言、標準庫或者工具的重大變動必須通過變動提議流程才能被接受。
敏感性的安全相關的 issues 只能上報到 security@golang.org 郵箱!
咱們鼓勵那些初次提交代碼而且已經至關熟悉 GitHub 工做流的貢獻者經過標準的 GitHub 工做流給 Go 提交代碼。儘管 Go 的維護者們是使用 Gerrit 來進行代碼評審,可是不用擔憂,會有一個叫 Gopherbot 的機器人專門把 GitHub PR 同步到 Gerrit 上。
就像你以往那樣新建一個 pull request,Gopherbot 會建立一個對應的 Gerrit 變動頁面而後把指向該 Gerrit 變動頁面的連接發佈在 GitHub PR 裏面;全部 GitHub PR 的更新都會被同步更新到 Gerrit 裏。當有人在 Gerrit 的代碼變動頁面裏發表評論的時候,這些評論也會被同步更新回 GitHub PR 裏,所以 PR owner 將會收到一個通知。
須要謹記於心的東西:
通常來講,咱們基本不可能在 Gerrit 和 GitHub 之間完整地同步全部信息,至少在現階段來講是這樣,因此咱們推薦你去學習一下 Gerrit。它是不一樣於 GitHub 卻一樣強大的工具,並且熟悉它能幫助你更好地理解咱們的工做流。
這是一個關於整個流程的概述:
步驟 1: 從 go.googlesource.com
克隆 Go 的源碼下來,而後經過編譯和測試一次確保這份源碼是完整和穩定的:
$ git clone https://go.googlesource.com/go $ cd go/src $ ./all.bash # compile and test
步驟 2: 從 master 分支上拉出一條新分支並在這個分支上準備好你的代碼變動。使用 git codereview change
來提交代碼變動;這將會在這個分支上新建或者 amend 一條單獨的 commit。
$ git checkout -b mybranch $ [edit files...] $ git add [files...] $ git codereview change # create commit in the branch $ [edit again...] $ git add [files...] $ git codereview change # amend the existing commit with new changes $ [etc.]
步驟 3: 重跑 all.bash
腳本,測試你的代碼變動。
$ ./all.bash # recompile and test
步驟 4: 使用 git codereview mail
命令發送你的代碼變動到 Gerrit 進行代碼評審(這個過程並不使用 e-mail,請忽略這個奇葩名字)。
$ git codereview mail # send changes to Gerrit
步驟 5: 通過一輪代碼評審以後,把你新的代碼變動依附在同一個單獨 commit 上而後再次使用 mail 命令發送到 Gerrit:
$ [edit files...] $ git add [files...] $ git codereview change # update same commit $ git codereview mail # send to Gerrit again
這個章節剩下的內容將會把上面的步驟進行詳細的講解。
除了你近期安裝的 Go 版本,你還須要有一份從正確的遠程倉庫克隆下來的本地拷貝。你能夠克隆 Go 語言源碼到你的本地文件系統上的任意路徑下,除了你的 GOPATH
環境變量對應的目錄。從 go.googlesource.com
克隆下來 (不是從 Github):
$ git clone https://go.googlesource.com/go $ cd go
每一次代碼變動都必須在一條從 master 拉出來的獨立分支上開發。你可使用正常的 git
命令來新建一條分支而後把代碼變動添加到暫存區:
$ git checkout -b mybranch $ [edit files...] $ git add [files...]
使用 git codereview change
而不是 git commit
命令來提交變動。
$ git codereview change (open $EDITOR)
你能夠像往常同樣在你最喜歡的編輯器裏編輯 commit 的描述信息。 git codereview change
命令會自動在靠近底部的地方添加一個惟一的 Change-Id 行。那一行是被 Gerrit 用來匹配歸屬於同一個變動的屢次連續的上傳。不要編輯或者是刪除這一行。一個典型的 Change-Id 通常長的像下面這樣:
Change-Id: I2fbdbffb3aab626c4b6f56348861b7909e3e8990
這個工具還會檢查你是否有使用 go fmt
命令對代碼進行格式化,以及你的 commit 信息是否遵循建議的格式。
若是你須要再次編輯這些文件,你能夠把新的代碼變動暫存到暫存區而後重跑 git codereview change
: 後續每一次運行都會 amend 到現存的上一條 commit 上,同時保留同一個 Change-Id。
確保在每一條分支上都只存在一個單獨的 commit,若是你不當心添加了多條 commits,你可使用 git rebase
來把它們合併成一條。
此時,你已經寫好並測試好你的代碼了,可是在提交你的代碼去進行代碼評審以前,你還須要對整個目錄樹運行全部的測試來確保你的代碼變動沒有對其餘的包或者程序形成影響/破壞:
$ cd go/src $ ./all.bash
(若是是在 Windows 下構建,使用 all.bat
;還須要在保存 Go 語言源碼樹的目錄下爲引導編譯器設置環境變量 GOROOT_BOOTSTRAP。)
在運行和打印測試輸出一段時間後,這個命令在結束前打印的最後一行應該是:
ALL TESTS PASSED
你可使用 make.bash
而不是 all.bash
來構建編譯器以及標準庫而不用運行整個測試套件。一旦 go
工具構建完成,一個 bin/go
可執行程序會被安裝在你前面克隆下來的 Go 語言源碼的根目錄下,而後你能夠在那個目錄下直接運行那個程序。能夠查看快速測試你的代碼變動這個章節。
一旦代碼變動準備好了並且經過完整的測試了,就能夠發送代碼變動去進行代碼評審了。這個步驟能夠經過 mail
子命令完成,固然它並無發送任何郵件;只是把代碼變動發送到 Gerrit 上面去了:
git codereview mail
Gerrit 會給你的變動分配一個數字和 URL,經過 git codereview mail
打印出來,相似於下面的:
remote: New Changes: remote: https://go-review.googlesource.com/99999 math: improved Sin, Cos and Tan precision for very large arguments
若是有錯誤,查看 mail 命令錯誤大全和故障排除。
若是你的代碼變動關聯到一個現存的 GitHub issue 並且你也已經遵循了建議的 commit 信息格式,機器人將會在幾分鐘更新那個 issue:在評論區添加 Gerrit 變動頁面的連接。
Go 語言的維護者們會在 Gerrit 上對你的代碼進行 review,而後你會收到一堆郵件通知。你能夠在 Gerrit 上查看詳情以及發表評論,若是你更傾向於直接使用郵件回覆,也沒問題。
若是你須要在一輪代碼評審以後更新代碼,直接在你以前建立的同一條分支上編輯代碼文件,接着添加這些文件進 Git 暫存區,最後經過 git codereview change
amend 到上一條 commit:
$ git codereview change # amend current commit (open $EDITOR) $ git codereview mail # send new changes to Gerrit
要是你不須要更改 commit 描述信息,能夠直接在編輯器保存而後退出。記得不要去碰那一行特殊的 Change-Id。
再次確保你在每一條分支上只保留了一個單獨的 commit,若是你不當心添加了多條 commits,你可使用 git rebase
來把它們合併成一條。
Go 語言的 commit 信息遵循一系列特定的慣例,咱們將在這一章節討論。
這是一個良好的 commit 信息的例子:
math: improve Sin, Cos and Tan precision for very large arguments The existing implementation has poor numerical properties for large arguments, so use the McGillicutty algorithm to improve accuracy above 1e10. The algorithm is described at https://wikipedia.org/wiki/McGillicutty_Algorithm Fixes #159
變動信息的第一行照慣例通常是一短行關於代碼變動的概述,前綴是這次代碼變動影響的主要的包名。
做爲經驗之談,這一行是做爲 "這次變動對 Go 的 _ 部分進行了改動" 這一個句子的補全信息,也就是說這一行並非一個完整的句子,所以並不須要首字母大寫,僅僅只是對於代碼變動的概括總結。
緊隨第一行以後的是一個空行。
描述信息中剩下的內容會進行詳盡地闡述以及會提供關於這次變動的上下文信息,並且還要解釋這個變動具體作了什麼。請用完整的句子以及正確的標點符號來表達,就像你在 Go 代碼裏的註釋那樣。不要使用 HTML、Markdown 或者任何其餘的標記語言。
添加相關的信息,好比,若是是性能相關的改動就須要添加對應的壓測數據。照慣例會使用 benchstat 工具來對壓測數據進行格式化處理,以便寫入變動信息裏。
接下來那個特殊的表示法 "Fixes #12345" 把代碼變動關聯到了 Go issue tracker 列表裏的 issue 12345。當這個代碼變動最終實施以後 (也就是合入主幹),issue tracker 將會自動標記那個 issue 爲"已解決"並關閉它。
若是這個代碼變動只是部分解決了這個 issue 的話,請使用 "Updates #12345",這樣的話就會在那個 issue 的評論區裏留下一個評論把它連接回 Gerrit 上的變動頁面,可是在該代碼變動被實施以後並不會關閉掉 issue。
若是你是針對一個子倉庫發送的代碼變動,你必須使用 GitHub 支持的徹底形式的語法來確保這個代碼變動是連接到主倉庫的 issue 上去的,而非子倉庫。主倉庫的 issue tracker 會追蹤全部的 issues,正確的格式是 "Fixes golang/go#159"。
這個章節是對代碼評審流程的詳細介紹以及如何在一個變動被髮送以後處理反饋。
當一個變動被髮送到 Gerrit 以後,一般來講它會在幾天內被分門別類。接着一個維護者將會查看並提供一些初始的評審,對於初次提交代碼貢獻者來講,這些評審一般集中在基本的修飾和常見的錯誤上。
內容包括諸如:
在第一次審查完你的代碼變動以後,維護者會啓動一些 trybots,這是一個會在不一樣 CPU 架構的機器上運行完整測試套件的服務器集羣。大部分 trybots 會在幾分鐘內執行完成,以後會有一個能夠查看具體結果的連接出如今 Gerrit 變動頁面上。
若是 trybot 最後執行失敗了,點擊連接而後查看完整的日誌,看看是在哪一個平臺上測試失敗了。儘可能嘗試去弄明白失敗的緣由,而後更新你的代碼去修復它,最後從新上傳你的新代碼。維護者會從新啓動一個新的 trybot 再跑一遍,看看問題是否是已經解決了。
有時候,Go 代碼樹會在某些平臺上有長達數小時的執行失敗;若是 trybot 上報的失敗的問題看起來和你的此次代碼變動無關的話,到構建面板上去查看近期內的其餘 commits 在相同的平臺上是否是有出現過這種同樣的失敗。若是有的話,你就在 Gerrit 變動頁面的評論區裏說明一下這個失敗和你的代碼變動無關,以此讓維護者知悉這種狀況。
Go 語言社區很是重視全面的評審。你要把每一條評審的評論的當成一張罰單:你必須經過某種方式把它"關掉",或者是你把評論裏評審人建議/要求的改動實現一下,或者是你說服維護者那部分不須要修改。
在你更新了你的代碼以後,過一遍評審頁面的全部評論,確保你已經所有回覆了。你能夠點擊 "Done" 按鈕回覆,這表示你已經實現了評審人建議的修改,不然的話,點擊 "Reply" 按鈕而後解釋一下你爲何還沒修改、或者是你已經作了其餘地方的修改並覆蓋了這一部分。
通常來講,代碼評審裏會經歷多輪的評審,期間會有一個或者多個評審人不斷地發表新的代碼審查評論而後等待提交者修改更新代碼以後繼續評審,這是很正常的。甚至一些經驗老到的代碼貢獻者也會經歷這種循環,因此不要所以而被打擊到。
在評審人們差很少要得出結論之時,他們會對你的這次代碼變動進行"投票"。Gerrit 的投票系統包含了一個在[-2, 2]區間的整數:
在一個代碼變動被投了一個 +2 票以後,投下這票的核準人將會使用 Gerrit 的用戶界面來將代碼合併入主幹,這個操做被稱爲"提交變動"。
之因此把覈准和提交拆分紅兩步,是由於有些時候維護者們可能並不想把剛剛批准的代碼變動馬上合入主幹,好比,彼時可能正處於 Go 代碼樹的暫時凍結期。
提交一個變動將會把代碼合入主倉庫,代碼變動的描述信息裏會包含一個指向對應代碼評審頁面的連接,而具體代碼評審頁面處也會更新一個連接指向倉庫裏的這次代碼變動 commit。把代碼變動合入主幹時使用的是 Git 的 "Cherry Pick" 命令,所以在主倉庫裏的關於這次代碼變動的 commit 哈希 ID 會被這個提交操做更改。
若是你的變動已經被批准了好幾天了,可是一直沒有被提交到主倉庫,你能夠在 Gerrit 寫個評論要求合入。
除了這裏的信息,Go 語言社區還維護了一個代碼評審的 wiki 頁面。隨時歡迎你在學習相關的評審流程之時爲這個頁面貢獻、補充新內容。
這個章節收集了一些除了 issue/edit/code review/submit 流程以外的註解信息。
Go 語言倉庫裏的文件不會保存一份做者列表,既是爲了不雜亂也是爲了不須要實時更新這份列表。相反的,你的名字將會出如今變動日誌和貢獻者文件裏,也可能會出如今做者文件裏。這些文件是按期從 commit 日誌上自動生成的。做者文件定義了哪些人是 「Go 語言做者」 - 版權持有者。
若是你在提交變動的時候有新添加的文件,那麼應該使用標準的版權頭:
// Copyright 2020 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.
(若是你此刻是在 2021 年或者日後的時間閱讀這份文檔,請使用你當前的年份。)倉庫裏的文件版權生效於被添加進去的當年,不要在你變動的文件裏更改版權信息裏的年份。
git codereview mail
命令失敗的最多見緣由是由於你的郵件地址和你在註冊流程中使用的郵件地址不匹配。
若是你看到這樣的輸出信息:
remote: Processing changes: refs: 1, done remote: remote: ERROR: In commit ab13517fa29487dcf8b0d48916c51639426c5ee9 remote: ERROR: author email address XXXXXXXXXXXXXXXXXXX remote: ERROR: does not match your user account.
你須要在這個倉庫下把 Git 用戶郵箱配置爲你一開始註冊好的那個郵箱。更正郵箱地址以確保不會再發生這個錯誤:
$ git config user.email email@address.com
而後經過如下命令修改你的 commit 信息,更正裏面的用戶名和郵箱:
$ git commit --amend --author="Author Name <email@address.com>"
最後運行一下的命令再重試一次:
$ git codereview mail
若是每一次單獨的代碼變動都對整個代碼樹運行 all.bash
腳本的話太費勁了,儘管咱們極力建議你在發送代碼變動以前跑一下這個腳本,然而在開發的期間你可能只想要編譯和測試那些你涉及到的包。
make.bash
而不是 all.bash
來只構建 Go 工具鏈,而不須要運行整個測試套件。或者你能夠運行 run.bash
來運行整個測試套件而不構建 Go 工具鏈。你能夠把 all.bash
當作是依次執行 make.bash
和 run.bash
。在這個章節,咱們會把你存放 Go 語言倉庫的目錄稱爲 $GODIR
。 make.bash
腳本構建的 go
工具會被安裝到 $GODIR/bin/go
而後你就能夠調用它來測試你的代碼了。例如,若是你修改了編譯器並且你想要測試看看會對你本身項目裏的測試套件形成怎樣的影響,直接用它運行 go test
:
$ cd <MYPROJECTDIR> $ $GODIR/bin/go test
若是你正在修改標準庫,你可能不須要從新構建編譯器:你能夠直接在你正在修改的包裏跑一下測試代碼就能夠了。你可使用平時用的 Go 版本或者從克隆下來的源碼構建而成的編譯器(有時候這個是必須的由於你正在修改的標準庫代碼可能會須要一個比你已經安裝的穩定版更新版本的編譯器)來作這件事。
$ cd $GODIR/src/hash/sha1 $ [make changes...] $ $GODIR/bin/go test .
若是你正在修改編譯器自己,你能夠直接從新編譯 編譯
工具(這是一個使用 go build
命令編譯每個單獨的包之時會調用到的一個內部的二進制文件)。完成以後,你會想要編譯或者運行一些代碼來測試一下:
$ cd $GODIR/src $ [make changes...] $ $GODIR/bin/go install cmd/compile $ $GODIR/bin/go build [something...] # test the new compiler $ $GODIR/bin/go run [something...] # test the new compiler $ $GODIR/bin/go test [something...] # test the new compiler
一樣的操做能夠應用到 Go 工具鏈裏的其餘內部工具,像是 asm
, cover
, link
等等。直接從新編譯而後使用 go install cmd/<TOOL>
命令安裝,最後使用構建出來的 Go 二進制文件測試一下。
除了標準的逐包測試,在 $GODIR/test
目錄下有一個頂級的測試套件,裏面包含了多種黑盒和迴歸測試。這個測試套件是包含在 all.bash
腳本里運行的,不過你也能夠手動運行它:
$ cd $GODIR/test $ $GODIR/bin/go run run.go
若是你正在向一個子倉庫提交貢獻,你須要使用 go get
來獲取對應的 Go 包。例如,若是要向 golang.org/x/oauth2
包貢獻代碼,你能夠經過運行如下的命令來獲取代碼:
$ go get -d golang.org/x/oauth2/...
緊接着,進入到包的源目錄($GOPATH/src/golang.org/x/oauth2),而後按照正常的代碼貢獻流程走就好了。
除非有明確的說明,好比在你提交代碼變動以前的討論中,不然的話最好不要本身指定評審人。全部的代碼變動都會自動抄送給 golang-codereviews@googlegroups.com 郵件組。若是這是你的第一次提交代碼變動,在它出如今郵件列表以前可能會有一個審覈延遲,主要是爲了過濾垃圾郵件。
你能夠指定一個評審人或者使用 -r/-cc
選項抄送有關各方。這兩種方式都接受逗號分隔的郵件地址列表:
$ git codereview mail -r joe@golang.org -cc mabel@example.com,math-nuts@swtch.com
在你作代碼變動期間,可能有其餘人的變動已經先你一步被提交到主倉庫裏,那麼爲了保持你的本地分支更新,運行:
git codereview sync
(這個命令背後運行的是 git pull -r
.)
評審人做爲評審流程的一部分能夠直接提交代碼到你的變動裏(就像是在 GitHub 工做流裏有其餘人把 commits 依附到你的 PR 上了)。你能夠導入這些他人提交的變動到你的本地 Git 分支上。在 Gerrit 的評審頁面,點擊右上角的 "Download ▼" 連接,複製 "Checkout" 命令而後在你的本地 Git 倉庫下運行它。這個命令相似以下的格式:
$ git fetch https://go.googlesource.com/review refs/changes/21/13245/1 && git checkout FETCH_HEAD
若是要撤銷,切換回你以前在開發的那個分支便可。
git codereview
相關的命令能夠直接在終端鍵入對應的選項運行,例如:
$ git codereview sync
不過給 git codereview
子命令命令設置別名會更方便使用,上面的命令能夠替換成:
$ git sync
git codereview
的子命令的名字是排除了 Git 自己的命令關鍵字而挑選出來的,因此不用擔憂設置了這些別名會和 Git 自己的命令衝突。要設置這些別名,複製下面的文本到你的 Git 配置文件裏(一般是在 home 路徑下的 .gitconfig
文件):
[alias] change = codereview change gofmt = codereview gofmt mail = codereview mail pending = codereview pending submit = codereview submit sync = codereview sync
老司機用戶可能會想要把相關的 commits 疊加到一個單獨的分支上。Gerrit 容許多個代碼變動之間相互依賴,造成這樣的依賴鏈。每個變動須要被單獨地核準和提交,可是依賴對於評審人來講是可見的。
要發送一組依賴的代碼更改,請將每一個變動做爲不一樣的 commit 保存在同一分支下,而後運行:
$ git codereview mail HEAD
要確保顯示地指定 HEAD
,不過這在單個變動的場景裏一般是不須要指定的。