dotfilesを複数の開発機で同期させたい

【mise】mise bootstrapで開発機のセットアップを宣言的に管理する で紹介したmise bootstrapのうち、.zshrc.gitconfigのようなdotfilesの配置を担当するのがmise bootstrap dotfilesである。mise.toml[dotfiles]セクションに管理対象を登録しておくと、別の開発機でも同じ内容を再現できる。

このコマンドはDockerの使い捨てコンテナで動作を確認した。

mise bootstrap dotfiles addで既存のdotfilesを登録する

既に手元にある.zshrcmise bootstrap dotfiles addで登録すると、ファイルの実体が~/.dotfiles配下に移動され、元の場所にはシンボリックリンクが作成される。

$ mise bootstrap dotfiles add --local ~/.zshrc -y
mise dotfiles: moved ~/.zshrc to ~/.dotfiles/.zshrc
mise dotfiles: added ~/.zshrc to /work/project/mise.toml
mise files: created symlink ~/.zshrc -> ~/.dotfiles/.zshrc
mise files: applied ~/.zshrc

mise.tomlには対象のパスだけが空のテーブルとして追記される。

[dotfiles]
"~/.zshrc" = {}

~/.dotfilesが実体を保持する場所(dotfiles.root)になり、~/.zshrc自体はそこへのシンボリックリンクになる。

$ ls -la ~/.zshrc
lrwxrwxrwx 1 root root 22 ... /root/.zshrc -> /root/.dotfiles/.zshrc

別マシンでapplyしてdotfilesを復元する

~/.dotfilesmise.toml([dotfiles]エントリ)さえあれば、mise bootstrap dotfiles applyだけでシンボリックリンクを再現できる。

$ mise bootstrap dotfiles apply -y
mise files: created symlink ~/.zshrc -> ~/.dotfiles/.zshrc
mise files: applied ~/.zshrc

dotfilesのリポジトリを新しい開発機にcloneし、mise trust && mise bootstrap dotfiles applyを実行するだけで、シンボリックリンクの配置を再現できる。

copyモードでコピー配置する

シンボリックリンクではなく実体をコピーして配置したい場合は、mode = "copy"を指定する。

[dotfiles]
"~/.zshrc" = {}
"~/.gitconfig" = { mode = "copy" }
$ mise bootstrap dotfiles apply -y
mise files: copied ~/.dotfiles/.gitconfig to ~/.gitconfig
mise files: applied ~/.gitconfig

copyモードで配置したファイルは、~/.dotfiles側の実体とは独立したファイルになる(symlinkのように自動で同期されない)。

既存ファイルとの衝突と–force

配置先に既に別の内容のファイルが存在する場合、applyはエラーになり上書きしない。

$ mise bootstrap dotfiles apply -y
mise ERROR files: refusing to overwrite existing files (use --force):
  ~/.zshrc

意図的に上書きしたい場合は--forceを付ける。既存ファイルはバックアップされずそのまま失われるため、実行前に中身を確認しておく。

$ mise bootstrap dotfiles apply --force -y
mise files: created symlink ~/.zshrc -> ~/.dotfiles/.zshrc
mise files: applied ~/.zshrc

statusとdiffで状態を確認する

mise bootstrap dotfiles status(エイリアスls)で、各dotfileの現在の状態を確認できる。

$ mise bootstrap dotfiles status
~/.zshrc  symlink  ~/.dotfiles/.zshrc  /work/project/mise.toml  applied

mise bootstrap dotfiles diffは、applyした場合に何が変わるかを表示する。既に適用済みで変更がなければ、次のように表示される。

$ mise bootstrap dotfiles diff
mise files: all files are applied

unapplyで元に戻す

mise bootstrap dotfiles unapplyで、applyによって作成されたシンボリックリンクやコピーを取り除ける。

$ mise bootstrap dotfiles unapply -y
mise files: unapplied ~/.zshrc

~/.zshrcはsymlinkモードで配置していたため、unapply後は~/.zshrc自体が削除される(実体である~/.dotfiles/.zshrcは残る)。