博主很早就想建立自己的dotfiles,之所以一直没有付诸行动,一方面是因为就一台笔记本,没有跨平台配置同步,操作体验一致的需求,另一方面是常用软件的配置文件就那么多,当然最主要的原因还是因为懒 :cry:

直到博主开始实习,需要给开发机配置环境,只好手动将笔记本上的配置文件拷贝到开发机上面,不得不勤快一点建立自己的dotfiles,为以后的更懒埋下伏笔,这也是博主写作本文的背景.

什么是dotfiles

使用Linux或其他类Unix的用户都知道,系统安装的软件一般在

1
/etc
目录下有类似
1
rc
.
1
conf
之类的配置文件.这些配置文件是系统级的,对于当前系统的每个用户都生效,而用户级的配置文件大致有以下几种:

  1. 用户主目录下面,比如bash的配置文件是

    1
    ~/.bashrc
    
    ,git的配置文件岁
    1
    ~/.gitconfig
    
    ,irssi的配置文件在
    1
    ~/.irssi
    
    隐藏目录里

  2. 用户主目录下面

    1
    .config
    
    隐藏目录下,比如mpv的配置文件是
    1
    ~/.config/mpv/mpv.conf
    

正因为这些配置文件大多是以

1
.
开头的隐藏文件,所以统称为dotfiles. PS:有些在windows下的开源软件也会在
1
user
目录里创建以
1
.
开头的配置文件,显然这种习惯是从Linux带过去的.

为什么要有自己的dotfiles

  1. 积累 其实对于系统和软件的使用就是对其配置的不断积累和优化,在长时间使用过程中逐渐形成自己的操作习惯,但是一旦重装系统了,这些积累和配置都得重头再来一遍,也可以称为一夜回到解放后.

  2. 管理与备份 当你重装系统或者换了新平台如何保持原有的习惯,这就要靠dotfiles

管理dotfiles方法的演变

由于用户级的配置文件存在于当前用户的家目录下,很长一段时间里人们安装系统的时候通过把

1
/home
单独分出来挂载,重装系统的时候不格式化,再挂载回去,所有的配置文件都还在,通过这个小技巧可以解决本机配置文件管理与备份的需求,但是对于配置新平台的环境就做不到了(难道你想共用
1
/home
吗,还能再懒一点吗?)

所以简单点的方法就是直接拷贝配置文件完成新平台的环境配置,但是这个方法的不足之处就是同步问题,你在一处设备上对配置文件的更改,要么重新拷贝,要么在另一台设备重新更改,这这种方法显然不适合博主这种懒人.

下面让我们更进一步,不是要解决同步问题吗,现在那么多网盘服务,比如dropbox,利用网盘的同步功能在多个设备之间同步dotfiles,这种方法是极好的,但是极好的dropbox被极烂的天朝给恶意屏蔽了,而极烂的国内网盘服务不是有审查就是私自更改用户的私人文件,把贞操交给这种禽兽,显然不够放心.直到有了github这个在线代码仓库托管网站.

通过git版本控制工具可以很容易track我们对dotfiles的更改,而github的代码分享,项目fork等功能又为懒人带来了不少福利,所以将dotfiles用git管理起来,托管到github上面,你可以分享自己的配置,也可以参(chao)考(xi)他人的配置,对于博主这种懒人来说,生活似乎朝着美好的方向去发展,天空万里无云,空气弥漫着青草的芬芳,大草原又到了交配的季节…

如何创建自己的dotfiles

最简单的方法就是在github上新建远程仓库,将要管理的dotfiles添加到本地仓库里再推送到远程仓库,换新的平台后直接clone这个远程仓库,再手动复制配置文件为正确的位置,这种方法优点是建立简单,而缺点也很明显,”手动复制到正确的位置”,说的简单,其实也并不难.但是,这种方法显然不适合懒人.

有没有更好的方法呢,很多读者估计也想到了,就是在创建仓库时顺带写个脚本,将手动的复制操作变成自动化操作.咦,吃起来不错,然而并没有解决问题,这种方法带来了新的问题,因为仓库一份配置文件,本机一份配置文件,有一处更新,就要改两次,oh my god,还是给我一刀吧,那应该要怎么办呢?

聪明的读者很快就能想到,可以通过创建软链接(又称为符号链接)的方式来完美解决这个配置文件修改的同步问题,这种做法常见于Linux的配置文件中,fontconfig通过软链接实现配置文件的启闭,nginx通过软链接控制站点的启闭,php通过软链接控制扩展的启闭等等.对于dotfiles,可以使用类似下面的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

BASEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# vim
ln -s ${BASEDIR}/vimrc ~/.vimrc
ln -s ${BASEDIR}/vim/ ~/.vim

# zsh
ln -s ${BASEDIR}/zshrc ~/.zshrc

# git
ln -s ${BASEDIR}/gitconfig ~/.gitconfig

这样就完了吗?其实并没有,因为有的同学发现每多出一个配置文件就要多写一行脚本,这么多重复的

1
ln -s
博主自己表示也懒得写,怎么办呢?去github上找找吧,刚好找到了 @anishathalye 创建的dotbot1项目,通过修改配置文件来管理你的配置文件,听起来有些拗口,其实用起来既简单又方便.

dotbot的使用方法

dotbot使用方法很间单,首先,仓库还是原来的那个仓库,你也是原来的那个你,接下来跟着我,走你!

下面假设之前的dotfiles保存在

1
~/.dotfiles

  1. 1
    cd ~/.dotfiles
    
    这一步是进入你之前的dotfiles仓库目录

  2. 1
    git submodule add https://github.com/anishathalye/dotbot
    
    添加dotbot为你当前仓库的子模块

  3. 1
    cp dotbot/tools/git-submodule/install .
    
    复制安装脚本

  4. 1
    touch install.conf.yaml
    
    创建管理dotfiles的配置文件

1
install.conf.yaml
文件的写法:

1
2
3
4
5
6
7
- clean: ['~']

- shell:
  - [git submodule update --init --recursive, Installing submodules]

- link:
    ~/.dotfiles: ''

比如dotfiles仓库里管理的vim配置文件为

1
vimrc
,而实际vim配置文件应为
1
~/.vimrc
,这个时候
1
install.conf.yaml
可以像下面这样写:

1
2
3
4
5
6
7
8
- clean: ['~']

- shell:
  - [git submodule update --init --recursive, Installing submodules]

- link:
    ~/.dotfiles: ''
    ~/.vimrc: vimrc

如果运行安装脚本,就会自动为我们创建正确的软链接,这种写法对于直接在主目录下面的配置文件是没有问题的,但是对于mpv那种配置文件在子目录中的,当子目录不存在时,软链接就会创建失败,这个时候应该这样写

1
2
3
4
5
6
7
8
9
10
- clean: ['~']

- shell:
  - [git submodule update --init --recursive, Installing submodules]
  - [mkdir -p ~/.config/mpv]

- link:
    ~/.dotfiles: ''
    ~/.vimrc: vimrc
    ~/.config/mpv/mpv.conf: mpv.conf

这个时候安装脚本会在创建软链接之前创建好目录.有了dotbot,加上git和github很好的解决了之前方法的种种问题,但是有的同学还是不知足,能不能在单个平台添加自定义的配置,但是又不想加到dotfiles仓库里,答案是有的.

Zsh

添加下面的代码加到

1
.zshrc
文件底部,平台的自定义配置文件是
1
~/.zshrc_local

1
2
3
if [ -f ~/.zshrc_local ]; then
    source ~/.zshrc_local
fi

Git

下面的代码加入

1
.gitconfig
文件底部,平台自定义文件为
1
~/.gitconfig_local

1
2
[include]
        path = ~/.gitconfig_local

Vim

下面的代码加到

1
.vimrc
文件底部,平台自定义文件为
1
~/.vimrc_local

1
2
3
4
let $LOCALFILE=expand("~/.vimrc_local")
if filereadable($LOCALFILE)
    source $LOCALFILE
endif

tmux

下面的代码加到

1
.tmux.conf
文件底部,平台自定义文件为
1
~/.tmux_local.conf

1
if-shell "[ -f ~/.tmux_local.conf ]" 'source ~/.tmux_local.conf'

小结

本文通过对dotfiles的介绍以及对其管理方法的演变和优缺点分析,最终找到一种比较另人满意的方法去帮助读者去建立自己的dotfiles仓库,写到这里,你猜的没错,完了,真的完了,完了又完 :cry:

参考网址

  1. 博主的dotfiles仓库
  2. dotbot作者的教程