dotfiles

来自 Arch Linux 中文维基

本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队

附注: 请提供模板的第一个位置参数以更详细的指示。(在 Talk:Dotfiles# 中讨论)

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

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

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

实现这一需求最简单的方式是直接在 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


注意: Usually one's dotfiles all have default permissions, but if specific file permissions for some files are a must, another approach should be used, as git does not store permissions (Discussion)

You can then manage your dotfiles with the created alias. If you are using Bash and would like bash completion for this alias, simply install bash-complete-aliasAUR, then add the alias and the following line to your ~/.bashrc.

$ complete -F _complete_alias config

Another way to get completion in bash is adding the following to your ~/.bashrc (taken from [1]):

source /usr/share/bash-completion/completions/git
__git_complete config __git_main
提示:To avoid accidentally commiting confidential information, see Git#Filtering confidential information.

特定配置[编辑 | 编辑源代码]

A common problem with synchronizing dotfiles across various machines is host-specific configuration.

With Git this can be solved by maintaining a master branch for all shared configuration, while each individual machine has a machine-specific branch checked out. Host-specific configuration can be committed to the machine-specific branch; when shared configuration is modified in the master branch, the per-machine branches need to be rebased on top of the updated master.

In configuration scripts like shell configuration files conditional logic can be used. For example, Bash scripts (i.e. .bashrc) can apply different configuration depending on the machine name (or type, custom variable, etc.):

if [[ "$(hostname)" == "archlaptop" ]]; then
    # laptop specific commands here
else
    # desktop or server machine commands
fi

Similar can also be achieved with .Xresources.[2]

If you find rebasing Git branches too cumbersome, you may want to use a tool that supports file grouping, or if even greater flexibility is desired, a tool that does processing.

工具[编辑 | 编辑源代码]

文件分组
如何分组配置文件。
处理
一些工具对配置文件进行处理,使其能够根据主机情况进行定制。
名称 语言 文件分组 处理
chezmoi chezmoi Go directory-based Go templates
dot-templater dot-templater-gitAUR Rust directory-based custom syntax
dotdrop dotdropAUR Python configuration file Jinja2
dotfiles dotfilesAUR Python No No
Dots dots-managerAUR Python directory-based custom append points
dotter dotter-rsAUR Rust configuration file Handlebars
dt-cli dt-cliAUR Rust configuration file Handlebars
GNU Stow stow Perl directory-based[3] No
Mackup mackupAUR Python automatic per application No
mir.qualia mir.qualiaAUR Python No custom blocks
rcm rcmAUR Perl directory-based (by host or tag) No

Git 的替代品[编辑 | 编辑源代码]

如果你不喜欢 Git ,可以尝试下列工具,它们包含一个单独的版本控制系统(或多或少)。

名称 语言 文件分组 处理
dotbare dotbareAUR Shell (fzf) repository-wise No
dotgit dotgitAUR Python filename-based No
homeshick homeshick-gitAUR Bash repository-wise No
homesick Ruby repository-wise No
Pearl pearl-gitAUR Python repository-wise No
vcsh vcsh Shell repository-wise No
yadm(1) yadm Python filename-based
(by class/OS/distro/hostname/user)[4]
Built-in templates/Jinja2/ESH[5]
(optional)
  1. 支持以 GPG 或 OpenSSL 对文件加密。 [6]

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

作者 Shell WM / DE 编辑器 终端 终端复用 音频 资源监视 邮件 IRC 文件管理 RSS 阅读
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
benmezger zsh/bash i3-gaps emacs rxvt-unicode/alacritty tmux mopidy/ncmpcpp i3status-rs mu4e/neomutt/mbsync weechat
brisbin33 zsh xmonad vim rxvt-unicode screen dzen mutt irssi
BVollmerhaus fish i3-gaps kakoune kitty polybar ranger
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

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