真・懒

订阅 Twitter GitHub 联系

使用 Stow 管理 dotfiles

dotfiles 困境

Unix 系统下,软件配置一般保存在 $HOME (即你的用户主目录)下,比如 zsh 的配置就保存在 $HOME/.zshrc 文件里。这些文件的特点是以 . (dot) 开头,因此我们姑且称之为 dotfiles。

由于这些文件直接位于 $HOME 下面,无论是备份、版本化管理、还是设备间共享,都会造成相当大的困扰,因为相关工具一般都以目录为单位,你又不可能版本化管理整个 $HOME

粗糙解决方案

一个解决方案是,把这些 dotfiles 纳入同一个目录,ln 到正确位置。例如:把 .zshrc 放在 ~/dotfile 目录里,然后 ln -s ~/dotfiles/.zshrc ~/.zshrc。之后只需管理 ~/dotfiles 这个目录。

但是有些配置不止一个文件,手工 ln 难免挂一漏万,精神一恍惚也容易出错。

GNU Stow

GNU Stow 原本目的是啥我不知道,不过它正好满足了我们的管理 dotfiles 的几乎所有需求。

首先安装 Stow,如果你是 macOS 系统,brew install stow 即可。

我们继续以 .zshrc 为例,读君代码几行,胜过千言万语:

mkdir -p ~/dotfiles/zsh
mv ~/.zshrc ~/dotfiles/zsh
cd ~/dotfiles
stow zsh

就是这么简单,先建立个总目录 ~/dotfiles,在此目录下,以软件名称为单位再建目录,将已有配置迁移到该目录下,然后运行 stow 即可。

不过需要注意的是,dotfiles 目录直接建立在 $HOME 目录下,如果不属于这种父子层级,比如我的位于 ~/Dropbox/dotfiles,那么需要以 stow zsh -t ~ 的方式运行。有个简单的方案,运行一次,一劳永逸,再也不用加 -t ~

cd ~/Dropbox/dotfiles
mkdir stow
echo '--target=~' > stow/.stowrc
stow stow -t ~

其他的软件配置类推,这样你的 dotfiles 就始终在一个目录下,你想备份,版本管理,设备间共享(Dropbox),开源共享(GitHub)都没问题啦。

设备间共享与私有配置

我自己有两台电脑运行 macOS,大部分配置都一致,但是一台私用,一台工作,我并不想把两者间不同的共享。

我的解决方法是,两台电脑用不同的用户名,在共享的配置中,加载各自的私有配置,以 .zshrc 为例:

# 省略了很长一段一段共享配置

zshrc_local=$HOME/.zshrc.$(whoami)
if [ -f "$zshrc_local" ]; then
  source "$zshrc_local"
fi

这种情况下,