概要
普段、生成AIでコードを書かせたり、commitさせたりすることは当たり前のようになってきている。
しかし、自分でcommitしたいこともあるし、commitのタイミングをこちらでコントロールしたい時もそれなりにある。
安価なサブスクリプション契約をしている場合は、commitなどはトークン消費させるのは勿体ないと思うこともある。
その際に、git commitメッセージを自動化できたら便利かなと思い、やってみることにした。
環境
- M5 Macbook Air
構成
- Ollama
- Ollama. Inc, が開発
- 無料で使用可能なローカル環境でLLMをダウンロード、実行、管理できるツール
- ローカルLLMであれば無料で使用可能(クラウド版は有料)
- gemma4:e4b
- Google DeepMiindが開発したオープンウェイトなLLM
- 無料で使用可能
- パラメータ数でサイズも変わるが今回は実行パラメータ数約45億のe4bを使用(e2bでも動く)
OllamaとGemma4のダウンロード
下記にアクセスしてインストーラーを実行する。
https://ollama.com/
そのあとでollamaコマンドが使用できるようになるので下記を実行すればOK。
なお、e4bとかもダウンロードできるがPCのスペックによっては重くてどうにもならなくなるので注意。
ollama pull gemma4:e2b
設定
git hooksを使って実現する。
aliasとしてはacを指定する。
$ vim ~/.config/git/config or vim ~/.gitconfig
[alias]
ac = !GIT_EDITOR=true git commit
[core]
hooksPath = ~/.git-hooks
git hooks配下に下記のスクリプトを配置する。
commitメッセージの味付けは MSGで自分好みに調整すると良いと思う。
❯ cat ~/.git-hooks/prepare-commit-msg
#!/bin/bash
# git commit 時に ollama でコミットメッセージを自動生成するフック
# 無効化したいときは環境変数 NO_AI_COMMIT=1 を付けて git commit する
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
MODEL="${AI_COMMIT_MODEL:-gemma4:e2b}"
# -m / merge / squash などで既にメッセージがある場合はスキップ
[ -n "$COMMIT_SOURCE" ] && exit 0
# 明示的に無効化された場合はスキップ
[ -n "$NO_AI_COMMIT" ] && exit 0
# ollama が無い・起動していない場合は静かにスキップ(コミット自体は妨げない)
command -v ollama >/dev/null 2>&1 || exit 0
DIFF=$(git diff --cached --no-color | head -c 8000)
[ -z "$DIFF" ] && exit 0
echo "AI コミットメッセージを生成中 (${MODEL})..." >&2
MSG=$(ollama run --think=false "$MODEL" "以下の git diff から日本語のコミットメッセージを1行生成してください。
ルール:
- 「何を」「どうした」が具体的に分かるように書く(対象のツール名・ファイル名・バージョン番号などを含める)
- 設定ファイルの変更では、追加・変更された設定キー名や値(core.hooksPath, alias.ac など)をそのまま含める。「設定を追加」のような言い換えは禁止
- 変更が複数ある場合は主要なものをすべて列挙する。一部だけ取り上げて他を省略しない
- 文体は体言止め(〜を追加 / 〜を修正 / 〜を更新)。「〜しました」「〜する」は禁止
- 日本語のみ。英語や英訳の併記は禁止
- 前置き・説明・引用符は不要。コミットメッセージ1行だけを出力する
- 長さは30文字程度に抑える
良い例:
- core.hooksPath と alias.ac を gitconfig に追加
- wezterm.lua のフォント設定を wezterm.font_with_fallback に変
悪い例:
- バージョンを更新しました。 (曖昧・文末が「ました」)
- エディタ設定を追加 (キー名がなく曖昧)
- Update python version (英語)
git diff:
$DIFF" 2>/dev/null)
# 生成に失敗したら何もしない
[ -z "$MSG" ] && exit 0
# 端末制御コードと thinking 出力を除去し、折り返し改行を連結して1行にまとめる
MSG=$(printf '%s' "$MSG" |
LC_ALL=C sed -e $'s/\x1b\\[[0-9;?]*[a-zA-Z]//g' -e 's/[[:cntrl:]]//g' |
sed -e '/^Thinking\.\.\./d' -e '/done thinking/d' |
tr '\n' ' ' | sed -e 's/ */ /g' -e 's/^ //' -e 's/ $//')
printf '%s\n%s' "$MSG" "$(cat "$COMMIT_MSG_FILE")" >"$COMMIT_MSG_FILE"
実行テスト
例えば、e2bからe4bに変えてみる。
❯ git diff
diff --git a/.git-hooks/prepare-commit-msg b/.git-hooks/prepare-commit-msg
index 63726fe..7af9bf7 100755
--- a/.git-hooks/prepare-commit-msg
+++ b/.git-hooks/prepare-commit-msg
@@ -5,7 +5,7 @@
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
-MODEL="${AI_COMMIT_MODEL:-gemma4:e2b}"
+MODEL="${AI_COMMIT_MODEL:-gemma4:e4b}"
# -m / merge / squash などで既にメッセージがある場合はスキップ
[ -n "$COMMIT_SOURCE" ] && exit 0
addしてacを実行する。
❯ git add .git-hooks/
❯ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: .git-hooks/prepare-commit-msg
そうすると、数秒程度で下記コミットメッセージが追加される。
❯ git ac
AI コミットメッセージを生成中 (gemma4:e4b)...
[master de73422] .git-hooks/prepare-commit-msg のモデル名を gemma4:e2b から gemma4:e4b に更新
1 file changed, 1 insertion(+), 1 deletion(-)
❯ git log | head -5
commit de73422617a03176c32cf0f4e77058f7af9ba46c
Author: Kazuma Inamura <xxxxxx@users.noreply.github.com>
Date: Sat Jul 18 00:10:30 2026 +0900
.git-hooks/prepare-commit-msg のモデル名を gemma4:e2b から gemma4:e4b に更新
まとめ
Ollamaを使ってgit commit メッセージを自動化する方法を書いた。
ちょっと手直ししないとかなと思う時もあるけど、概ねわかりやすいものが出力されているように見受けられている。
思ったよりも手軽に導入できて便利なのでぜひオススメしたい。