はじめに
ソフトウェア開発の現場では、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}")
スクリプトの仕組み
-
ステージングされたファイルの検出
git diff --cached --name-only
を実行して、ステージングされたファイルの一覧を取得します。変更がなければスクリプトを終了します。 -
ファイルごとの変更内容の取得
変更前と変更後の内容をgit show
やファイル読み込みで取得し、ファイルごとの差分を生成します。 -
ChatGPT APIの呼び出し
取得した差分をプロンプトとして組み立て、ChatGPT APIに送信します。ChatGPTは差分を分析し、適切なコミットメッセージを生成して返します。 -
コミットの実行
生成されたメッセージをgit commit
コマンドで実行し、自動的にコミットを作成します。
実際に使ってみた感想
このスクリプトを使うことで、開発中のコミット作成が非常にスムーズになり、変更内容を的確に反映したメッセージを手軽に生成できるようになりました。ChatGPTの出力はコンテキストに沿った内容になりやすく、レビュー時にもメッセージの理解がしやすいと感じます。
注意点
- 自動化されているとはいえ、生成されたコミットメッセージが常に正しいとは限らないため、注意が必要です
- OpenAI APIのコストも考慮する必要があります。適切な使用頻度を見極めることが大切です
- 企業でOpenAI APIを使う場合には、所属する企業のポリシーに従ってください