composer clear-cache 会清 cache/vcs/,但仅限全局缓存路径下;若自定义 COMPOSER_CACHE_DIR 或 CI/CD 用户切换(如 root 写、普通用户删),可能删错目录或空路径,且无法按包名精准清理——必须通过 -vvv 日志定位具体 .git 目录后手动删除,并同步更新 composer.lock 中的 source.reference 以避免复用旧提交。

为什么 composer clear-cache 不会删掉你想要的 VCS 缓存
它确实会清 cache/vcs/,但只在「全局缓存路径下」执行;如果你用过 COMPOSER_CACHE_DIR 自定义路径,或在 CI/CD 中切换了用户(比如 root 装过、普通用户跑 clear-cache),那实际被删的可能是空目录或错误位置。更关键的是:clear-cache 是整删 vcs/,没法按包名精准剔除——而你真正想清理的,往往只是某个 Git 仓库的旧克隆(比如已废弃的私有 fork 或 dev 分支裸库),留着它不仅占 inodes,还会让 composer update 错误复用旧提交。
定位并删除特定 VCS 缓存目录的实操步骤
Composer 把每个 Git 仓库缓存为一个子目录,命名规则是 github.com-用户名-仓库名.git 或 gitlab.com-组名-项目名.git,后缀固定为 .git。你要做的不是猜名字,而是靠日志反查:
- 运行一次失败或可疑的
composer update vendor/package,加-vvv参数 - 在输出里找类似
Cloning into '/home/user/.composer/cache/vcs/https---github.com-vendor-package.git'...或Updating /home/user/.composer/cache/vcs/https---gitlab.com-group-proj.git的行 - 复制完整路径中的目录名(如
https---github.com-vendor-package.git) - 进缓存根目录:
cd $(composer config --global cache-dir)/vcs/ - 执行
rm -rf https---github.com-vendor-package.git(Linux/macOS)或Remove-Item "$env:APPDATA\Composer\Cache\vcs\https---github.com-vendor-package.git" -Recurse(PowerShell)
删完 VCS 缓存后,哪些操作必须跟上
VCS 目录只是“源”,真正决定装什么版本的,是 composer.lock 里的 dist.sha256 和 source.reference。如果只删 VCS 却不更新锁文件,下次 install 可能因校验失败 fallback 到 dist ZIP,或者继续走错分支。
- 若目标包已从
composer.json移除:先composer remove vendor/package,再composer install触发 vendor 清理 - 若只是想切新分支(如从
dev-feature改成main):改composer.json中的"version"字段(如"dev-main"),然后加--no-cache --force-checksums运行composer update vendor/package - CI/CD 部署中:务必在删 VCS 后,同步删掉
vendor/composer/installed.json和composer.lock,否则update仍会读取旧快照
cache/vcs/ 可以整删,但要注意两个例外
绝大多数情况下,rm -rf ~/.composer/cache/vcs/* 是安全的——下次需要时自动重建,且不破坏任何 lock 或 vendor 状态。但有两个真实踩坑点:
- 某些自建 Git 服务器(如 Gitea + 自签名证书)的缓存目录名含特殊字符(如
https---gitea.example.com%2Fgroup%2Frepo.git),直接rm -rf *可能漏掉,建议用find . -maxdepth 1 -name "*repo.git" -delete - Windows 上若用 WSL2,
%APPDATA%\Composer\Cache\vcs\实际映射到 Linux 文件系统,PowerShell 删除可能不彻底,优先用 WSL 终端执行rm -rf
真正难清理的从来不是 VCS 目录本身,而是它和 composer.lock 里 source.reference 的耦合关系——删了缓存却不更新 reference,等于白删。


















