mcpField
G
git-commit-rewrite

git-commit-rewrite

github.com/chann開発048 回インストール4 週間前に更新
リポジトリ

git-commit-rewrite について

git-commit-rewriteは、最近のGit履歴にある規約外のコミットタイトルをConventional Commits形式に直すスキルです。プッシュ済みコミットには確認手順を設け、本文はそのまま保持します。

主な機能

  1. 01最近のコミットタイトルの書き換え
  2. 02Conventional Commits形式の判定
  3. 03プッシュ済みコミットの安全な選択肢
  4. 04元のコミット本文の保持
  5. 05既存ブランチまたは新規ブランチでの書き換え

活用シーン

  1. 01最近のコミットメッセージの形式統一
  2. 02プッシュ済みコミットを含む履歴の整理
  3. 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 に厳密に従います。手順:

  1. 書き換え範囲を決定する — デフォルトのベースは upstream の merge-base(または main/master の merge-base)です。ユーザーが件数を指定した場合は HEAD~N を使います。--root は決して使いません。
  2. 安全確認 A、B、C を実行する — 作業ツリーがクリーンであること、HEAD がブランチに接続されていること、範囲内のコミットがリモートに存在するかを確認します。
  3. コミットがプッシュ済みの場合、3 つの選択肢(キャンセル/強制プッシュ/ブランチベース)のメニューを表示します。黙って拒否してはいけません。デフォルトはキャンセルです。
  4. Conventional Commits の正規表現で規約に準拠していないコミットを特定します。マージコミットは --no-merges で除外します。
  5. 「一般的な非準拠パターンのマッピング」表を使って新しいメッセージを作成します。チケットの接頭辞(例:proj #N:)は Refs: フッターに移動し、元の本文は一字一句そのまま維持します。
  6. 変更前後の計画を表示し、明示的な確認を待ちます。
  7. 書き換えを適用します:
    • 選択肢 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 して、新しいブランチをプッシュします。
  8. 書き換え後: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 — まず作業ツリーの変更をコミットし、その後、古くなった履歴を別途書き換えます。 呼び出し元: ユーザーによる手動実行のみです。別のスキルのワークフロー中に自動実行してはいけません。

コメント