dotfiles
用户特定的应用程序配置传统上存储在所谓的 dotfiles(文件名以点开头的文件)中。常见的做法是使用诸如 版本控制系统(例如 Git)来跟踪 dotfiles,以记录更改并在各种主机之间同步 dotfiles。管理 dotfiles 有多种方法(例如,直接在主目录中跟踪 dotfiles,或将它们存储在子目录中,并使用 shell 脚本或专用工具来符号链接/复制/生成文件)。除了介绍如何管理 dotfiles 之外,本文还包含 Arch Linux 用户的 dotfile 仓库列表。
直接使用 Git 跟踪 dotfiles
直接使用 Git 跟踪 dotfiles 的好处是它只需要 Git,并且不涉及符号链接。缺点是主机特定配置通常需要将更改合并到多个 分支中。
实现此方法最简单的方法是在您的主目录中直接初始化一个 Git 仓库,并使用 *
的 gitignore(5) 模式默认忽略所有文件。但是,此方法有两个缺点:当您的主目录中有其他 Git 仓库时,它可能会变得混乱(例如,如果您忘记初始化仓库,您突然就在您的 dotfile 仓库上操作),并且您不再容易看到当前目录中有哪些文件是未跟踪的(因为它们被忽略了)。
另一种没有这些缺点的替代方法是 “裸仓库和别名方法”,该方法在 Ask Hacker News: What do you use to manage your dotfiles? 上流行起来,只需要三个命令即可设置
$ git init --bare ~/.dotfiles $ alias dotfiles='/usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME"' $ dotfiles config status.showUntrackedFiles no
您的 dotfiles 可以在新系统上像这样复制:
$ git clone --bare <git-repo-url> $HOME/.dotfiles $ alias dotfiles='/usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME"' $ dotfiles checkout $ dotfiles config --local status.showUntrackedFiles no
- 如果已经有一些可能被覆盖的库存 dotfiles,您会遇到类似于以下内容的错误
$ dotfiles checkout error: The following untracked working tree files would be overwritten by checkout: .bashrc .gitignore Please move or remove them before you can switch branches. Aborting
- 您可以使用
$ dotfiles checkout -f
,这将重写已存在的文件,或者使用更安全的方法,使用以下脚本备份所有文件,然后使用checkout
mkdir -p .dotfiles-backup && \ dotfiles checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \ xargs -I{} mv {} .dotfiles-backup/{}
然后,您可以使用创建的别名来管理您的 dotfiles。如果您正在使用 Bash 并且想要此别名的 bash 补全,只需安装 bash-complete-aliasAUR,然后将别名和以下行添加到您的 ~/.bashrc
。
$ complete -F _complete_alias dotfiles
在 bash 中获得补全的另一种方法是将以下内容添加到您的 ~/.bashrc
中(取自 [1])
source /usr/share/bash-completion/completions/git __git_complete dotfiles __git_main
主机特定配置
在各种机器之间同步 dotfiles 的一个常见问题是主机特定配置。
使用 Git,可以通过维护一个用于所有共享配置的主分支来解决此问题,而每台单独的机器都有一个机器特定的分支检出。主机特定的配置可以提交到机器特定的分支;当在主分支中修改共享配置时,每个机器的分支都需要在更新后的主分支之上进行变基。
在诸如 shell 配置文件之类的配置脚本中,可以使用条件逻辑。例如,Bash 脚本(即 .bashrc
)可以根据机器名称(或类型、自定义变量等)应用不同的配置
if [[ "$(hostname)" == "archlaptop" ]]; then # laptop specific commands here else # desktop or server machine commands fi
类似于 .Xresources 也可以实现。[2]
如果您觉得变基 Git 分支太麻烦,您可能需要使用支持文件分组的工具,或者如果需要更大的灵活性,则可以使用执行处理的工具。
工具
- 文件分组
- 如何将配置文件分组到配置组(也称为配置文件或软件包)。
- 处理
- 一些工具处理配置文件,以允许根据主机自定义它们。
名称 | 软件包 | 编写语言 | 文件分组 | 处理 |
---|---|---|---|---|
dotbot | dotbotAUR | Python | 配置文件 | 否 |
chezmoi | chezmoi | Go | 基于目录 | Go 模板 |
dot-templater | dot-templater-gitAUR | Rust | 基于目录 | 自定义语法 |
toml-bombadil | toml-bombadil | Rust | 配置文件 | tera |
dotdrop | dotdropAUR | Python | 配置文件 | Jinja2 |
dotfiles | dotfilesAUR | Python | 否 | 否 |
dotter | dotter-rsAUR | Rust | 配置文件 | Handlebars |
dt-cli | dt-cliAUR | Rust | 配置文件 | Handlebars |
GNU Stow | stow | Perl | 基于目录[3] | 否 |
Mackup | mackupAUR | Python | 每个应用程序自动 | 否 |
mir.qualia | mir.qualiaAUR | Python | 否 | 自定义块 |
rcm | rcmAUR | Shell | 基于目录(按主机或标签) | 否 |
yas-bdsm | – | Shell | 基于目录 | 否 |
Git 包装工具
如果您不熟悉 Git,您可能想要使用这些工具之一,它们(或多或少)抽象化了版本控制系统。
名称 | 软件包 | 编写语言 | 文件分组 | 处理 |
---|---|---|---|---|
dotbare | dotbareAUR | Shell (fzf) | 按仓库 | 否 |
dotgit | dotgitAUR | Python | 基于文件名 | 否 |
homeshick | homeshick-gitAUR | Bash | 按仓库 | 否 |
homesick | – | Ruby | 按仓库 | 否 |
Pearl | pearl-gitAUR | Python | 按仓库 | 否 |
vcsh | vcsh | Shell | 按仓库 | 否 |
yadm(1) | yadm | Shell | 基于文件名 (按类/OS/发行版/主机名/用户)[4] |
内置模板/Jinja2/ESH[5] (可选) |
dfm | dfmAUR | Perl | 按仓库 | 否 |