hgwebと2つのリポジトリでpull requestを開発フローに組み込む
http://connpass.com/event/445/:title=の成果です。
TODO: 動機付け
構成
hgwebでは次の二つのリポジトリを用意します。
- http://hg.example.com/app (pull専用リポジトリ、レビュー済みの履歴を持つ)
- http://hg.example.com/app-work (push専用リポジトリ、未レビューを含む全ての履歴を持つ)
通常の作業者は一のリポジトリを用意ます
- 作業用リポジトリ
pull requestを処理する人は二つのリポジトリを用意します。
0) hg clone (◆作業者/★pull request処理者)
pull専用リポジトリをクローンして作業用リポジトリ(とpull request取り込み用リポジトリ)を作成します。
$ hg clone http://hg.example.com/app app # 作業用リポジトリ $ hg clone http://hg.example.com/app app-pull-request # pull request取り込み用リポジトリ # もしくは $ hg clone app app-pull-request # ハードリンクされるのでディスク容量が節約できる
push/pull先を変更する為に.hg/hgrcを書き換えます。
$ cd app $ vi .hg/hgrc
- .hg/hgrc
[paths] default = http://hg.example.com/app default-push = http://hg.example.com/app-work app = http://hg.example.com/app work = http://hg.example.com/app-work
default-pushを設定後に引数無しで'hg push'を実行すると、default-pushで指定したリポジトリ(http://hg.example.com/app-work)にpushを行います。
2) hg commit(◆作業者)
作業を行います
3) hg push --force -r . (◆作業者)
行った変更をpush専用リポジトリにpushします
$ hg push --force -r .
push専用リポジトリは変更点置き場です。マルチプルヘッドになっても良いのでどんどんforce pushしてしまいます。
4) pull request (◆作業者)
redmine等のitsにpull requestのイシューを登録します。
イシューにはpush専用リポジトリにpushした内容(headのurl)を貼り付けます。
# hgwebの場合のURLの例 http://hg.example.com/app-work/rev/973671fc0804
5) hg pull work -r REV (★pull request処理者)
pull request取り込み用リポジトリでpull requestを処理します。push専用リポジトリからpull requestに登録されたリビジョンをpullします。
$ hg pull work -r 973671fc0804
取り込み後、変更点のレビューを行ったり、mergeやupdateをして動作確認を行います。
$ hg log -r .:tip -p # .:tip で現在の場所から取り込んだ内容を指定出来る $ hg merge tip # もしくは hg update
動作確認して取り込みが決定したらコミットします。(hg updateで済む場合は不要です)
$ hg ci -m "merge (pull request #123)" # pull requestのイシュー番号を含めます
取り込まない場合はイシュー等で連絡してpull requestを修正して貰います。その場合、pull request取り込み用リポジトリに取り込んだ変更点は一旦破棄します。
6) hg push app -r . (★pull request処理者)
最後に、pull request取り込み用リポジトリからpull専用リポジトリにpushします。
$ hg push app -r .
tips
pull requestの取り込み方について
pull requestは通常mergeで取り込みます。が、必ずmergeするべきというわけではありません。
- pull requestの必要なリビジョンだけhg graftで取り込み
- 常にrebaseして取り込み
も運用ルール次第でOKです。その場合はpull requestのイシューでmergeで取り込まなかったという事を伝えます。
履歴改変について
ルールは一つだけで、pull専用リポジトリの内容を変更してはいけません。
逆にpull専用リポジトリに取り込まれていない履歴は改変可能です。pull requestをrejectされた場合、がりがりに改変して新しくpull requestを出したりするのもOKです。
http://hg.example.com/app-workが汚くなる問題
汚くなるのが目的です。代わりにhttp://hg.example.com/appがクリーンに保てます。
bitbucketの有料プランでも使える
bitbucketの有料プランで6人以上でpull requestで開発を行っている場合も、この方法が有効。
というのも個人個人でforkしてしまうと5人までしか共有出来ないので。