Syncthingを使ってみる、その5
Syncthingを使ってみる、その4の続きである。
Syncthingのバージョン管理
バージョン管理とは、あるファイルを編集したり、削除したりした場合でも、前の状態を覚えておくということ。これにより、「やっぱり前の方が良かった」とか、「うっかり消してしまった」という要求に応えられるようにする。
Syncthingにはバージョン管理機能があり、いくつかの種類がある。
簡単な選択肢としては、いわゆる「ゴミ箱」フォルダで、ファイルを消してしまっても、それをゴミ箱に残しておくというアレである。複雑なところでは、ファイルが変更されたり、削除された履歴を定期的にとるらしい。
デフォルトでは、バージョン管理機能は無しである。ファイルを削除したり、変更したりすれば、ファイルそのものが無くなってしまうか、前の状態は残らない。
ただし、これを例えばWindowsの中で行った場合には、Windowsの機能として「ゴミ箱」機能があるので、そこには残っているはずである。これはMacでも同じ事情のようだが、AndroidやLinuxでは一般にゴミ箱機能は装備されていないので注意。
Syncthingのバージョン管理はローカルには反映されない
Syncthingのゴミ箱機能、あるいはバージョン管理を初めてやってみて面食らった点だが、ローカルには反映されないのである。今以下のような状況だとする。
- あるフォルダAをX,Y,Zのマシンで共有しているとする
- マシンX,YでAフォルダのババージョン管理にゴミ箱を指定したとする。Zにはバージョン管理無し。
そして、マシンXのAフォルダから一つのファイルを削除したとする。すると、XのAフォルダの.stversionsというフォルダにゴミが残るかと思いきや、残らない。残るのは、YのAフォルダの.stversionsフォルダである。
※ただし、この.stversionsという、「ドット」から始まる名称は、一般的には「隠しファイル・フォルダ」になっているので、「隠しファイル・フォルダを表示する」というオプションを選択しないと表示されない。
この事情については、No .stversions folder?に説明がある。つまり、こういうことだ。
- ファイルを削除した当該のマシンでは、この機能は動作しない(ただし、それがWindows/Macなら、そのOS自体のゴミ箱には残っている)
- そのフォルダを共有している別のマシンで「ゴミ箱」を有効にしているなら、その.stversionsには残っている。
ということなのである。
このような仕様になっている理由
おそらくこういうことだ。マシンXでユーザが手作業でファイルを削除した場合、それをOSが検出し、Syncthingに伝えるわけだが、その時には既に元のファイルがないため(たとえOSのゴミ箱にあったとしても)、そのマシンの.stversionsに元ファイルを放り込むすべが無いものと思われる。
しかしながら、マシンXで起こった変更が伝えられるマシンYの方では、そのファイルが削除されたことが通知され、削除前の状態が残っているので、ゴミ箱に入れることができるのだろう。
バージョン管理の種類
さて、バージョン管理の種類はいくつかある。
すべてを試してみたわけではないし、少々意味不明なところもあり、想像もあるのだが、以下の種類だそうだ。
バージョン管理をしない
何もしない。ファイルが消されれば消されっぱなし(ただし、OSのゴミ箱サポートがあれば、それは行われる。
ゴミ箱によるバージョン管理
当該マシン以外で、そのフォルダを共有しているマシンにおいて、削除された場合は、それが.stversionsというゴミ箱に放り込まれる。また、ファイルが上書きされた場合にも前のバージョンがゴミ箱に放り込まれる。
何度も上書きされた場合でも前のバージョンしか残らないものと思われる。
単純バージョン管理
「Syncthingによって置き換えられたり削除されたファイルは、タイムスタンプ付きのファイル名で .stversions ディレクトリに移動します」とある。
例えば、test..txtというファイルを作成し、これに変更を加えて保存していくと、以下のようなファイル名で.stversionsに格納される。
つまり、ファイルを変更する都度、前のバージョンがどんどんと無制限に格納されていく。ただし、「最大保存日数」を指定できる。
期間別バージョン管理
「Syncthingによって置き換えられたり削除されたファイルは、タイムスタンプ付きのファイル名で .stversions ディレクトリに移動します。 古いバージョンは、最大保存日数もしくは期間ごとの最大保存数を超えた場合、自動的に削除されます。
保存間隔は次の通りです。初めの1時間は30秒ごとに古いバージョンを保存します。同様に、初めの1日間は1時間ごと、初めの30日間は1日ごと、その後最大保存日数までは1週間ごとに、古いバージョンを保存します。」
あまり役に立ちそうもないので、詳しく調べておらず、これも想像だが、こういうことかもしれない。ファイルが作成されたばかりの時は、頻繁に、かつ大きく変更される可能性が高い。しかし、保存の都度、やたらと前のバージョンを保存しても意味が無い。そこで、前のバージョンから、上の時間が経過している場合には、次のバージョンを保存するということかもしれない。
外部バージョン管理
Syncthing内部でバージョン管理を行うのではなく、バージョン管理を外部コマンドにまかせてしまうということらしい。これも詳しくは調べていない。
どれを選択するか
結局のところ、すべての履歴を保存してくれるのが最も良い。つまり、選択すべきは単純バージョン管理である。
その一方で、この方式はディスクスペースを使い過ぎる。だからこそ、他の選択肢があるわけだ。
しかし、作業中のマシンには、一切履歴が残らず、そのフォルダの同期先にのみ残るわけだから、これはむしろ都合が良い。
作業は容量の比較的容量の小さいノートパソコンにし、その同期先として自宅据え置きのNAS(ネットワークストレージ)なり、デスクトップパソコンとすれば、それは、単純バージョン管理にしておいてもそれほど無茶な話しではないだろう。
ただし、もちろん、Syncthingによるバージョン管理は、プログラムソースには全く向いていない。そういった用途では、git等のシステムを使うべきだろう。