Claude Code attributionでコミット署名とPR署名を変える
settings.jsonのattributionでgitコミットとPRの署名を変える方法。コミット署名が消えない原因、includeCoAuthoredByとの優先関係、trailerがgitに読まれる条件を実測付きで扱います。
このTipsでできること
Claude Codeがgitコミットやプルリクエストに自動で付けるAI署名は、settings.jsonのattributionで変更できます。署名を消したい、文言を組織のルールに合わせたい、セッションURLだけ外したい。この3つが主な用途です。
Claude Codeのバージョンはclaude --versionで確認できます。設定の挙動はv2.1.285のドキュメントに、trailerの読まれ方は使い捨てgitリポジトリでの再現に基づきます。
attributionは3つの署名を別々に制御する
何も設定しなければ、コミットにはCo-Authored-Byのgit trailerが、PR本文には生成元を示す1行が付きます。クラウドやRemote Controlのセッションでは、コミットにClaude-Sessionのtrailerも加わります。
attributionの3つのキー
commit
コミットメッセージの署名です。既定は
Co-Authored-By: <モデル名> <noreply@anthropic.com>。空文字列で非表示になります。pr
PR本文の署名です。既定は
🤖 Generated with [Claude Code](https://claude.com/claude-code)の1行。空文字列で非表示になります。sessionUrl
クラウド / Remote Controlセッションのclaude.aiリンクです。既定は
trueで、falseにするとコミットのtrailerもPR本文のリンクも付きません。
3つは独立しています。コミット履歴には残しつつ、PR本文だけチームのテンプレートで統一するといった使い分けが、1つのオブジェクトで書けます。
コミット署名を消したいとき
.claude/settings.json(プロジェクト共有)か~/.claude/settings.json(自分専用)に書きます。
{
"attribution": {
"commit": "",
"pr": "",
"sessionUrl": false
}
}commitとprを空文字列にしただけでは、クラウドセッションのリンクは残ります。3つ目のsessionUrlまで書いて、初めてすべての署名が消えます。
v2.1.281以降なら、もっと短く書けます。
{
"attribution": false
}falseはすべての署名を隠す指定です。ただし古いバージョンはこの値を受け付けず、falseを書いたファイルごと読み飛ばします。複数人で共有するファイルには、上のオブジェクト形式を残すほうが安全です。
署名の文言を差し替えたいとき
組織のAI利用ポリシーで文言が決まっているなら、commitに文字列をそのまま書きます。改行は\nで入れます。
{
"attribution": {
"commit": "Generated with AI\n\nCo-Authored-By: AI <ai@example.com>",
"pr": ""
}
}既定のモデル名は3通りに変わる
既定のtrailerに入る名前は、コミットした時点のモデルです。サブエージェントがコミットしたときは、そのサブエージェントのモデル名になります。
モデルのバージョンを確認できない場合はClaudeだけが入ります。Claudeモデルと判別できない場合、たとえばANTHROPIC_BASE_URL経由のサードパーティモデルではClaude Codeと入ります。trailerの名前でモデルを集計しているなら、この3通りを想定しておく必要があります。
trailerとして読まれるのは最終段落だけ
commitに複数行を書くとき、gitがCo-Authored-Byをtrailerと認識するのは、メッセージ末尾の段落が空行で分かれ、しかもその段落がtrailer行だけでできているときです。本文の行と同じ段落に空行なしで置くと、最終段落でも認識されません。使い捨てリポジトリで、文言の位置を変えて確かめました。
# 1) 空行で分けた最終段落がtrailer行だけ
git commit --allow-empty -q \
-m $'subj\n\nGenerated with AI\n\nCo-Authored-By: AI <ai@example.com>'
git log -1 --format='[%(trailers:key=Co-Authored-By,valueonly,separator=%x2C )]'
# → [AI <ai@example.com>]
# 2) 本文の行と同じ段落に空行なしで置く
git commit --allow-empty -q \
-m $'subj\n\nGenerated with AI\nCo-Authored-By: AI <ai@example.com>'
git log -1 --format='[%(trailers:key=Co-Authored-By,valueonly,separator=%x2C )]'
# → []
# 3) Co-Authored-Byの後ろに別の段落が続く
git commit --allow-empty -q \
-m $'subj\n\nCo-Authored-By: AI <ai@example.com>\n\nnote'
git log -1 --format='[%(trailers:key=Co-Authored-By,valueonly,separator=%x2C )]'
# → []2つ目と3つ目は本文にCo-Authored-By行があるのに、gitからはtrailerが0件に見えます。git logやgit interpret-trailersでtrailerを集計している場合、この違いが集計結果に出ます。文言の末尾にnoteなどを足すときは、trailerの後ろに段落を続けないでください。
署名が消えない・変わらないとき
includeCoAuthoredByを書いたのに効かない
旧設定のincludeCoAuthoredByは、v2.0.62でattributionに置き換わりました。今も読まれますが、attribution.commitかattribution.prを設定した時点で無視されます。
includeCoAuthoredBy: false の効き方
attributionを書いていない
コミットのtrailerとPR本文の署名が、どちらも消えます。
commitかprを書いている
includeCoAuthoredByは無視されます。書かなかった側は既定の文言に戻ります。
両方をattributionに移し、旧キーは削除してください。
CLAUDE.mdに署名のルールを書いたとき
Claude Codeは、CLAUDE.mdやメモリーに書いた署名についての指示を、attributionのコミット・PR用の文言より優先するようClaudeに伝えます。ただし署名の文言をmanaged settingsで指定している場合は、その行が優先されます。
CLAUDE.mdに「コミットにCo-Authored-Byを付けない」と書けば、attributionを触らなくても署名が付かない場合があります。逆に、署名が出ない原因が設定ファイルに見当たらないときは、CLAUDE.mdやメモリーの中身も疑う価値があります。
設定ファイルが読み込まれていない
JSONの構文エラーや不正な値があると、ファイルごと、または不正な値だけが読み飛ばされます。対話セッションの開始時に、Settings Errorのダイアログが出ます。-pで実行したときはダイアログが出ないので、claude doctorで確認します。
コメントや末尾のカンマは構文エラーです。attributionを書いた直後に署名が変わらないなら、まずファイルの読み込みを疑います。
署名が想定どおりにならないときの切り分け
- 1
バージョンを確認する
claude --versionを実行します。attribution: falseはv2.1.281、sessionUrlはv2.1.183が必要です。 - 2
設定が読み込まれているか見る
Claude Code内で
/statusを開き、Setting sourcesの行を確認します。User settingsやProject local settingsなど、読み込まれたファイルが並びます。 - 3
複数スコープの優先順位を確かめる
同じキーは、managed settings、コマンドライン、ローカル、共有プロジェクト、ユーザーの順に優先されます。低いスコープから順にキーを外し、そのつど
git logでtrailerを見ると、どのファイルが効いているか分かります。 - 4
CLAUDE.mdとメモリーを見る
署名についての指示が書かれていないか確認します。
/statusが示すのは、読み込まれたファイルの一覧です。キーごとの出どころは表示しません。読み飛ばされた値の一覧はclaude doctorで出ます。
sessionUrlはローカルのターミナルでは付かない
Claude-SessionのtrailerとPR本文のリンクは、クラウドかRemote Controlのセッションでコミット・PRを作ったときに付きます。ローカルのターミナルで通常どおり使っている場合は付きません。PR本文には、セッションURLが単独の1行で入ります。コミットのtrailerは、次のように取り出せます。
git log -1 --format='%(trailers:key=Claude-Session,valueonly)'
# → https://claude.ai/code/session_...社内リポジトリでセッションURLを外に出したくないときや、PR本文を短く保ちたいときは、sessionUrlだけをfalseにします。commitとprの署名は残ります。Remote Controlの導入でつまずいているなら、Remote Controlが使えない「requires the Anthropic API」の意味が参考になります。
名前が似た設定との違い
CLAUDE_CODE_ATTRIBUTION_HEADERという環境変数は、attribution設定とは無関係です。こちらはAPIリクエストのシステムプロンプト冒頭に付く、クライアントのバージョンとプロンプトのフィンガープリントを含むブロックを制御します。0で省略できます。
もう1つ、includeGitInstructionsというキーもあります。これは署名の文言ではなく、Claudeに渡す組み込みのコミット・PR手順とgitの状態のスナップショットを外す設定です。falseにしても、署名の有無はattributionの側で決まります。
どのスコープに書くか
attributionはどのスコープのsettings.jsonにも書けます。個人の好みなら~/.claude/settings.json、リポジトリの慣習なら.claude/settings.json、自分だけの一時的な上書きなら.claude/settings.local.jsonです。Claude Codeがこのファイルを作った場合はgit管理外になり、共有設定を汚さずに試せます。手で作ったときは.gitignoreに自分で追加してください。
組織全体で署名を統一するなら、managed settingsで配ると個々のメンバーは上書きできません。運用はClaude Code組織管理ガイド — managed settingsで統制するにまとめています。
場面別の設定例
判断の軸は、このコミット履歴を誰が読むかです。
| 場面 | commit | pr | sessionUrl |
|---|---|---|---|
| OSSの公開リポジトリ | commit既定のまま | pr既定のまま | sessionUrl既定のまま |
| 納品物にAI利用の痕跡を残さない受託開発 | commit"" | pr"" | sessionUrlfalse |
| 社内の個人開発でURLだけ外したい | commit既定のまま | pr既定のまま | sessionUrlfalse |
| AI利用の明記が組織ポリシーで義務 | commit指定の文言 | pr必要に応じて | sessionUrl必要に応じて |
署名を消す理由が無ければ、既定のままで問題ありません。契約やポリシーで表記が決まっているなら、その文言をattributionに書けば、コミット後の手直しが要りません。
よくある質問
attributionを設定しても既存のコミットは変わりますか
変わりません。attributionが効くのは、これから作るコミットとPRだけです。過去のコミットを書き換えるには、git rebaseなどClaude Codeとは別のgit操作が必要です。
まとめ
署名を消すならsessionUrlまで書き、旧キーのincludeCoAuthoredByは残さない構成にすると食い違いが起きません。文言を差し替えたら、一度コミットしてtrailerとして読まれているかをgit logで見ておくと、集計の抜けを防げます。
設定全体の構成はClaude Code settings.json完全ガイド、権限やhooksまで含めた例はClaude Code設定ガイドにあります。