composer clear-cache 对 VCS 缓存无效,因其仅清理 files/ 和部分 provider 索引,不触碰 vcs/ 目录;VCS 缓存(如 Git 裸仓库)损坏会导致拉取旧提交、校验失败等静默问题。

为什么 composer clear-cache 对 VCS 缓存无效
Composer 的 clear-cache 命令默认只清 files/(ZIP 包)和部分 provider 索引,完全不碰 vcs/ 目录。而 VCS 缓存(如 Git 克隆的裸仓库)是 Composer 在用 --prefer-source、dev- 版本或 path 仓库时实际依赖的底层快照。一旦它损坏(比如磁盘写中断、Git 操作被强制终止),后续 update 或 install 仍会复用这个坏的裸库,导致拉取旧提交、校验失败、甚至静默跳过更新。
定位并精准删除损坏的 VCS 缓存
别删整个 vcs/——你可能只想修一个包,却把其他几十个 Git 仓库全清了。关键看报错上下文:
- 盯住
composer update -v输出末尾,找类似Cloning into '/home/user/.composer/cache/vcs/https---github.com-vendor-package.git/'或Failed to clone https://github.com/vendor/package.git的行 - 提取域名和路径片段,比如
github.com/vendor/package - 进缓存 VCS 目录:
ls -l ~/.composer/cache/vcs/*github.com*vendor*package*(Linux/macOS)或 PowerShell 中Get-ChildItem "$env:APPDATA\Composer\Cache\Vcs" -Recurse -Filter "*vendor*package*" - 只删匹配到的那个目录,例如
rm -rf ~/.composer/cache/vcs/https---github.com-vendor-package.git
必须同步清理的关联项
VCS 缓存不是孤立存在的。删完裸库后若不处理以下三项,Composer 仍可能从其他路径“绕过”重装逻辑:
-
vendor/vendor/package/目录:里面残留的.git子模块或损坏的 symlink 会干扰重拉,直接删掉该包目录 -
composer.lock中对应条目的source.type和source.reference:如果锁的是旧 commit hash,即使 VCS 清了,Composer 也会尝试检出那个已不存在的 ref -
vendor/composer/installed.json:它记录当前安装状态,含 source URL 和 reference,不删会导致composer show显示错误信息
删完再跑 composer update vendor/package --no-cache,加 -vvv 可确认日志里出现 Cloning https://... 而非 Using version x.x.x from cache。
Windows 下特别注意权限与路径
PowerShell 删除 VCS 目录时,Remove-Item 默认不递归删子目录,必须显式加 -Recurse -Force;且 %APPDATA%\Composer\Cache\Vcs 下的子目录若被 PhpStorm、VS Code 或 WSL 进程占用,会提示“访问被拒绝”。此时需:
- 关掉所有 IDE 和终端,尤其检查后台是否有
git.exe或php.exe进程 - 避免在 WSL 中操作
/mnt/c/下的 Composer 缓存——chmod/chown 无效,改用原生 Linux 路径 - 删完后验证:运行
git -C "$env:APPDATA\Composer\Cache\Vcs\..." rev-parse HEAD应报错而非返回 hash
VCS 缓存的问题往往藏得深:它不报错,只是让你始终用着旧代码。修复时最易忽略的是没动 installed.json 和 lock 里的 source 引用,结果删了缓存却还走老路。


















