クイックサマリー: Claude Codeは、バージョンや実行環境によってコミットメッセージに Claude-Session: https://claude.ai/code/session_... という個人セッションへのリンクを自動で付与することがあります。本記事では、GitHubのCommit Search APIで自分の全リポジトリを横断チェックする手順と、attribution.sessionUrl 設定でこのURLを抑制する方法を解説します。対象はClaude Code(CLI・web・Remote Control)を利用するすべての開発者です。
Claude-Session URLとは?コミットに埋め込まれる仕組み
Claude Codeでコミットを作成すると、コミットメッセージの末尾に Co-Authored-By: Claude <noreply@anthropic.com> というトレーラーが付くことはよく知られています。しかし一部の環境では、これに加えて次のような行が自動で挿入されることがあります。
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_1234567abcdefghこの Claude-Session の中身は、claude.ai/code 上の作業セッションそのものへのURLです。Zennに投稿された開発者K@zuki.氏のレポートによると、自身のコミットログを見返していた際に見覚えのないこのトレーラーに気づき、その日のうちに調査・対応したとのことです。閲覧には本人のログインが必要なため即座に第三者へ漏洩するわけではありませんが、「AIとの作業会話への参照が、公開リポジトリのgit履歴に永続的に残る」状態になります。
この記事でわかることは次の4点です。
- Claude-Session URLがコミットに付与される条件と背景(GitHub Issue #41873)
- gh api(Commit Search API)で自分の全リポジトリを横断チェックする手順
attribution.sessionUrl設定による抑制方法(v2.1.182で追加)- 書き換え後に「本当に消えたか」を確認する検証コマンド
なお、Claude Code自体はAnthropicが提供する商用ツールですが、Issueトラッカーとリリースノートは GitHubのanthropics/claude-codeリポジトリ で公開されています。本記事の手順はすべて公開情報に基づいています。
なぜ「ログイン必須だから安全」と言い切れないのか
「セッションURLの閲覧にはログインが必要だから実害はない」という見方もできます。ただし、これは認可制御が正しく機能し続けている前提での話です。OWASP Top 10(2021年版)では「アクセス制御の不備(Broken Access Control)」が第1位に挙げられており、認可周りの不具合はWebサービス全般でありふれた脆弱性カテゴリです。
仮に認可制御に不具合が発生した場合、公開リポジトリに撒かれたClaude-Session URLは「アクセス可能な標的の一覧」に変わり得ます。しかもGitHubのCommit Search APIを使えば、公開コミットに含まれるセッションURLは誰でも横断的に収集できる状態です。元記事の筆者も「得るものが特にない情報を、わざわざ公開のまま置いておく理由はない」と指摘しており、これは防御層を一枚に依存しないという基本的なセキュリティ設計の考え方に沿った判断と考えられます。
職種別に見ると、この課題が特に重要になるのは次のようなケースです。
- OSSメンテナー: 公開リポジトリへのコミットが多く、履歴が世界中から参照されるため露出面が最も広い
- 受託開発エンジニア・SIer: クライアントのコードベースに自社のAIセッションURLが残ると、契約上の情報管理の観点で説明が難しくなる
- SRE・プラットフォームエンジニア: インフラ設定リポジトリでの作業セッションには内部構成の議論が含まれやすく、参照リンクの放置は避けたい
自分のリポジトリを横断チェックする手順
1件見つかった以上、他のリポジトリにも埋まっていないか確認するのが先決です。ローカルで git log --grep を繰り返すよりも、GitHubのCommit Search APIを使う方が横断チェックに向いています。gh CLIで次のように実行します。
# 自分のアカウントの全リポジトリを検索
gh api "/search/commits?q=Claude-Session+user:<自分のアカウント>&per_page=100" \
--jq '.total_count, .items[].repository.full_name'
# 所属Organizationも検索
gh api "/search/commits?q=Claude-Session+org:<所属org>&per_page=100" \
--jq '.items[].repository.full_name' | sort -uヒットしたリポジトリは、次のコマンドで公開・非公開を1つずつ確認します。
gh api repos/<owner>/<repo> --jq '.visibility'元記事の実例では、複数リポジトリがヒットしたもののほとんどはprivateで、publicで該当したのはごく一部だったと報告されています。まずは全体像を把握し、public該当分から優先的に対処するのが現実的です。
書き換え後の「本当に消えたか」検証
ここで重要な注意点があります。GitHubの検索インデックスにはラグがあることです。該当コミットを git commit --amend で書き換えた直後に再検索しても、古いコミットがまだヒットすることがあります。さらにGitHubはブランチから外れたコミットオブジェクトをしばらく保持する仕様のため、SHA直指定では取得できてしまう期間があります。
確実な検証には、検索APIではなく branches-where-head エンドポイントで「そのSHAがどのブランチにも属していない」ことを確認します。
gh api repos/<owner>/<repo>/commits/<該当SHA>/branches-where-head --jq '.'
# [] が返れば、どのブランチからも到達不可能 = 履歴上は消えているattribution.sessionUrl でセッションURLを抑制する設定
根本原因は、Claude Codeの attribution 設定を明示していなかったことです。Claude Codeには従来から attribution.commit / attribution.pr という、コミットやPR本文に付くトレーラー文言をカスタマイズする設定がありました。ところがセッションURLだけはこの設定の対象外で、この挙動はGitHub Issue #41873「attribution setting does not control session URL in commit messages」として報告されていました。「セッションURLはデフォルト付与ではなくopt-inにすべき」という要望はIssue #66504まで遡れます。
対策として、v2.1.182で attribution.sessionUrl という専用キーが追加されています。公式リポジトリのCHANGELOG.mdには次の記載があります。
- Added `attribution.sessionUrl` setting to omit the claude.ai session link
from commits and PRs in web and Remote Control sessions設定例は次のとおりです。commit / pr は従来どおり文言をカスタマイズしつつ、sessionUrl だけを false にすればセッションリンクのみを抑制できます。
{
"attribution": {
"commit": "🤖 Generated with Claude Code",
"pr": "",
"sessionUrl": false
}
}配置場所によって適用範囲が変わります。
~/.claude/settings.json— 全リポジトリに適用(個人環境ではこちらを推奨)- プロジェクト直下の
.claude/settings.json— そのリポジトリだけに適用(チームで設定を共有したい場合に有効)
設定後の動作確認として、新しいセッションでテストコミットを作成し、git log -1 --format=%B でトレーラーにClaude-Session行が含まれていないことを確認してください。設定変更はセッション再起動後に反映され、同一セッション内では効かない点に注意が必要です。
実際の開発フローに組み込む方法
個人の設定変更だけでなく、チームの開発フローとして再発を防ぐ組み込み方を紹介します。
① プロジェクト共通設定としてコミットする: .claude/settings.json に attribution.sessionUrl: false を含めてリポジトリにコミットしておけば、チームメンバー全員のClaude Codeセッションに同じ抑制が効きます。CLAUDE.mdに「コミットトレーラーの方針」を1行書いておくと、設定の意図も後から追えます。
② 定期チェックをスクリプト化する: 前述の gh api search/commits コマンドをシェルスクリプトにまとめ、月次の棚卸しやCIの定期ジョブで実行すれば、意図しないトレーラーの混入を早期に検知できます。Claude Codeを使っているなら、このチェック手順を .claude/commands/ 配下のスラッシュコマンド(例: /check-session-leak)として保存しておくと、「セッションURLの混入チェックをして」の一言で定型作業を再現できます。
③ push前の最終確認をhooksに寄せる: 元記事の筆者は、最初に気づいたリポジトリでは該当コミットをpushする前に発見できたため事なきを得たと述べています。git の pre-push フックや Claude Code の hooks でコミットメッセージに Claude-Session: が含まれていないか検査すれば、「push前に気づける」状態を仕組みとして保証できます。
類似アプローチとの比較
セッションURL対策に関連する手段を整理します。予防(設定)と事後対応(履歴書き換え)は役割が異なるため、組み合わせて使うことになります。
| ツール・手段 | 対応CLI/環境 | ライセンス | 最終更新 | 特徴 |
|---|---|---|---|---|
| attribution.sessionUrl 設定 | Claude Code v2.1.182以降 | 商用(設定は公開情報) | 2026年(CHANGELOG記載) | セッションURLの付与自体を予防。v2.1.182以降はweb版セッションにも適用(公式ドキュメント) |
| gh CLI(Commit Search API) | GitHub CLI 全般 | MIT | 活発に更新中 | 既存コミットの横断検出に最適。書き換え後の検証はbranches-where-headで行う |
| git filter-repo | git 全般(Python製) | MIT | 活発に更新中 | push済み履歴からトレーラー行を一括除去できる事後対応ツール。強制push必須で共同開発では調整が必要 |
注意点・制約・セキュリティ
- web版は当初抑制不可だったが現在は対応済み: 元記事の執筆時点では「web版には効かない」との報告がありましたが、公式ドキュメントでは v2.1.182 以降 claude.ai/code のweb版セッションにも
attribution.sessionUrlが適用されると明記されています。旧バージョン利用時は要注意です - 公式ドキュメント未記載: 執筆時点で
attribution.sessionUrlは公式ドキュメントに記載がなく(Issue #69614として報告済み)、CHANGELOGを読まないと存在に気づけない設定です。バージョンアップで挙動が変わる可能性も考慮してください - 反映タイミング: 設定はセッション再起動後に有効になります。設定直後の同一セッションでのコミットには効きません
- push済み履歴の書き換えは破壊的操作:
git commit --amendや filter-repo での書き換え後は強制pushが必要になり、共同開発者のローカル履歴と衝突します。実行前に必ずチームで合意を取ってください - データ送信先: Claude-Session URL自体はclaude.aiへの参照リンクであり、コードが追加送信されるわけではありません。リスクは「参照の公開」にあります
まとめ
要点は次の3つです。
- Claude Codeは環境によってコミットに
Claude-Session:URLを自動付与することがあり、公開リポジトリではセッションへの参照が永続化する - 心当たりがあれば
gh api "/search/commits?q=Claude-Session+user:<自分>"で横断チェックし、書き換え後はbranches-where-headで到達不能を確認する attribution.sessionUrl: falseを settings.json に設定すれば抑制できる(v2.1.182以降・セッション再起動後に反映)
公開リポジトリでClaude Codeを日常的に使っている方は、まず5分だけ時間を取って自分のコミットログをチェックしてみることをおすすめします。attribution設定の詳細や最新の挙動については、Claude Code公式ドキュメントと公式リポジトリのCHANGELOGを参照してください。
コメント