1. 導入:なぜコミットメッセージの自動生成が必要なのか
開発の終盤、疲労が溜まっている中で「fix」や「update」といった簡素なコミットメッセージを書いてしまった経験はありませんか?不適切なメッセージは、数ヶ月後の障害調査やコードレビューの際に大きな足かせとなります。AIによるコミットメッセージ自動生成は、git diffの内容から変更の意図を汲み取り、規約に則ったメッセージを提案することで、履歴の質を均質化し、チームの可読性を劇的に向上させる強力な手段です。
2. 基礎知識:Conventional Commitsとは
自動化の前提として「Conventional Commits」という規約を理解することが重要です。これはコミットメッセージの構造を「type(scope): description」のように定義する手法です。
・type: 変更の種類(feat: 機能追加, fix: バグ修正, docs: ドキュメント更新など)
・scope: 影響範囲(コンポーネント名など)
・description: 変更内容の簡潔な要約
この規則に沿うことで、AIが生成するテキストが機械的に解析可能になり、CHANGELOGの自動生成などとも連携しやすくなります。
3. 実装/解決策:Git Hooksによる自動化フロー
Gitの「prepare-commit-msg」フックを利用し、コミット実行時にAI(今回はOpenAI APIを想定)を呼び出す仕組みを構築します。これにより、コマンドを打つだけでAIが差分を解析し、メッセージを提示してくれる環境が整います。
4. サンプルプログラム:Pythonによる自動生成スクリプト
以下は、git diffを取得してOpenAI APIに送信し、コミットメッセージを生成するスクリプト例です。`.git/hooks/prepare-commit-msg` として配置することを想定しています。
import subprocess
import openai
import sys
OpenAIのAPIキーを設定
openai.api_key = "YOUR_OPENAI_API_KEY"
def get_git_diff():
# ステージングされた変更内容を取得
return subprocess.check_output(["git", "diff", "--cached"]).decode("utf-8")
def generate_message(diff):
prompt = f"以下のgit diffの内容に基づき、Conventional Commits形式でコミットメッセージを1行で生成してください:\n\n{diff}"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content.strip()
if __name__ == "__main__":
diff_content = get_git_diff()
if diff_content:
commit_msg = generate_message(diff_content)
# メッセージを一時ファイルに書き込み、Gitのコミットメッセージとして使用させる
with open(sys.argv[1], "w") as f:
f.write(commit_msg)
5. 応用・注意点:現場運用のためのヒント
導入にあたっては以下の点に注意してください。
APIコストと速度のトレードオフ:
すべてのコミットでAPIを叩くと、開発のテンポが悪くなることがあります。また、トークン数制限を考慮し、大規模なdiffの場合は要約を簡略化するロジックが必要です。
AI生成の限界:
AIはコードの「変更」は読めますが、開発者の「意図(なぜそうしたか)」までは推測できないことがあります。AIが提案したメッセージを必ず人間が確認・修正するプロセスをフローに組み込むことが、履歴管理の質を担保する秘訣です。
セキュリティ:
社内コードを外部APIに送信するため、機密情報が含まれていないか注意してください。社内インフラ環境であれば、ローカルで動作するLLM(Ollamaなど)を活用するのも非常に有効な選択肢です。

コメント