目的
普段Sourcetreeを使用しており、mergeは fast-forward ではなく -no-ff で行いたいが、その場合コミットのコメントが一律で以下のようになってしまう。
Merge branch ‘マージ対象のブランチ名’ into マージされるブランチ名
これではmergeされたことはわかっても、その内容まではわからないため、mergeとコメントを変更する処理をワンタッチでできるようするべく、シェルスクリプトを作成することにした。
環境
macOS High Sierra
Sourcetree version 2.7.3
処理の流れ
- Sourcetreeでカスタムアクションを実行
- merge —no—ff 実行
- ターミナルのウィンドウが開いて最新コミットのコメント修正を求める
問題とその解決
上記のような流れで処理を行いたかったが、いくつか詰まったところがあったので、その紹介をします。
Sourcetreeでカスタムアクションを実行した際、ターミナルが表示されない
Sourcetreeにシェルスクリプトをカスタムアクションとして実行した場合、ターミナルは開かれない。なので以下のようなスクリプトを組んでもコメントの書き換えを行えない。
#リポジトリに移動
cd $*
#merge(--no-ff)する
git merge --no-ff マージしたいブランチ名
#コメント入力
read -p "コメントをなるべく簡潔・明瞭に入力して下さい:" input
#最新のコミットのコメントを書換
git commit --amend -m $input
なので、ターミナルを開くためにopenのコマンドを使用することにした。
また、”コメント入力”と”最新のコミットのコメントを書換”する処理を、別のシェルスクリプト(comment.sh)に記述し、ターミナルからそのファイルを開くようにした。
open -a "Terminal" comment.sh
open コマンドを使用してターミナルからシェルスクリプトを実行する場合、引数を渡すことが(簡単には)できない
ターミナルの画面を呼び出してシェルスクリプトを実行させることは可能になったが、上記の場合、リポジトリの位置を引数として渡すことができないという問題があった。
※ちなみに、open には —args という引数を渡すオプションがあるが、これはアプリケーションに対して値を渡すためのもので、シェルスクリプトへ値を渡すことはできなかった。
このことについて調べて見たところ、次のことがわかった。
(参考:「コマンドを指定してTerminal.appを実行する」notions:iaarchiver)
- コマンドに引数を指定してターミナルを実行するのは簡単にはできない
- もし引数を渡したいなら、tmpファイルまたはAppleScript経由で行う
ここではとりあえずtmpファイル経由を選択した。ちなみに以下のようなコマンドとなる。(参考サイトより)
echo "echo 'Hello'" > .tmp/tmp; chmod +x .tmp/tmp; open -a "Terminal" .tmp/tmp
上記を参考に、以下のような処理でターミナルを呼び出すこととし、シェルスクリプトに引数を渡すことが可能になった。
#実行対象のシェルスクリプトを指定
ShellScript="/ファイルパス/comment.sh"
#引数を書き込む一時ファイルの位置
TmpFile="/ホームディレクトリ/.tmp/tmp"
#シェルスクリプトへのファイルパスと引数($1, リポジトリ位置)を一時ファイルに書き込み、ターミナルでそのファイルを開く
echo "$ShellScript $1" > $TmpFile; chmod +x $TmpFile; open -a "Terminal" $TmpFile
※上記の場合、ホームディレクトリに .tmp ディレクトリを作成する必要があります
以上で問題解決です。
スクリプト
- merge.shをSourcetreeにカスタムアクションとして設定
- 設定時、パラメータに**$REPO**を指定
- call_comment.shは、コメント修正を行いたい場合にのみ使用
merge.sh
#!/bin/sh
#関数ファイル呼び出し
. /ファイルパス/function.sh
#リポジトリに移動
cd $*
#merge(--no-ff)する
git merge --no-ff マージしたいブランチ名
#最新コミットのコメント修正スクリプト呼び出し
CallChangeComment $*
function.sh
#!/bin/sh
#最新コミットのコメント修正スクリプト呼び出し
function CallChangeComment() {
#実行対象のシェルスクリプトを指定
ShellScript="/ファイルパス/comment.sh"
#引数を書き込む一時ファイルの位置
TmpFile="/ホームディレクトリ/.tmp/tmp"
#シェルスクリプトへのファイルパスと引数($1, リポジトリ位置)を一時ファイルに書き込み、ターミナルでそのファイルを開く
echo "$ShellScript $1" > $TmpFile; chmod +x $TmpFile; open -a "Terminal" $TmpFile
}
comment.sh
#!/bin/sh
#リポジトリに移動
cd "$1"
#コメント入力
read -p "コメントをなるべく簡潔・明瞭に入力して下さい:" input
#最新のコミットのコメントを書換
git commit --amend -m $input
call_comment.sh
#!/bin/sh
#関数ファイル呼び出し
. /ファイルパス/function.sh
#最新コミットのコメント修正スクリプト呼び出し
CallChangeComment $*
まとめ
シェルスクリプトはろくすっぽ書いたことがなかったので、かなり大変でした。特に、シェルスクリプトに値を渡す部分については、参考になるサイトが一つしか見当たらなかったので、本当に助かりました。
あまりにも面倒なので、コメント修正だけターミナルで叩こうかとも思ったのですが、紹介した方法だと "カスタムアクションをクリック → ターミナルが開く" といったように、ワンタッチでできるので上手いこといってよかったです。
誰かお詳しい方、もっといい方法があるよ!という場合はコメントくださると嬉しいです。