はじめに
WIP PullRequestに便利な2つのスクリプトを作りました。WIP PRは進捗が常に見えるので開発体制としては理想的だと思いますが、手順が多くうっかりPullRequestを忘れてしまったりします。で、WIP PRはダメだという結論になってしまう。
プロジェクト管理や運用を浸透させるには、開発者がどれだけ楽に導入できるか?が肝だと思います。楽をしましょう。
前提
hubコマンドが使える状態であること
http://shoma2da.hatenablog.com/entry/2014/03/26/222802
コマンドの使い方
空のプルリクエストを作成する
$ git wip.pr <branch名>
以下のコマンドで、ブランチの作成+チェックアウト、remoteへのpush、PullRequestの作成までワンストップで実行されます。毎度やることは同じなのに手順だけが多い作業なので非常に便利です。branchの作成=PullRequestの作成になるので物忘れもなく効果的。
該当PullRequestのページを開く
$ git wip.link
現在のブランチに該当するGithub上のPullRequestページを開きます。Githubのトップページから探したり、連携しているSlackのログを辿るのは面倒です。PCが覚えられることはすべてPCに任せましょう。
設定方法
以下のスクリプトをgitレポジトリの適当な場所に置きます。開発者はこのスクリプトを実行するだけで上記2コマンドが使えるようになります。
#!/bin/sh
echo "setup PullRequest..."
mkdir .git/Github
#create PullRequest script
cat << "EOF" > .git/Github/create_pullrequest
#!/bin/sh
current=`git rev-parse --abbrev-ref HEAD`
git checkout -b $1
git commit --allow-empty -m "create PullRequest"
git push origin $1
git branch -u origin/$1 $1
url=`hub pull-request -m "$1" -b $current`
num=`echo $url | awk -F / '{print $NF}'`
git tag $num
EOF
chmod +x .git/Github/create_pullrequest
#show Link script
cat << "EOF" > .git/Github/link
#!/bin/sh
base=`git show-branch --merge-base master HEAD`
commit="HEAD"
while :
do
echo ">"
nextcommit="${commit}^"
next=`git rev-parse $nextcommit`
if [ $base = $next ]; then
echo "Found!"
pr=`git tag --contains $commit`
hub browse -- pull/$pr
break
fi
commit=$nextcommit
done
EOF
chmod +x .git/Github/link
#setup gitconfig
cat << "EOF" >> .git/config
[alias "wip"]
pr = "!f(){ .git/Github/create_pullrequest $1;};f"
link = "!f(){ .git/Github/link;};f"
EOF
仕組み
wip.pr
でPullRequestを作成するときに、PullRequestIDを最初のコミットのTagで割り当てています。tagならpushすれば全開発者で共有できるので便利です(今回はやっていませんが)。featureブランチにtagを付けることはほとんど無く、masterにしてもproduction-xxx
という風にtagのフォーマットも決まっていると思うので、特に運用上弊害は出ないかと。