ChatGPT で Git Commit コメントを生成させてみた

特に個人で GitHub を使って開発している場合、コミットコメントが適当になったり test とか hoge になったりする経験ありますよね？もういっそのことソースコードの差分から ChatGPT にコメント文を考えてもらったら楽になるなと思ったので、そういうツール "commitgen" をつくりました。

ただ毎回 `node commitgen.js`みたいにやるのも面倒ですし、npm に登録するのも面倒だなぁということで、Git alias も使いつつ、とりあえず基本ローカルで動く環境を作ったという内容になります。

もう `git add .`したら、あとはコメント付きで勝手にcommit してくれる `git ccg`の誕生です！なお、プロンプトの微調整はあまりしていないので、プルリクお待ちしてます！

こんな結果↓で、commitまで一気通貫です。
```
$ git ccg
[main c115129] openai.jsファイルで、chatbotの回答を生成するための設定値が変更されました。GPT-3のtemperature値が0.5から1.0に変更されています。
 1 file changed, 1 insertion(+), 1 deletion(-)
```

# commitgen の使い方

[commitgenは GitHub 上に公開しています。](https://github.com/shyamagu/commitgen)
READMEにも書いてあるのですが、流れとしては、以下のステップで進めてみて下さい。

### 1. まずはお好きな場所にリポジトリをクローンしてください。
   ```
   git clone https://github.com/shyamagu/commitgen.git
   ```
### 2. クローンしたフォルダ―のルートに.envというファイルを作ります（環境変数でもOKです）
- OpenAI を利用の場合は、OPENAI_API_KEYを登録します。
```:.env
OPENAI_API_KEY={your OpenAI API Key}
```

- Azure OpenAI Servcie の場合は、エンドポイント、モデル名、キーを登録します。
```:.env
AOAI_API_KEYAOAI_API_KEY={your Azure OpenAI API Key}
AOAI_ENDPOINT={your Azure OpenAI API Endpoint}
AOAI_MODEL={your Azure OpenAI Service's ChatGPT Model name}
```

### 3. この状態でひとまずテストです。
   ```
   node {クローンしたフォルダの絶対パス}/commitgen.js "test.jsを変更しました".
   ```
   たぶん「test.jsを変更」みたいなコメントが生成されると思います。できたら成功です。

### 4. 実際にコミットさせてみる。
   何か適当なプロジェクトに移動して、ソースコードを変更した上で、`git add`が終わった状態で、以下のコマンドを実行してみてください。
   ```
   git commit -m "$(node {クローンしたフォルダの絶対パス}/commitgen.js "$(git diff --staged)")"
   ```
   変更に応じてコメントが生成されてコミットされていれば成功です。
   このままでも使えると言えば使えますが、コマンドが長くて面倒なので、以下のステップで Git alias をつかって、作業を楽にしたうえで、commitまで自動でやるようにしてしまいます。

### 5. GitHub Alias を登録します
   まずは設定を開きます。
   ```
   git config --global --edit
   ```
   その上で、以下のalias を登録してください。
   **※Windows 上の GitBash でのみ動作確認しています。もし動かなければ環境に併せて修正してくださいませ**
   ```
   [alias]
	    ccg = !git diff --staged | node {クローンしたフォルダの絶対パス}/commitgen.js \"$(cat -)\" | xargs git commit -m
	    ccgtest = !git diff --staged | node {クローンしたフォルダの絶対パス}/commitgen.js \"$(cat -)\"
   ```
   登録が終わりましたら、あとは実行です。↑では、ccg という commit comment 生成とcommit を一気にやってしまうコマンドと、ccgtest というコメント文章の確認だけをするものを登録しています。
   ```
   git add .
   git ccg
   ```
   うまくいっていれば以下のようなコミットコメントとコミットが自動で実行されるかと
   ```
   $ git ccg
   [main c115129] openai.jsファイルで、chatbotの回答を生成するための設定値が変更されました。GPT-3のtemperature値が0.5から1.0に変更されています。
    1 file changed, 1 insertion(+), 1 deletion(-)
   ```
   あとは普通に push してください。（push までも自動化してしまうのもありですね）

# まとめ
個人的に生産性を上げてくれそうなツールとして commitgen を開発してみました。ChatGPT は色んな用途で使えますが、ツールとしての有効性も体験できたかなと思います。

まぁこういう機能だと、気づいたら本家が実装してくる可能性もありますががが

# おまけ（全部入り）
もういっそのこと全部でいいのでは？と思ったので、以下のaliasを追加しました。一応ブランチだけは入力する方式です。

```
[alias]
    ccg = ...
    ccgtest = ...
    acp = !git add -A && git ccg && git push origin $1 &&:
```

こんな結果です。まぁ実際の運用に併せて色々変えないといけないシーンが多そうですが、個人開発ならこれくらいでいいのかなって
```
$ git acp main
[main 75ea0fa] 日付取得関数を追加しました
 1 file changed, 14 insertions(+)
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 532 bytes | 532.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/org/repo.git
   052e92c..75za0fa  main -> main
```