ObsidianをPC/モバイルで使いたいとき、同期方法は大きく3つある:
- Obsidian Sync(公式有料サービス)
- iCloud/Google Drive などのクラウドストレージ
- Git
以前はObsidian Syncを利用していたけど、Obsidian以外でもファイルを参照したい場合などを考えて「Obsidian Git」プラグインを利用するようになった。
ただ、PC版では安定しているものの、モバイル版では後述するような問題があって方法を模索していた。
Obsidian Gitのモバイル版は不安定
Obsidian Gitプラグインはモバイルにも対応している。
しかし、公式READMEに「モバイルサポートは実験的」と明記されている。
これはプラグインの問題というより、Obsidianモバイル版がネイティブGitを使えないことに起因する。
プラグインはJavaScriptでGitを再実装した「isomorphic-git」を使っており、これが原因で制限が多い。
具体的には以下のような問題がある。
- isomorphic-gitの制限でSSH認証が使えない
- 大きめのリポジトリでRAM不足によりクラッシュ
- サブモジュールが使えない
- リベースができない
- バッファオーバーフローで無限ループになる場合がある
最初は我慢して使っていたけど、Vaultが大きくなるにつれて不安定になってしまったので代替案を考える必要が出てきた。
GitSyncアプリを使う
そこで見つけたのがGitSyncというスタンドアロンのGit同期アプリ。
ネイティブ実装のJGitを使っているため、前述したようなisomorphic-gitの制限を受けずに安定して動作する。
- Reddit: https://www.reddit.com/r/ObsidianMD/comments/1f3iavu/obisdian_git_sync_natively_on_android/
- Play Store: https://play.google.com/store/apps/details?id=com.viscouspot.gitsync
- App Store: https://apps.apple.com/us/app/gitsync/id6744980427
- GitHub: https://github.com/ViscousPotential/GitSync
特徴:
- 任意のアプリの起動/終了に連動して自動同期
- クイックタイルから手動同期も可能
- スケジュール同期(例:15分ごと)もできる
- オープンソース
注意点
PC/モバイルで同時編集すると競合してめんどくさいので避けたほうがいい。
競合した場合もGitSync上で手動解決自体は可能。
セットアップ手順
詳しくはGitSync Tutorialを参照。
以下は自分がセットアップしたときの流れ。
インストールとクローン
アプリをインストールして、GitHub OAuth認証でログイン。
新しい空のフォルダを作成してリポジトリをクローンし、ObsidianでそのフォルダをVaultとして開いた。
同期方式の選択
GitSyncには2つの同期方式がある:
A. アプリ連動方式
- Obsidianの起動時にpull、終了時にpush
- (Androidの場合)アクセシビリティサービスの有効化が必要
B. スケジュール方式
- 例:15分ごとに自動同期
- アプリの状態に関係なく定期的に同期
最初はアプリ連動方式を使っていたけど、以下の問題があった
- 頻度が高すぎる(開く/閉じるたびに同期)
- 意図しない差分解決が発生
(起動時のSyncでモバイル側に存在しないファイルが削除判定されて削除されることがあった)
現在は15分に1度のスケジュール同期に落ち着いている。
頻度を下げることで誤検知が減ったことと、起動してないときにも裏でSyncされていることにより、意図しない差分の競合も避けられて安定した。
Obsidian Gitとの競合回避
GitSyncとObsidian Gitが両方動くと競合するので、モバイルではObsidian Gitを動かさないようにする必要があった。
自分の場合、PC・モバイルでObsidianの設定ファイル(.obsidian/)も同期している。
そのため、.gitignoreにObsidian Gitプラグインのディレクトリを追加することで対処した。
.obsidian/plugins/obsidian-git/
こうするとモバイル側では「プラグイン一覧には表示されるけど、ファイルが存在しないので動作しない」状態になる。PC側では普通に動く。
設定ファイルを同期していない場合は、単純にモバイル版Obsidianでプラグインを無効化すればOK。