ドットファイル
ユーザー固有のアプリケーション設定は、伝統的に ドットファイル(ファイル名がドットで始まるファイル) に保存されています。変更を追跡し、さまざまなホスト間でドットファイルを同期するために、Git などの バージョン管理システム でドットファイルを管理することは一般的な方法です。ドットファイルを管理するには、さまざまな方法があります(例えば、ホームディレクトリでドットファイルを直接追跡する、サブディレクトリに保存する、シェルスクリプト や専用ツール でファイルをシンボリックリンク/コピー/生成するなど)。ドットファイルの管理方法とは別に、この記事には、ドットファイルのリボジトリのリスト も含まれています。
目次
ドットファイルを Git で直接追跡する
ドットファイルを直接 Git で追跡することの利点は、Git だけで済み、シンボリックリンクを必要としないことです。デメリットは、ホスト固有の設定 では一般的に複数の branches に変更をマージする必要があるということです。
このアプローチを実現する最もシンプルな方法は、ホームディレクトリに直接 Git リポジトリを初期化して、gitignore(5) パターンの *
でデフォルトで全てのファイルを無視することです。しかし、この方法には二つの欠点があります。ホームディレクトリに他の Git リポジトリがある場合、混乱することがあります(例えば、リポジトリの初期化を忘れると、突然 dotfile リポジトリを操作することになります。)また、(無視されるので)現在のディレクトリのどのファイルが追跡されていないかを簡単に確認することができなくなりました。
これらの欠点がない別の方法として、Ask Hacker News で人気のある "bare repository and alias method" があります。これは、3つのコマンドでセットアップすることができます。
$ git init --bare ~/.dotfiles $ alias config='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME' $ config config status.showUntrackedFiles no
そうすると、作成した エイリアス でドットファイルを管理することができます。もし Bash を使っていてこのエイリアスを bash 補完したい場合は、bash-complete-aliasAUR をインストールして、エイリアスと次の行を ~/.bashrc
に追加してください。
$ complete -F _complete_alias config
bash で補完させるもう一つの方法は、~/.bashrc
に以下を追加することです。(https://askubuntu.com/a/642778] から引用)
source /usr/share/bash-completion/completions/git __git_complete config __git_main
ホスト固有の設定
様々なマシンで dotfiles を同期させる際によくある問題が、ホスト固有の設定です。
Git では、すべての共有設定を master ブランチで管理し、個々のマシンにはマシン固有のブランチをチェックアウトすることでこれを解決できます。ホスト固有の設定はマシン固有のブランチにコミットすることができます。共有設定が master ブランチで変更された場合、マシンごとのブランチは更新された master の上にリベースされる必要があります。
シェル設定ファイル のような設定スクリプトでは、条件付きロジックを使用することができます。例えば、Bash スクリプト (すなわち .bashrc
) は、マシン名 (またはタイプ、カスタム変数など) に応じて異なる設定を適用することができます。
if [[ "$(hostname)" == "archlaptop" ]]; then # laptop specific commands here else # desktop or server machine commands fi
同様のことは、.Xresources でも実現できます。[1]
Git ブランチのリベースが面倒だと感じる場合は、ファイルのグループ化 をサポートする ツール や、さらに柔軟性を求めるなら 加工処理 を行うツールを使用するとよいでしょう。
ツール
- ファイルのグループ化
- 設定ファイルを設定グループ (プロファイルまたはパッケージとも呼ばれる) にグループ化する方法です。
処理
- ホストによってカスタマイズできるように、設定ファイルを処理するツールもあります。
名前 | パッケージ | 言語 | ファイルのグループ化 | 処理 |
---|---|---|---|---|
chezmoi | chezmoi | Go | ディレクトリベース | Go テンプレート |
dot-templater | dot-templater-gitAUR | Rust | ディレクトリベース | カスタムシンタックス |
dotdrop | dotdropAUR | Python | 構成ファイル | Jinja2 |
dotfiles | dotfilesAUR | Python | No | No |
Dots | dots-managerAUR | Python | ディレクトリベース | カスタム追加ポイント |
dotter | dotter-rsAUR | Rust | 構成ファイル | Handlebars |
dt-cli | dt-cliAUR | Rust | 構成ファイル | Handlebars |
GNU Stow | stow | Perl | ディレクトリベース [2] | No |
Mackup | mackupAUR | Python | アプリケーションごとに自動 | No |
mir.qualia | mir.qualiaAUR | Python | No | カスタムブロック |
rcm | rcmAUR | Perl | ディレクトリベース (ホストまたはタグによる) | No |
Git を wrapping するツール
Git に不安がある場合は、バージョン管理システムを (多かれ少なかれ) 抽象化するこれらのツールのいずれかを使用することをお勧めします。
名前 | パッケージ | 言語 | ファイルのグループ化 | 処理 |
---|---|---|---|---|
dotbare | dotbareAUR | Shell (fzf) | リポジトリ的 | No |
dotgit | dotgitAUR | Python | ファイル名ベース | No |
homeshick | homeshick-gitAUR | Bash | リポジトリ的 | No |
homesick | – | Ruby | リポジトリ的 | No |
Pearl | pearl-gitAUR | Python | リポジトリ的 | No |
vcsh | vcsh | Shell | リポジトリ的 | No |
yadm(1) | yadm | Bash | ファイル名ベース (by class/OS/distro/hostname/user)[3] |
組み込みのテンプレート /Jinja2/ESH [4] (オプション) |
他のツール
- dotbot — ドットファイルリポジトリの git サブモジュールとしてインストールすることができるミニマルなドットファイルマネージャ。
- https://github.com/anishathalye/dotbot || パッケージが存在しないか AUR で検索
- dotdrop — 様々なホストのドットファイルを管理するツール。
- dotfiles — $HOME のドットファイルのシンボリックリンクを簡単に管理することができるツール。
- dotgit — ドットファイルを管理するための包括的なソリューション。
- dots — 計画的にドットファイルを管理するためのポータブルツール。
- etckeeper — システム全体の設定が存在する
/etc
をバージョン管理します。バージョン管理ソフトウェアが無視するパーミッションやモードを記録することで動作します。様々な SCM システムをバックエンドとして使用可能。フックを使用することでシステムがアップグレードされる前にリポジトリに変更を自動的にコミットできます。
- GNU Stow — リポジトリのドットファイルから
$HOME
ツリーにシンボリックリンクを作成します。詳しくは [6] を見てください。
- homeshick — Bash で書かれた git ドットファイル同期ツール。
- mackup — アプリケーションの設定を同期する小さな Python ユーティリティ。
- Pearl — ドットファイルやプラグイン、プログラムあるいは git から入手できるあらゆるコードのパッケージマネージャ。システム間でパッケージを簡単に共有・同期することができ、すぐに使える状態にできます。
- rcm — リポジトリから $HOME ツリーにドットファイルのシンボリックリンクを作成できます。
- vcsh — 全てのドットファイルをひとつのリポジトリで管理するのではなく、様々なモジュール (Emacs の設定や zsh の設定など) を別々のリポジトリに分割することで管理を分けることができます。git でしか動作しません。
- yadm — ひとつの Git リポジトリを使って複数のシステムでファイルを管理します。特定の OS やホストで別のファイルを使うようにすることができます。機密情報を暗号化することでリポジトリに安全に保存することが可能。
複数のマシンでドットファイルを管理する
共有する設定をマスターブランチで管理して、マシンごとのブランチを作成することで、カスタマイズを加えながら様々なマシンのドットファイルを管理するという方法があります。特定のマシンの設定は専用のブランチにコミットし、共通設定はマスターブランチに追加します。そしてマスターを更新したら各マシンのブランチをリベースします。
また、特定のマシンの設定を特殊なコメントブロックに記述して qualia を使って自動的にアンコメントさせるという方法もあります。この方法は手間が少ない上にマージによる衝突が発生しません。
機密情報
ときとして、ソフトウェアはパスワードを平文で設定ファイルに保存することがあります。そのような場合、git clean フィルターを利用することで機密情報を間違ってコミットする危険を減らすことができます。例えば、以下の .gitattributes ファイルは “some-dotfile” ファイルにフィルターを適用します:
.gitattributes
some-dotfile filter=remove-pass
“some-dotfile” ファイルが git にチェックインされた場合、git は “remove-pass” フィルターを実行します。フィルターは .git/config
に以下のように定義してください:
.git/config
[filter "remove-pass"] clean = "sed -e 's/^password=.*/#password=TODO/'"
リポジトリ
作者 | シェル | WM / DE | エディタ | ターミナル | マルチプレクサ | オーディオ | モニター | メール | IRC |
---|---|---|---|---|---|---|---|---|---|
Ambrevar | zsh | awesome | emacs | rxvt-unicode | cmus | htop/vicious | mutt | ||
awal | fish | i3 | vim | sakura | tmux | i3status | The Lounge | ||
ayekat | zsh | karuiwm | vim | rxvt-unicode | tmux | ncmpcpp/mpd | karuibar | mutt | irssi |
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 | |
cinelli | zsh | dwm | vim | termite-git | pianobar | htop | mutt-kz | weechat | |
dillebidum | zsh/mksh | dwm/i3 | vim/vis | st | tmux/dvtm | ncmpcpp/mpv | htop/i3blocks | mutt | ii/irssi |
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 | ||
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 | ||
izmntuk | zsh | xfce4 | vim | rxvt-unicode/yaft | tmux | cmus | xfce4-panel | irssi | |
jasonwryan | bash/zsh | dwm | vim | rxvt-unicode | tmux | ncmpcpp | custom | mutt | irrsi |
jdevlieghere | zsh | xmonad | vim | terminal | tmux | htop | mutt | weechat | |
jelly | zsh | i3 | vim | termite | tmux | ncmpcpp | mutt-kz-git | weechat | |
maximbaz | zsh | i3-gaps | neovim | alacritty | tmux | py3status | thunderbird | ||
meskarune | bash | herbstluftwm | vim | rxvt-unicode | screen | conky | weechat | ||
neersighted | zsh | i3 | vim | rxvt-unicode | tmux | ncmpcpp | htop | mutt | irssi |
OK100 | bash | dwm | vim | rxvt-unicode | cmus | conky, dzen | mutt | weechat | |
pid1 | zsh | dwm | neovim | st | tmux | custom | mutt | weechat | |
polyzen | zsh | i3 | vim | termite | tmux | i3status | weechat | ||
sistematico | zsh/fish/bash | i3 Gaps | vim/nano | termite | tmux | ncmpcpp | polybar | mutt | weechat |
swalladge | zsh/bash | i3 | neovim/vim | termite | tmux | cmus | i3pystatus | mutt | |
thiagowfx | bash/zsh | i3 | vim/emacs | rxvt-unicode | ncmpcpp | i3blocks | |||
unexist | zsh | subtle | vim | rxvt-unicode | ncmpcpp | mutt | irssi | ||
vodik | zsh | xmonad | vim | termite-git | tmux | ncmpcpp | custom | mutt | weechat |
w0ng | zsh | dwm | vim | rxvt-unicode | tmux | ncmpcpp | custom | mutt | irssi |
Wintervenom | bash | herbstluftwm | vim | rxvt-unicode | screen | mpd (mpc-utils) | hlwm-dzen2 | mutt | weechat |
wolfcore | bash | dwm | vim | rxvt-unicode | tmux | cmus | custom | weechat | |
zendeavor | zsh | i3 | vim | rxvt-unicode | tmux | ncmpcpp | i3status | weechat |
参照
- gregswiki:DotFiles
- XMonad Config Archive
- dotshare.it
- dotfiles.github.io
- terminal.sexy - ターミナルのカラースキームデザイナー