chezmoiで環境をまたぐdotfiles管理がとても快適になった話
dotfilesの管理、ツラくない?
dotfiles の管理、どうしてますか。
dotfilesで管理し始めた当初は「仕事のPCと個人のPCの開発環境が整っていると楽だな〜」くらいで管理を始めたのですが、こう転職があったり副業があったり、個人にもノートがあったりデスクトップがあったりと、環境が多くなっていくと途端に面倒になってきます。
これをGitブランチで最初は管理していたんですが、どんどんカオスになっていきました。
「あーもう!全部手動でコピーしたろか!」みたいな気持ちになることも多々。
chezmoiいいじゃん
素のdotfilesを管理するんじゃなくて、なんかイケてる仕組み、特に複数環境に強い仕組みないかな〜と探しているところで、chezmoiをみつけました。他にもいくつか候補があったのですが、1Passwordとうまく連携できるところが個人的にかなり大きなキーになり、乗り換えることにしました。
chezmoiをさわる
インストール
Macならbrewで一発です。
brew install chezmoiおしまい。ドキュメントも充実していてるし、頻繁にメンテもされてるし、いいですね。
セットアップ
chezmoi initこれで ~/.local/share/chezmoi にローカルリポジトリが作られます。
GitHubで管理したい場合は、空のリポジトリを作って chezmoi cd した後に git remote add とかすればOK。
使い方
例えば .zshrc を管理下に置くには:
chezmoi add ~/.zshrcすると、Sourceディレクトリに dot_zshrc という名前でコピーされます。
以降は、以下のコマンドで編集・適用を行います。
- 編集:
chezmoi edit ~/.zshrc(保存すると自動でapplyされる) - 適用:
chezmoi apply(Sourceの内容をローカルに反映) - 更新:
chezmoi update(リモートリポジトリから pull して apply)
1Password連携で秘密情報をGit管理外へ
これが今回chezmoiを選んだ最大の理由、1Password連携です。 APIキーやアクセストークンをGitにコミットせず、かといって手動管理もせず、テンプレート機能を使って動的に埋め込みます。 最近だと、会社のPCと個人のPCのOpenAIのAPIキーが違うよ〜みたいな、とりわけAIツールのキーを使い分けたい場面が増えましたね。
1. 1Password CLIの準備
まず、CLIツール op をインストールしてログインしておきます。
brew install 1password-cliop signin2. 秘密リファレンス (UUID) の取得
埋め込みたいアイテム(OpenAIのAPIキーを例にしましょう)のIDを特定します。 CLIからUUIDを引く方法もありますが、デスクトップアプリからやるのが個人的には楽です。 設定 > 開発者 > 「1Password CLIと統合」をONにしておくことで、アイテムから「秘密参照をコピーする」という事ができます。これを行うと
"op://Private/hogehoge/fugafuga"みたいなものが取得できます。

3. テンプレートへの埋め込み
ファイルにテンプレート機能を持たせるため、--template オプション付きでaddし直します。
chezmoi add --template ~/.zshrc管理ファイル名が dot_zshrc.tmpl に変わります。
あとはその中で onepasswordRead 関数などを使って値を引っ張ってくるだけです。
export API_KEY={{ onepasswordRead "op://Private/hogehoge/fugafuga" }}これで chezmoi apply をすると、1Passwordから値が注入された状態で .zshrc が生成されます。
Gitには {{ onepasswordRead ... }} という文字列だけがコミットされます。セキュアで良いです。最高。
ディレクトリごとの管理
僕は巨大な .zshrc が嫌いなので ~/.zshrc.d/ に分割しているのですが、chezmoiはディレクトリごとの add にも対応しています。再帰的に管理してくれるので、構造をそのまま維持できます。
chezmoi edit が面倒なときの一括 re-add
面倒だけど工夫していることがあります。公式推奨の chezmoi edit は安全ですが、ついつい ~/.zshrc で実ファイルを直接いじったり、AIエディタに書き換えさせたりしがちです。
そうするとSourceとTargetがズレてしまいます。めちゃよくやる。癖になってんだ、~/.zshrcイジるの。
そこで、chezmoi status で変更を検知して、一括でchezmoi側に変更を取り込む(re-addする)ような関数を作って運用してます。
# .zshrc などに追記
# chezmoiで管理しているファイルのうち、ローカルで変更があったものを一括でre-addするfunction cm-readd() { # " M" (Modified) なファイルを抽出 local targets=$(chezmoi status | grep '^ M' | awk '{print $2}')
if [ -n "$targets" ]; then echo "以下のファイルを検知しました:" echo "$targets" echo "" read -p "これらをchezmoiに反映(re-add)しますか?ローカルの内容が正となります (y/N): " yn if [[ "$yn" =~ ^[Yy]$ ]]; then echo "$targets" | xargs chezmoi re-add echo "Done! 🚀" else echo "キャンセルしました。" fi else echo "変更のあるファイルはありませんでした。" fi}実ファイルをガシガシ編集したあとにこれを実行するだけで同期が完了します。 自分でクセで直接変更してしまっていることに気づいてないことのほうが多いので、実際にはstatusを見るコマンドにその他のことも全てを内包して使ってます。
おわり
これ、シェモアって読むんですね。ずっと「ちぇずもい」って読んでました。恥ずい。 環境差異に悩まされている方、ブランチ管理で消耗している方、ぜひchezmoiと1Passwordの組み合わせを試してみてください。