composer clear-cache 对多 VCS 项目效果差,因其仅清全局缓存且不按项目隔离,vcs/ 目录下大量废弃 Git 仓库(单个常超 100MB)无法被自动回收,导致磁盘与 inodes 占用居高不下。

composer clear-cache 为什么对多 VCS 项目效果差?
它清的是全局缓存,不是按项目隔离的。你有 5 个 Laravel 项目、3 个 Symfony 项目,每个都用 git 仓库拉过 monolog/monolog、symfony/console 等包,Composer 就会在 ~/.composer/cache/vcs/ 下为每个 Git URL(含分支、commit hash)建一个裸仓库——哪怕这些项目早已废弃,缓存仍原封不动留着。
现象是:composer clear-cache 后磁盘只少 200MB,但 du -sh ~/.composer/cache/vcs/ 显示仍有 8.3GB。这是因为 clear-cache 默认删整个 vcs/ 目录,但下次任意项目执行 composer update,它又会立刻重建所有用到的 Git 仓库,包括你半年没碰的老项目依赖。
-
vcs/缓存不按“是否被当前 lock 文件引用”判断,只按“是否被最近一次命令访问过”粗略保留 - Git 仓库缓存体积大(单个 Laravel 包的裸仓库常超 100MB),且无法被
--gc自动回收 - 如果你用私有 GitLab/GitHub Enterprise,URL 带端口或子路径(如
git@gitlab.example.com:group/project.git),Composer 会为每个变体单独缓存,极易冗余
怎么安全删掉不用的 vcs 缓存?
别直接 rm -rf ~/.composer/cache/vcs/* —— 这会导致下次 composer install 全量重 clone,耗时且占带宽。应该先识别哪些 Git 仓库真没人用了。
步骤如下:
- 运行
composer config --global cache-dir确认路径,进入$(composer config --global cache-dir)/vcs/ - 用
find . -type d -name "refs" -exec dirname {} \; | sort -u列出所有缓存的 Git 仓库根目录(每个对应一个 URL) - 对每个目录,执行
git --git-dir=./xxx.git config --get remote.origin.url查原始 URL - 打开你所有项目的
composer.json,检查repositories字段和require中的 VCS 包名;再搜composer.lock里"source": {"type": "git", ...}的 URL - 只保留 lock 文件里出现过的 URL 对应的缓存目录,其余全部
rm -rf
注意:vcs/ 下目录名是 URL 的 hash,不是明文,所以必须用 git config 反查;删之前确保没有 composer 进程在跑,否则可能触发 Corrupted cache file。
cache-files-ttl 和 cache-files-maxsize 能自动帮你减负吗?
能,但默认值太宽松:6 个月过期 + 300MiB 上限,对多项目开发完全不够用。你一年跑几十次 composer update,缓存早爆了。
建议改配置:
- 运行
composer config -g cache-files-ttl 2592000(30 天) - 运行
composer config -g cache-files-maxsize "1G"(1GB,避免小文件堆积占满 inodes) - 加
--gc手动触发清理:composer clear-cache --gc,它会按 TTL 和 size 规则删旧文件,不碰vcs/和repo/
这个组合比全量 clear-cache 更可持续:既防止缓存无限膨胀,又保留常用包的 zip,装包不明显变慢。但注意——cache-files-maxsize 不限制 vcs/,那部分还得手动筛。
为什么清完缓存 C 盘还是满?重点盯 vcs/ 和 inodes
真正吃空间的往往不是 files/(zip 包),而是 vcs/ 下成百上千个裸仓库。更隐蔽的问题是 inodes 耗尽:一个 Git 仓库缓存平均含 10k+ 小文件,vcs/ 占满后,df -i 显示 inodes 100%,即使 df -h 还剩 10GB,也会报 No space left on device。
验证方式:
- Linux/macOS:
df -i看IUse%是否超 95%;再find ~/.composer/cache/vcs -type f | wc -l统计文件数 - Windows WSL:同样用
df -i,但 inodes 是虚拟文件系统级限制,清vcs/是最有效解法 - 别信“清缓存后磁盘没变化”——先
du -sh ~/.composer/cache/vcs,再du -sh ~/.composer/cache/files,对比就知道哪块在作祟
多 VCS 项目下,vcs/ 是缓存管理中最容易被忽略、也最该定期动手的部分。自动策略管不住它,得靠你主动翻 lock 文件、反查 URL、精准剔除。


















