git-commit-rewrite について
git-commit-rewriteは、最近のGit履歴にある規約外のコミットタイトルをConventional Commits形式に直すスキルです。プッシュ済みコミットには確認手順を設け、本文はそのまま保持します。
主な機能
- 01最近のコミットタイトルの書き換え
- 02Conventional Commits形式の判定
- 03プッシュ済みコミットの安全な選択肢
- 04元のコミット本文の保持
- 05既存ブランチまたは新規ブランチでの書き換え
活用シーン
- 01最近のコミットメッセージの形式統一
- 02プッシュ済みコミットを含む履歴の整理
- 03チケット参照をRefs:フッターへ移動
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ chann/ skills --skill git-commit-rewriteインストール後、Claude Code で/git-commit-rewriteを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlevals/evals.json
詳細
Git Commit Rewrite
概要
最近の履歴にある Conventional Commits 形式に準拠していないコミットの件名を書き換えます。破壊的な操作です。コミット SHA が変わります。すでにプッシュ済みのコミットを黙って書き換えることはせず、代わりに 3 つの選択肢(キャンセル/強制プッシュ/ブランチベース)のメニューを表示します。
強制モード: 呼び出しに force または --force というトークンが含まれている場合は、そのメニューとほかのすべての対話的な確認を省略して、書き換えを強制プッシュします。詳細はメインの git-commit/SKILL.md の「強制モード」を参照してください。
開始時に伝えること: 「git-commit-rewrite スキルを使って、これらのコミットメッセージを書き換えます。」
ワークフロー
開始前に、メインの git-commit SKILL.md(<plugin-root>/skills/git-commit/SKILL.md)を読みます。安全確認の詳細、正規表現、「一般的な非準拠パターンのマッピング」表、インプレース/ブランチベースの書き換えスクリプト、書き換え後のクリーンアップコマンドは、すべてそこに記載されています。このバリアントはそれらのセクションを利用します。
次に、メインの SKILL.md にある ## Workflow: /git-commit-rewrite に厳密に従います。手順:
- 書き換え範囲を決定する — デフォルトのベースは upstream の merge-base(または
main/masterの merge-base)です。ユーザーが件数を指定した場合はHEAD~Nを使います。--rootは決して使いません。 - 安全確認 A、B、C を実行する — 作業ツリーがクリーンであること、HEAD がブランチに接続されていること、範囲内のコミットがリモートに存在するかを確認します。
- コミットがプッシュ済みの場合、3 つの選択肢(キャンセル/強制プッシュ/ブランチベース)のメニューを表示します。黙って拒否してはいけません。デフォルトはキャンセルです。
- Conventional Commits の正規表現で規約に準拠していないコミットを特定します。マージコミットは
--no-mergesで除外します。 - 「一般的な非準拠パターンのマッピング」表を使って新しいメッセージを作成します。チケットの接頭辞(例:
proj #N:)はRefs:フッターに移動し、元の本文は一字一句そのまま維持します。 - 変更前後の計画を表示し、明示的な確認を待ちます。
- 書き換えを適用します:
- 選択肢 2(インプレース):
scripts/rewrite_msg.pyと/tmp/cc-rewrite-map.tsvのマッピングを使ってgit filter-branch --msg-filterを実行し、その後git push --force-with-leaseを実行します(--forceは決して使いません)。 - 選択肢 3(ブランチベース):ベースから
${branch}-ccを作成し、各コミットを新しいメッセージで cherry-pick と--amendして、新しいブランチをプッシュします。
- 選択肢 2(インプレース):
- 書き換え後:
git log --oneline <base>..HEADを表示します。refs/original/のバックアップを削除する方法をユーザーに伝え、/tmp/cc-rewrite-map.tsvをクリーンアップします。
強制モード(force キーワード): 呼び出しに単独のトークン force または --force(大文字と小文字を区別しない)が含まれている場合、ユーザーは事前に同意しています。手順 2 の安全確認を省略し、手順 3 のメニューを省略して(プッシュ済みの場合も自動的にインプレースで書き換えます)、手順 6 では計画を表示しますが、確認を待ちません。適用後、書き換えたコミットがリモートにすでに存在していた場合は、git push --force(オプションを付けない形式。使用が許されるのはこの場合のみ)で完了します。Git 自体の filter-branch の制約は引き続き適用されます。詳細なルールは、メインの git-commit/SKILL.md の ## Workflow: /git-commit-rewrite →「強制モード」を参照してください。
スクリプトは <plugin-root>/skills/git-commit/scripts/rewrite_msg.py にあります(メインのスキルに含まれており、バリアント間で共有されます)。
注意事項
メインの <plugin-root>/skills/git-commit/SKILL.md にある Never/Always の一覧と同じです。特に:
--forceによるプッシュは決して行いません。ただし、強制モード(forceキーワード)の場合は例外で、オプションを付けない--forceはユーザーが選択した方法です。それ以外の場合は、ユーザーの明示的な同意を得た後に--force-with-leaseのみを使います。- 3 つの選択肢のメニューを最初に表示せずに、プッシュ済みのコミットを書き換えてはいけません。強制モードではキーワードが事前同意となるため、例外です。
git filter-branch --rootは決して使いません。- チケット参照を決して削除しません。
Refs:フッターに移動します。 - マージコミットは決して書き換えません。
--no-mergesを使います。 - 元のコミット本文は必ず一字一句そのまま維持します。
連携
組み合わせるスキル: git-commit — まず作業ツリーの変更をコミットし、その後、古くなった履歴を別途書き換えます。
呼び出し元: ユーザーによる手動実行のみです。別のスキルのワークフロー中に自動実行してはいけません。