必须扫描Git历史中的token:先用git rev-list --all | xargs -n1 git grep -l "github.com.[a-zA-Z0-9]{40}"查GitHub PAT,再用git log --grep="@.:" --oneline找含凭据URL,最后grep -A2 '"dist":' composer.lock | grep 'url.*@'查composer.lock中硬编码凭证。

开源前必须清除所有敏感信息,否则等于主动分发密钥——auth.json、.env、composer.lock 中的带参 URL、CI 日志片段,全得扫一遍,不能只删文件。
怎么扫出藏在 Git 历史里的 token?
别信“我只 commit 过一次,肯定没泄露”。只要 auth.json 或含凭据的 URL 出现在任意提交里,就已暴露。
- 先跑
git rev-list --all | xargs -n1 git grep -l "github.com.*[a-zA-Z0-9]\{40\}"扫 GitHub PAT(40 字符 hex) - 再查私有源:运行
git log --grep="@.*:" --oneline找user:pass@类 URL - 检查
composer.lock是否硬编码凭证:grep -A2 '"dist":' composer.lock | grep 'url.*@' - 如果发现匹配,立刻停手,进入清理流程——别等“改完再推”
用 git filter-repo 彻底擦除,不是 git rm --cached
git rm --cached auth.json 只删暂存区,历史提交里的内容原封不动。真正有效的只有重写历史。
- 装
git-filter-repo(pip install git-filter-repo),别用已弃用的filter-branch - 执行
git filter-repo --invert-paths --path auth.json --path .env(可追加多个--path) - 若已推送到远端,必须
git push --force --all+git push --force --tags - 通知所有协作者
git clone新仓库——旧 clone 仍含敏感历史,不可信
CI 日志和 composer.lock 怎么防间接泄露?
GitHub Actions 的 GITHUB_TOKEN 会被自动脱敏,但你自定义的 MY_API_KEY 不会;composer.lock 不存密码,但可能存带 token 的 dist URL。
- CI 中禁用
echo "::set-env"(已废弃),改用env:块注入密钥 - 避免在
run:里拼接含 secret 的命令,例如composer config http-basic.repo.example.com ${{ secrets.USER }} ${{ secrets.PASS }}—— 命令本身会被记录 - 优先用
COMPOSER_AUTH环境变量传凭证,而非生成auth.json文件 - 检查
composer.lock中所有dist.url,确保不含?token=或user:pass@;私有镜像应配http-basic类型凭据,由 Composer 自动注入
最常被跳过的一步:补漏。清理完历史后,立刻执行 echo -e "auth.json\n.env" >> .gitignore,再跑 git check-ignore -v auth.json 确认生效。漏掉这步,下次 composer install 又会把 auth.json 写进工作区,一不小心又 commit 进去。











