这些年换过多台电脑,重装过很多次系统,每次安装软件、配置工作环境都很麻烦。我有一点强迫症,有一点不统一就会让我觉得不舒服。所以提出一个问题:如何在新设备上面快速恢复一致的环境?如何在多台设备保持配置(手感)的同步?

我现在的解决方案是把问题分成三层:

  1. 软件本体:尽量用包管理器安装,只维护软件清单,不手动备份安装目录;
  2. 软件配置:移动到 dotfiles 仓库,用 Git 留痕,原配置文件路径创建符号链接指向 dotfiles 内容;
  3. 数据:用 Syncthing、OneDrive、SyncBackFree 这类工具处理。

软件备份

一般来说,我会尽可能使用 scoop 包管理器来安装软件,好处是迁移性很强,将相关目录拷贝到新电脑就可以快速恢复使用。最早尝试过用云盘同步软件目录,但是由于软件的高度动态变化,这样会产生大量的冲突文件,很快放弃了。后来我试过用移动硬盘做增量同步,这个方式理论上可行,但是我很容易忘记维护。现在我采用的方案是:

  1. 第一次备份使用移动硬盘拷贝,之后的维护使用一个专门的清单记录软件列表,在设备安装、卸载、更新软件后自动更新这个列表;
  2. 不同的设备在启动的时候去读这个列表,如果有变化就同步相关的操作。

具体来说,我给 scoop 增加了一个 call back 函数,日常仍然输入:

scoop install vscode
scoop uninstall r

实际流程是:

  1. 调用真正的 scoop 命令;
  2. 如果命令成功,并且子命令是 install、uninstall、update 之类,自动运行 scoop export,写入 scoop-apps.json;
  3. 如果清单有变化,用 Git 记录并 push。
  4. 新设备 pull 这个清单,如果有变化使用 scoop import scoop-apps.json 同步安装。

软件配置备份

我的做法是:

  1. 建立一个专门的仓库(例如:C:\Users\way\dotfiles);
  2. 如果我手动编辑了一个软件的配置,那么就把这个配置移动到 dotfiles 中,软件原本读取的位置放一个符号链接,指向仓库里的文件。

例如:

软件仓库路径系统读取路径
PowerShellconfig\powershell\Microsoft.PowerShell_profile.ps1C:\Users\way\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
komorebiconfig\komorebi\komorebi.jsonC:\Users\way\komorebi.json
whkdconfig\whkd\whkdrcC:\Users\way\.config\whkdrc
Alacrittyconfig\alacritty\alacritty.tomlC:\Users\way\AppData\Roaming\alacritty\alacritty.toml
VS Codeconfig\vscode\settings.jsonC:\Users\way\scoop\persist\vscode\data\user-data\User\settings.json

这样做的好处是:

  1. 软件仍然从原来的位置读取配置,不需要重新更改软件配置目录;
  2. 无论从系统路径还是仓库路径,本质上改的都是同一个文件;
  3. windows软件的安装目录比较混乱,集中管理的配置可以通过 Git 追踪所有配置变化,而且改坏了可以回滚;
  4. 新电脑重建链接后,后续只要 pull 同步相关变化,就能让软件的配置同步。

值得注意的是:

  1. 这套方案比较依赖路径的一致性,所以我在每台电脑用的都是同一个用户名,软件安装目录也是直接使用默认。
  2. 有些软件的配置是不可编辑的文件,理论上也可以用相同的方式管理,不过我选择了用 SyncBack 软件备份到云盘,在新电脑上恢复。
  3. 重复的操作都可以定时自动化完成,不需要手动维护比较方便。

数据备份

这个比较常规,使用 SyncBack 镜像到 OneDrive云盘,重要的工作数据设置为每 20 分钟增量同步一次,其它文件每天晚上自动同步一次。