見やすく意味のあるコミットメッセージを効率的に書く方法
はじめに
コミットメッセージを書くときにある程度フォーマットが決まっていた方が書きやすいよなと思っていました。
何か良いルールがないか探していたところSemantic Commit MessagesやConventional Commitsというフォーマット仕様があることを知りました。
”人間と機械が読みやすく、意味のあるコミットメッセージにするための仕様” ということでコミットメッセージのフォーマットを揃えるならこれを採用するのが良さそうです。
またコミットメッセージを見やすくするという文脈ではgitmojiを使うとパッと見でどういった変更なのかがわかりテキストだけよりもテンションが上がりそうです。
ということで早速Conventional Commitsとgitmojiをやってみたいです。
しかし毎回フォーマットや絵文字をコピー&ペーストするのは大変そうです。
これをテンプレートやスクリプトを利用して効率的に書く方法を紹介していきます。
参考資料
コミットメッセージのテンプレートを設定する
フォーマットは以下の形式にしたいとします。
prefix: :emoji: {description}
[optional body]
[optional footer]
# prefix
# feat: 新しい機能を追加する場合
# fix: バグを修正する場合
# docs: 文書を更新する場合
# style: スタイルを変更する場合
# refactor: リファクタリングを行う場合
# test: テストを変更する場合
# chore: ビルドプロセスなどの環境構築の変更を行う場合
この規則に沿ったコミットメッセージは例えば以下のようになります。
feat(users): :sparkles: Add user login
オプションで本文やフッターをつけます。
feat(users): :sparkles: Add user login
Users can now log in with their username and password.
Fixes #123
だいぶコミットメッセージの情報が整理されて読みやすくなりそうです。
しかし、実際の開発でこれらの規約を覚えておいてゼロから入力していくのは大変です。
そこでメッセージテンプレートを用意します。
テンプレートファイル名は任意のファイル名が使えます。
例えば .gitmessage
というファイルを用意します。
$ vi .gitmessage
ファイルの内容は前述のものを自分好みに編集して書き込みましょう。
このテンプレートファイルを利用するには以下のコマンドを実行します。
$ git config commit.template .gitmessage
これで git commit
コマンドを叩くとテンプレートの内容が反映された状態でエディタが立ち上がります。
コミットメッセージに自動的に絵文字などを挿入する
コミットメッセージのフォーマットが決まったらコミットのtypeに合わせて絵文字を自動挿入できるようにしてみます。
メッセージのフォーマットが決まっていれば、Git hooksスクリプトを使って絵文字を挿入するのは簡単にできます。
以下の内容を .git/hooks/commit-msg
に記載します。
メッセージテンプレートの :emoji:
部分をprefixに合わせて絵文字で置き換えするスクリプトです。
COMMIT_MSG=$1
prefix=`head -n 1 $COMMIT_MSG | awk '{ print $1 }'`
emoji=""
case $prefix in
"fix:")
emoji=":bug:"
;;
"feat:")
emoji=":sparkles:"
;;
"docs:")
emoji=":notebook:"
;;
"style:")
emoji=":shirt:"
;;
"refactor:")
emoji=":recycle:"
;;
"test:")
emoji=":green_heart:"
;;
"chore:")
emoji=":up:"
;;
*)
echo "The specified prefix is undefined.";
exit 1
;;
esac
sed -i "" "s/:emoji:/$emoji/" $COMMIT_MSG
echo $prefix
exit 0
絵文字はgitmojiのサイトを見て好みのものに変更できます。
実際に利用する際にはprefixの種類も必要に応じてカスタマイズしてください。
おまけ
ブランチ名の命名規則でGithubのIssue番号入れるようにすると、それをコミットメッセージに自動的に埋め込むこともできます。
.git/hooks/prepare-commit-msg
に以下のスクリプトを記載します。
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3
current_branch=$(git rev-parse --abbrev-ref HEAD)
issue_no=`echo $current_branch | grep -o '[a-zA-Z]*/[0-9]\+[^_-]' | sed 's/^[^\/]*\///'`
sed -i "" "s:\$branchname:refs #$issue_no:" $COMMIT_MSG_FILE
$branchname
の部分をブランチ名から取得したIssue番号で置き換えます。
また .git/hooks/
はリポジトリ管理下ではないディレクトリです。
このようなhookスクリプトをチームで共通利用するにはリポジトリ管理できる場所に置きたくなります。
そんな時は任意のディレクトリ(ここでは .githooks
とします)に prepare-commit-msg
を置き以下のコマンドを叩くと可能です。
git config --local core.hooksPath .githooks
これで .githooks
以下に置いたスクリプトが使われるようになります。
終わりに
今回は追加のツールなどは使わずにGitの標準機能だけを利用してコミットメッセージを効率的に書く方法をご紹介しました。
少しでも誰かの参考になれば幸いです。
Discussion