私有仓库权限拒绝90%是git认证失败:ssh需验证密钥加载与github配置,https需pat令牌且正确注入;先用git ls-remote测试url连通性,再排查composer repositories配置是否匹配type规则。

私有仓库权限拒绝,90% 是 SSH 或 HTTPS 认证没走通,不是 Composer 配置写错了。 错误如 Could not read from remote repository 或 Permission denied (publickey),本质是 Git 在后台克隆时被拒,Composer 只是“背锅”——它根本没机会解析 composer.json 里的 repositories,卡在第一步就停了。
确认 Git 能否手动克隆该仓库
别绕开 Git 直接跑 composer install。先用和 Composer 完全相同的 URL 尝试克隆:
- 如果是 SSH 格式(
git@github.com:org/private.git):运行git ls-remote -h git@github.com:org/private.git,看到一长串 ref 才算通;报Permission denied (publickey)就说明密钥没加载或没加对平台 - 如果是 HTTPS 格式(
https://github.com/org/private.git):运行git ls-remote -h https://github.com/org/private.git,若提示用户名密码,说明凭证缺失;若直接 404 或 fatal,可能是 URL 拼错或仓库不存在 - 注意:HTTPS 私仓必须配 GitHub PAT(Personal Access Token),密码已失效;PAT 要勾选
repo权限,且必须通过composer config --global github-oauth.github.com <token></token>注入,不能靠git config --global credential.helper
检查 composer.json 中 repositories 的 type 和 url 是否匹配
Composer 对 type 字段有硬性校验,错一个就判“无效”,连网络请求都不会发:
-
type: "vcs"必须配真实 Git/SVN 地址,例如"url": "git@gitlab.example.com:group/pkg.git";写成网页地址"https://gitlab.example.com/group/pkg"会直接报invalid repository -
type: "composer"要求 URL 可访问且返回合法packages.json,末尾必须带/(如"https://packages.example.com/"),少斜杠会拼成/packages.json导致 404 -
type: "package"不需要url字段,但必须提供完整package对象,含name、version、dist或source - 运行
composer diagnose,它会明确指出哪条repositories“failed to parse”,比盲改快得多
修复 SSH 密钥归属与加载状态
宝塔、CI 或 Docker 环境下,www 用户或 runner 账户往往没有私钥,或权限不对:
- 确认密钥文件归属:
ls -l ~/.ssh/id_rsa,输出第三列(owner)必须是当前运行composer install的用户(如www-data或runner),不是root - 密钥权限必须为
600:chmod 600 ~/.ssh/id_rsa;755或更宽松都会被 SSH 拒绝 - 检查
~/.ssh/config是否显式指定了IdentityFile,且路径正确;git config --global user.name对认证完全无效 - 测试是否加载成功:
ssh -T git@github.com(或对应平台),看到Hi xxx! You've successfully authenticated才算真正可用
镜像配置失效导致实际还在连 packagist.org
很多人以为配了镜像就万事大吉,结果报错里全是 https://packagist.org/p/xxx.json ——说明镜像根本没生效:
- 运行
composer config -g repo.packagist,输出必须是完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};如果还是https://packagist.org或空,说明配置失败 - 键名只能是
repo.packagist,写成repos.packagist或repositories.packagist全部无效 - 项目根目录若有非空
"repositories": []字段,全局镜像直接失效;此时应进项目目录运行composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加-g) - URL 必须以
/结尾:https://mirrors.aliyun.com/composer/✅,少斜杠会拼成/composerpackages.json导致 404
最常被忽略的一点:Docker 或 CI 中,localhost 指的是容器自己,不是宿主机。想连内网 GitLab,URL 得写成 http://host.docker.internal:8080/group/pkg.git(Linux 下需加 --add-host=host.docker.internal:host-gateway 启动容器)。











