dotfiles管理のモダンプラクティス2026

symlink + brew-fileでdotfilesを管理している人は多いと思う。動いているし、困っていない。でも「もっと良い方法があるのでは?」という漠然とした感覚もあるかもしれない。

この記事では、2026年現在のdotfiles管理ツールの選択肢を整理し、特にChezmoiとHome-Managerという2つのアプローチを比較する。

自前のsymlink管理で以下のような課題を感じたことはないだろうか。

マシン間の差異対応が面倒 - 仕事用MacBookと個人用Linuxマシンで.gitconfigのメールアドレスを変えたい。if文だらけのシェルスクリプトを書くか、マシンごとにブランチを分けるか。どちらもメンテナンスが辛くなる。

秘密情報の扱いが悩ましい - APIキーやSSH設定をdotfilesに含めたいが、GitHubにpushするのは怖い。.gitignoreで除外すると、新しいマシンで手動コピーが必要になる。

新マシンのセットアップが手作業の連続 - リポジトリをcloneして、symlinkを張るスクリプトを実行して、brew bundleして…。毎回微妙に手順を忘れて、何かが壊れる。

これらの課題を解決するために、dotfiles管理ツールは進化してきた。

dotfiles管理ツールの進化

generated_imgs/dotfiles-evolution.png

2010年代前半は手動コピーとシェルスクリプトの時代だった。その後、bare git repoやGNU Stowによるsymlink管理が普及し、2020年代に入るとChezmoiやYADMのようなテンプレート対応ツールが登場した。そして現在、Nix + Home-Managerによる宣言的アプローチも選択肢に入ってきている。

dotfiles管理ツールを理解する上で重要なのが、「symlink方式」と「コピー方式」の違いだ。

generated_imgs/dotfiles-symlink-vs-copy.png

Symlink方式(GNU Stow等) は、ホームディレクトリの.bashrcをdotfilesリポジトリ内のファイルへのsymlinkにする。変更は即座に反映される。シンプルだが、テンプレート処理や暗号化といった機能を追加しにくい。

コピー方式(Chezmoi) は、リポジトリ内の「ソース」からホームディレクトリの「ターゲット」へファイルを生成・コピーする。この間にテンプレート処理を挟めるため、マシンごとの差異吸収や秘密情報の展開が可能になる。

Chezmoiの作者は「symlinkは必要な場所でのみ使うべきで、すべてのdotfilesに使う必要はない」という設計思想を持っている。実際、一部のソフトウェアはsymlinkを正しく扱えないケースがある。

Chezmoi:実用重視の多機能ツール

ChezmoiはGoで書かれたdotfiles管理ツールで、GitHub上で17,000以上のスターを獲得している。名前はフランス語の「chez moi(私の家)」に由来する。

設計思想

Chezmoiの核となる考え方は以下の通り。

日常のワークフロー

generated_imgs/dotfiles-chezmoi-workflow.png

日常的な操作は3つのコマンドで完結する。

chezmoi edit ~/.bashrc    # ソースファイルを編集
chezmoi diff              # 差分を確認
chezmoi apply             # 変更を適用

chezmoi editはソースディレクトリ内のファイルを開く。編集後、chezmoi diffで「適用したらどう変わるか」を確認し、chezmoi applyで実際に適用する。

変更をリモートに同期するには、ソースディレクトリでgit commit & pushすればよい。chezmoi cdでソースディレクトリに移動できる。

マシン差異の吸収:テンプレート

Chezmoiの強力な機能の一つがテンプレートだ。Go言語のtext/template構文を使い、マシンごとに異なる設定を生成できる。

例えば、.gitconfigでメールアドレスをマシンごとに変えたい場合:

[user]
    name = Your Name
{{ if eq .chezmoi.hostname "work-macbook" }}
    email = work@company.com
{{ else }}
    email = personal@example.com
{{ end }}

OSによる分岐も可能だ:

{{ if eq .chezmoi.os "darwin" }}
# macOS固有の設定
{{ else if eq .chezmoi.os "linux" }}
# Linux固有の設定
{{ end }}

.chezmoi.tomlでカスタム変数を定義することもできる。マシンごとに異なる値を設定し、テンプレートから参照する。

秘密情報の管理:パスワードマネージャ連携

Chezmoiは多数のパスワードマネージャと連携できる。対応しているのは1Password、Bitwarden、LastPass、AWS Secrets Manager、Azure Key Vault、macOS Keychain、GNOME Keyringなど。

1Password連携の例:

[credential]
    helper = {{ onepasswordRead "op://Private/github-token/credential" }}

chezmoi apply実行時に1Password CLIが呼び出され、秘密情報が展開される。リポジトリには参照情報のみが含まれ、実際の秘密情報は含まれない。これにより、dotfilesリポジトリを安全に公開できる。

新マシンのセットアップ

新しいマシンでのセットアップは1コマンドで完了する。

sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply $GITHUB_USERNAME

このコマンドでChezmoiのインストール、リポジトリのclone、dotfilesの適用がすべて行われる。

さらに、run_once_プレフィックスを持つスクリプトを使えば、Homebrewのインストールやパッケージのセットアップも自動化できる。

Chezmoiが向いているケース

Home-Manager:宣言的アプローチの極致

Home-ManagerNixエコシステムの一部で、ホームディレクトリを宣言的に管理するツールだ。NixOS以外のLinuxやmacOSでも使える。

設計思想

Home-Managerの根底にあるのは宣言的プログラミングの思想だ。

generated_imgs/dotfiles-imperative-vs-declarative.png

命令的(Imperative)アプローチ - 「この設定をコピーして」「このテンプレートを展開して」と手順を指示する。Chezmoiはこちら。

宣言的(Declarative)アプローチ - 「最終状態はこうあるべき」を定義し、システムが現在の状態との差分を計算して適用する。Home-Managerはこちら。

宣言的アプローチの利点は再現性だ。同じ設定ファイルからは、必ず同じ環境が構築される。「このマシンでは動くのに、あのマシンでは動かない」という問題が原理的に発生しない。

日常のワークフロー

Home-Managerの基本的な流れは以下の通り。

# home.nixを編集
vim ~/.config/home-manager/home.nix

# 変更を適用
home-manager switch

home-manager switchを実行すると、Nixが設定ファイルを解析し、必要なパッケージのダウンロード、設定ファイルの生成、symlinkの作成をすべて行う。

重要な点として、生成された設定ファイルはイミュータブル(不変) だ。直接編集しても、次のswitchで上書きされる。すべての変更はhome.nixを経由する必要がある。

この「強制力」が再現性を保証する一方で、「ちょっと試してみたい」という場面では煩わしく感じることもある。

dotfiles + パッケージ管理の統合

Home-Managerの特徴は、dotfilesとパッケージ管理が統合されていることだ。

{
  programs.git = {
    enable = true;
    userName = "Your Name";
    userEmail = "you@example.com";
  };

  programs.neovim = {
    enable = true;
    plugins = with pkgs.vimPlugins; [
      telescope-nvim
      nvim-treesitter
    ];
  };
}

この設定で、gitとneovimのインストールと設定が同時に行われる。「このツールにはこの設定」という関係が一箇所に記述される。

学習コストと得られるもののトレードオフ

Home-Managerを使うには、Nix言語を学ぶ必要がある。これは決して小さなコストではない。

Nixは関数型言語であり、独自の概念(derivation、flake、overlay等)を持つ。公式ドキュメントも改善されてきているとはいえ、まだ学習しやすいとは言い難い。

しかし、一度習得すれば強力な再現性を手に入れられる。「3年前のプロジェクトを、当時と同じ環境で動かす」といったことが可能になる。dotfiles管理を超えて、開発環境全体の管理に応用できる。

Home-Managerが向いているケース

どちらを選ぶか

Chezmoi Home-Manager
学習コスト 低〜中
再現性 中(テンプレート依存) 高(宣言的保証)
柔軟性 高(任意のファイル形式) 中(Nix経由)
エコシステム パスワードマネージャ連携 Nixパッケージ全体
移行コスト 低(段階的移行可) 高(Nix導入必要)

Chezmoiを選ぶべき状況

Home-Managerを選ぶべき状況

ハイブリッドという選択肢 もある。NixOS/macOSではHome-Manager、それ以外の環境(一時的なサーバー、Windows)ではChezmoiを使う。両方のリポジトリを持ち、状況に応じて使い分ける。

移行のステップ

既存のsymlink管理からChezmoiへ移行する場合の手順を示す。

Step 1: Chezmoiの初期化

brew install chezmoi  # または sh -c "$(curl -fsLS get.chezmoi.io)"
chezmoi init

Step 2: 既存ファイルの追加

chezmoi add ~/.bashrc
chezmoi add ~/.gitconfig

これでソースディレクトリにファイルがコピーされる。既存のsymlinkは実ファイルに置き換わる。

Step 3: テンプレート化(必要に応じて)

マシン差異がある箇所をテンプレートに変換する。拡張子を.tmplにして、条件分岐を追加する。

Step 4: 秘密情報の移行

パスワードマネージャ連携を設定し、ハードコードされていた秘密情報を参照に置き換える。

段階的に移行できるのがChezmoiの利点だ。一度にすべてを移行する必要はない。

まとめ

dotfiles管理は「動けばいい」から「再現性と安全性を担保する」フェーズに移行しつつある。

Chezmoiは実用性と学習コストのバランスが良く、多くのケースで最初の選択肢になる。Home-Managerは学習コストは高いが、宣言的プログラミングの恩恵を最大限に受けられる。

どちらを選ぶにせよ、「設定をコードとして管理する」という考え方(Infrastructure as Code)は共通している。まずはChezmoiから始めて、必要に応じてHome-Managerに移行する、という段階的移行も有効だ。

関連概念

参考リンク

抽出された概念