WindowsTerminalのsettings.jsonをクラウドで同期


方法

settings.json が置いてあるディレクトリ (LocalState) ごとシンボリックリンクを張る。
以下は OneDrive を使って同期する例。(ちなみに私は Dropbox で同期している。)
なお、cmd によるシンボリックリンクの作成には管理者権限が必要。

> rd %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState
> mklink /D %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState %OneDrive%\WindowsTerminal\LocalState
symbolic link created for C:\Users\yabeenico\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState <<===>> C:\Users\yabeenico\OneDrive\WindowsTerminal\LocalState

以上で LOCALAPPDATA -> OneDrive なシンボリックリンクが出来上がる。

失敗例

settings.json のシンボリックリンク (LOCALAPPDATA -> OneDrive)

settings.json のシンボリックリンクを LOCALAPPDATA から OneDrive に向けて張った場合、settings.json を更新しても WindowsTerminal に変更が即時反映されない。
変更を反映するためには WindowsTerminal の再起動が必要。
settings.json の変更のたびに再起動する手間が許容できるならこれでも良いかもしれない。

> mklink %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json %OneDrive%\WindowsTerminal\LocalState\settings.json

settings.json のシンボリックリンク (OneDrive -> LOCALAPPDATA)

settings.json のシンボリックリンクを OneDrive から LOCALAPPDATA に向けて張った場合、settings.json が OneDrive によって同期されない。
OneDrive はシンボリックリンクを同期しない。

> mklink %OneDrive%\WindowsTerminal\LocalState\settings.json %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

settings.json のハードリンク

期待通りに同期できない。
同期先の OneDrive 中の settings.json は File ID が新しいものに変化する。
つまり、OneDrive (や Dropbox) は同期先のファイルを変更する時、既存のファイルに上書きするのではなく、一旦古いファイルを削除し、新しいファイルを作成するような挙動を行う。
以下は LOCALAPPDATA から OneDrive (既存) にハードリンクを張る例。

> mklink /H %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json %OneDrive%\WindowsTerminal\LocalState\settings.json

同期元、同期先でハードリンクを張った状態で、同期元でファイルを編集した場合の挙動:

同期元
> rem =============== 初期状態 ===============

> type %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json | findstr theme
    "theme": "light"

> type %OneDrive%\WindowsTerminal\LocalState\settings.json | findstr theme
    "theme": "light"

> rem File ID が等しい

> fsutil file queryFileID %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
File ID is 0x0000000000000000003800000001dab7

> fsutil file queryFileID %OneDrive%\WindowsTerminal\LocalState\settings.json
File ID is 0x0000000000000000003800000001dab7

> rem ハードリンクの被リンク数は2

> fsutil hardlink list %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
\Users\yabeenico\OneDrive\WindowsTerminal\LocalState\settings.json
\Users\yabeenico\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

> rem ===== "theme": "dark" に変更 =====

> vim %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json 

> type %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json | findstr theme
    "theme": "dark"

> type %OneDrive%\WindowsTerminal\LocalState\settings.json | findstr theme
    "theme": "dark"

> rem File ID は変化しない

> fsutil file queryFileID %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
File ID is 0x0000000000000000003800000001dab7

> fsutil file queryFileID %OneDrive%\WindowsTerminal\LocalState\settings.json
File ID is 0x0000000000000000003800000001dab7

> rem ハードリンクの被リンク数も変化しない

> fsutil hardlink list %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
\Users\yabeenico\OneDrive\WindowsTerminal\LocalState\settings.json
\Users\yabeenico\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

同期先
> rem =============== 初期状態 ===============

> type %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json | findstr theme
    "theme": "light"

> type %OneDrive%\WindowsTerminal\LocalState\settings.json | findstr theme
    "theme": "light"

> rem File ID が等しい

> fsutil file queryFileID %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
File ID is 0x000000000000000001e0000000003a11

> fsutil file queryFileID %OneDrive%\WindowsTerminal\LocalState\settings.json
File ID is 0x000000000000000001e0000000003a11

> rem ハードリンクの被リンク数は2

> fsutil hardlink list %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
\Users\yabeenico\OneDrive\WindowsTerminal\LocalState\settings.json
\Users\yabeenico\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

> rem ===== OneDrive の同期開始 -> 完了 =====

> rem LOCALAPPDATA の settings.json は変化なし

> type %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json | findstr theme
    "theme": "light"

> rem OneDrive の settings.json は変化

> type %OneDrive%\WindowsTerminal\LocalState\settings.json | findstr theme
    "theme": "dark"

> rem LOCALAPPDATA の File ID は変化なし

> fsutil file queryFileID %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
File ID is 0x000000000000000001e0000000003a11

> rem OneDrive の File ID は変化

> fsutil file queryFileID %OneDrive%\WindowsTerminal\LocalState\settings.json
File ID is 0x0000000000000000007200000000c2eb

> rem ハードリンクの被リンク数はどちらも1

> fsutil hardlink list %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json
\Users\yabeenico\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

> fsutil hardlink list %OneDrive%\WindowsTerminal\LocalState\settings.json
\Users\yabeenico\OneDrive\WindowsTerminal\LocalState\settings.json