auth.json绝不能提交到git,因其是明文凭据保险箱,一旦进入历史无法彻底清除;常见原因包括漏加--global参数执行composer config --auth、ide自动启用“store credentials in project”、ci脚本误用echo生成或硬编码token至composer.json。

auth.json 绝对不能提交到 Git,它不是配置文件,是明文凭据保险箱——一旦进历史,删都删不干净。
为什么 auth.json 会意外进 Git
最常见原因是执行了 composer config --auth 却漏了 --global 参数。这条命令默认在当前目录生成 auth.json,而项目根目录通常没在 .gitignore 里覆盖它,git add . 时就顺手提交了。
- IDE(如 PHPStorm)可能自动启用 “store credentials in project”,得关掉对应设置
- 某些 CI 脚本用
echo '{...}' > auth.json生成文件,也容易误加进版本库 - 手动编辑
composer.json把 token 塞进repositories.url字段,比如"https://token:xxx@packagist.internal",这属于硬编码密钥,同样进 Git 历史
怎么确认 auth.json 没被 Git 跟踪
别只看文件是否存在,要看它是否已在索引或历史里:
- 检查是否已纳入跟踪:
git ls-files | grep auth.json—— 有输出说明已提交过 - 检查是否被
.gitignore正确忽略:git check-ignore -v auth.json—— 若无输出,说明没生效 - 查全局配置路径(确认该放哪):
composer config --global --list | grep config-home
如果 git ls-files 有结果,必须立刻执行:git rm --cached auth.json(仅从索引移除,保留本地文件),再补 auth.json 到 .gitignore。
CI/CD 环境下不能依赖 auth.json 文件
GitHub Actions、GitLab CI 的 runner 上没有交互终端,也没有你的 ~/.composer/auth.json,硬塞文件既不安全也不可靠。
- 优先用环境变量:
COMPOSER_AUTH='{"github-oauth": {"github.com": "ghp_xxx"}}' - GitHub Actions 中写成:
env: COMPOSER_AUTH: ${{ secrets.COMPOSER_AUTH }} - GitLab CI 中用:
COMPOSER_AUTH: "$COMPOSER_AUTH"(配合variables注入) - 避免用
echo写文件——权限易错、JSON 易格式错误、明文残留风险高
真正容易被忽略的点
很多人配完就以为万事大吉,但没验证三件事:第一,auth.json 是否真不在 Git 历史里(git log -p --grep=auth.json 可搜);第二,团队成员本地是否统一用了全局配置而非各自提交的项目级文件;第三,私有 Packagist 域名是否完全匹配(比如 packagist.example.com 和 https://packagist.example.com 是两个 key,少一个斜杠就失效)。










