跳转到内容

dotfiles

来自 Arch Linux 中文维基

用户对于程序的配置通常存储在所谓的点文件(以 . 开头的文件)中。通常的做法是用版本控制系统(如 Git )来管理点文件,以跟踪其变化,并在不同的主机上同步。有许多管理点文件的方法。例如,直接跟踪主目录中的点文件;或者将其放在子文件夹中,用 shell 脚本或专用工具进行管理。除了说明如何管理你的点文件之外,本文章还包含了一个来自 Arch Linux 用户的点文件配置库列表。

使用 Git 跟踪点文件[编辑 | 编辑源代码]

直接使用 Git 跟踪点文件的好处是它只涉及Git而不涉及符号链接。坏处则是对于特定主机的配置通常需要多个分支来合并。

实现这一需求最简单的方式是直接在 home 目录初始化一个 Git 仓库,并在gitignore(5)文件中使用*匹配所有文件来忽视它们。 但是两个弊端也随之而来:一是当你的 home 目录下有其他 Git 仓库时,就会难以应对(比如说你如果你忘记初始化而直接对点文件仓库进行操作的时候)。二是你很难确定当前目录下的那些文件是没有被跟踪的(因为他们已经被忽略了)。

为避免上述两个弊端,一个很受欢迎的替代方法是“裸仓库别名法”,它的原文链接在此:Ask Hacker News: What do you use to manage your dotfiles?,它只要3个命令就可轻松完成设置:

$ git init --bare ~/.dotfiles
$ alias dotfiles='/usr/bin/git --git-dir="$HOME/.dotfiles/" --work-tree="$HOME"'
$ dotfiles config status.showUntrackedFiles no
注意:通常情况下, 点文件都是默认权限,但如果某些配置一定要配置特定权限,请另寻他法。(git 不支持存储权限信息)(Discussion)

你可以采用下面的命令在新系统中复制点文件:

$ 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 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/{}

在这之后你可以用 alias命令 去管理点文件。如果你使用的是 Bash,只需要安装 bash-complete-aliasAUR 后就可以使用补全功能,最后将别名和下面的一行命令放在你的~/.bashrc中。

$ complete -F _complete_alias dotfiles

另一种在bash中使用补全功能的方法,在你的~/.bashrc中加入下面的命令(擅自[1]):

source /usr/share/bash-completion/completions/git
__git_complete config __git_main
提示:关于避免以外提交敏感信息的方式,请看 Git#Filtering confidential information.

特定设备相关的配置[编辑 | 编辑源代码]

你可能有很多台设备, 在这些设备之间同步点文件是一个很常见的问题,我们将其称之为特定设备相关的配置。

有了 Git 工具的帮助,我们可以通过以下方式解决这个问题:我们可以维护一个包含通用配置文件的主分支,同时为设备间不同的特定配置文件创建单独的分支。维护时将通用配置文件的变动提交到前者,而将与设备相关的配置文件提交到后者。也就是说,每个设备的专用分支都是在保持通用分支更新的基础上单独建立的。

某些配置文件中,比如在 shell configuration files 中,可以使用条件逻辑判断不同的设备。比如,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) repository-wise
dotgit dotgitAUR Python 基于文件名称
homeshick homeshick-gitAUR Bash repository-wise
homesick Ruby repository-wise
Pearl pearl-gitAUR Python repository-wise
vcsh vcsh Shell repository-wise
yadm(1) yadm Python 基于文件名称
(按类/操作系统/发行版/主机名称/用户)[4]
内置模板/Jinja2/ESH[5]
(可选)
dfm dfmAUR Perl repository-wise
  1. 支持以 GPG 或 OpenSSL 对文件加密。 [6]

用户仓库[编辑 | 编辑源代码]

提示:中文社区有人整理了来自中文社区用户的 dotfiles 集锦:archlinuxcn-dotfiles-collection
注意:这个表格用于提供点文件的参考和例子,如果你想将自己的点文件提交到此,请确保它们整洁、注释完善且不过时。
警告:这些点文件未经Arch Linux维护团队验证,请自行承担使用风险。
作者 Shell WM / DE 编辑器 终端 终端复用 音频 资源监视 邮件 IRC 文件管理 RSS 阅读
adamperkowski Zsh dwm Neovim Kitty tmux mpv 自定义 weechat
alfunx zsh awesome vim kitty tmux ncmpcpp/mpd htop/lain thunderbird
Ambrevar Eshell EXWM Emacs Emacs (Eshell) Emacs TRAMP + dtach EMMS conky/dzen mu4e Circe
ananthu zsh bspwm neovim alacritty mpv htop, polybar neomutt weechat ranger
awal fish i3 vim st tmux i3status The Lounge
ayekat zsh karuiwm vim rxvt-unicode tmux ncmpcpp/mpd karuibar mutt irssi
bachoseven zsh dwm neovim st ncmpcpp bottom neomutt weechat lf
bamos zsh i3/xmonad vim/emacs rxvt-unicode tmux mpv/cmus conky/xmobar mutt ERC
brisbin33 zsh xmonad vim rxvt-unicode screen dzen mutt irssi
BVollmerhaus fish i3-gaps kakoune kitty polybar ranger
christian-heusel Zsh i3 Neovim st / terminator byobu / tmux htop neomutt/thunderbird weechat nemo / rangern
cinelli zsh dwm vim termite-git pianobar htop mutt-kz weechat
dikiaap zsh i3-gaps neovim alacritty tmux i3blocks nnn
Earnestly zsh i3/orbment vim/emacs termite tmux mpd conky mutt weechat
ErikBjare zsh xmonad/xfce4 vim terminator tmux xfce4-panel weechat
falconindy bash i3 vim rxvt-unicode ncmpcpp conky mutt
filiparag fish bspwm vim alacritty tmux mpv, playerctl htop, polybar mail-notification pcmanfm[失效链接 2022-09-17 ⓘ]
gardenapple zsh sway neovim kitty htop aerc
graysky zsh xfce4 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
JonasDe[失效链接 2022-09-17 ⓘ] zsh i3 vim rxvt-unicode tmux
Jorengarenar sh/Bash i3 Vim xterm tmux[失效链接 2022-09-17 ⓘ] mpv htop aerc WeeChat ranger QuiteRSS
MarkusZoppelt zsh gnome vim terminal tmux
maximbaz zsh sway kakoune kitty waybar neomutt nnn
mehalter zsh i3-gaps neovim termite tmux cmus gotop neomutt weechat ranger
meskarune bash herbstluftwm vim rxvt-unicode screen conky weechat
neersighted fish i3 neovim alacritty tmux ncmpcpp
nimaipatel fish awesome neovim alacritty ncmpcpp
oibind fish awesome neovim st tmux htop-vim weechat lf
OK100 bash dwm vim rxvt-unicode cmus conky, dzen mutt weechat
orhun bash i3-gaps vsc alacritty i3status weechat tere
pablox-cl zsh (zplug) gnome3 neovim kitty
peterzuger zsh i3-gaps emacs rxvt-unicode screen moc htop
potamides bash awesome neovim termite tmux ncmpcpp conky,htop mutt weechat ranger
reisub0 fish qtile neovim kitty mpd conky
Scrumplex fish sway neovim kitty ncmpcpp / pipewire waybar aerc ranger
sistematico zsh/fish/bash i3-gaps vim/nano termite tmux ncmpcpp polybar mutt weechat
sitilge zsh sway neovim alacritty htop thunderbird
thecashewtrader Eshell EXWM Emacs Emacs (VTerm) Emacs Bongo htop mu4e ERC Dired Elfeed
thiagowfx bash/zsh i3 vim alacritty tmux playerctl i3status ranger
tuurep bash openbox neovim alacritty tmux polybar
vodik zsh xmonad vim termite-git tmux ncmpcpp custom mutt weechat
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
wryonik zsh i3-gaps-rounded vim terminator cmus htop, i3blocks, gotop ranger, nautilus

另见[编辑 | 编辑源代码]