github-protocols 仅影响无协议前缀的 github 包名解析,对显式声明的 https:// 或 git@ url、非 github 平台及 composer

直接改 github-protocols 只影响 GitHub 域名,且仅在 URL 不带协议前缀时生效;它不重写已写死的 https:// 或 git@,也不能跨平台解决 GitLab 或私有 Git 服务的问题。
为什么 composer config -g github-protocols https 有时没反应
这个配置只在 Composer 解析「无协议前缀的 GitHub 包名」时起作用,比如你 require 一个没显式指定源的包:monolog/monolog。此时 Composer 才会查 github-protocols 列表,按顺序尝试 https://github.com/monolog/monolog.git、git@github.com:monolog/monolog.git 等。
以下情况它完全不参与决策:
适用于以下场景:(1)用户提供 GitHub 仓库 URL 或本地仓库路径,并请求将其转换为其他格式;(2)用户请求导出 GitHub 仓库……
- repositories 里写了完整 URL:
"url": "https://github.com/vendor/pkg.git"→ 强制走 HTTPS,无视配置 - URL 是 SSH 格式:
"url": "git@github.com:vendor/pkg.git"→ 强制走 SSH,无视配置 - 包来自 GitLab、Gitee 或自建 Git 服务器 →
github-protocols不生效 - Composer 版本低于 2.0 → 该配置项被忽略(旧版只认
github-protocol单数形式)
github-protocols 和 default-protocol 怎么选
github-protocols 是窄口径、场景明确的开关;default-protocol 是宽口径、全局兜底的策略。两者可共存,但优先级不同:
-
github-protocols对 GitHub 域名有最高优先级:即使设了default-protocol ssh,只要github-protocols是["https"],GitHub 包仍走 HTTPS -
default-protocol影响所有未显式带协议的 VCS 地址,包括 GitLab、Bitbucket、自建 Git 服务器,也包括vendor/package这类简写形式 - 想统一所有 Git 源走 HTTPS?用
composer config -g default-protocol https更彻底 - 只想约束 GitHub,其他平台保持默认?才用
github-protocols
Git 层重写比 Composer 配置更底层、更可靠
当你要让所有 HTTPS 地址静默转成 SSH(比如公司只开放 SSH 端口),或者反过来,git config --global url. 是唯一能穿透 Composer、真正控制底层 clone 行为的方式:
- 把所有 GitHub HTTPS 请求转 SSH:
git config --global url."git@github.com:".insteadOf "https://github.com/" - 把所有 GitLab HTTPS 请求转 SSH:
git config --global url."git@gitlab.com:".insteadOf "https://gitlab.com/" - 该配置发生在 Git 本身,不受 Composer 版本、
repositories写法、github-protocols设置影响 - 但要注意:
~/.ssh/config必须配好对应 Host 别名,否则git clone仍会卡在权限验证
真正容易被忽略的是:协议切换不是“设个配置就完事”,而是要分清控制层——Composer 配置管的是「地址生成逻辑」,Git 配置管的是「实际执行动作」。很多问题卡住,是因为只动了上层,忘了底层 Git 是否真能连通。










