dotfilesを複数の開発機で同期させたい
【mise】mise bootstrapで開発機のセットアップを宣言的に管理する
で紹介したmise bootstrapのうち、.zshrcや.gitconfigのようなdotfilesの配置を担当するのがmise bootstrap dotfilesである。mise.tomlの[dotfiles]セクションに管理対象を登録しておくと、別の開発機でも同じ内容を再現できる。
このコマンドはDockerの使い捨てコンテナで動作を確認した。
mise bootstrap dotfiles addで既存のdotfilesを登録する
既に手元にある.zshrcをmise 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を復元する
~/.dotfilesとmise.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は残る)。
