プログラミング

SyncthingでAndroidだけ画像を同期させない|Obsidianのギャラリー汚染を止める

Syncthingで同期しているObsidianの画像を、PCと自宅サーバーには残したままAndroid端末だけ除外した設定記録です。.stignoreと#include、(?d)の使い方、実際に遭遇したディレクトリ削除エラー、元に戻す手順までまとめます。

目次

はじめに

SyncthingでObsidianのvaultをスマホまで同期したところ、思わぬ副作用がありました。

Obsidianの記事に添付した画像や、ブログ用に保存しているアイキャッチ画像が、Androidのギャラリーアプリに大量に並んでしまったのです。
写真を見たいだけなのに、スクリーンショット、書影、グラフ、ブログ素材が何百枚も混ざります。

ただし、画像そのものをvaultから消すわけにはいきません。
Windowsパソコンと自宅サーバーには全データを残し、Android端末にだけ画像を配らない形が必要でした。

そこで、Syncthingの.stignoreと#includeを使い、端末ごとに同期対象を変えました。
私の環境ではGalaxy S25 Ultraに適用し、再スキャン後にギャラリーからObsidianの画像が消えたことを確認しています。
PCとサーバー側の画像は残ったままです。

この記事では、実際に使っている設定と、途中で遭遇した「同期が95%で止まる」トラブルまでまとめます。
Syncthingそのものの導入から知りたい場合は、先にObsidian SyncをSyncthingで無料代替する方法をご覧ください。

結論:.stignoreは端末別、除外パターンは共有ファイルに置く

今回の構成は次のとおりです。

ファイル 置き場所 役割
.stignore Android側のvault直下 その端末で使う除外設定を読み込む
mobile-ignore.txt 同期するvault直下 画像を除外する共通パターンを管理する

Android側の.stignoreには、次の1行を書きます。

#include mobile-ignore.txt

画像除外の本体は、同期対象であるmobile-ignore.txtにまとめます。

(?d)/99_Extra

(?d)*.png
(?d)*.jpg
(?d)*.jpeg
(?d)*.gif
(?d)*.webp
(?d)*.svg
(?d)*.bmp
(?d)*.heic
(?d)*.avif

この形にした理由は、.stignore自体が他端末へ同期されないからです。
Androidにだけ.stignoreを置けば、Windowsとサーバーは画像を同期し続けます。

一方、mobile-ignore.txtは通常のテキストファイルとして同期されます。
除外する拡張子を後から増減したいときは、パソコン側でこのファイルを直すだけです。
スマホの隠しファイルを毎回編集する必要はありません。

Syncthingの公式ドキュメントでも、.stignoreは同期されない一方、同期される別ファイルを#includeで読み込める仕様になっています。

設定手順

1. vault直下にmobile-ignore.txtを作る

まず、パソコン側でObsidianのvault直下にmobile-ignore.txtを作り、先ほどのパターンを保存します。
文字コードはUTF-8です。

*.pngのようにスラッシュを含まないパターンは、特定のフォルダだけでなくvault内の各階層にあるファイル名へ適用されます。
新しい画像フォルダを増やしても、フォルダ名ごとの追記は不要です。

拡張子は、自分のvaultにある形式に合わせて減らして構いません。
私の環境では、PNGやJPEGだけでなく、WebP、SVG、HEIC、AVIFまで対象にしました。

2. Android側だけ.stignoreから読み込む

次に、Android端末の同期フォルダ直下に.stignoreを作ります。
中身は次の1行だけです。

#include mobile-ignore.txt

.stignoreをWindowsやサーバー側には置きません。
同じvaultを共有していても、除外ルールが効くのはこのファイルを置いた端末だけです。

すでに競合ファイル対策などで.stignoreを使っている場合は、既存の行を消さずに#include mobile-ignore.txtを追加します。
私のAndroid端末では、実際には次の2行を読み込んでいます。

#include conflict-ignore.txt
#include mobile-ignore.txt

3. Syncthingで再スキャンする

設定後、Android側のSyncthingで対象フォルダを再スキャンします。

私の環境では、設定直後だけを見ても除外が効いたか判断できませんでした。
再スキャン後に同期状態を確認し、Androidのギャラリーから画像が消えたこと、PCとサーバーには残っていることを確認しました。

ここで大事なのは、「画像を全端末から削除した」のではなく、「Android端末の同期対象から外した」だけだという点です。
元データはPCとサーバーに残っています。

パターンの(?d)は何をしているのか

設定例の各行には(?d)を付けています。

Syncthingでは、無視したファイルが残っていると、親ディレクトリの削除を妨げることがあります。
(?d)は、そのような場面で無視対象のファイルを削除できるようにする接頭辞です。

公式ドキュメントにも、無視したファイルは空になったはずのディレクトリ削除を止める場合があり、(?d)でその削除を許可できるとあります。

ただし、(?d)を付ければ端末側で何を消しても安全、という意味ではありません。
私はここで実際に一度失敗しました。

失敗例:Android側で画像フォルダごと消したら同期が95%で止まった

Androidから画像を片づけるとき、vault内の99_Extraをフォルダごと削除しました。
するとサーバー側で、次のエラーが出て同期が95%で止まりました。

syncing: delete dir: directory has been deleted on a remote device but is not empty;
the contents are probably ignored on that remote device, but not locally

Androidから見ると、フォルダの中は無視対象の画像だけなので空に見えます。
しかしPCとサーバーから見ると、そのフォルダには画像が残っています。
端末ごとに見えている中身が違う状態でディレクトリ自体の削除が同期され、つじつまが合わなくなったわけです。

対策として、mobile-ignore.txtに次の行を追加しました。

(?d)/99_Extra

/から始まるため、vault直下の99_Extraだけが対象です。
末尾にスラッシュを付けていないので、ディレクトリ自体と中身の両方にマッチします。
この変更後、同期停止は解消しました。

ただし、同じ事故を避ける一番確実な運用は、画像を除外したモバイル端末から同期フォルダを丸ごと削除しないことです。
別の画像フォルダを増やした場合も、Android側でフォルダ単位の整理をする前に、PCかサーバー側の実体を確認した方が安全です。

元に戻す方法

この構成は、画像を消しているのではなく同期対象から外しているだけなので、元に戻せます。

画像を再びAndroidへ同期したい場合は、PC側でmobile-ignore.txtのパターン行を//でコメントアウトします。

// (?d)/99_Extra

// (?d)*.png
// (?d)*.jpg
// (?d)*.jpeg

mobile-ignore.txtは同期されるため、この変更はAndroidにも届きます。
反映後にAndroid側で再スキャンすれば、画像の受信が再開します。

ここで、mobile-ignore.txtそのものを先に削除してはいけません。
#include先が存在しないとSyncthingのエラーになります。

構成自体を撤去したい場合は、次の順番です。

  1. Android側の.stignoreから#include mobile-ignore.txtを削除する
  2. その後でmobile-ignore.txtを削除する

順番さえ守れば、端末ごとの設定を安全に外せます。

iPadでは画像除外を使っていない

私の環境では、iPadにはmobile-ignore.txtを読み込ませていません。
iOSの写真アプリは、Obsidianや同期アプリのサンドボックス内をAndroidのギャラリーと同じようには走査しないためです。

そのため、端末別の.stignoreは次のように分けています。

端末 .stignoreの内容
Android 競合対策+画像除外
iPad 競合対策のみ
Windows・サーバー 画像除外なし

「mobile」という名前でも、すべてのモバイル端末へ一律に適用する必要はありません。
ギャラリーへ画像が出て困る端末だけに設定できるのが、端末ローカルな.stignoreを使う利点です。

まとめ

SyncthingでObsidianを同期するとき、端末ごとに必要なデータ量や見え方が同じとは限りません。
今回のようにPCとサーバーには全データを残し、Androidだけ画像を除外したい場合は、.stignoreと#includeの組み合わせが使えます。

設定の要点は次のとおりです。

  1. 画像パターンを、同期されるmobile-ignore.txtへまとめる
  2. Android側の.stignoreだけから、そのファイルを#includeする
  3. (?d)を付け、無視した画像がディレクトリ削除を妨げる場面に備える
  4. 除外した端末では、同期フォルダをディレクトリごと削除しない
  5. 戻すときはパターンをコメントアウトし、#include先を先に消さない

この設定に変えてから、スマホのギャラリーは普段の写真だけに戻り、Obsidianの画像はPCとサーバー側でそのまま管理できています。

この記事が誰かの役に立てばうれしいです。

コメント

読み込んでいます…

この記事を書いた人

リットン

都内金融機関で経営企画とデータアナリストをしているアラサー。
文系の非エンジニアですが、独学で始めた Python と生成AIにすっかりはまりました。
プログラミング・サッカー・ミステリ紹介など、好きなことを好きに書いています。

プロフィールを見る →