Computer screen displays "vibe vibe coding" text.

Apps

VS Code がすべてのコミットに「Co-Authored-by Copilot」を追加する件

VS Code の Copilot 拡張機能は、自分ですべての行を書いた場合でも、コミットに「Co-Authored-by」トレーラーを密かに挿入します。その止め方を正確に解説します。

TLDR GitHub Copilot の VS Code 拡張機能は、コミットメッセージの生成に関与した際(時には関与していない場合でも)、Co-authored-by: GitHub Copilot トレーラーを自動的に追記します。これはアトリビューション記録、オープンソースの貢献履歴、さらには雇用主の IP ポリシーにも影響を与えます。git フック、VS Code の設定変更、またはグローバルな gitconfig ルールで無効化できます——それぞれにトレードオフがあります。

最近 git log を確認して、自分で書いたコミットメッセージの末尾に見覚えのない行が追加されているのに気づいたとしたら、それは気のせいではありません。GitHub Copilot——より正確には、VS Code の Copilot 拡張機能——は、プッシュした内容に一行も触れていなくても、コミットに共同著者として名前を静かに刻み続けています。これは陰謀ではなく、ほとんどの開発者が意識的に同意したことのないオプトアウト型のアトリビューションシステムです。以下では、この挿入の仕組み、GitHub がそう設計した理由、そして最も実用的な部分——それを止めるための設定・フック・コンフィグ——を正確に解説します。

Copilot コミットメッセージ生成を表示した VS Code ソースコントロールパネル


トレーラーの実際の見た目

修正する前に、何を扱っているのかを正確に把握しておきましょう。挿入されるテキストは標準的な git コミットトレーラー——コミットメッセージ本文の末尾に空行を挟んで追記されるキーと値のペアです。git interpret-trailers や Gerrit、GitHub 自身のマージインフラで使われるものと同じ形式に従っています:

feat: ユーザー認証フローを追加

リフレッシュトークンローテーション付きの JWT ベースのログインを実装。

Co-authored-by: GitHub Copilot <github-copilot[bot]@users.noreply.github.com>

最後の行が Copilot の挿入内容です。メールアドレス github-copilot[bot]@users.noreply.github.com は実在する GitHub ボットアカウントです。つまり、GitHub のコントリビューショングラフとコミットアトリビューションエンジンは、これを実際の共同著者として記録します——コメントでも無視できるメタデータでもありません。プッシュされた瞬間からコミット履歴に永続的に埋め込まれた一流の git オブジェクトです。

どこに表示されるか

  • GitHub のコミットビュー:コミットにあなたのアバターと並んで「Co-authored by GitHub Copilot」バッジが表示されます。
  • git log --format=full:トレーラーがコミット本文に表示されます。
  • git shortlog:パースの仕方によっては、Copilot がプロジェクト統計のコントリビューターとして表示される場合があります。
  • GitHub のコントリビューターグラフ:ボットアカウントがリポジトリのコントリビューターとして登録される可能性があります。
Warning このトレーラーを含むコミットを共有リモートにプッシュした後、それを削除するための履歴の書き換え(git rebase -igit filter-branch)は破壊的な操作であり、強制プッシュが必要になりチームメンバーのローカル履歴を壊します。事後対処より予防の方がはるかに簡単です。

最も挿入されやすいコミット

挿入が最も積極的に行われるのは、VS Code の コミットメッセージ生成 機能——ソースコントロールサイドバーのスパークル(✨)アイコン——を使用した場合です。クリックすると Copilot がメッセージを下書きし、確認する前に共同著者トレーラーが埋め込まれます。しかし、開発者からの報告によると、メッセージを手動で書いたコミットにも表示されることがあります。特に、そのセッション中に Copilot Chat がアクティブになっていて、ステージされたファイル内のコードを生成するために使用されていた場合に多く見られます。


挿入の仕組み

GitHub Copilot の VS Code 拡張機能は、VS Code の Source Control Manager(SCM)API に低レベルで統合されています。ファイルをステージしてコミットメッセージの入力ボックスを開くと、Copilot は SCM 入力ボックスプロバイダーとして登録され、そのテキストフィールドに——文字を入力する前から——プログラム的にトレーラーを追記するなど、事前入力や変更が可能になります。

これは不正な機能ではありません。GitHub の AI アトリビューション哲学に基づいた、文書化された動作です。AI モデルが作業に実質的に貢献した場合、その貢献は記録されるべきだと GitHub は考えています。問題は実装にあります:「実質的に貢献した」の解釈が拡張機能によって非常に広く取られており、オプトアウトの UI は目立つ初回起動時のプロンプトではなく、複数のメニューの奥深くに埋もれています。

VS Code の SCM API がこれを可能にする仕組み

VS Code は vscode.scm.inputBox および関連 API を公開しており、拡張機能がフックできます。Copilot 拡張機能はこれを使って次のことを行います:

  1. どのファイルがステージされているか、その差分を監視する。
  2. それらのファイルの編集中に Copilot が呼び出されたか(または単にアクティブだったか)を判断する。
  3. Copilot API 経由でコミットメッセージを生成する。
  4. メッセージ——トレーラーを含む——を送信前にコミット入力フィールドに挿入する。

挿入は GitHub のサーバーではなく VS Code のクライアント側で行われます。つまり、サーバー側のルールやブランチ保護では、履歴に入る前にキャッチできません。

Info この動作は、プルリクエストに対する GitHub のサーバー側 Copilot アトリビューションとは異なります。VS Code 拡張機能が行うのは、コミットメッセージフィールドへのクライアント側のテキスト挿入です——これはまったく別のコードパスです。

生成機能を使わなくても発生するか?

はい——そして、これが開発者を最も苛立たせる部分です。次のような場合でもトレーラーが表示されると報告されています:

  • コミットメッセージを手動で書いた場合(スパークルボタンを使わずに)。
  • ステージされた変更が 100% 手打ちだった場合。
  • Copilot Chat が開いていたが、現在のタスクには使わなかった場合。

拡張機能の「Copilot が関与した」という判断基準は緩いです。差分内のいずれかのファイルの編集セッション中に Copilot がアクティブだった場合——たとえすべての提案を却下していたとしても——トレーラーを追記する可能性があります。これが不満の核心です:実際の AI 貢献に対するアトリビューションではなく、近接性によるアトリビューションなのです。


見た目以上に問題な理由

git log に幽霊の共同著者がいても見た目だけの問題に思えるかもしれませんが、どれほど早急に対処すべきかを決める前に理解しておく価値がある、実際の影響があります。

共同著者コミットを示すターミナルの git ログを確認する開発者

知的財産と雇用主ポリシー

多くの雇用主——特に金融・医療・防衛請負などの規制産業——は、AI 生成コードに関する明示的な IP ポリシーを持っています。プロプライエタリなコードベースへのコミットに Co-authored-by: GitHub Copilot の行があることは、そのコードの作成に AI ツールが関与していたという文書化された記録です。Copilot が閉じ括弧を補完しただけであっても、そのトレーラーは法務チームが対処しなければならない監査証跡を作り出します。

会社が本番コードへの Copilot 使用を明示的に許可していない場合、このトレーラーはあなたが承認していない法的リスクになります。

オープンソースライセンスへの影響

AI 生成コードの法的地位と、コピーレフトライセンス(GPL、AGPL)との互換性はまだ未解決の問題です。厳格な貢献ポリシーを持つプロジェクトは、Copilot アトリビューションを含むコミットを拒否したり、履歴の書き換えを要求する場合があります——FSF などの組織はこれに関する見解を公表しています。明確なプロベナンスを期待するコントリビューターがいるオープンソースプロジェクトをメンテナンスしている場合、履歴内の Copilot トレーラーはそれを複雑にします。

コントリビューター統計と採用ポートフォリオ

GitHub プロフィールとコントリビューショングラフは、採用担当者、潜在的なコラボレーター、カンファレンスのプログラム委員会によるインフォーマルなポートフォリオとしてますます利用されています。公開リポジトリのコミットにボットが共同著者として記載されることで、それらのグラフが提供すべきアトリビューションシグナルが曖昧になります。小さなことかもしれませんが、あなたの履歴です。

Warning 納品物の検収としてクライアントが git 履歴を確認するフリーランサーやコンサルタントの方は、クライアント所有のリポジトリへの Copilot アトリビューションが、避けたいはずの契約上の疑問を引き起こす可能性があります。

止める4つの方法

すべてのワークフローに対応する唯一の正規の修正方法はありません。グローバルなソリューション、リポジトリごとのオーバーライド、またはトレーラーだけを取り除きながら Copilot のコミットメッセージ生成を維持するもの——どれが適切かは状況によります。

オプション 1 — VS Code 拡張機能の設定

最も直接的な方法は、VS Code の設定から動作を無効にすることです。設定を開き(Ctrl+, または Cmd+,)、「copilot commit」 を検索します。GitHub Copilot 拡張機能のコミットメッセージ生成と共同著者アトリビューションに関連するオプションを探します。

settings.json の該当する設定パスは次のとおりです:

{
  "github.copilot.chat.generateCommitMessage.enabled": false
}

コミットメッセージ生成を完全に無効にすると、Copilot がコミット入力フィールドを入力しなくなるため、トレーラーを追加する機会もなくなります。AI によるコミットメッセージ支援は維持しつつアトリビューション行だけを除去したい場合は、拡張機能のバージョンによっては共同著者トレーラーだけを対象とした個別のトグルが存在します。VS Code サイドバーの 拡張機能 > GitHub Copilot > 設定 に移動して、インストールされているバージョンで何が利用可能かを確認してください——Copilot 拡張機能のリリースによって設定名が変わっているためです。

Tip VS Code の設定 UI には、拡張機能の現在のバージョンとその設定が並んで表示されます。古い Copilot ビルドを使用している場合は、拡張機能を更新するとアトリビューション動作に対するより細かい制御が得られる場合があります——Microsoft はこの件に関するコミュニティのフィードバックに対応しています。

オプション 2 — Git フック(最も信頼性が高い)

prepare-commit-msg フックはコミットメッセージエディターが開く前に自動的に実行され、Copilot トレーラーがどのように挿入されたかにかかわらず、外科的に取り除くことができます。このアプローチは VS Code から独立して動作し、拡張機能の更新後も有効で、リポジトリ内で使用するすべての git クライアントに適用されます。

.git/hooks/prepare-commit-msg にフックファイルを作成します:

#!/bin/sh
# GitHub Copilot の共同著者トレーラーをコミットメッセージから削除する
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"

次に実行権限を付与します:

chmod +x .git/hooks/prepare-commit-msg

チーム全体のソリューションとしては、リポジトリにコミットされた共有フックディレクトリを使用し、git を設定して使用させます:

# .gitconfig またはリポジトリのローカル設定で
git config core.hooksPath .githooks

次に、同じ内容で .githooks/prepare-commit-msg にフックをコミットします。リポジトリをクローンして git config core.hooksPath .githooks を実行する(またはセットアップスクリプトで自動化する)すべての開発者に、削除動作が適用されます。

Info sed-i フラグはファイルをインプレース編集します。macOS では BSD の sed に明示的なバックアップ拡張子が必要です:sed -i '' '/^Co-authored-by: GitHub Copilot/Id' "$1"。チームが Linux と macOS の両方を使用している場合は、シェルの条件分岐を追加してください。

オプション 3 — ワークスペースごとに Copilot を無効にする

クライアントプロジェクトや厳格なプロベナンスルールを持つオープンソースリポジトリなど、特定のリポジトリが懸念される場合は、グローバルな設定に触れることなく、そのワークスペースだけ Copilot を完全に無効にできます。リポジトリのルートで .vscode/settings.json を作成または編集します:

{
  "github.copilot.enable": {
    "*": false
  }
}

これにより、そのワークスペースのみですべての Copilot 機能——補完、チャット、コミットメッセージ生成——が無効になります。個人プロジェクトに切り替えると、Copilot は通常通り動作します。欠点は、共同著者の挿入だけでなく、そのリポジトリ内のすべての Copilot 支援を失うことです。

オプション 4 — グローバル gitconfig クリーンアップルール

複数のツールや環境(VS Code だけでなく)からトレーラーが混入している場合は、ホームディレクトリの git テンプレートにグローバルな prepare-commit-msg フックを置けばすべてをカバーできます:

# グローバルフックテンプレートディレクトリを設定
git config --global init.templateDir ~/.git-templates

# ディレクトリとフックを作成
mkdir -p ~/.git-templates/hooks
cat > ~/.git-templates/hooks/prepare-commit-msg << 'EOF'
#!/bin/sh
sed -i '/^Co-authored-by: GitHub Copilot/Id' "$1"
EOF
chmod +x ~/.git-templates/hooks/prepare-commit-msg

この設定以降に初期化またはクローンした新しいリポジトリは、このフックを自動的に継承します。既存のリポジトリについては、リポジトリのルートで git init を実行してください——既存のリポジトリに対しても安全で、履歴に触れることなくテンプレートフックがコピーされます。


オプションの比較

方法 スコープ トレーラー削除 補完を維持 チーム共有可能 拡張機能更新後も有効
VS Code 設定(生成を無効化) グローバルまたはワークスペース はい いいえ settings.json のコミット経由 はい
prepare-commit-msg フック(ローカル) リポジトリごと はい はい .githooks/ パターン経由 はい
ワークスペース無効化(copilot.enable リポジトリごと はい いいえ .vscode/settings.json 経由 はい
グローバル git テンプレートフック すべてのリポジトリ(新規・将来) はい はい いいえ(ユーザーレベル) はい
Copilot 拡張機能を完全に無効化 グローバル はい いいえ N/A N/A

Copilot 補完を維持したい個人に最適prepare-commit-msg フック + グローバルテンプレート。

共有ポリシーを持つチームに最適:セットアップドキュメント付きのコミットされた .githooks/ ディレクトリ。

機密性の高いクライアントリポジトリに最適.vscode/settings.json にコミットされたワークスペースレベルの copilot.enable: false


すでに含まれているコミットのクリーンアップ

Copilot トレーラーを含むコミットをプライベートリポジトリにプッシュ済みで履歴をクリーンにしたい場合、強制的な書き換えが必要です。これは自分だけがコントリビューターのブランチで、コミット SHA を変更することの影響を理解している場合にのみ行ってください。

# 最近のコミットを編集するインタラクティブリベース
git rebase -i HEAD~10

# 対象の各コミットを 'reword' としてマークし、トレーラー行を削除
# または、一括クリーンアップに filter-branch を使用:
git filter-branch --msg-filter \
  'sed "/^Co-authored-by: GitHub Copilot/Id"' \
  HEAD~20..HEAD

書き換え後は強制プッシュが必要です:

git push --force-with-lease origin your-branch
Warning --force-with-lease--force より安全です。最後にフェッチしてから他の誰かがブランチにプッシュしていた場合、プッシュを拒否するためです。パブリックな共有ブランチは保護されません——個人のフィーチャーブランチ以外で行う場合は事前にチームと調整してください。

すでに公開 GitHub にプッシュされていて履歴を書き換えたくないリポジトリについては、現実的な答えはこうです:プロジェクトの CONTRIBUTING ファイルに状況を記録し、今後のためにフックを追加し、古いコミットはそのままと割り切ることです。アクティブな公開リポジトリでの履歴書き換えは、解決するより多くの問題を引き起こします。

ブランチ保護ルールを示す GitHub リポジトリ設定


クイックチェックリスト

状況に合わせて順番に対処してください:

  1. トレーラーを確認するgit log --format=full -5 を実行し、コミット本文の末尾に Co-authored-by: GitHub Copilot がないか確認する。
  2. 影響を受けているリポジトリに prepare-commit-msg フックをインストールする——これが最も摩擦が少なく、信頼性の高い修正です。
  3. VS Code の Copilot 設定を確認する:設定を開き「copilot commit」を検索し、スパークルボタンを使わないのであればコミットメッセージ生成を無効にする。
  4. 機密性の高いリポジトリの場合:そのワークスペースの Copilot を無効にする .vscode/settings.json を追加し、チームメンバーが設定を継承できるようにコミットする。
  5. チーム環境の場合.githooks/ ディレクトリを作成して prepare-commit-msg スクリプトを追加し、コミットし、プロジェクトのセットアップ手順や Makefile に git config core.hooksPath .githooks を追加する。
  6. 多数の個人リポジトリにまたがって作業する場合は、グローバル git テンプレートを設定する——一度設定すれば完了のカバレッジが得られます。
  7. 共有ブランチ上の最近のコミットを監査するgit log --grep="Co-authored-by: GitHub Copilot" --oneline を使って影響を受けたコミットを見つけてから、履歴のクリーンアップが必要かどうかを判断する。
  8. 修正が機能していることを確認する:ファイルをステージし、VS Code でコミットダイアログを開いて、コミットを確定する前にトレーラーがないことを確認する。

参考資料・関連リンク

  • GitHub Docs — コミットトレーラーアトリビューションCo-authored-by 形式が GitHub のコントリビューショングラフやリポジトリ統計・プルリクエストのアトリビューションに対してどう機能するかを説明する GitHub の公式ドキュメント。

  • VS Code GitHub Copilot 拡張機能 Changelog(marketplace.visualstudio.com)— Copilot 拡張機能のリリースノートには、コミットメッセージ生成が導入された時期とアトリビューション動作のその後の変更が記録されています。2023年末以降のバージョンを検索してください。

  • git-scm.com — githooks ドキュメントprepare-commit-msg フック、その呼び出しコンテキスト、引数、およびさまざまな git クライアント間でのコミットプロセスとの相互作用に関する公式リファレンス。

  • Software Freedom Conservancy — コピーレフトと AI 生成コード — SFC が公開した、AI モデルの出力と GPL・AGPL ライセンス義務との相互作用の分析。プロジェクト内の Copilot アトリビューションの扱いを決定しようとしているオープンソースメンテナーに関連します。

  • GitHub コミュニティフォーラム —「Copilot が入力なしで Co-authored-by を追加する」 — 挿入動作の実際の事例、ユーザーが確認した回避策、意図された設計と報告されたエッジケースについての GitHub スタッフの回答を記録した、進行中の開発者ディスカッションスレッド。