チームで作業する同じリポジトリの中で Pull Request を送り合うのではなく、オープンソースプロジェクトに外部から PR がやってくる場合の話です。
最近のフロー
送られてきた PR に対しては、大まかには仕様の話、実装方針の話、具体的な実装の話を詰めながらマージできるように持っていくわけだけれど、それがほとんど満足いく状態になっていてマージしたいと思うタイミングになっても、変数の名前付けだとか、ちょっとした処理の書き方だとかで、相手にお願いするよりは自分で手を加えてからマージした方が手っ取り早いことがある。そういう時は PR 元のブランチを手元にチェックアウトして、そのブランチを自分の変更で進めた上で master にマージするようにすると、push 時に PR も閉じられて便利です。
motemen/lgtm.sh#1 の例。分かりにくいれど、PR にさらに 1 コミット足してからマージしてる。
この際コードは fork された外部のリポジトリにあるから、たんに git checkout すればいいわけではなく予め git fetch なりする必要がある。
で、最近いろいろ試行錯誤した結果、以下のようにするとよさそうだった。
1. フォークされたリポジトリを、そのオーナー名で remote に登録する
git remote add -f jwerle https://github.com/jwerle/lgtm.sh.git
-f
オプションで、登録後 git fetch する。
2. PR 元のリモートブランチを、ローカルにチェックアウトする
git checkout -b '#1-jwerle/master' --track remotes/jwerle/master
この際 #xxx をブランチ名に入れておくと、コミットメッセージなどにブランチ名が入った時に自動的にリンクになって便利(ありがたいことに #
はブランチ名に使える)。また、このブランチで git pull すると、PR が更新されたときに最新のコードを取得できる。
3. ローカルにチェックアウトされたブランチの push 先を自分のリポジトリに変更
git config --local 'branch.#1-jwerle/master.pushremote' origin
これで、このブランチを変更したときに、自分のリポジトリに push することができる。この設定後も依然として git pull は相手のリポジトリから行われる。
hub-pr
一度以上のようにしてしまうと結構便利なわけだけど、セットアップに少し面倒がある。最近 PR を受け取ることが重なったこともあり、このへんの作業はもうフローが決まってるのでコマンド化することにした。ホントはちょっとしたシェルスクリプトに収めるつもりだったのだけど、なぜか色気を出してしまった……。yak shaving だけが人生だ。
go get github.com/motemen/hub-pr
で入手できます。
使い方
hub-pr checkout PULL_REQUEST_NUMBER
PR 番号を与えると、以上に書いたフローでブランチを作ってくれる。zsh 用の補完を用意してるので以外と簡単なのです。
あとは普通にマージしてやればいいのだけど、手元でマージするとあの GitHub おなじみのマージメッセージにならないので、それと同じものを生成するコマンドも用意しておいた。
hub-pr merge BRANCH
これであたかもマージボタンを押したかのようなコミットメッセージでもってマージされます。なんか便利ですね。ほかにも hub-pr browse っていう便利なのもありますが、オマケです。コンソールから PR やイシューを扱うなら、ghi ってのが圧倒的に便利。
このフローで作業したいと思う人がいるかどうかは分かりませんが……、どうぞご利用下さい。verbose output 的なオプションがないのでわりとブラックボックス感が高い。
Go で GitHub 用のツールを書く時は github.com/github/hub 以下のパッケージを使うとなかなか快適に行えるようでした。まあそりゃそうか。
GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)
- 作者: 大塚弘記
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る