dotfiles
用户对于程序的配置通常存储在所谓的点文件(以 .
开头的文件)中。通常的做法是用版本控制系统(如 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 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 工具的帮助,我们可以通过以下方式解决这个问题:我们可以维护一个包含通用配置文件的主分支,同时为设备间不同的特定配置文件创建单独的分支。维护时将通用配置文件的变动提交到前者,而将与设备相关的配置文件提交到后者。也就是说,每个设备的专用分支都是在保持通用分支更新的基础上单独建立的。
某些配置文件中,比如在 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 | 无 |
用户仓库[编辑 | 编辑源代码]
作者 | 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 |
另见[编辑 | 编辑源代码]
- gregswiki:DotFiles
- XMonad Config Archive
- dotshare.it
- dotfiles.github.io
- terminal.sexy - Terminal color scheme designer