2026 年 4 月,Visual Studio Code 在升级至 v1.117.0 后,引入了 GitHub Copilot 自动署名功能:无论用户是否实际使用 Copilot,也无论 Copilot 功能是否被禁用,所有通过 VS Code 完成的 Git 提交都会被强行附加 Co-authored-by: GitHub Copilot <noreply@github.com> 这一行 Trailer。此举引发了开发者社区的强烈反弹,更暴露了 IDE 在 Git 提交流程中隐藏注入行为的技术实现细节。本文将从技术机制层面分析这一问题的根因,并提供可在生产环境直接部署的工程级解决方案。
技术根因:git.addAICoAuthor 配置与提交钩子的实现逻辑
VS Code 的 Git 集成模块并非简单调用系统 Git 命令,而是通过 VS Code 扩展层(Extension Host)拦截并增强了提交过程。当用户在 VS Code 的源代码管理面板中输入提交信息并确认时,VS Code 并非直接将用户输入作为 git commit -m 的参数传递,而是经过了一层内部处理。这一层处理负责解析用户配置中的 git.addAICoAuthor 选项,并根据其值决定是否在提交消息末尾追加 Co-Authored-by Trailer。
该配置项支持三个枚举值:off(完全禁用)、chatAndAgent(仅在使用 Copilot Chat 或 Agent 模式时追加)以及 all(无条件追加)。问题出在 v1.117.0 的更改将默认值从 off 修改为 all,且该行为在 Copilot 扩展功能被全局禁用甚至在 disableAIFeatures 开关打开的情况下仍然触发。根据后续 Microsoft 工程师在 GitHub 上的回应,根本原因在于配置文件默认值的更改与运行时回退逻辑之间存在同步问题:配置默认值被改为 all,但仓库代码中某处的运行时回退仍调用了 config.get('addAICoAuthor', 'off'),导致两套逻辑不一致。在某些 VS Code 运行环境中(如测试环境或无头模式),配置默认值未被正确加载,反而使用了硬编码的回退值,而这个回退值在此次更新中被误设为 all。
从架构角度看,VS Code 的 Git 扩展通过 git.commit API 实现了对提交的拦截。提交消息的组装发生在 commit() 方法内部,该方法接受一个包含 message 和 trailers 属性的对象。当检测到需要添加 Co-Authored-by 时,扩展会将 Co-authored-by: GitHub Copilot <noreply@github.com> 推入 trailers 数组,然后将其序列化后传递给 Git。关键问题在于:这一追加操作发生在提交确认之后、Git 命令执行之前,且默认不向用户展示这个追加过程,导致用户在实际查看提交前无法感知这一修改。
工程级禁用方案:从配置到钩子的多层防御
鉴于此次事件暴露的信任问题,建议在团队内部建立多层次的防御机制,确保即使 IDE 层面配置被意外更改,仍有其他手段保障提交记录的完整性。
方案一:配置文件级强制覆盖。 在仓库根目录的 .git/config 中或通过 Git 配置层级(仓库级别优先级高于全局)明确设置 addAICoAuthor 为 off。执行命令 git config addAICoAuthor off 会在当前仓库的 .git/config 中写入 [commit] addAICoAuthor = off。此方案的优点是生效范围精确到单个仓库,但需要注意 VS Code 可能在某些版本中忽略此配置或使用扩展内部的默认值覆盖。
方案二:全局配置文件防御。 对于需要统一管理的团队,可在全局 Git 配置中强制设置。执行 git config --global commit.template 并指向一个包含空白 Trailer 区域的提交模板,或者在全局钩子目录中部署防护脚本。更为直接的方式是在团队的所有开发环境中统一安装一个预提交钩子脚本,在 commit-msg 阶段检测并拒绝包含 Co-authored-by: GitHub Copilot 的提交。此方案的示例代码如下:
#!/bin/bash
# .git/hooks/commit-msg
commit_msg_file="$1"
if grep -q "Co-authored-by: GitHub Copilot" "$commit_msg_file"; then
echo "Error: Detected unauthorized Co-Authored-by trailer in commit message."
echo "Please remove the Copilot attribution before committing."
exit 1
fi
将上述脚本保存为仓库的 .git/hooks/commit-msg 并赋予执行权限(chmod +x .git/hooks/commit-msg)。如果使用 Git 2.9 以上版本,可通过 core.hooksPath 将钩子目录统一指向版本库内的目录,实现钩子的版本化管理。
方案三:VS Code 设置 JSON 明确声明。 在用户级别的 settings.json(~/.config/Code/User/settings.json,Linux/macOS)或 %APPDATA%\Code\User\settings.json(Windows)中显式添加 "git.addAICoAuthor": "off"。虽然本次事件表明 VS Code 可能忽略此设置,但作为基础防御层仍值得部署。需要注意的是,部分用户报告在升级后发现配置被重置或被覆盖,因此建议同时检查工作区级别的 .vscode/settings.json,确保在项目根目录也包含相同配置。
方案四:迁移至 VSCodium。 对于关注隐私和功能的团队,可考虑切换至 VSCodium—— 这是 VS Code 的社区分支,移除了微软的遥测和数据回传功能,且默认不包含 Copilot 扩展。VSCodium 仍支持通过手动安装 Copilot 扩展获得相同的功能,但避免了微软 “开箱即用” 的强制行为。
深层影响:信任危机与版权风险
此次事件的核心问题并非技术实现本身,而是 IDE 在用户不知情的情况下修改了作为代码历史记录的提交信息。Git 提交消息是软件开发中具有法律和技术双重意义的人工制品:它是代码变更的因果记录,也是版权归属的佐证。当 VS Code 未经用户同意强行插入 Co-Authored-by Trailer 时,存在两个层面的风险。
其一是版权风险。美国版权局目前认定完全由 AI 生成的内容不受版权保护,虽然添加 Co-Authored-by 并不意味着 Microsoft 对代码拥有版权,但这一标记可能在未来的法律争议中被引用为 “AI 参与创作” 的证据,进而影响代码的版权归属判定。其二是企业合规风险。许多企业有明确的 AI 使用政策,禁止在特定项目中使用 AI 生成的代码。当所有提交都被自动标记为 Copilot 参与时,可能导致审计合规问题,即使这些代码实际上完全是人工编写的。
微软在社区强烈反对后已将默认值从 all 回调为 chatAndAgent,并在后续版本中承诺修复在 disableAIFeatures 启用时仍会触发的问题。但这一事件为整个开发者工具行业敲响了警钟:当 IDE 开始在后台修改用户的版本控制记录时,信任的重建将远比功能的移除更为困难。
参考资料
- GitHub Issue #242634: VS Code inserting 'Co-Authored-by Copilot' into commits regardless of usage
- Hacker News 讨论: VS Code inserting 'Co-Authored-by Copilot' into commits regardless of usage (news.ycombinator.com/item?id=47989883)