はじめに

dotweave が何をするか、シンボリックリンクやテンプレート方式のツールとどう違うか、何をあえて git に任せるかを説明します。

dotweave とは

dotweave は dotfile を git で同期するコマンドラインツールです。ホームディレクトリにある設定ファイルのうち、~/.zshrc~/.gitconfig など必要なものだけを選んでおけば、どのマシンでも同じ設定をそのまま使えます。

覚えるコマンドは 3 つです。dotweave track で同期するパスを登録し、dotweave push でホームディレクトリの内容を同期ディレクトリに入れ、別のマシンで dotweave pull として取り出します。SSH 鍵のようにそのままでは公開できないファイルは、secret モードで登録すると age の暗号文として保存されます。

同期ディレクトリは git リポジトリです。コミットしてリモートへ push するのは、いつも通りの git の作業です。

ホームディレクトリが基準です

基準になるのはローカルのファイルで、リポジトリはそこから派生したコピーです。これはシンボリックリンク方式やテンプレート方式のツールとは逆の考え方です。stow はホームディレクトリのファイルを、リポジトリを指すシンボリックリンクに置き換えます。chezmoi は正本を自身のストアに置き、そこを経由して編集するよう求めます。どちらもリポジトリを基準にするため、エディタやツール、身についた手順のほうがツールに合わせることになります。

dotweave では、ラッパーコマンドもシンボリックリンクもなく、エディタで ~/.zshrc をそのまま編集します。変更を公開したくなったら dotweave push を実行し、git でコミットします。

この選択の代償は、自動で進むものが何もないことです。デーモンもファイル監視もないため、コマンドを実行しない限り変更は共有されません。

dotweave が行わないこと

dotweave は git を代わりに実行しません。pushpull はホームディレクトリと同期ディレクトリの間でファイルを動かすだけです。コミット、リモートからの pull、リモートへの push は自分で実行します。dotweave cd はその作業に適した場所でシェルを開きます。

dotweave はマージしません。2 台のマシンが同じファイルを変更した場合、それは同期リポジトリにおける git の分岐であり、git で解決します。

dotweave はファイルをシンボリックリンクに置き換えず、専用エディタも要求せず、外部の age バイナリも必要としません。暗号化は CLI に組み込まれています。

ただし gitPATH にある必要があります。

最小の流れ

dotweave init
dotweave track ~/.gitconfig
dotweave track ~/.ssh/config --mode secret
dotweave push

ここまでで ~/.gitconfig は平文ファイルとして、~/.ssh/config は age の暗号文としてミラーされます。公開するには、同期ディレクトリを開いて git を使います。

dotweave cd
git add -A && git commit -m "Initial sync"
git remote add origin <your-repo-url>
git push -u origin main

次のマシンでは、age の鍵とあわせてリポジトリを clone し、復元します。

dotweave init <your-repo-url> --key-file ~/dotweave.agekey
dotweave pull

age の秘密鍵はコミットも同期もされません。各マシンへは自分で持ち運んでください。

実装とリファレンス

すべてのコマンドの土台となる 2 つのスナップショットのモデルは同期のしくみ、dotweave が作るファイルはディレクトリとリポジトリの構造で説明しています。

CLI を入手するには dotweave をインストールする、実行する前にモデルを理解したい場合は同期のしくみを参照してください。