chezmoi(シェモア)で始めるdotfiles管理

Macの環境構築をするとき、シェルやエディタの設定を一からやり直すのは面倒です。
.zshrcや.gitconfigといった設定ファイルをバックアップしておらず、Macが故障したり、新しいMacを手に入れるたびに同じ作業を繰り返している人もいるのではないでしょうか。
今回は「dotfiles(ドットファイルズ)」と呼ばれる設定ファイルを管理する考え方と、それらを管理するツールの「chezmoi(シェモア)」について紹介します。
dotfilesとは
.zshrcや.gitconfig、.vimrcなど、シェル・Git・エディタの設定ファイルなど、ドットから始まるファイルは「隠しファイル」や「不可視ファイル」と呼ばれ、Finderではデフォルトで表示されません。
しかし、macOSの場合はshift + command + .(ドット)で表示・非表示を切り替えられます。
特にホームディレクトリ(自分のmacOSユーザー名のフォルダ)で隠しファイルを表示してみると、大量のファイルがあると思います。
そして、これらの設定ファイルをGitリポジトリでまとめて管理する仕組み、およびそのリポジトリ自体を「dotfiles(ドットファイルズ)」と呼びます。
GitHubで「dotfiles」というリポジトリ名で公開している人も多いです。
dotfilesを管理するメリット
dotfilesを管理する最大のメリットはマシン間の同期です。
新しいMacをセットアップするときに、GitHubなどに置いておいたリポジトリをクローンするだけで自分の設定を一通り戻せます。
また、Gitで管理しているのでバージョン管理もできます。
「ちょっと設定を変えてみたけど馴染まなかった」というときに前の状態に戻すのも簡単ですし、変更履歴を見返せばどんな試行錯誤をしてきたかも分かります。
dotfilesで管理するもの
なんでもかんでも隠しファイルを管理するのではなく、あくまで同期したい設定ファイルだけを選んで管理します。
具体的に管理する代表的なファイルは下記の通りです。
| ファイル | 用途 |
|---|---|
.zshrc / .bashrc | シェルの設定(エイリアス、PATH、プロンプト、関数など) |
.gitconfig | Gitの設定(ユーザー名、メール、エイリアス、デフォルトブランチなど) |
.vimrc / init.lua | エディタの設定(Vim / Neovim) |
.config | さまざまなアプリ・ツールの設定が入ったフォルダ |
.config/karabiner/ | Karabiner-Elementsのキーリマッピング設定 |
.editorconfig | エディタ横断のフォーマット設定 |
Brewfile | Homebrewのパッケージリスト |
.config/ディレクトリ以下のファイルもdotfilesの管理対象になります。
最近のツールは.config/配下に設定を置くものが増えているので、このフォルダを管理対象にするとさまざまなツールの設定を一気に同期できます。
ターミナルアプリのGhosttyの設定ファイル(~/.config/ghostty/config)もこれにあたります。
さらに最近は.claudeや.agentsなど、AIエージェントのスキルやルール設定をdotfilesで管理している人も見かけます。
しかし、.claudeフォルダをまるごと管理しようとするとファイル数が膨大になりますし、ログ的なものまで入ってしまうため、.claude/skillsだけ管理するなど、ある程度絞った方が良さそうです。
dotfilesで管理してはいけないもの
セキュリティの観点から、認証情報を含むファイルはdotfilesに入れてはいけません。
- SSH秘密鍵(
~/.ssh/id_ed25519、~/.ssh/id_rsa) - APIトークンやシークレット(GitHub PAT、AWSクレデンシャルなど)
.envファイル(パスワードやデータベース接続情報を含むもの)
秘密鍵は一度漏洩すると取り返しがつかないため、.gitignoreで確実に除外するようにしましょう。
個人的には何かあると怖いので、プライベートリポジトリにして外部公開はしないようにしています。
仮に公開することがあっても、別で「dotfiles-public」のような公開用のリポジトリを別で作って、チェックしたものを公開していくと思います。
管理ツールの比較
dotfilesの管理方法は、手動で管理する方法から専用ツールを使う方法まで幅があります。
代表的な選択肢を比較すると下記の通りです。
| 項目 | 手動シンボリックリンク | GNU Stow | yadm | chezmoi |
|---|---|---|---|---|
| 方式 | 手動でシンボリックリンクを作成 | シンボリックリンクを自動管理 | bareリポジトリ(Gitラッパー) | 管理コピー |
| インストール | 不要 | brew install stow | brew install yadm | brew install chezmoi |
| 料金 | 無料 | 無料 | 無料 | 無料 |
| 学習コスト | 低い | 低い | 中程度 | やや高い |
| テンプレート | なし | なし | Jinja2系(j2)など | Goテンプレート |
| シークレット管理 | なし | なし | GPG等で暗号化 | 1Password / Keychain等と連携 |
| OS別の切り替え | 手動で対応 | ディレクトリで分離 | Alternateファイル | テンプレートの条件分岐 |
私の場合はchezmoiを使っています。
最近はAIに「このファイルをchezmoiでこう管理したい」と聞けばテンプレートの書き方をすぐ教えてくれますし、シークレット管理や条件分岐まで含めて1つのツールでまとまっているのがラクなので、これに落ち着きました。
Dropboxではダメなのか?
dotfilesをDropboxで同期し、そこからシンボリックリンクを貼れば良いのではと思う人もいるかもしれません。
私もmacOSアプリケーションの設定の多くはDropboxで同期しています。
しかし、dotfilesはファイル数が多くなりがちで、複数マシンで同時に編集すると同期が衝突しやすくなります。
うっかり古い方の内容で上書きされて、せっかくのターミナル設定が動かなくなる、なんてことも起こりがちです。
Dropboxにもバージョン履歴の機能はありますが、コミット単位で意味のあるまとまりを残せるGitに比べると差分の見やすさで劣ります(動かなくなっても差分を戻せば動くようになる)。
リアルタイム同期が必須な場面でもないですし、dotfilesに関してはGit管理の方が合っているかなと思っています。
手動シンボリックリンクの方法
専用ツールを使わない一番シンプルな方法が手動でのシンボリックリンクです。~/dotfiles/のようなディレクトリを用意してそこにファイルを集めて、ホームディレクトリからシンボリックリンクを貼ります。
# dotfilesリポジトリを作成
mkdir ~/dotfiles
cp ~/.zshrc ~/dotfiles/.zshrc
cp ~/.gitconfig ~/dotfiles/.gitconfig
# 元のファイルを退避してシンボリックリンクを作成
mv ~/.zshrc ~/.zshrc.backup
ln -s ~/dotfiles/.zshrc ~/.zshrc仕組みが分かりやすく、コードを見るだけで何をしているか把握できます。
しかし、ファイルが増えるたびにリンクの管理スクリプトを書き足したり、マシンごとの差分を自分で吸収したりする必要が出てきて、結局は何かしらのツールに乗り換えたくなるパターンが多いです。
chezmoi

chezmoi(シェモア)は、テンプレートやシークレット管理まで含めて1つのツールでまかなえる、高機能なdotfiles管理ツールです。
読み方が全然覚えられないですが、「chez moi」がフランス語で「私の家」「私のところ」を意味するそうです。
MITライセンスのオープンソースで、macOS / Linux / Windows に対応しています。
インストール方法
Homebrewを使っている場合は、下記のコマンドでインストールできます。
brew install chezmoiさまざまなOS・方法が用意されているので、他のダウンロード方法は公式サイトのインストール方法を参照ください。
管理コピー方式
chezmoiの特徴的な点は、ソースディレクトリ(デフォルトは~/.local/share/chezmoi)にファイルを集めておき、chezmoi applyで実際のホームディレクトリに反映する仕組みになっているところです。
公式ドキュメントでは、ソースディレクトリの内容を「ソースステート」、ホーム側の最終状態を「ターゲットステート」と呼んでいます。chezmoi applyを実行すると、ソースステートからターゲットステートが計算されてホームディレクトリに展開されます。
基本コマンド
よく使うコマンドだけ抜粋すると下記の通りです。
chezmoi init # 初期化(GitHubユーザー名を渡せばリポジトリのクローンも兼ねる)
chezmoi add ~/.zshrc # ファイルを管理対象に追加
chezmoi edit ~/.zshrc # ソースディレクトリ側のファイルを編集
chezmoi apply # ソースディレクトリの内容をホームディレクトリに反映
chezmoi cd # ソースディレクトリでサブシェルを起動(git操作用)chezmoi init https://github.com/username/dotfiles.git --applyのように書くと、新しいマシンでも1コマンドでクローンから反映までいけるので、初期セットアップがかなりラクです。
テンプレートでマシンごとに設定を切り替える
chezmoiはGoのtext/template構文を拡張したテンプレートエンジンを内蔵しています。
ファイル名末尾に.tmplを付けると、その中で条件分岐や変数展開ができます。
例えば.gitconfig.tmplの中身を下記のように書けば、ホスト名で仕事用と個人用のメールアドレスを切り替えられます。
[user]
name = Your Name
{{- if eq .chezmoi.hostname "work-mac" }}
email = you@example-work.com
{{- else }}
email = you@example.com
{{- end }}「マシンごとにファイルをコピーし分ける」のではなく、「1つのソースから複数のターゲットを生成する」という発想なので、設定の重複が減ります。
シークレットを安全に管理する
chezmoiは1Password、macOSのKeychain、Bitwardenなどのパスワードマネージャーと連携できます。
テンプレート内からパスワードマネージャーの値を呼び出して、生成されたファイルにだけ秘密情報を埋め込む形になります。
リポジトリ自体には平文の秘密情報を一切置かずに済むので、Gitで履歴を残しても安心です。
私の場合は1Passwordを併用しているので、APIトークンなどはchezmoiから1Passwordを参照する形にしています。
学習コストは高め
機能が豊富な反面、学習コストはやや高めです。
ソースステート・ターゲットステートの概念や、テンプレートを書くために最低限のGoテンプレート構文を覚える必要があります。
しかし、最近はAIに具体的にやりたいことを伝えればテンプレートを書いてくれます。
そこまで気合を入れて学ばなくても、必要なときに必要な分だけ調べたり、AIに書いて貰えば十分使えます。
Brewfileも一緒に管理する
dotfilesと一緒に管理しておきたいのが、Homebrewでインストールしているパッケージの一覧です。
Homebrew公式のbrew bundleコマンドを使うと、Brewfileという1つのファイルでインストール済みパッケージをまとめて管理できます。
現在インストールされているパッケージからBrewfileを書き出すコマンドは下記です。
brew bundle dump --describe --file=~/dotfiles/Brewfile--describeを付けると各行に説明コメントが付くので、後から見返したときに「これは何のためのツールだっけ」とならずに済みます。
Brewfileの中身は下記のようになります。
# CLIツール
brew "git"
brew "starship"
brew "stow"
# GUIアプリ
cask "firefox"
cask "visual-studio-code"
cask "keyboard-maestro"
# Mac App Storeのアプリ(masコマンドが必要)
mas "Xcode", id: 497799835Mac App Storeのアプリも書けるのが地味に嬉しいポイントです。
書き出し・インストールには別途masコマンド(brew install masでインストール)が必要になります。
新しいMacをセットアップするときは、下記のコマンドでBrewfileに記載されたパッケージをまとめてインストールできます。
brew bundle install --file=~/dotfiles/BrewfileこのBrewfileをdotfilesリポジトリに含めておけば、アプリのインストールも含めて環境構築の大半を自動化できます。
しかし、何も気にせず使っていると、試しに入れただけのツールがそのまま買い換え先の新しいMacにもインストールされてしまいます。
定期的に使っていないものは削除するようにしましょう。
まとめ
dotfilesの管理は、最初に仕組みを作るところまでが大変ですが、一度やり始めてしまえばあとはほとんど手間がかかりません。
新しいMacや検証用マシンのセットアップが格段にラクになりますし、設定の変更履歴がGitに残っていくので、後から「なぜこの設定にしたんだっけ」と振り返るときの安心感もあります。
chezmoiは学習コストが少し高めですが、テンプレートとシークレット管理まで含めて1ツールにまとまっているので、長く使うほど元が取れると思います。
少なくとも、1から全部セットアップするよりは遙かにラクなので、まだ管理していない人は試してみてはいかがでしょうか。

Bartender 4のShow for Updates機能を使って、AirPodsに接続しているときだけ「ToothFairy」のアイコンを表示させる
macOSのスクリーンショット音やゴミ箱移動時の効果音(サウンドエフェクト)をオフにする方法
Zoomで画面共有が始まると自動でフルスクリーンになるのをオフにする方法
OnyXでターミナルを使わずにmacOSの詳細設定を行う
新しいMacBook Proを購入して移行するときにやること|コーディングに必要な開発環境を整える
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
無料のSVGビューワーの「Gapplin」でSVG画像を確認する
iTerm2でよく使うアクションやスニペットの設定ができる環境設定の「Shortcuts」タブ
Macの外部ディスプレイで特定の画面だけミラーリングさせる方法
Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
chezmoi(シェモア)で始めるdotfiles管理
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」
Keyboard Maestroの変数基礎
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理