概述

virgiling/dotfiles 统一管理我在 macOS 与 Arch Linux 上的个人配置与软件清单。三个组件的分工如下:

chezmoi 管理配置,mpm 登记软件,Git 保存两者。

配置与软件按平台分开维护,只共享确实通用的部分;软件安装仍由 HomebrewnpmCargo 等原包管理器负责。

为什么选择这套工具

需求

  • 同时覆盖 macOS 与 Linux 两套环境,配置按平台区分。
  • 只保存文件,不引入一套会接管整个操作系统的机制。
  • 能够从已经配好的电脑登记环境,而不是在新机器上重新安装一遍。
  • 保留一份「配置 ↔ 软件版本」的基准,供换机 / 重装时对照。

排除的方案

  • Nix:提供的是「可复现操作系统」级别的能力,会额外占据大量磁盘空间,且与已有的 Homebrew 使用习惯冲突。本场景只需要「存文件 + 一定的可复现性」,不需要切换整个系统。
  • Homebrew Bundle(Brewfile):只能覆盖 Homebrew 来源,管不到 npm install -gcargo install 等全局安装;且官方明确 Bundle 没有版本锁文件,无法做版本冻结。
  • mise:重心在「接管工具的安装」(mise install 会实际安装),而本场景要的是「登记已有环境」,方向相反。

最终分工

组件职责边界
chezmoi管理配置文件(dotfiles),按系统区分配置只管文件,不装软件
mpm读取各包管理器的现有安装,导出成 TOML 清单只登记,不安装、不升级
Git版本化配置与清单,跨机器同步记录改动,不做后台实时双向同步
Homebrew / npm / Cargo继续负责原来的软件安装不迁移到统一工具

「版本冻结」被拆成两件独立的事:记录当前已验证的版本mpm 导出清单 + 提交)与阻止包管理器 / 应用改变版本(登记工具做不到,Homebrew 滚动更新也不支持任意历史版本恢复)。因此本仓库保存的是一份「经过验证的版本基准」,而非「永远不升级」的锁。

如何使用

配置:chezmoi

common/macos/linux/ 是同一个 Git 仓库里的三个独立 chezmoi source:先处理 common/,再处理当前系统的 source。dot_config 对应 ~/.configcommon/dot_agents 对应 ~/.agents

以 Mac 的 Ghostty 配置为例:

cd /path/to/dotfiles
 
# 把本机配置保存到仓库副本
chezmoi --source "$PWD/macos" --working-tree "$PWD" add --secrets=error ~/.config/ghostty/config
 
# 分别预览共用配置和 Mac 专用配置的差异
chezmoi --source "$PWD/common" --working-tree "$PWD" diff
chezmoi --source "$PWD/macos" --working-tree "$PWD" diff
 
# 需要把仓库配置写回本机时,确认差异后再执行
chezmoi --source "$PWD/macos" --working-tree "$PWD" apply ~/.config/ghostty/config

两条基本语义:

  • add 默认保存文件副本,不建立实时符号链接apply 才把仓库配置写到目标位置。文件不会在两者之间自动同步。
  • 仓库根目录不是 source,不使用 chezmoi init --apply virgiling 自动应用整个仓库。

软件清单:mpm

根目录只有两个清单:macos.tomllinux.toml。其中 [brew][cask][npm][cargo][uvx]mpm 导出,[manual] 手动登记所选本机应用。

Mac 上重新导出(mpm 8.0.0+):

mkdir -p tmp
mpm --no-config --stop-on-error --jobs 1 --timeout 30 \
  --brew --cask --npm --cargo --uvx dump --overwrite tmp/macos.toml

导出只查询所选管理器,不安装或升级软件;确认差异后再用 git diff --no-index 对比、人工核对后替换。清单是现状登记:既不是「必须安装的清单」,也不是「保证完整复现环境的锁文件」。

配套提交:Git

一次升级被当作一个完整变更:选定新版本 → 更新对应平台配置 → 验证工具与配置能一起工作 → 把版本清单、依赖附属文件与 dotfiles 一并提交。回退时同样要同时恢复「软件」与「配置」两部分,仅回退 Git 文件不会自动回退已安装的软件。

搭建方式

本仓库由 agent 自动化搭建:目录结构、文档、测试与项目级 agent 约定,均在工具选型确定后自动生成与整理,人工只做核对与微调。

dotfiles/
├── AGENTS.md       # 仅本项目的 agent 工作约定
├── .agents/        # 仅本项目的维护与配置同步 skills
├── common/         # Mac 和 Linux 共用的 ~/.agents 规则与 skills
├── macos/          # Mac 专用配置,包括 Fish、Ghostty
├── linux/          # Arch Linux / Hyprland 专用配置
├── macos.toml      # Mac 软件清单(mpm TOML 格式)
├── linux.toml      # Linux 软件清单,目前留空
├── docs/
│   ├── usage.md    # 配置管理、软件登记和 Git 同步教程
│   ├── macos.md    # Mac 软件及用法
│   └── linux.md    # Linux 软件及用法
└── tests/          # 配置布局和清单检查

几个关键点:

  • 根目录的 TOML 清单、文档和项目 AGENTS.md / .agents/ 不会部署到家目录common/dot_agents/ 里的全局用户规则与项目 .agents/ 是两套独立内容。
  • 项目级 skill(maintain-dotfilessync)只用于维护本仓库;tests/Python unittest 校验配置布局与清单,验证时使用临时 home 与 source,不指向实际家目录。
  • 之前的 hyprland-dotfiles 仓库里的 Hyprland 配置,即现在 linux/dot_config/hypr/ 那一套(另有 kitty、rofi、waybar、mako、swaylock、fusuma 等),旧仓库已删除。

完整的教程、Mac / Linux 的软件清单与用法见仓库的 docs