管理linux下软件的配置文件dotfile(rc files)

在linux下,各种软件的配置文件大多存储于以“.”开头以“rc”结尾的文件中并存放于用户的个人目录~/中,也就是俗称的dotfile或者rc file,例如zsh的配置文件.zshrc,vim的配置文件.vimrc等等。

当我们初次使用一些软件时经常会花大量时间对相应的dotfile(rc file)进行配置,让软件以符合我们期望的方式工作,在使用时也时常会对dotfile进行调整。但是当我们希望在新电脑上恢复多个软件配置或者在多台电脑上共享一台电脑对dotfile的修改时,逐一对各个dotfile进行管理非常不方便。

所以我来介绍一下我管理dotfile的方式

所需软件介绍

我在管理dotfile时用到的软件是在Github上开源的rc file management(rcm)软件,这个软件主要思想就是将所有你希望用rcm管理的dotfile移动并集中存储在一个目录中(默认是在~/.dotflies下),并在你的个人目录下创建所有被rcm管理的dotfile的符号连接(symlink)。如果你熟悉这个软件可以看看我的日常使用方法

我们可以在该集中存储目录下建立git repository进行版本控制,同时也可托管到github或gitcafe上方便多台机器共享。当你希望使用别人分享给你的rcm目录下的dotfile时则rcm可以利用多目录存储管理功能,同时调用多个分享目录下的文件。

这套软件主要包括了一下4个命令和一个配置dotfile文件~/.rcrc(注意在安装好rcm后不会有配置文件,若要使用需手动创建)

  • lsrc:列出当前所有通过rcm管理的dotfile,以及其对应的符号链接位置
  • mkrc:将指定的dotfile移动至你的集中存储目录,并在~/目录下创建相应的符号链接
  • rcup:根据rcm管理的dotfiles更新当前用户目录下已存在的符号链接或创建新的符号链接
  • rcdn:删除通过rcm创建的dotfile的符号链接

安装RCM

我主要是用Mac和Ubuntu,他们的安装方法如下

Mac

1
2
brew tap thoughtbot/formulae
brew install rcm

Ubuntu

1
2
3
sudo add-apt-repository ppa:martin-frost/thoughtbot-rcm
sudo apt-get update
sudo apt-get install rcm

Arch Linux

https://aur.archlinux.org/packages/rcm/

Debian-based

1
2
3
4
wget https://thoughtbot.github.io/rcm/debs/rcm_1.2.3-1_all.deb
sha=$(sha256sum rcm_1.2.3-1_all.deb | cut -f1 -d' ')
[ "$sha" = "fb8ec2611cd4d519965b66fcf950bd93d7593773659f83a8612053217daa38b4" ] && \
sudo dpkg -i rcm_1.2.3-1_all.deb

Gentoo-based (including Funtoo)

1
2
3
sudo emerge layman
sudo layman -f --overlays https://github.com/bronislav/overlays/raw/master/layman.xml --add bronislav
sudo emerge rcm

OpenBSD(-current)

1
sudo pkg_add rcm

openSUSE/RHEL/CentOS

http://software.opensuse.org/download.html?project=utilities&package=rcm

其他Linux发行版

这个软件使用了标准GNU autotools,可以尝试一下方法编译安装

1
2
3
4
5
6
7
8
9
10
11
curl -LO https://thoughtbot.github.io/rcm/dist/rcm-1.2.3.tar.gz && \

sha=$(sha256 rcm-1.2.3.tar.gz | cut -f1 -d' ') && \
[ "$sha" = "502fd44e567ed0cfd00fb89ccc257dac8d6eb5d003f121299b5294c01665973f" ] && \

tar -xvf rcm-1.2.3.tar.gz && \
cd rcm-1.2.3 && \

./configure && \
make && \
make install

RCM使用方法

接下来介绍一下我的使用方式

通过mkrc命令创建Dotfiles管理目录

如果你是第一次在本地使用rcm,则可以通过mkrc命令来创建dotfiles管理目录,并指定要用使用rcm管理哪些文件.

1
2
cd ~
mkrc .zshrc .zsh-custom

命令执行完毕后,会将你指定的dotfile默认移动到~/.dotfiles目录下并重命名将文件名前的“.”去掉,同时在~/目录下创建相应的符号链接,如果你的dotfile是存储在某个文件夹下时,例如~/.example/config, 则程序会将文件拷贝至~/.dotfiles/example/config,并在原目录中创建符号连接

1
2
3
4
5
6
7
8
9
10
ls -l ~/dotfiles
-rw-r--r-- 1 Rain staff 1065 8 15 13:20 zshrc
drwxr-xr-x 3 Rain staff 102B 8 15 13:20 zsh-custom

cd ~
ls -l .zshrc
lrwxr-xr-x 1 Rain staff 35B 8 15 13:20 .zshrc -> /Users/Rain/.dotfiles/zshrc

ls -l .zsh-custom/themes/wty.zsh-theme
lrwxr-xr-x 1 Rain staff 61 8 15 13:20 .zsh-custom/themes/wty.zsh-theme -> /Users/Rain/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme

此时你可以使用git在~/.dotfiles目录下创建仓库进行版本管理

1
2
3
4
5
cd ~/.dotfiles
git init
git add .
echo "These are my config dotfiles" >> README.md
git commit -m "initial commit"

如果你希望更改创建的dotfiles管理目录的位置,可以通过在mkrc命令中带上-d参数,或者
在~/.rcrc配置文件中配置默认的目录

1
2
3
4
5
mkrc -d ~/.mydotfiles .zshrc

#in ~/.rcrc file
#此参数可以设置多个目录,为其余几个命令服务,对mkrc命令来说第一个目录为默认目录,若不填写则~/.dotfiles为默认目录
DOTFILES_DIRS="~/.mydotfiles"

注意事项

由于rcm软件的设计问题,请勿对已经由rcm管理并创建的符号连接使用mkrc命令,否则会让~/.dotfiles下的文件变成指向自己的符号链接并丢失源文件。

为了避免符号链接带来的问题,我们可以在使用mkrc命令时带上“-C”参数来改变创建符号链接的行为,或者在~/.rcrc文件中加入如下参数,将所有创建符号链接的行为都改为拷贝,这个将影响所有的rcm命令

1
2
3
4
#in ~/.rcrc files
COPY_ALWAYS="*"

mkrc -C .zshrc

我最开始尝试使用这个软件的时候因为这个问题导致丢失了.zshrc,而且并未备份,又得重新配置一遍,幸好有oh-my-zsh,Orz..

但是使用符号链接的好处就是当你对~目录下我的dotfile进行修改时,相当于直接对dotfiles管理目录中的文件进行了修改,这样备份更加方便,我认为只要小心一点还是符号链接更加方便,如何取舍就看大家啦。

mkrc命令高级用法

mkrc命令还支持将dotfiles通过tags分类存放,可以方便的对不同软件的配置文件进行分类管理,比如通过如下命令创建dotfiles管理目录,

1
2
cd ~
mkdir -t zsh .zshrc

此命令将会在./dotfiles目录下创建以“tag-”开头的目录,效果如下

1
2
ls -l ~/.dotfiles/tag-zsh/zshrc                                                
-rw------- 1 Rain staff 1065 8 15 15:42 .dotfiles/tag-zsh/zshrc

mkrc还能根据hostname来进行分类管理,mkrc的更多参数请查看man page mkrc(1)
在使用了mkrc的分类管理参数后会影响到接下来要介绍的rcup命令的行为

通过rcup命令更新dotfiles

基础用法

当你没有使用任何分类管理参数时,你的所有dotfile应该都存储在~/.dotfiles目录下,此时你只需要简单的执行rcup命令,则rcm会在~目录下创建所有~/.dotfiles下文件对应的符号链接,当配置了COPY_ALWAYS=“*”时则会改为拷贝,若~目录下存在对应文件且内容不同时,会提示是否覆盖。且若~、。dotfiles中的文件夹在~中不存在时会自动创建,样例如下

1
2
3
4
5
6
rcup -v   
identical /Users/Rain/.rcrc
'~/.dotfiles/tag-zsh/zsh-custom/themes/wty.zsh-theme' -> '~/.zsh-custom/themes/wty.zsh-theme'
overwrite /Users/Rain/.zshrc? [ynaq] y
removed '/Users/Rain/.zshrc'
'/Users/Rain/.dotfile/zshrc' -> '/Users/Rain/.zshrc'

高级用法

当不加任何参数时,rcup默认只将没有通过tag进行分类的且如果通过hostname分类了则分类hostname与本地hostname相同的dotfiles更新至你的~目录

当你使用tag来构建你的dotefile目录时,你可以通过给rcup命令加上“-t”参数或者在~/.rcrc中配置TAGS=”tag1 tag2”来更新相应分类下的dotfiles,或者加上“-B”参数来指定一个hostname或在~/.rcrc文件中配置HOSTNAME参数,从而取消自动计算hostname。

如果加了“-t”参数以后,lsrc,rcup和rcdn命令都只会加载没有用tag分类的和“-t”参数给出的tag相关的dotfile,其他tag下的dotfiles不会被加载

你可以通过lsrc命令查看当前rcup命令能作用于哪些dotfiles,如果要查询有哪些tag,只需进入~/.dotfiles目录查看那些以“tag-”开头的目录即可。

1
2
3
4
5
6
7
8
9
10
lsrc
/Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc

lsrc -t zsh
/Users/Rain/.rcrc:/Users/Rain/.dotfiles/rcrc
/Users/Rain/.zshrc:/Users/Rain/.dotfiles/tag-zsh/zshrc

rcup -v -t zsh
identical /Users/Rain/.rcrc
'/Users/Rain/.dotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

当你希望rcup同时载入多个dotfiles管理目录,比如当你使用他人分享给你的通过rcm创建的dotfiles管理目录时,你可以使用rcup的“-d”参数来指定从哪个文件夹来更新~目录下的文件

1
2
rcup -d ~/.SarahDotfiles -t zsh
'/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

我的日常使用方法

一般我的使用方法是,使用一个dotfiles管理目录统一管理dotfiles,并在该目录里建立git repository进行版本控制

其中

  • rcm的配置dotfiles .rcrc以tag rcm分类
  • 同一个软件的所有dotfile配置文件都通过一个tag来分类管理
  • 在.rcrc中配置TAGS=“所有以用于分类的tags”
  • 在.rcrc中配置EXCLUDES=”忽略dotfiles管理目录中的某些文件”,比如github的README.md等

当迁移到新的电脑上时,将dotfiles管理目录放置于~/.dotfiles,并采用如下方法

1
2
3
4
5
6
7
8
9
10
11
#1.恢复rcm的dotfile
rcup -t rcm

#2.查看当前有哪些可以恢复的dotfiles
lsrc

#3.因为.rcrc配置中已经配置了原电脑所有的分类,则可以直接全部恢复
rcup

#4.若只想部分恢复,则指定tag
rcup -t zsh

当使用别人分享过来的dotfiles管理目录时,采用如下方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#1.取消自己对应的配置
rcdn -t zsh -v
removed '/Users/Rain/.zshrc'

#2.将别人的对应配置符号连接过来,进行测试
rcup -d ~/.SarahDotfiles -t zsh
'/Users/Rain/Download/.SarahDotfiles/tag-zsh/zshrc' -> '/Users/Rain/.zshrc'

#3.如果不满意则取消对方的配置,并重新链接回自己的配置
rcdn -d ~/.SarahDotfiles -t zsh
rcup -t zsh

#4.如果满意则copy对方的配置到我的~目录,在自己重建dotfiles管理目录中对应的文件
rcup -d ~/.SarahDotfiles -t zsh -C
mkrc .zshrc

#5.使用git对自己的dotfiles管理目录进行版本管理

更多使用方法请参考man page rcup(1), mkrc(1), rcdn(1), lsrc(1), rcrc(5)rcm(7) quick start tutorial.


本文个人博客地址: http://wty.im/2015/08/14/use-rcm-to-manage-your-dotfile-rc-file/
Github: https://github.com/wty21cn/