🧠

aicommitsを導入してgitのコミットメッセージを自動化する

2023/10/09に公開

概要

ほぼ全てのエンジニアが使っているであろうgitはコミットメッセージを適切に書くと他者から見てどのタイミングでどんな変更をしたのかがgit logを見るだけで分かります。
しかし、このメッセージを考える作業は実装をした後に作業内容の抽象的なメッセージを考えるという具体↔︎抽象の行き来で、頻繁に発生する作業ながら負荷はそれなりに高いと感じています。
それゆえにコミットメッセージが雑で分かりにくいものになってしまい、他人や後で自分で見たときでさえ何をしたコミットなのかが分かりにくくなってしまいます。
そこでChatGPTにコミットメッセージを提案してもらえるaicommitsを導入して作業の認知負荷を減らし、自分にも他人にも読みやすいコミットメッセージを考えてもらおうと思います。

設定の項目については公式のREADMEよりも実例を交えて書いてあるので、特に読んでいただければと思います。

想定読者

  • コミットメッセージを考えるのが苦手な方
  • Node.jsのインストールをしている方
  • OpenAIのアカウント登録を済ませている方

aicommitsのインストール時にnpmを利用するので、Node.jsのインストールを事前に済ましておいてください。
また、ChatGPTのAPIを利用するためChatGPTを利用したことのある方なら済んでいると思いますが、アカウント登録も済ましておいてください。

Quick start

OpenAIプラットフォームにクレジットをチャージする

OpenAIプラットフォーム からログイン後、右上のアイコンをクリックし Manage account を選択してください。
その後、 Billing > Payment Methods からクレジットカードを選択し、クレジットをチャージします。
今回試しで利用するだけであれば1$くらいでいいと思います。今後もaicommitsを使用する予定の方は10$くらいをチャージしてauto charge設定をオフにしておけば、勝手にチャージされる心配もなくしばらくAPIを叩きまくれます。
ちなみにaicommitsの場合、1回のコミットメッセージの提案にかかるのは0.01$よりも少ないです。なので10$ほどあれば十分な回数使えます。
チャージ後、 Billing > Overview でチャージされている金額を確かめましょう。

API Keyの作成

そのままOpenAIプラットフォームの画面から User > API Keys を選択し、 Create new secret key からAPI Keyを作成します。
※ちなみに画像のAPI Keyは既に削除されているので使えないです。

API Keyはこの画面でしかコピーできないので、コピーし忘れたままDoneをクリックしてしまった場合は削除してもう一度作り直してください。

aicommitsのインストール

ここからは基本的に以下の公式リポジトリのREADMEの通りです。
https://github.com/Nutlope/aicommits

npm install -g aicommits

API Keyの設定

aicommits config set OPENAI_KEY=<your token>

ここで先ほどのAPI Keyを入力します。
設定はMacであれば、~/.aicommitsに保存されます。

使い方

使い方はシンプルでコミットの際にaicommitsコマンドを使用するだけです。

git add <files...>
aicommits

ただ、そのままだと毎回タイプする量が多いので、自分は以下のようにエイリアスを張ってます。

./zshrc
alias ac='aicommits'

aicommitsコマンドはフラグを渡された際に自身の知っているフラグ以外はgit commitコマンドに渡します。
例えば、コミットするときにトラックされたファイルのすべての変更をステージングすることができます:

aicommits --all # or -a

設定

ここからは細かい設定についてです。
デフォルトでは使いにくい、バグが出る設定になっていることがあるので実例を交えながら解説します。
公式READMEには書いてないこともあるので、こちらを参考にしてください。
全ての設定は以下のコマンドでできます。

aicommits config set <key>=<value>

複数のコミットメッセージを提案する

デフォルトでは提案されるコミットメッセージが1つになっており、Yes/Noを選択する形式になっています。

この際に提案されたコミットメッセージがイけていないとCtrl+Cでキャンセルして、複数回aicommitsコマンドを実行することになります。
これでは使いづらいので、複数のコミットメッセージを提案してもらってその中から選択する形式にします。

aicommits config set generate=3

これで1回の実行で3個のメッセージを提案してもらえます。

もっとたくさんの候補を提案してもらうことも可能ですが、レスポンスタイムが悪くなったり、自分が選択するのに迷ったりするので3つが最適だと思います。

言語を変更する

デフォルトではコミットメッセージが英語ですが、日本語にすることも可能です。

aicommits config set locale=ja // 英語に戻す場合はen

複数選択の際に表示がバグるのを防ぐ

コミットメッセージを複数から選択をしている際に表示がバグることがあります。

これはaicommitsのこちらのissueで指摘されていますが、aicommits自体のバグではなく内部で使用している@clack/promptsのバグらしいです。@clack/promptsでの該当PRはこちら
2023/10/09現在まだこのPRはマージされていない(実装上の原因もよくわかっていない)ので、同じように表示がバグる方がいると思います。
これを防ぐためには、おそらく原因である一行当たりの表示が長すぎる問題をaicommits側の設定で防げばいいわけです。

aicommits config set max-length=40

最大文字数を40文字に制限しました。これでも表示がバグる場合は文字数をもっと小さい数に減らしてみてください。

Conventional Commit

Conventional Commitというのはコミットメッセージの先頭にfeat:refactor:などのように接頭辞をつけることでどんな変更をしたか一目でわかりやすくしたものです。
OSSの開発だと基本必須になっているイメージです。

aicommits config set type=conventional


プライベートの開発ではConventional Commitを使用したくないという場合はこの設定をせず、デフォルトでは素のコミットメッセージ、OSS開発時にはコマンド引数でtypeを指定するということも可能です。

aicommits -t conventional // 指定した時だけConventional Commit

以上で設定は完了です。より詳細な設定を知りたい方はリポジトリのREADMEを見てみてください。

最後に

OpenAIはChatGPTのAPI経由で送信されたデータについて、以下のように述べています。

Question: Do you store the data that is passed into the API?
Answer: As of March 1st, 2023, we retain your API data for 30 days but no longer use your data sent via the API to improve our models. Learn more in our data usage policy. Some endpoints offer zero retention.
APIに渡されたデータは保存されますか?
2023年3月1日より、APIデータは30日間保存されますが、API経由で送信されたデータは、モデルの改良のために使用されなくなりました。詳しくはデータ利用ポリシーをご覧ください。エンドポイントによっては、データ保持期間がゼロのものもあります。

ということでAPI経由で送ったデータが社外の不特定の人に流出するということはありません。
ただ、AIサービスを利用するために他社にデータを送信することには変わりありませんので、業務で利用する際は自社のAIサービスに関するガイドライン等をよく読んでご使用ください。

Discussion