0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gitのコミットメッセージ作成をChatGPTで自動化してみた

Last updated at Posted at 2024-11-03

はじめに

ソフトウェア開発の現場では、Gitのコミットメッセージをきちんと書くことが推奨されていますが、内容を反映した適切なメッセージを考えるのは意外と難しい作業です。今回は、ChatGPTのAPIを活用して、Gitのコミットメッセージを自動生成するスクリプトを作成したので、紹介します。

スクリプトの概要

このスクリプトは、OpenAIのAPIを使って、ステージングされたファイルの変更内容に基づいたコミットメッセージを自動で生成します。特に、大規模な変更や複数ファイルにわたる修正がある場合には、変更点を理解しやすく、簡潔なコミットメッセージが生成されるため、手作業の時間を大幅に削減できます。

事前準備

このスクリプトを実行するには、OpenAIのAPIキーを取得し、環境変数として設定する必要があります。APIキーがない場合、スクリプトはエラーを返します。

コードの詳細

では、実際のコードについて見ていきましょう。以下のコードは、変更内容をChatGPTに送信し、その結果をコミットメッセージとして使用する仕組みです。

import subprocess
import os
from openai import OpenAI

client = OpenAI()

# OpenAI APIキーを環境変数から取得
client.api_key = os.getenv('OPENAI_API_KEY')

if not client.api_key:
    raise ValueError("環境変数 'OPENAI_API_KEY' が設定されていません。")

# ステージングされたファイルの一覧を取得
result = subprocess.run(['git', 'diff', '--cached', '--name-only'], capture_output=True, text=True)
files = result.stdout.strip().split('\n')

if not files or files == ['']:
    print("ステージングされた変更がありません。")
    exit(1)

# 各ファイルの変更前後の内容を取得
file_diffs = {}

for file in files:
    try:
        # 変更前の内容を取得
        old_version = subprocess.run(['git', 'show', f'HEAD:{file}'], capture_output=True, text=True)
        old_content = old_version.stdout

        # 変更後の内容を取得
        with open(file, 'r') as f:
            new_content = f.read()

        file_diffs[file] = {'old': old_content, 'new': new_content}
    except Exception as e:
        print(f"ファイル '{file}' の処理中にエラーが発生しました: {e}")

# プロンプトの作成
prompt = "以下は、各ファイルの変更前と変更後の内容です。これらの変更に基づいて、適切なコミットメッセージを日本語で生成してください。先頭行は全体像が見えるような簡潔な内容にして、詳細は段落を分けて説明してください。\n"

for file, contents in file_diffs.items():
    prompt += f"\nファイル名: {file}\n変更前:\n{contents['old']}\n変更後:\n{contents['new']}\n"

# OpenAI APIを呼び出し
try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "あなたは優秀なソフトウェアエンジニアです。"},
            {"role": "user", "content": prompt}
        ],
        max_tokens=100,
        temperature=0.5
    )

    # コミットメッセージとして使用
    commit_message = response.choices[0].message.content.strip()

    # コミットの実行
    subprocess.run(['git', 'commit', '-m', commit_message])
    print("コミットが正常に作成されました。")
except Exception as e:
    print(f"OpenAI APIの呼び出し中にエラーが発生しました: {e}")

スクリプトの仕組み

  1. ステージングされたファイルの検出
    git diff --cached --name-only を実行して、ステージングされたファイルの一覧を取得します。変更がなければスクリプトを終了します。

  2. ファイルごとの変更内容の取得
    変更前と変更後の内容を git show やファイル読み込みで取得し、ファイルごとの差分を生成します。

  3. ChatGPT APIの呼び出し
    取得した差分をプロンプトとして組み立て、ChatGPT APIに送信します。ChatGPTは差分を分析し、適切なコミットメッセージを生成して返します。

  4. コミットの実行
    生成されたメッセージを git commit コマンドで実行し、自動的にコミットを作成します。

実際に使ってみた感想

このスクリプトを使うことで、開発中のコミット作成が非常にスムーズになり、変更内容を的確に反映したメッセージを手軽に生成できるようになりました。ChatGPTの出力はコンテキストに沿った内容になりやすく、レビュー時にもメッセージの理解がしやすいと感じます。

注意点

  • 自動化されているとはいえ、生成されたコミットメッセージが常に正しいとは限らないため、注意が必要です
  • OpenAI APIのコストも考慮する必要があります。適切な使用頻度を見極めることが大切です
  • 企業でOpenAI APIを使う場合には、所属する企業のポリシーに従ってください
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?