Dotfile管理

在Linux上各个程序的配置文件大多是以 . 开头或以 rc 结尾的文件,并存放于用户的个人目录 ~/ 中,通常叫dotfile 或 rc file ,如 .zshrc.vimrc 等。在初次使用一些软件时需要花大量时间对相应的 dotfile 进行配置,当需要在新系统上恢复多个软件配置或者在多台电脑上共享一台电脑对 dotfile 的修改时,逐一对各个 dotfile 进行管理非常不方便,rcm(rc file management) 就是一个 dotfile 管理工具,用于方便管理 dotfile 。

rcm 主要是将所有希望用 rcm 管理的 dotfile 集中存储在一个目录中(默认 ~/.dotfiles),并在原配置文件位置创建被 rcm 管理的 dotfile 的软链接。

可在该集中存储目录中使用 git 进行版本控制,同时也可托管到 github 等 git 仓库中方便多台机器共享。若要使用别人分享的 rcm 目录下的 dotfile 时 rcm 可调用不同 dotfiles 目录下的文件进行使用。

rcm github仓库

rcm gitee国内加速仓库

命令格式

rcm 包括了 4 个命令和一个 dotfile 文件 ~/.rcrc (注意 rcm 默认不会生成该配置文件,若要使用需手动创建)

lsrc

列出当前所有通过 rcm 管理的 dotfile ,以及其对应的符号链接位置

lsrc [-FhqVv] [-B HOSTNAME] [-d DIR] [-I EXCL_PAT] [-S EXCL_PAT] [-s EXCL_PAT] [-t TAG] [-U EXCL_PAT] [-u EXCL_PAT] [-x EXCL_PAT] [files ...]

mkrc

将指定的 dotfile 移动至集中存储目录(默认 ~/.dotfiles),并在原下创建相应的软链接

mkrc [-ChoqSsVvUu] [-t TAG] [-d DIR] [-B HOSTNAME] files ...

rcup

更新或创建由 rcm 管理的 dotfile 的软链接

rcup [-CfhiKkqVv] [-B HOSTNAME] [-d DIR] [-g] [-I EXCL_PAT] [-S EXCL_PAT] [-s EXCL_PAT] [-t TAG] [-U EXCL_PAT] [-u EXCL_PAT] [-x EXCL_PAT] [files ...]

rcdn

删除通过 rcm 创建的 dotfile 的软链接

rcdn [-hKkqVv] [-B HOSTNAME] [-d DIR] [-I EXCL_PAT] [-S EXCL_PAT] [-s EXCL_PAT] [-t TAG] [-U EXCL_PAT] [-u EXCL_PAT] [-x EXCL_PAT] [files ...]

命令指令

~/.rcrc

可以使用主目录中的 .rcrc 文件配置rcm dotfile 管理器。 可通过设置 RCRC 环境变量来更改此位置。

支持以下变量:

.rcrc 样例:

COPY_ALWAYS="ssh/id_* weechat/* netrc"
COPY_ALWAYS="*"
DOTFILES_DIRS="/home/mike/.dotfiles /usr/share/dotfiles"
EXCLUDES="irbrc *:*emacs* dotfiles:python*"
HOSTNAME="eggplant"
TAGS="freebsd development email git laptop gmail notmuch"
SYMLINK_DIRS="zprezto texmf"
UNDOTTED="texmf"

EXCLUDE PATTERN (排除列表)

使用冒号 (:) 分隔 dotfile 目录和 glob (由普通字符、通配字符组成的字符串,用于匹配文件路径) 。可选择带 dotfile 目录,如果省略则默认为 * ,代表从所有 dotfile 目录匹配。 glob 是相对于 dotfile 目录的相对路径。

例如,要忽略 Thoughtbot-dotfiles 目录中所有与 emacs 相关的项目,使用:

thoughtbot-dotfiles:*emacs*

要忽略所有 bash_profile 文件使用:

*:bash_profile

或者简写为:

bash_profile

注意,通常通过 hostname 命令获得主机名,但此命令并非标准的,获取的主机名或许会有差异,在macOS上,主机名是不可预测的,甚至可能在 DHCP 握手被更改,强烈建议在 rcrc 中,因此使用 HOSTNAME 变量强制使用已知的主机名。

DIRECTORY LAYOUT (目录布局)

dotfiles 目录下的任何非点 (.) 开头的、非元的文件或目录都将作为点 (.) 开头的文件安装。 例如,.dotfiles/zshrc 将安装到 ~/.zshrc

文件安装为软链接。 目录通过建立目录来安装。-C 选项指定文件通过复制安装而不是软链接。 rcrc 中的 COPY_ALWAYS 可用于列出只能复制的文件。

支持三个元文件: host-specific (特定主机文件), tagged (标记文件), hooks 。

日常使用

# 创建管理
# 已添加过管理的目录请勿再次添加,如目录里需要添加新内容,只指定新内容添加即可,不然会出现软链接套娃 BUG 。
mkrc xxx

# 打标签方式创建管理
mkrc -t git xxx

# 安装 dotfiles 中的 dotfile 文件
rcup

# 安装指定标签的 dotfile 文件
rcup -t git

# 安装指定标签的 dotfile 文件,并显示过程
rcup -t git -v

# 查询被管理的 dotfile 文件
lsrc

# 查询指定标签的 dotfile 文件
lsrc -t git
lsrc -t i3 -t meshell -t vim -t zsh

# 查询指定 dotfiles 中的 dotfile 文件
lsrc -d ~/.MyDotfiles

# 取消所有安装
rcdn

# 取消指定标签的安装,并显示过程
rcdn -t git -v

# 取消指定 dotfiles 中指定标签的安装
rcdn -d ~/.MyDotfiles -t git

使用git进行版本管理及云备份:

cd ~/.dotfiles
git init
git add .
echo "These are my dotfiles" >> README.md
git commit -m "initial commit"

参考

RCM(7)

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