github-protocols配置后仍走SSH,是因为该配置仅对github.com生效且优先级低于显式URL;若composer.json中repositories指定了git@github.com格式地址,或存在项目级配置、自定义域名未配github-domains、CI环境未注入全局配置,均会导致失效。

默认走 SSH 协议,但多数 CI 和受限网络环境会直接失败;必须显式配置 github-protocols 或更彻底的 default-protocol 才能稳定拉取。
为什么 github-protocols 配置后还是走 SSH?
这个配置只对 GitHub 官方域名 github.com 生效,且优先级低于显式 URL。常见失效场景包括:
- composer.json 中
repositories里写了git@github.com:...这类 SSH 格式 URL —— Composer 会直接用它,无视github-protocols - 项目里同时设了
default-protocol,而它的作用范围更广,会覆盖github-protocols对 GitHub 的控制 - 用了自定义域名(如
github.example.com),但没配github-domains,导致 Composer 根本不识别它是 GitHub 实例
github-protocols 和 default-protocol 怎么选?
看你要管多大范围:
GitHub 项目更新追踪工具 - 自动检查多个 GitHub 项目的 Releases 和 CHANGELOG,生成更新摘要与影响分析报告。支持自动化定时任务。 如何使用 最简单的方式:直接用自然语言告诉我 你可以说 我会做 「检查 GitHub 更新」 检查最新版本 「添加 vscode」 追踪新项目 「停止追踪 xxx」 移除项目 「暂停更新检查」 暂停自动化 「给我看 openclaw 报告」 展示报告 触发词:「追踪项目更新」「检查 GitHub 更新」「项目更新报告」「设置更新提醒」
- 只让所有
github.com仓库走 HTTPS:运行composer config -g github-protocols https,它会写入auth.json的github-protocols字段 - 想一揽子解决 GitLab、Bitbucket、私有 Git 服务器等所有 VCS 源:用
composer config -g default-protocol https,它作用于所有未显式指定协议的地址(比如把git@host/repo自动转成https://host/repo.git) - 值可选
https、ssh、git、http,但http不带认证,不推荐
配置完怎么验证有没有生效?
别只看命令是否执行成功,要确认实际行为:
- 运行
composer config -g -l | grep -E "(github-protocols|default-protocol)",检查输出中对应字段是否存在且值正确 - 临时删掉项目里的
repositories声明,执行composer show vendor/package --no-interaction(换一个你确定在 github.com 上的公开包),观察日志里是出现Cloning https://github.com/...还是Cloning git@github.com:... - 如果仍走 SSH,检查是否被项目级配置覆盖:运行
composer config github-protocols(不加-g),看输出是否非空
CI 环境下最容易漏的一件事
GitHub Actions 或其他 CI runner 是干净环境,auth.json 为空 —— 即使你本地配好了 github-protocols,CI 里也完全无效。必须在 workflow 中显式注入:
- 用
COMPOSER_AUTH环境变量传入完整 JSON,例如:{"github-oauth": {"github.com": "${{ secrets.GITHUB_TOKEN }}"}} - 或者提前运行
composer config -g github-oauth.github.com ${{ secrets.GITHUB_TOKEN }} - 注意:仅配协议不配 token,HTTPS 仍会 401;仅配 token 不配协议,SSH 失败时不会自动 fallback 到 HTTPS
协议配置本身很简单,真正卡住人的永远是「谁在什么时候用了哪个配置」——global、project、auth.json、repositories.url 四层叠加,任意一层写死 SSH 就会让上层协议设置失效。

















