起因是更新 Xcode 时提示空间不足,查看系统存储发现还有 40G 呀,虽然不是那么够用,怎么着也够 App 升级了吧。

问题的存在促使我不得不正面应对。

清理 node_modules

首先想到的就是 node_modules 的熵增模式,理所当然拿这个“黑洞”来开刀。

1
find . -type d -name node_modules | grep -v node_modules.*node_modules | tr '\n' '\0' | xargs -0 du -sch

运行上条命令,列出工作目录下所有 node_modules 体积,居然有 30G 大小!!按需删除即可。

清理本地 TimeMachine 快照

清理完 node_modules 后,storage 显示空闲空间有 60G 左右了,但是依旧无法更新应用。

运行 df -hl,才发现实际可用空间只有 20G,为什么系统标示的可用空间与实际不一致呢。这里就要提到 APFS 文件系统的“可释放”空间。

参考[1],APFS有一些新特性会隐藏的占用很多磁盘空间,在采用完全兼容APFS的系统调用时,如果系统空间不足,这部分占用空间将会自动释放。但是很多应用不兼容该特性,无法识别这部分可用空间,比如 终端的 df命令,应该也包括 App Store 的升级程序。

可用空间有个大头就是 TimeMachine 的本地快照,如果开启了自动备份,在没有连接外置备份磁盘时,本地会进行大概每小时一次,只保留最近一天的备份。

TimeMachine 的备份分为两种,不是同时进行,但是是同时存在的。
一种就是通常所知道的增量备份,当你连接硬盘或者时间胶囊的时候,会自动备份。
另一种备份叫做本地快照。本地快照和增量备份属于两种备份系统。当你连接备份介质的时候,会自动进行增量备份。当你开启了 TimeMachine 的自动备份功能时,且备份介质——即硬盘或时间胶囊不可用的时候,就会自动生成本地快照,存储在本地硬盘上,即你 Mac 的硬盘上。
两个备份系统,使得即使没有连接备份介质,仍然能进入到 TimeMachine 进行一些节点的文件恢复。这两种备份『交替』工作,从而最大程度上保证了数据安全。
实际上对于 Mac 来说无需担心本地快照存满硬盘。当容量低于一个阈值的时候,本地快照会自动进行删除操作,从最早的本地快照开始删起。但是只要容量允许,本地快照就会一直存下去。
来源:https://www.zhihu.com/question/47951339/answer/145257481

清理 TimeMachine 本地快照方法:

  1. 关闭 TimeMachine 的自动备份,亲测没有关闭的时候删除快照没有生效

  2. 列出所有的本地快照,sudo tmutil listlocalsnapshots /

  3. 上条命令的每行对应一个快照,其中后部分的 2019-09-26-XXXXXX 是快照编号,运行下条命令删除对应的快照

    sudo tmutil deletelocalsnapshots <快照编号>

清理完后,就可以愉快的升级应用啦 ☺️