最近、ついに Go (golang/go) にコントリビュートしました!
正確にはレビュー中で、レビューが通ってもマージされるのは Go 1.10 なので、だいぶ先は長いですが取り敢えず自分のできることは一通り終わりました。
Go ではレビューシステムに GitHub は使っておらず、代わりに Google が開発した Gerrit を使っています。
普段の GitHub を利用したフローと結構異なっていたので備忘録がてらブログに書いておこうと思います。
なお、この記事は 2017 年 7 月 3 日現在のもので、情報が変わる可能性があるので必ず原文も目を通して下さい。
この記事は大雑把に原文を訳したものだと思ってください。
Contribution Guide - The Go Programming Language
この記事は自分を含めた英語弱者のための補完記事としての立ち位置でお願いします。
詳細
Gerrit について
Go では GitHub は Issue しか使っておらず、Pull Request は Gerrit というシステムで行われています。
Gerrit は Google の開発したソースコードレビューシステムで、全ての変更はここでレビューされてからマージされることになります。
go.googlesource.com のユーザ登録・パスワード生成
まず、go.googlesource.com へアクセスし、Google アカウントでユーザ登録をし、パスワードを生成します。
そうするとコマンドが表示されるので、それをターミナルで実行すると Gerrit を使うための準備が完了します。
Go の Gerrit にユーザ登録をする
次に go-review.googlesource.com にて Gerrit のユーザ登録をします。
CLA に同意する
コントリビュートするには Contributor License Agreement (CLA) に同意する必要があります。
個人なら individual contributor license agreement に目を通して同意します。
団体の場合は別に CLA があるので、原文を参照してください。
git-codereview の導入
Go の Gerrit を操作するためのコマンドラインツールです。もちろん go get
でインストールできます。
$ go get -u golang.org/x/review/git-codereview
ここは任意ですが、やっておくとタイピング量が少なくなるのでやっておいた方がいいかもしれません。
[alias]
change = codereview change
gofmt = codereview gofmt
mail = codereview mail
pending = codereview pending
submit = codereview submit
sync = codereview sync
これを ~/.gitconfig
に追加し再読み込みします。
以下ではエイリアスを設定しているものとして進めていきます。
コードを書く前に
リポジトリに変更を加える前に、GitHub の Issue にて問題を報告するか、既存の問題を説明するようにしなければいけません。
Go は非常に大きなプロジェクトなので、その提案が正当かどうかレビューされる場合もあります。
GitHub ではなく、go.googlesource.com から取得します。
$ git clone https://go.googlesource.com/go
編集
変更は master
ブランチで行います。
checkout して、Git でいう git pull
である git sync
を行ってリポジトリを最新にします。
$ git checkout master
$ git sync
ファイルを変更し終えたら、ここは普段の Git と同じようにファイルをステージングします。
$ git add <ファイル名>
git rm
や git mv
も同様に使えます。
編集が終わったら、git commit
の代わりに git change
を行います。この時に、ローカルにブランチが作成され、そこに変更がコミットされます。
ブランチ名は任意の名前が使えます。また、この操作はサーバへは送信されません。
$ git change <ブランチ名>
これを行うと、$EDITOR
に指定したエディタか vi
が起動し、コミットメッセージを記述できます。
コミットメッセージは以下のフォーマットに従う必要があります。
- 一行目にはもっとも変更が加えられているパッケージ名を書き、変更の概要を書き、
This change modifies Go to ___
という形式に合うように記述する。
- 参考文献がある場合は記載する
- Issue を Fix した場合は、
#
をプレフィックスにして記載する。
以下が公式のテンプレートです。変更されている可能性もあるので 必ず 原文も確認してください。
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 http:
Fixes #159
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch foo
# Changes not staged for commit:
# modified: editedfile.go
#
書き終わったら保存してエディタを終了します。
さらに編集する必要がある場合は、同じように編集し、ステージングし、git change
をします。
Go 1.4
ビルドやテストには Go 1.4 が必要になります。
Go リポジトリ内で release-branch.go1.4
にチェックアウトし、ビルドを行い、$HOME/go1.4
以下に配置します。
$ git checkout release-branch.go1.4
$ cd src/
$ ./make.bash
$ mv ../bin ~/go1.4/bin
テスト
必要に応じてテストを書く必要があります。
また、必ずレビューを受ける前に以下のコマンドを実行してテストが成功することを確認します。
$ cd go/src
$ ./all.bash
変更の送信
全ての変更が完了したらレビューのため、Gerrit へ送信します。
以下のコマンドを実行するだけです。
$ git mail
そうすると、Gerrit に反映されるので確認します。
しばらく経つとレビュアーがレビューを行ってくれるので待ちます。
あとは通常の PR と同じ流れになるかと思います。
CONTRIBUTORS
混乱を防ぐため、各ファイルにはコントリビュータの名前等は書かないことになっています。
代わりにコミットが取り込まれると、 CONTRIBUTERS
ファイルに自動で名前が記載されます。
まとめ
ここでは基本のフローのみを紹介していたため、他のことについては扱っていません。もし他にわからないことがあった場合、原文を読めばだいたい乗っているかと思います。
感想
当然ではあるけども、レビュアーに Rob Pike 先生や Bradfitz などの超有名人がいて、恐れ多い… 😇
今回コントリビュートした内容はとても小さいものだけど、継続的に Go にコントリビュートできたらいいなぁと思う。