homebrew元数据损坏需提前备份三类关键数据:已安装包清单(用brew bundle dump生成brewfile)、taps源列表(brew tap > taps.txt)、自定义formula或patch(如手动修改的.rb文件及pr安装url),并定期更新存至icloud或git。

Homebrew 元数据损坏不是小概率事件——brew update 中断、磁盘异常、手动误删 $(brew --repo) 下文件,都可能让 brew doctor 报一堆「broken link」「missing formula」,甚至 brew install 直接失败。最有效的防御不是等出事再抢救,而是提前备份三类关键元数据:已安装包清单、taps 源列表、自定义 Formula 或 patch。
用 brew bundle dump 备份完整可重装环境
这是唯一能同时覆盖 brew、cask、tap 和 mas 的方案,生成的 Brewfile 是灾后一键恢复的核心依据:
- 必须先执行
brew tap homebrew/bundle,否则命令不存在 - 运行
brew bundle dump --force --file=Brewfile,强制覆盖已有文件;加--no-cask或--no-mas可跳过对应类型(比如你不用 Mac App Store) - 生成的
Brewfile默认不含注释和分组,加--describe会为每个brew条目自动补一句说明(如# CLI tool for JSON processing),方便后期人工筛选 - 它不记录自动依赖(如
curl装openssl是自动的),但重装时brew bundle install会自动解析并装全,不影响功能
单独导出 brew list 和 brew tap 作为轻量兜底
当 homebrew/bundle 不可用(比如刚重装系统还没装 tap),或你只想快速记下核心命令行工具时,这两个命令足够应急:
-
brew list --versions > brew-list.txt:只存包名+版本,不包含 cask/tap/mas,但体积小、生成快,适合脚本定期抓取 -
brew tap | sort > taps.txt:必须保存,否则brew install ffmpeg可能报No available formula——因为homebrew-ffmpeg这类非 core tap 一旦丢失就找不到源 - 检查是否有本地或 fork tap:
ls -d $(brew --repo)/Library/Taps/*/* 2>/dev/null,若有,把对应路径或git cloneURL 一并记入taps.txt - 若用过
brew tap-pin,记得在taps.txt旁另存一份pinned-taps.txt,内容是brew tap-pin --list输出
哪些目录真值得备份?哪些纯属浪费空间
绝大多数用户不需要备份整个 /opt/homebrew/Cellar 或 /opt/homebrew/Caskroom——它们是二进制安装产物,重装即可;真正要快照的是「元数据层」:
- 仅当你手动改过某个 Formula(如
brew edit wget),才需备份对应文件:$(brew --repo)/Library/Taps/homebrew/homebrew-core/Formula/wget.rb - 若用
brew install https://raw.githubusercontent.com/xxx/yyy.rb装过未合入主干的 PR 版本,必须保存该 URL 到文本,否则重装时无法复现 -
$(brew --repo)/.git/config和$(brew --repo)/.git/HEAD可选备份——它们记录当前 Homebrew 仓库的远程地址和分支,对恢复brew update行为有帮助,但非必需 - 绝对不要备份
/opt/homebrew/var/homebrew/locks或$(brew --repo)/.git/index,这些是运行时临时状态,备份了反而可能引发冲突
最容易被忽略的点是:Brewfile 和 taps.txt 必须存到 iCloud 或 Git 仓库里,并且每次 brew install 或 brew tap 后顺手跑一次 brew bundle dump——元数据的价值只存在于「最新」,隔两周没更新的 Brewfile,跟没备份没区别。











