6. 同期(Git Sync)
複数のデバイスで同じメモを使いたい場合は、Git 同期を有効にしてください。
任意の Git リポジトリ(GitHub / GitLab / cnb など)を使用して同期し、自動で commit + pull + push を行います。
主に技術ユーザー向けです(Obsidian Git ユーザー層を想定)。初心者向けのクラウド同期も準備中です。
6.1 これは何ですか
PinSlip の Git 同期は任意の追加機能です。
仕組み:vault ディレクトリ内に Git リポジトリを保持し、定期的に自動で commit + pull + push を実行します
連続変更の集約:変更後 3 分間新たな操作がなければ commit をトリガーします
コンフリクト解決:diff3 による 3-way マージ(異なる段落は自動マージ、同じ行は標準マーカーを記述)
処理:Go サービス内で go-git による純 Go 実装で実行され、ローカルの git 実行ファイルに依存しません
デフォルトでは無効になっており、「設定 → Git 同期」で手動で有効化する必要があります。
6.2 セットアップ手順
準備
GitHub / GitLab / cnb などのプラットフォームで空のリポジトリを作成します(README やライセンスにチェックを入れない空のリポジトリを推奨)
書き込み権限のある Personal Access Token(PAT)を作成します
GitHub:
Settings → Developer settings → Personal access tokens → Fine-grained tokensContents: Read and writeにチェックトークンをコピー(表示されるのは 1 回だけです)
PinSlip で設定する
設定 → Git 同期 → 以下を入力します。

フィールド | 例 |
|---|---|
リポジトリ URL |
|
ユーザー名 |
|
Token |
|
ブランチ | デフォルト |
保存すると、PinSlip がローカルリポジトリを自動で初期化し、remote を設定して、最初の commit & push を実行します。
認証情報の保存場所
<vault>/.pinslip/git-sync.jsonに保存されます<vault>/.pinslip/は.gitignoreに含まれているため、トークンがノートと一緒にリモートへプッシュされることはありません設定画面で Token フィールドを空のまま保存 = 変更しないという意味になります
6.3 自動同期
同期サイクル
変更 → 3 分間新たな操作がなければ → 自動で commit
→ pull (fetch + merge)
→ pushcommit message:
sync YYYY-MM-DD HH:mm (n files)定期 push 間隔:デフォルト 10 分(設定で 1〜1440 分の範囲で調整可能)
「今すぐ同期」ボタンで手動トリガーも可能
アプリ終了前の最大 5 秒の猶予期間内で、できる限り push を実行します
失敗時の処理
ネットワーク / 認証の失敗 → 指数バックオフ:1 分 → 5 分 → 15 分
ステータス画面に
lastErrorが表示されるため、原因の特定に役立ちます
同期対象
同期する | 同期しない |
|---|---|
|
|
|
|
|
6.4 複数デバイスでの同期
新しいデバイスを追加する
新しいデバイスに PinSlip をインストール
vault ディレクトリを選択(空のディレクトリにします)
設定 → Git 同期 → 同じリポジトリ + 同じ Token を入力
PinSlip が自動で clone → インデックスを再構築 → すべてのメモが表示されます
共同作業
PinSlip はファイルをロックしません。
複数人が同時に同じ vault を編集 → 後勝ちのリスクがあります
ブランチ + PR の運用を推奨します
同期ステータス
設定ドロワー → Git 同期のエリアに次の情報が表示されます。
最終同期時刻
未 push の件数
エラーメッセージ(ある場合)
6.5 コンフリクト解決
これは Git 同期において最も重要な詳細の 1 つです。
どのように発生するか
2 台のマシンが同じメモを同時に変更
pull 時にクリーンにマージできないことが判明 → コンフリクトマーカーが書き込まれる
3 つのケース
1. 異なる段落の自動マージ(最も一般的)
あなたが A 段落に 1 行追加
別のある人が B 段落を変更
→ 自動でマージ成功、邪魔しません2. 同じ行のコンフリクト(まれ)
PinSlip は標準の git コンフリクトマーカーを書き込みます。
<<<<<<< HEAD
あなたが新しく追加した行
=======
別のある人が追加した行
>>>>>>> origin/mainタイトル抽出時はマーカー行をスキップ → ファイル名がマーカーで混入しません
メイン画面のメモリストの上部に「未解決コンフリクト」の通知が表示されます
API レスポンスには
conflicted: trueが含まれます
3. バイナリのコンフリクト(画像)
PinSlip は両方とも保持します。
リモート側の元の名前
ローカル側は
name-コンフリクト-タイムスタンプ.ext
メモ内でコンフリクトを解決する
コンフリクトのあるメモを開くと、オレンジ色の警告バナーに置き換わります。
等幅 textarea で原文を編集(Markdown レンダリングは通しません)
「すべてローカルを使用」 でマーカーを一括で除去(ローカル版を保持)
「すべてリモートを使用」 でマーカーを一括で除去(リモート版を保持)
「解決を保存」 で手動保存(自動保存は走りません、確認してから保存する仕組み)
保存するとマーカーが消え、自動的に通常の Markdown エディタに戻ります。
外部変更の検知
外部エディタ(Obsidian / VS Code)でディスク上のファイルが変更 → PinSlip の watcher が検知
編集されていないとき → 自動で再読み込み + 「同期しました」トースト
編集中(変更あり) → 「最新版を読み込む / 自分の編集を保持する」のバナーで選択
これは双方向同期の体験を守る仕組みです:2 台のマシンが互いに奪い合わない。
6.6 よくある問題
現象 | 確認ポイント |
|---|---|
認証失敗 | トークンの期限切れではないか、リポジトリ URL に |
同期が停滞する | ステータス画面の |
同期失敗が繰り返される | リポジトリ URL に |
無効化したい | 設定 → Git 同期 → 「無効化」( |