WebDesigner's Memorandumウェブデザイナーの備忘録

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、プロンプト、関数など)
.gitconfigGitの設定(ユーザー名、メール、エイリアス、デフォルトブランチなど)
.vimrc / init.luaエディタの設定(Vim / Neovim)
.configさまざまなアプリ・ツールの設定が入ったフォルダ
.config/karabiner/Karabiner-Elementsのキーリマッピング設定
.editorconfigエディタ横断のフォーマット設定
BrewfileHomebrewのパッケージリスト

.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 Stowyadmchezmoi
方式手動でシンボリックリンクを作成シンボリックリンクを自動管理bareリポジトリ(Gitラッパー)管理コピー
インストール不要brew install stowbrew install yadmbrew 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: 497799835

Mac App Storeのアプリも書けるのが地味に嬉しいポイントです。
書き出し・インストールには別途masコマンド(brew install masでインストール)が必要になります。

新しいMacをセットアップするときは、下記のコマンドでBrewfileに記載されたパッケージをまとめてインストールできます。

brew bundle install --file=~/dotfiles/Brewfile

このBrewfileをdotfilesリポジトリに含めておけば、アプリのインストールも含めて環境構築の大半を自動化できます。

しかし、何も気にせず使っていると、試しに入れただけのツールがそのまま買い換え先の新しいMacにもインストールされてしまいます。
定期的に使っていないものは削除するようにしましょう。

まとめ

dotfilesの管理は、最初に仕組みを作るところまでが大変ですが、一度やり始めてしまえばあとはほとんど手間がかかりません。

新しいMacや検証用マシンのセットアップが格段にラクになりますし、設定の変更履歴がGitに残っていくので、後から「なぜこの設定にしたんだっけ」と振り返るときの安心感もあります。

chezmoiは学習コストが少し高めですが、テンプレートとシークレット管理まで含めて1ツールにまとまっているので、長く使うほど元が取れると思います。

少なくとも、1から全部セットアップするよりは遙かにラクなので、まだ管理していない人は試してみてはいかがでしょうか。

著者について

プロフィール画像

サイトウ マサカズ@31mskz10

1997年生まれ。2016年から専門学校でデザインについて勉強。卒業後は神戸の制作会社「N'sCreates」にウェブデザイナーとして入社。このブログでは自分の備忘録も兼ねて、ウェブに関する記事や制作環境を効率的に行うための記事を書いています。

Twitterをフォロー Facebookでいいね