# Claude Code 默认往 Git 历史塞会话链接，删它却要重写历史

**Summary:** Claude Code 默认为云端和远程控制会话的提交与 PR 添加会话链接。我会保留这条审计线索，但应由每个仓库在发布前自行决定是否启用。

- Canonical: https://markhuang.ai/zh/news/claude-session-link-rewrites-history
- Language: zh-CN
- Author: [Mark Huang](https://markhuang.ai/about)
- Published: 2026-08-30
- Section: News
- Tags: Claude Code, Git, AI 归属
- Source: [GitHub Issue](https://github.com/anthropics/claude-code/issues/66504)
- License: https://creativecommons.org/licenses/by-nc/4.0/

---

![一条发光的会话链接融合在玻璃材质的分支提交块中，并连接到一个拉取请求卡片](https://cdn.markhuang.ai/news/claude-session-link-rewrites-history/hero.webp)

*会话链接能留下有用的痕迹。可一旦写进了已推送的提交，再想移除就是改历史了。*

2026 年 6 月 9 日，有人在 [GitHub 上提交了一个 Claude Code 的功能请求](https://github.com/anthropics/claude-code/issues/66504)，反对在未经用户明确同意的情况下，将会话 URL 自动添加到提交信息和拉取请求描述中。后来一位 Anthropic 协作者澄清说，这只影响网页版和远程控制会话，然后在 8 月 17 日关闭了议题——理由是已经有开关了。争议的核心从来不是会话链接有没有用，而是谁有权决定它该不该出现在仓库里。

我的答案是：仓库所有者。Claude Code 当前的[设置文档](https://code.claude.com/docs/en/settings-reference#attribution-sessionurl)指出，`attribution.sessionUrl` 选项默认对云端和远程控制会话的提交及拉取请求设为 `true`。将其设为 `false` 即可移除会话链接，而提交和拉取请求的归属信息仍可单独配置。知道去哪找的人确实能改，但 agent 写入元数据的那一刻，并没有人问过你同不同意。

拉取请求描述改起来很容易，但已推送的提交信息就不一样了。我觉得 Claude Code 的问题在于：溯源功能本身没问题，但默认设置选错了。

## 会话链接有实际用途

这个功能确实有实际价值：会话链接能帮你搞清楚一段代码是怎么来的。[Hacker News 的讨论](https://news.ycombinator.com/item?id=49498201)里，有开发者说他们看重这条链接，拿它当审计线索，或者回头查旧提交时的推理过程。也有人觉得归属信息有用，但产品应该先问一声。议题帖子里大多在骂默认设置，但社区对这个功能本身的价值其实是有分歧的。

我能理解这个吸引力。diff 只记录了最终结果，那些被放弃的方案、遇到的约束、人工修正的过程，全都没有留下。几个月后出了回归 bug，这些缺失的上下文本来能省很多时间。一个会话 URL 就能把代码和完整的对话记录串起来，又不用把整段对话塞进 Git。

但这条线索绑在厂商平台上。团队可能更想用工单、架构决策记录、评审备注，甚至根本不想留对话记录。仓库本身也可能有数据保留和访问控制规则，跟会话服务对不上。从公开议题里我也看不出谁能打开某个会话 URL，一个链接本身也证明不了对话记录是公开的。这个链接会写进项目历史，当然应该由项目自己来决定。

## 关闭开关是后来才加入的

Anthropic 公开的[Claude Code 更新日志](https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md)记录了这一过程。2.1.9 版本首次在网页会话创建的提交和拉取请求中加入了会话 URL 归属信息；2.1.183 版本则新增了 `attribution.sessionUrl` 选项，允许用户从网页和远程控制输出中省略该链接。

这个先后顺序本身就解释了不少怨气。链接先上线了，控制开关后来才补上。报告议题的人一开始建议在新手引导里加个选项，或者第一次提交时弹个提示。维护者指了指现有的设置项，他又追加要求：要么给个账户级选项，要么给个命令，要么弹个提示，要么换个默认值——什么都行。结果议题还是被以“已完成”关掉了。

JSON 设置找到了当然能用，但它不会在第一次受影响之前提醒你，也解决不了团队到底想要什么的问题。我更希望的是：第一次跑网页或远程控制提交时，先暂停一下，给你三个选项——保留会话链接、只留普通归属信息、或者都不要。仓库里要能看到当前选了什么策略，组织层面也要能统一管理。

## 提交信息里不应该有意外

GitHub 关于[修改提交信息](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/changing-a-commit-message)的文档说得很清楚：改提交信息会生成新的提交 ID。如果提交已经推送上去了，要删掉那一行就得重写历史、强制推送。GitHub 警告这可能会干扰协作者，还提到强制推送不一定能从 GitHub 上彻底删掉包含敏感信息的旧提交。

不是说每个会话 URL 都涉及敏感信息，问题出在写入的位置。默认设置改的是草稿，发现不对随时能改，成本很低。可一旦写进了提交，标准就得高得多——清理起来要改哈希、让引用失效，还会影响别人基于旧历史做的工作。

> **Info:**
>
> 我对 agent 写 Git 元数据的原则很简单：发布前把提交信息和拉取请求描述完整展示出来，第一次加新类型的归属信息或外部链接时，先问一声。

这也是我把溯源和作者身份分开看的原因。`Co-Authored-By` 尾注、会话链接、合并代码的责任——这三个回答的是不同的问题。我之前写[Claude 提议的文本水印](https://markhuang.ai/news/claude-watermark-can-flag-claude-not-settle-authorship)时也做过类似的区分：溯源信号能说明工具有没有参与，但不能决定谁拥有想法、谁来为结果负责。

## 我会保留链接，但改变决策者

我不希望 Claude Code 把会话链接这个选项直接砍掉。对有些团队来说，review 或调试时翻对话记录确实有用，这个链接值得保留。但我希望产品把它当成仓库策略来对待，而不是创建提交的环境随手贴上去的。

我会把会话 URL 默认关掉，在第一次相关发布操作时问一声，然后让组织可以设统一策略。普通的 AI 归属信息应该独立出来——这样团队可以披露工具有没有参与，同时不用把 Git 历史绑到厂商托管的对话上。

Claude Code 议题 #66504 因为用户能关掉链接就关了。我觉得这回答了配置层面的问题，但没回答产品层面的问题。agent 要往仓库里写东西的时候，该留什么痕迹，应该由项目自己说了算。
