Fork(Gitクライアント)でも「git commit --allow-empty」したい

こんにちは、エンジニアの @akase244 です。

みなさんGitクライアントは何を使ってますか?

ターミナルからコマンドを実行してる方もいれば、GUIクライアントを利用されているという方もいらっしゃるでしょう。

私はGitHub DesktopSourcetree を経て、ForkというGUIクライアントを利用しています。

Forkの紹介記事はあまり多くないのですが、この辺りを参考にされるとよいかと思います。(「Fork Git」でググると「違う、そうじゃない」ってのがヒットするので、ググラビリティが高いプロダクト名を考えるのって大事だなと思ったり)

ということで、今回はForkの「Custom Actions」機能の使い方について説明します。

Custom Actionsとは

Custom ActionsとはGitコマンドにまつわる一連の操作を登録しておいて、Forkの操作画面から呼び出すことができる機能です。

Sourcetreeには実装されていてForkでも使えるといいなぁと思ってたんですが、リリースノートを見てみると、今年の5/28にリリースされたバージョン1.0.67で新機能として追加されていたようです。(早く言ってよー)

やりたいこと

記事のタイトルでも書いてますが、今回やりたいこととしてはForkのUIの操作で git commit --allow-empty -m "for WIP PR" を実行させることです。

Forkの基本機能では「--allow-empty」なコミットができないようなので、↑の操作をCustom Actionsに登録したいというわけです。

なぜ「git commit --allow-empty」をやる必要があるのか

今、私が携わっているプロジェクトでは「WIP PR(Work In Progress Pull Request)開発フロー」を採用しています。
WIP PR開発フローの場合、実装がすべて完了してからPull Requestを行うのではなく、まず空コミットでPull Requestを作成しておいて実装の途中段階(キリがよいタイミング)でpushを繰り返し、作業経過を見える化するという手法になります。
なので、Pull Request作成前にForkでお手軽に空コミットを作りたいのです。

さらに詳しいWIP PR開発フローの説明については検索してもらうと参考になる記事がたくさんありますので、そちらを見ていただけるとよいかと思います。

Custom Actionsの登録方法

メニューからFork → Preferencesをクリックします。
f:id:akase244:20180921173137p:plain

Custom Actionsのタブを選択します。
f:id:akase244:20180921173611p:plain:w400

左下のプラスボタンをクリックします。
f:id:akase244:20180921173854p:plain

「Add Commit Custom Action」をクリックします。
f:id:akase244:20180921174358p:plain:w400

Custom Actionsの登録方法は2種類あるようです。

  • 「Script Path」にGitコマンドへのパス(例: /usr/bin/git )、「Parameters」にパラメーター(例: commit --allow-empty -m "for WIP PR" )を記載する方法。(なお、Gitコマンドへのパスは初期値の「$git」を記述しておけば、 /usr/bin/git のように実際のパスは書かなくても認識されるようです)
  • 「Script Path」に一連の操作を記述したシェルスクリプトへのパスを記載する方法。

ただし、どうやら「Parameters」の実装がまだイマイチみたいで、例に記載しているとおり「 commit --allow-empty -m "for WIP PR" 」を設定してCustom Actionsを実行してみると以下のようなエラーが発生しました。

error: pathspec 'WIP' did not match any file(s) known to git.
error: pathspec 'PR"' did not match any file(s) known to git.

つまり、-m が認識しているのはダブルクォーテーションを含めた「"for」までのようで、試しにダブルクォーテーションを除いて「 commit --allow-empty -m for_WIP_PR 」と設定してみるとうまくいきました。
が、コミットメッセージが「for_WIP_PR」になってしまうのはちょっと嫌なので今回は「Script Path」にシェルスクリプトへのパスを記載する方法を説明します。

まず、Custom Actionsとして呼び出したい操作を以下のように記述し、 allow-empty.sh といったファイル名で保存します。

#!/bin/sh
git commit --allow-empty -m "for WIP PR"

次に、作成した allow-empty.sh に実行権限を与えます。こうしておかないと、Custom Actionsを実行した際に Launch path is not executable '/PATH_TO/allow-empty.sh' のように怒られてしまいます。

$ chmod +x allow-empty.sh 

↑の「Add Commit Custom Action」をクリックした際に1件登録されているかと思いますので、そのCustom Actionsを以下のように編集します。

Title:Empty Commit Action
Script Path: allow-empty.sh へのパス
f:id:akase244:20180921181008p:plain:w400

これで準備完了です。

Custom Actionsの実行方法

実行したいブランチとコミットログを選択した状態でコンテキストメニューを開くと、先ほど登録した「Empty Commit Action」が表示されていますので、これを選択します。
f:id:akase244:20180921181535p:plain:w400

実行が成功した旨のメッセージが表示されます。
f:id:akase244:20180921181646p:plain:w400

「Initial commit」の次に「for WIP PR」という空コミットが作成されていることが確認できました。
f:id:akase244:20180921181833p:plain

これで git commit --allow-empty -m "for WIP PR" を実行するときだけターミナルを開くといったことから解放されました。やったね。