はじめに
こんにちは、@ttskch です。今日はちょっとした小ネタで、以下のツイートの焼き直し記事です
```:/usr/local/bin/git-wippr
— たつきち🐱PHPerKaigiで条件分岐禁止ギプス配ってました (@ttskch) 2019年4月2日
#!/bin/sh
git checkout -b $1
git commit -m "[ci skip] wip" --allow-empty
git push -u origin $1
hub pull-request -m $2 | xargs open -a "Google Chrome"
```
$ git wippr branch-name "PRのタイトル"
って感じでWIP-PR開発が捗りまくる
伝えたい内容はこのツイートでほぼすべて言い終わっているのでこの記事を書く意義はかなり謎ですが(笑)、一応細かいところを軽く補足しつつ記事の体裁にしてみようと思いますので、よろしければ最後までお付き合いください
※ GitHubを使っていることを前提とした内容になっていますのでご了承ください
WIP-PR駆動開発とは
WIP-PR駆動開発とは、開発の最初にWIP(Work In Progress:進行中)な状態からPull Requestを作ってしまって、そこにどんどんコミットを追加しながら開発を進めていく開発スタイルのことです。
開発の途中経過がGitHub上で可視化されるため、チームで開発している場合の情報の透明化に一役買ってくれます。もちろん一人での開発にも使えます。
WIP-PR駆動開発のやり方
基本的には以下のような流れで行います。
- ローカルでmasterから開発用のトピックブランチを切る
- そのブランチに
git commit -m "[ci skip] wip" --allow-empty
などのようにして空のコミットを追加 - とりあえずこの空のコミットをGitHubにpush
- GitHub上でmasterへのPull Requestを作成
- ローカルで開発を開始(最初のコミットは
git commit --amend
で空コミットと結合する)
「まだ何も開発してない状態でPRを作って、それから開発を始める」というのがポイントですね。
※ 空コミットのコミットメッセージに書いた
[ci skip]
はCircleCIやTravis CIなどのCIサービスでビルドをスキップさせるためのキーワードです(参考: CircleCI / Travis CI)
めんどくさい
やってみると分かりますが、ブランチを切る度に空コミットを作ってpushしてGitHubのWeb UIでPull Requestを作って、という作業はまあまあめんどくさいです
そこで、一連の作業をシェルスクリプトで自動化してしまいましょうというのがこの記事の主旨です
hubコマンド
シェルスクリプトを書く前に、お使いのマシンに hub
というコマンドをインストールしておいてください。これは、GitHubの操作をコマンドラインで行うためのGitHub公式のCLIツールです。
このコマンドを使ってシェルスクリプトからPRを作成します。
hubコマンドには色々な機能がありますが、hub browse
で今いるプロジェクトのGitHubリポジトリをブラウザで開いてくれる機能だけでもめちゃ便利なので、WIP-PRしない人もとりあえずhubコマンドは入れておくことをお勧めします。
hubコマンドの利用にはGitHubの認証が必要
hubコマンドを使うためには、当然ながらGitHubの認証が必要です。
ユーザー名とパスワードでも認証できますが、2FAを設定している場合は毎回2FAトークンの入力が必要になってしまうので、GitHub上でPersonal Access Tokenを発行して設定ファイルに記入しておくのがお勧めです。
https://github.com/settings/tokens の Generate new token
というボタンからトークンを作成できます。スコープは repo
だけでOKです。
作ったAccess Tokenを ~/.config/hub
というテキストファイルに以下のようにユーザー名と合わせてセットしておけば、それ以降特に意識せずに認証ができます
github.com:
- user: user_name
oauth_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
gitのサブコマンドは自作できる
ところで、gitコマンドのサブコマンドは簡単に自作できるということをご存知でしたでしょうか。
やり方はとても簡単で、 git-hoge
といったファイル名の実行ファイル(シェルスクリプトなど)をパスの通ったディレクトリに置いておくだけです。こうしておくと、 git hoge
のようにハイフンなしでそのコマンドを実行できます。
というわけで、今回はシェルスクリプトを git wippr
というgitのサブコマンドとして実行できるようにしてみます。
実際のシェルスクリプトの内容と使い方
では、いよいよ実際のシェルスクリプトの中身です。(最初のツイートでネタバレしてますが笑)
#!/bin/sh
# 第1引数の文字列をブランチ名としてブランチを切る
git checkout -b $1
# 空コミット
git commit -m "[ci skip] wip" --allow-empty
# push
git push -u origin $1
# hubコマンドを使って、第2引数の文字列をタイトルとしてPRを作り、作られたPRをGoogle Chromeで開く
# ※ macOSでGoogle Chromeがインストールされている場合の例です
hub pull-request -m $2 | xargs open -a "Google Chrome"
これを /usr/local/bin/git-wippr
に保存して、以下のようにして実行可能なパーミッションを設定すれば完了です
$ chmod u+x /usr/local/bin/git-wippr
使い方も見たまんまで、masterブランチにいる状態で
$ git wippr branch-name "PRのタイトル"
という感じで実行すれば、 branch-name
という名前でブランチが切られて、そのブランチからmasterへのPRが PRのタイトル
というタイトルで作成され、Google Chromeで自動的にPRの画面が開かれます。
なんて便利なんでしょう
番外編
シェルスクリプトの中に
# hubコマンドを使って、第2引数の文字列をタイトルとしてPRを作り、作られたPRをGoogle Chromeで開く
# ※ macOSでGoogle Chromeがインストールされている場合の例です
hub pull-request -m $2 | xargs open -a "Google Chrome"
という箇所がありましたが、この方法だとリポジトリに PRのテンプレート がセットされている場合にもそれは適用されずにdescriptionが空のPRが作成されてしまいます。
これを回避する代替案として、上記の箇所を以下のように書き換えることもできます。
# hubコマンドを使って、標準のブラウザでGitHubのPR作成画面を開く
hub compare
この場合、git wippr
コマンド実行時にPRのタイトルまで決めてしまうことはできなくなりますが、その代わりに、PRテンプレートが反映されたdescriptionが入力された状態のPR作成画面が開かれます。(PRのタイトルも、作成画面であとから入力することになります)
個人的には最近は個人開発でしかWIP-PRを使っておらずPRテンプレートとかほとんど使ってないので先述の方法をご紹介しましたが、チーム開発メインでPRテンプレートを多用する方は、こちらの方法のほうが便利かもしれません。
コマンド名を変えて2つとも作っておいて使い分けるという手もありますね。
おわりに
というわけで、140文字で書けることを長々と記事にしてお送りしました(笑)
ご自身の好みに合わせてカスタマイズしたりしつつ、ご活用いただければ幸いです