複数デバイスの同期を保つ
マシンをまたぐ操作の順序、git による分岐の解決、マシンごとにプロファイルを与える方法を説明します。
編集する前に pull する
dotweave は git pull を自分で実行しません。そのため、しばらく触っていないマシンには古い同期ディレクトリが残ったままです。リポジトリを取り込む操作とホームディレクトリへ適用する操作は別のコマンドで、この順に実行します。
同期ディレクトリを開いて取り込み、子シェルを抜けてから適用します。
dotweave cd
git pull
exit
dotweave pull
dotweave cd は同期ディレクトリをルートとする子シェルを起動し、exit で元のシェルに戻ります。git pull がワークツリーを更新したあとで初めて、dotweave pull が書き込む新しい artifact がそろいます。
dotweave pull はリポジトリに存在しないローカルファイルを削除し、計画を適用する前に確認します。先に dotweave status または dotweave pull --dry-run を実行して計画を読んでください。
pull より先に編集すると分岐が生まれます。古い履歴の上にコミットすることになり、同じファイルについて 2 台のマシンの状態が食い違います。
分岐は dotweave ではなく git で解決する
dotweave はマージを行いません。3-way マージも、dotweave が書き込むコンフリクトマーカーも、解決用の UI もありません。2 台のマシンがそれぞれ push してコミットした状態は、同期リポジトリにおける git の分岐であり、dotweave cd の中で git を使って解決します。
artifact は普通のファイルで、dotweave init は * -text を含む .gitattributes を書き出すため、git が改行を書き換えることはありません。そのため normal の artifact は同期リポジトリの git diff で読め、ほかのテキストファイルと同じように 1 行ずつマージできます。
secret の artifact は age の暗号文です。その diff は人が読めるものではなく、1 行ずつマージすることもできません。シークレットは片方を選んで決着させ、残したいバージョンを持つマシンから平文をもう一度 push してください。
マシンごとにプロファイルを与える
マシンごとに異なる設定は、共有の項目ではなくプロファイルに置きます。名前を登録し、マシン固有の項目をそのプロファイルに限定して、対象のマシンでプロファイルを選択します。
dotweave profile add work
dotweave track ~/.config/work-vpn --profile work
dotweave profile use work
選択内容は dotweave ホームディレクトリの settings.jsonc に保存されます。このディレクトリは同期ディレクトリの外にあるためコミットされず、マシンごとに独立して選べます。
プロファイルに割り当てた項目は、別のプロファイルが有効なあいだ見えません。dotweave status にも現れず、push も pull もその項目を扱いません。項目が失われたと判断する前に、有効なプロファイルを確認してください。
push はほかのプロファイルの artifact を削除しません。そのため 1 つのリポジトリがすべてのマシンの設定を並べて保持します。
シークレットにはマシンごとの条件が 1 つ加わります。そのマシンの公開鍵が manifest.jsonc の age.recipients に含まれ、対応する秘密鍵がそのマシン自身の keys.txt にある必要があります。どちらかが欠けていると、ほかのマシンが書いた内容を復号できません。鍵の扱いはシークレットと暗号化で確認してください。
実装とリファレンス
プロファイルの可視性のルールとマシンごとの選択についてはプロファイルで説明しています。
適用前に計画を確認するためのフラグは dotweave pull、同期リポジトリに対して git を実行するシェルは dotweave cdを参照してください。