跳至內容

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

另見[編輯 | 編輯原始碼]