删vcs/目录安全,因其仅存Git裸仓库快照,用于加速clone;删除后composer install/update仅略慢几秒,不会导致包丢失、类加载失败或版本错乱。

为什么删 vcs/ 目录是安全的
Composer 的 vcs/ 目录只存 Git(或 Mercurial/SVN)裸仓库快照,用于加速 git clone 操作。它不参与 ZIP 解压、autoload 生成或依赖解析——也就是说,删了它,composer install 或 update 顶多慢几秒(重新克隆一次),绝不会导致“包找不到”“类加载失败”或“版本错乱”。尤其当你在调试本地 path 包、切换分支、或重装插件(如 hirak/prestissimo)后行为异常时,vcs/ 下残留的旧提交引用常是元凶。
手动清理 vcs/ 的正确姿势
别用 composer clear-cache——它默认会清 vcs/,但若权限错乱或路径被覆盖,可能静默失败;更稳妥的是直接进目录删:
- 先确认路径:
composer config --global cache-dir(通常输出/home/username/.composer/cache) - 进入并清空:
rm -rf $(composer config --global cache-dir)/vcs/* - 不建议删整个
vcs/目录(只删其内容),因为目录结构本身由 Composer 管理,重建时需额外校验 - 删完立刻生效,无需重启终端或 reload 配置
vcs/ 和 files/ 缓存必须区分对待
这两个目录干的事完全不同,混删容易踩坑:
-
files/存下载好的 ZIP 包,删它会影响所有包的安装速度,且可能触发Failed to extract(如果composer.lock里哈希没同步更新) -
vcs/只影响通过source方式安装的包(即从 Git URL 拉取),对--prefer-dist完全无感 - 某些插件(如
phpstan/extension-installer)全局安装时既走files/又可能触发vcs/克隆,此时要两边都查——但删vcs/总是安全的,删files/则必须盯准包名
CI/CD 或 Docker 中要不要保留 vcs/
不要。在构建镜像或跑 CI 任务时,vcs/ 不仅没用,还可能引入污染:
- Docker 构建层缓存会让
vcs/残留旧 commit,导致后续composer update拉到非预期分支 - CI runner 多项目共享缓存目录时,
vcs/交叉污染风险高(比如 A 项目用dev-main,B 项目用dev-master,Git 快照互相覆盖) - 标准做法是在构建脚本开头加:
rm -rf $(composer config --global cache-dir)/vcs,干净启动
真正麻烦的从来不是 vcs/ 本身,而是你以为它“只是缓存”就放着不管,结果某天 composer show vendor/package 显示的 source reference 和你本地 Git 分支对不上——那八成是 vcs/ 里那个裸仓库悄悄记住了半年前的一次 checkout。











