dotfiles

出自 ArchWiki
(重定向自Dotfile

用户特定的应用程序配置传统上存储在所谓的 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 不存储权限(讨论

您的 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
提示: 为避免意外提交机密信息,请参阅 Git#过滤机密信息

主机特定配置

在各种机器之间同步 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 按仓库
  1. 支持使用 GPG 或 OpenSSL 加密机密文件。[6]

用户仓库

注意: 此表用作 dotfiles 的参考/示例,如果您要将您的 dotfiles 提交到该表,请确保它们保持整洁、注释完整且是最新的。
警告: 这些 dotfiles 未经任何 Arch Linux 工作人员验证,使用风险自负。
作者 Shell (Shell 框架) WM / DE 编辑器 终端 多路复用器 音频 显示器 邮件 IRC 文件管理器 RSS 阅读器
adamperkowski zsh dwm Neovim st tmux mpv custom WeeChat
ananthu Zsh bspwm Neovim Alacritty Mpv htop, Polybar Neomutt WeeChat Ranger
ayekat Zsh karuiwm Vim Rxvt-unicode tmux ncmpcpp/Mpd karuibar Mutt Irssi
bachoseven Zsh Dwm source Neovim St source tmux ncmpcpp bottom Neomutt WeeChat Lf newsboat
bamos Zsh i3/xmonad Vim/Emacs rxvt-unicode tmux mpv/cmus conky/xmobar mutt ERC
brisbin33 zsh xmonad vim rxvt-unicode GNU Screen dzen mutt irssi
christian-heusel Zsh i3 Neovim st / terminator byobu / tmux htop neomutt/Thunderbird WeeChat nemo / ranger
CuterThanYou Zsh i3 / Hyprland Neovim Alacritty / Foot Mpv Polybar / Yambar Lf / Thunar Newsboat
dikiaap Zsh i3-gaps Neovim Alacritty tmux i3blocks nnn
Earnestly Zsh i3/orbment Vim/Emacs termite tmux mpd conky mutt WeeChat
egnrse Zsh/Bash Hyprland Neovim Alacritty VLC bottom Dolphin
ErikBjare Zsh xmonad/Xfce4 Vim terminator tmux xfce4-panel WeeChat
erikw Zsh/Bash dwm/macOS Neovim urxvtc tmux mpd mutt irssi
filiparag fish bspwm Vim Alacritty tmux mpv, playerctl htop, Polybar mail-notification PCManFM
Freed-Wu zsh openbox Neovim wezterm tmux cmus bottom neomutt WeeChat Neovim newsboat
graysky Zsh Xfce Vim terminal ncmpcpp custom Thunderbird
hugdru Zsh awesome Neovim rxvt-unicode tmux Thunderbird WeeChat
insanum Bash Herbstluftwm Vim evilvte tmux dzen mutt-kz
isti115 pwsh sway neovim alacritty tmux mpv / playerctl waybar / htop / ytop ranger
jasonwryan Bash/Zsh dwm Vim rxvt-unicode tmux ncmpcpp custom mutt irssi
jdevlieghere Zsh xmonad Vim terminal tmux htop mutt WeeChat
jelly Zsh i3 Vim termite tmux ncmpcpp mutt-kz-git WeeChat
jl2 Zsh swayfx geany foot missioncenter, eww (bar) srain thunar
karras Zsh Wayfire Neovim Terminator Waybar
MarkusZoppelt Zsh GNOME Neovim Alacritty tmux
maximbaz Zsh Sway kakoune kitty waybar neomutt nnn
neersighted fish i3 Neovim Alacritty tmux ncmpcpp
nimaipatel fish awesome Neovim Alacritty ncmpcpp
oibind fish awesome Neovim st tmux htop-vim WeeChat lf
orhun Bash i3-gaps Neovim Alacritty i3status WeeChat tere
patri9ck Zsh bspwm Vim kitty Thunar
peterzuger Zsh i3-gaps Emacs rxvt-unicode GNU Screen moc htop
polyzen Zsh i3 Neovim Alacritty tmux mpv i3status,htop himalaya ranger Newsboat
potamides Bash awesome Neovim termite tmux ncmpcpp conky,htop mutt WeeChat ranger
sistematico zsh/fish/bash i3-gaps Vim/nano termite tmux ncmpcpp Polybar mutt WeeChat
thecashewtrader Eshell EXWM Emacs Emacs (VTerm) Emacs Bongo htop mu4e ERC Dired Elfeed
thiagowfx bash/zsh i3 Vim Alacritty tmux playerctl i3status ranger
tplasdio bash (ble.sh) awesome neovim alacritty tmux mpv, mpvs htop neomutt weechat lf
tuurep Bash openbox Neovim Alacritty tmux Polybar
unrealapex Zsh dwm Neovim St ncmpcpp htop Neomutt Irssi fff Newsboat
w0ng Zsh dwm Vim rxvt-unicode tmux ncmpcpp custom mutt irssi
whitelynx fish i3 Neovim kitty i3pystatus
whynothugo Zsh Sway Neovim Alacritty mpv waybar, top neomutt Nemo

参见