kakakakakku blog

Weekly Tech Blog: Keep on Learning!

OpenCommit: AI に Git のコミットメッセージを考えてもらおう

git commit を実行するときに差分を確認しつつ「どういうコミットメッセージにしたら良いかなぁ〜」と悩むことがある.

そこで LLM (Large Language Models) を使ってコミットメッセージを自動生成できる「OpenCommit」を個人的な検証リポジトリを中心に導入してみた.3週間ほど使ってみて,体験としてはイイ感じ👌

github.com

セットアップ

セットアップは README に載っている通りに実行した👌

$ npm install -g opencommit
$ oco --version
3.2.7

次に oco config set コマンドを使って OCO_API_KEY に LLM プロバイダーの API Key を設定する必要があるけど(たとえば OpenAI の API Key など)今回は設定しなかった.後述する .env ファイルを使って GitHub リポジトリごとに設定できるためそちらを使う.ちなみに LLM プロバイダーとモデルはデフォルトで OpenAIGPT‑4o mini になっていて,他に Anthropic / Gemini / Ollama などもサポートされている.

👾 .env

OpenCommit を導入する GitHub リポジトリの .gitignore.env を設定しつつ,以下のようにした.必要最低限の設定にしてある👌

OCO_API_KEY=xxx
OCO_GITPUSH=false
OCO_ONE_LINE_COMMIT=true

まず OpenCommit ではコミットメッセージを自動生成した後に「git push する?」というインタラクションがある.個人的には細かく意味のあるステップで git commit をして,まとまってから git push を実行したく不要だな〜と感じたため OCO_GITPUSH=false で無効化した.README を読むと Push to git (gonna be deprecated) と書いてあるけど,現状まだ代替になる設定が見つからなかったため使うことにした😀

│
◇  Do you want to run `git push`?
│  No
│
└  `git push` aborted

そして OCO_ONE_LINE_COMMIT=true というオプションを設定すると自動生成されるコミットメッセージをまとめることができる(まとめようと努力する).ちなみに src/prompts.ts を確認すると以下のようなプロンプトが挿入されるようになっている💡

Craft a concise commit message that encapsulates all changes made, with an emphasis on the primary updates. If the modifications share a common theme or scope, mention it succinctly; otherwise, leave the scope out to maintain focus. The goal is to provide a clear and unified overview of the changes in a one single message, without diverging into a list of commit per file change.

とは言え LLM モデルに依存しているところはあって,OCO_ONE_LINE_COMMIT=true を設定してもファイルごとにコミットメッセージが生成されてしまうこともある.関連する issue もあって参考になる✍

github.com

github.com

実行例

Terraform AWS Provider の v6.0.0-beta1 を試したときのコミットメッセージは以下のようになった.

chore(provider.tf): update AWS provider version to 6.0.0-beta1 for compatibility with new features and improvements

Terraform で Amazon Inspector 抑制ルールを設定したときのコミットメッセージは以下のようになった.

feat(inspector.tf): add AWS Inspector filter resource for CVE suppression to manage vulnerabilities effectively

Terraform で Amazon ECS クラスタを追加したときのコミットメッセージは以下のようになった.

feat(ecs): add ECS cluster resource with container insights enabled to enhance monitoring capabilities

Vibe Coding で CI/CD Level Checker ウェブサイトを実装したときのコミットメッセージは以下のようになった.

feat(QuizForm): enhance quiz form with bilingual support for questions and results to improve accessibility for users

gitmoji

また OCO_EMOJI というオプションを使うと gitmoji で標準化された絵文字(10種類)をコミットメッセージの冒頭に追加できる.さらに CLI に --fgm オプションを指定すると全種類の絵文字を対象にできる.

ちなみに CLI のヘルプを確認したら --fgm オプションの説明が載ってなくてプルリクエストを出したりもした👌(Full GitMoji の略というのは最初わからなかった...)

github.com

まとめ

LLM (Large Language Models) を使ってコミットメッセージを自動生成できる OpenCommit❗️

引き続き使っていくぞ〜 \( 'ω')/