git权限变更后composer仍用旧仓库地址,因其缓存了vendor/目录、~/.composer/cache/vcs/和installed.json中的旧vcs元数据;需手动删除这三处并验证新地址是否生效。

为什么 Git 权限变更后 Composer 还在用旧仓库地址
Git 仓库权限调整(如私有变公开、SSH 改 HTTPS、组织迁移)后,Composer 仍尝试用缓存里的旧 URL 拉取源码,导致 git clone 失败或 checkout 报错。这不是镜像源的问题,而是 Composer 在 vendor/composer/installed.json 和本地 Git 缓存中固化了旧的 VCS 元数据,且默认不校验远程地址是否变更。
必须清理的三处 Git 相关缓存位置
只运行 composer clear-cache 不够——它清不掉已克隆的 Git 工作副本和锁死的源地址记录:
-
vendor/下对应包的目录:含损坏或权限失效的 Git 仓库,直接rm -rf vendor/vendor-name/package-name -
~/.composer/cache/vcs/下的 Git 缓存:路径类似https---github.com-vendor-package.git/,删掉整个子目录 -
vendor/composer/installed.json:记录当前安装包的精确 commit hash 和 source URL,删掉后composer install才会重新解析
如何验证新权限是否被正确识别
执行前先确认 Composer 实际请求的是新地址,而不是还在 fallback 到旧源:
GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。
- 加
-vvv参数跑composer update vendor/package-name,观察日志里出现的Cloning into或Executing command (CWD)行,确认 URL 是你期望的新地址(如https://github.com/new-org/package.git) - 若仍看到旧地址,检查项目
composer.json中是否硬编码了"source": {"url": "..."}或"repositories"里指定了过期的 Git 源 - 临时禁用所有缓存验证:用
composer update --no-cache --dry-run -vvv,跳过本地 VCS 缓存,强制走网络重解析
避免下次再踩坑的关键配置项
Git 仓库权限常变,但 Composer 默认不主动刷新源地址。真正可控的是让它少依赖本地快照:
- 在
composer.json中显式声明"type": "git"并确保"url"是当前有效地址,不要依赖 Packagist 自动推断 - 避免长期保留
composer.lock中的"source"字段(尤其含 commit hash 的),改用"version"+"dist"优先策略 - 对频繁变更的私有包,加
--prefer-dist强制走 ZIP 下载,绕过 Git 操作:composer update vendor/package --prefer-dist
Git 权限变更后的同步滞后,本质是 Composer 把“曾经能 clone 的地址”当成了事实标准。它不会自动感知远端变化,只能靠你手动切断旧上下文——删目录、删缓存、删锁文件,三者缺一不可。










