Ruoshan's jiffies

About Archive

使用GNU Stow管理配置文件

On 30 Oct 2013, By Ruoshan Huang

习惯了使用自己的vimrc emacs.d的配置后, 在机器间迁移和配置保存通常的做法是使用Github。但是很不方便的是,那些dotfile 在HOME目录中,如果直接在HOME下建立git repo,会有非常多的文件需要ignore, 每次HOME有新文件时非常头疼。所以还要把那些dotfile移到一个独立的git repo文件夹中,每次更新就需要手动rsync那些文件到那个文件夹。

除了拷贝之外, 更方便的方法是软链接。把git repo下的文件软链接到HOME即可,但是每次增删文件的时候, 又很麻烦。为了避免这些麻烦的操作, 使用stow就边的特别合适了。

Stow最早是用来做“包管理器”用的。很多使用make && make install的软件,安装者为了保持系统整洁,一般安装到/usr/local/your-soft-name,然后把对应的可执行文件目录加到$PATH,这样,你的PATH也是异常“丰富”。Stow的作用是,它可以把某个文件夹下的所有文件(夹)都软链接到/usr/bin中,而且能处理一些冲突。它也能智能地决定软链接是否需要递归的软链所有文件夹下的文件。

所以,用Stow来管理你的软链接很方便, 它不止可以一次性的软链接你git repo下的所有文件。而且还能一次性的删除对应的软链接。

下面就是我常用的例子:

如上图所示,只要cd ~/Stow; stow vim, 就能得到图中虚框的两个链接了。Stow的默认做法是把stow的A文件夹下的所有文件(夹)软链接到A所在目录的上层(即类似ln -s A/* A/../)。

如果上层目录已有相应链接,比如下面的情况:

左图是 cd ~/Stow; stow vim-A 后得到的结果; 右图是在左图基础上再 cd ~/Stow; stow vim-B 得到的结果。

Stow把冲突的链接改成目录,在目录下再次链接相应的文件(夹)。大概的哲学就是, 尽量往高层文件夹做链接, 如果不行则往下层走, 直到对每个文件单独链接。具体内容请man stow

当然, Stow是可以删除链接的, 比如cd ~/Stow; stow -D vim 即可删除HOME下的链接了。

这是我的 Stow github repo.
参考文章:using GNU stow to manage your dotfiles.