dotfiles管理のモダンプラクティス2026
symlink + brew-fileでdotfilesを管理している人は多いと思う。動いているし、困っていない。でも「もっと良い方法があるのでは?」という漠然とした感覚もあるかもしれない。
この記事では、2026年現在のdotfiles管理ツールの選択肢を整理し、特にChezmoiとHome-Managerという2つのアプローチを比較する。
symlink管理の「よくある課題」
自前のsymlink管理で以下のような課題を感じたことはないだろうか。
マシン間の差異対応が面倒 - 仕事用MacBookと個人用Linuxマシンで.gitconfigのメールアドレスを変えたい。if文だらけのシェルスクリプトを書くか、マシンごとにブランチを分けるか。どちらもメンテナンスが辛くなる。
秘密情報の扱いが悩ましい - APIキーやSSH設定をdotfilesに含めたいが、GitHubにpushするのは怖い。.gitignoreで除外すると、新しいマシンで手動コピーが必要になる。
新マシンのセットアップが手作業の連続 - リポジトリをcloneして、symlinkを張るスクリプトを実行して、brew bundleして…。毎回微妙に手順を忘れて、何かが壊れる。
これらの課題を解決するために、dotfiles管理ツールは進化してきた。
dotfiles管理ツールの進化

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

Symlink方式(GNU Stow等) は、ホームディレクトリの.bashrcをdotfilesリポジトリ内のファイルへのsymlinkにする。変更は即座に反映される。シンプルだが、テンプレート処理や暗号化といった機能を追加しにくい。
コピー方式(Chezmoi) は、リポジトリ内の「ソース」からホームディレクトリの「ターゲット」へファイルを生成・コピーする。この間にテンプレート処理を挟めるため、マシンごとの差異吸収や秘密情報の展開が可能になる。
Chezmoiの作者は「symlinkは必要な場所でのみ使うべきで、すべてのdotfilesに使う必要はない」という設計思想を持っている。実際、一部のソフトウェアはsymlinkを正しく扱えないケースがある。
Chezmoi:実用重視の多機能ツール
ChezmoiはGoで書かれたdotfiles管理ツールで、GitHub上で17,000以上のスターを獲得している。名前はフランス語の「chez moi(私の家)」に由来する。
設計思想
Chezmoiの核となる考え方は以下の通り。
- ファイルは正しい場所に実体として置く - symlinkではなく、実際のファイルを生成する
- ソースとターゲットを分離する - リポジトリ内のソースファイルと、ホームディレクトリのターゲットファイルを明確に区別
- テンプレートで差異を吸収する - マシンごとの違いは条件分岐で処理
- 秘密情報はパスワードマネージャから取得 - リポジトリに秘密情報を含めない
日常のワークフロー

日常的な操作は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が向いているケース
- macOS、Linux、Windowsなど複数OSを使う
- 秘密情報をdotfilesに含めたいが、安全に管理したい
- 学習コストを抑えつつ、高度な機能も使いたい
- 既存のsymlink管理から段階的に移行したい
Home-Manager:宣言的アプローチの極致
Home-ManagerはNixエコシステムの一部で、ホームディレクトリを宣言的に管理するツールだ。NixOS以外のLinuxやmacOSでも使える。
設計思想
Home-Managerの根底にあるのは宣言的プログラミングの思想だ。

命令的(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が向いているケース
- 完全な再現性を求める
- Nixエコシステムに興味がある、または既に使っている
- 学習コストを払う覚悟がある
- dotfilesだけでなく、開発環境全体を宣言的に管理したい
どちらを選ぶか
| Chezmoi | Home-Manager | |
|---|---|---|
| 学習コスト | 低〜中 | 高 |
| 再現性 | 中(テンプレート依存) | 高(宣言的保証) |
| 柔軟性 | 高(任意のファイル形式) | 中(Nix経由) |
| エコシステム | パスワードマネージャ連携 | Nixパッケージ全体 |
| 移行コスト | 低(段階的移行可) | 高(Nix導入必要) |
Chezmoiを選ぶべき状況
- すぐに始めたい
- 複数OS(特にWindows含む)で使いたい
- 既存のsymlink管理から段階的に移行したい
- 秘密情報管理が主な課題
Home-Managerを選ぶべき状況
- 完全な再現性が必要
- 開発環境全体をコード化したい
- Nixを学ぶモチベーションがある
- 長期的な投資として環境構築を考えている
ハイブリッドという選択肢 もある。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に移行する、という段階的移行も有効だ。
関連概念
- symlinkベースとコピーベースのファイル配置戦略
- ソースとターゲットの分離
- テンプレート駆動設定
- パスワードマネージャ連携による秘密情報管理
- dotfilesとパッケージ管理の統合
- マシン差異の吸収
- 宣言的プログラミング
- 再現性
- 冪等性
- イミュータビリティ
- Infrastructure as Code
- 段階的移行
参考リンク
- Chezmoi公式サイト
- Home-Manager Manual
- dotfiles.github.io - General-purpose dotfiles utilities
- Chezmoi Comparison Table
抽出された概念
- symlinkベースとコピーベースのファイル配置戦略 - dotfilesを目的地に配置する2つの戦略(既存)
- テンプレート駆動設定 - テンプレートから動的に設定を生成しマシン差異を吸収するアプローチ(既存)
- dotfilesとパッケージ管理の統合 - 設定ファイルとパッケージを一箇所で宣言的に管理する設計(既存)
- 宣言的プログラミング - 最終状態を宣言することでHome-Managerが再現性を保証するパラダイム(既存)
- 再現性 - 同じ設定から必ず同じ環境が構築されること(既存)
- 段階的移行 - 既存のsymlink管理からChezmoiへの段階的な移行戦略(既存)