👋

見やすく意味のあるコミットメッセージを効率的に書く方法

2023/02/15に公開

はじめに

コミットメッセージを書くときにある程度フォーマットが決まっていた方が書きやすいよなと思っていました。
何か良いルールがないか探していたところSemantic Commit MessagesやConventional Commitsというフォーマット仕様があることを知りました。

”人間と機械が読みやすく、意味のあるコミットメッセージにするための仕様” ということでコミットメッセージのフォーマットを揃えるならこれを採用するのが良さそうです。

またコミットメッセージを見やすくするという文脈ではgitmojiを使うとパッと見でどういった変更なのかがわかりテキストだけよりもテンションが上がりそうです。

ということで早速Conventional Commitsとgitmojiをやってみたいです。
しかし毎回フォーマットや絵文字をコピー&ペーストするのは大変そうです。
これをテンプレートやスクリプトを利用して効率的に書く方法を紹介していきます。

参考資料

https://gist.github.com/joshbuchea/6f47e86d2510bce28f8e7f42ae84c716

https://www.conventionalcommits.org/ja/v1.0.0/

https://gitmoji.dev

コミットメッセージのテンプレートを設定する

フォーマットは以下の形式にしたいとします。

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スクリプトを使って絵文字を挿入するのは簡単にできます。

https://gitmoji.dev

以下の内容を .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の標準機能だけを利用してコミットメッセージを効率的に書く方法をご紹介しました。
少しでも誰かの参考になれば幸いです。

GitHubで編集を提案

Discussion