使用するプログラムを決定する際に重要な要因がいくつかあります。
一般に、データの配信には2種類のモデルが使用されます。1つは、すべてのクライアントが、そのファイルを一元的なサーバによって同期させるモデルです。サーバはすべてのクライアントから、少なくともいずれかの時点でアクセスできる必要があります。このモデルは、Subversion、CVS、およびWebDAVで採用されています。
もう1つは、すべてのネットワークホストがそれぞれのデータをピアとして相互に同期させるモデルです。これは、unisonで採用されている概念です。実際には、rsyncはクライアントモードで動作しますが、すべてのクライアントがサーバとしても動作できます。
Subversion、CVS、WebDAV、およびUnisonでは、ユーザが手動によってデータの同期を開始します。これにより、データの同期を詳細に制御でき、競合の処理も容易です。ただし、同期の間隔が長すぎると、競合が起こりやすくなります。
複数のユーザが大きなプログラミングプロジェクトにかかわっている場合も、SubversionまたはCVSでは、競合はまれにしか発生しません。これはドキュメントが個別の行単位でマージされるためです。競合が起こると、影響を受けるのは1台のクライアントだけです。SubversionやCVSでは、普通、競合が容易に解決できます。
Unisonは、競合をレポートし、影響を受けたファイルを同期処理から排除します。しかしながら、SubversionやCVSでは、変更のマージが容易ではありません。
競合時に変更を部分的に受け入れることができるSubversionやCVSとは対照的に、WebDAVでは、変更が全体的に成功したと見なせる場合にのみチェックインを行います。
rsyncには、競合処理の機能はありません。ユーザは、意図せずにファイルを上書きしないように注意し、考えられる競合はすべて手動で解決する必要があります。安全のために、RCSなどのバージョニングシステムを追加採用できます。
標準設定では、Unisonはディレクトリツリー全体の同期が行われます。ファイルシステムに新しく追加したファイルが、自動的に他のコンピュータに表示されます。
SubversionまたはCVSでは、新しいディレクトリとファイルは、それぞれコマンドsvn add または cvs addを使用して明示的に追加する必要があります。これにより、同期の対象となるファイルについて、ユーザがより詳細に制御できます。しかし他方で、新しいファイルが見過ごされることが多く、特にsvn updateおよびsvn statusまたはcvs updateの出力に表示される疑問符は、ファイルの数が多いためにたびたび無視されます。
Subversion または CVS は追加機能として、古いバージョンのファイルが再構成できます。変更を行うたびに簡単な編集コメントを挿入しておくと、内容とコメントからファイルの作成状況を後で簡単に追跡できます。これは論文やプログラムテキストを作成する際、貴重な支援となります。
同期の対象となるすべてのホストには、分散されたデータを処理できるだけの十分なハードディスクの空き容量が必要です。SubversionおよびCVSでは、サーバ上のリポジトリデータベースに余分な容量が必要となります。ファイルの履歴もサーバに保存されるため、このための容量も別に必要です。テキスト形式のファイルが変更されたときには、変更された行だけを保存すれば足ります。バイナリファイルは、ファイルが変更されるたびに、ファイルのサイズと同じだけの容量が必要なため、テキストより必要な容量が多くなります。
Unisonはグラフィカルユーザインタフェースを備え、Unisonが実行する同期手順を画面に表示します。提案を了承するか、個別のファイルを同期処理から排除します。テキストモードでは、個々の手順を対話型で確認します。
SubversionまたはCVSを使い慣れたユーザは、通常、コマンドラインでプログラムを制御します。しかしながら、cervisiaのようなLinux用のグラフィカルユーザインタフェースがあり、また他のオペレーティングシステム用にwincvsなども用意されています。kdevelopなどの開発ツールやemacsなどのテキストエディタの多くが、CVSやSubversionをサポートしています。競合の解決は、これらのフロントエンドの方が、はるかに容易です。
Unisonとrsyncは使いやすく、初心者にも適しています。CVSとSubversionは、やや操作が難しいプログラムです。ユーザはレポジトリとローカルデータの間のインタラクションを理解する必要があります。データを変更すると、最初にローカルでリポジトリとマージする必要があります。これはコマンドcvs updateまたはsvn updateで実行します。次にコマンドcvs commitまたはsvn commitでデータをレポジトリに送信する必要があります。この手順をいったん理解すれば、初心者でもCVSまたはSubversionを簡単に利用できるようになります。
伝送中、データは妨害や改ざんから保護される必要があります。Unison、CVS、rsync、およびSubversionはいずれもssh(セキュアシェル)経由で容易に使用できるため、この種の攻撃からセキュリティ保護されます。CVSやUnisonをrsh(リモートシェル)経由で実行するのは避けるべきです。また、安全でないネットワークでpserverメカニズムを使用してCVSにアクセスすることもお勧めできません。Subversionは、Apacheで実行することで既に必要なセキュリティ対策を提供しています。
CVSは、プログラミングプロジェクト管理のため長期間にわたって開発者に使用されてきたため、きわめて安定しています。CVSでは開発履歴が保存されるため、誤ってファイルを削除するといったユーザの誤操作にも対応できます。SubversionはCVSほど普及してはいませんが、生産環境(Subversionプロジェクト自体など)で採用されつつあります。
Unisonはまだ比較的新しいプログラムですが、ハイレベルな安定性を誇っています。しかし、ユーザエラーには効果的に対応できません。いったんファイルを削除するという同期処理が確定されたら、そのファイルを復元する手立てはありません。
表 27.1 ファイル同期ツールの機能:-- = よくない - = あまりよくないまたはサポート対象外、o = 普通、+ = よい、++ = 非常によい、x = サポートされている
unison | CVS/SVN | rsync | mailsync | |
|---|---|---|---|---|
クライアント/サーバ | 同等 | C-S/C-S | C-S | 同等 |
移植性 | Lin、Un*x、Win | Lin、Un*x、Win | Lin、Un*x、Win | Lin、Un*x |
対話処理 | x | x/x | x | - |
速度 | - | o/+ | + | + |
競合 | o | ++/++ | o | + |
ファイル選択 | ディレクトリ | 選択/ファイル、ディレクトリ | ディレクトリ | メールボックス |
履歴 | - | x/x | - | - |
ハードディスクスペース | o | -- | o | + |
GUI | + | o/o | - | - |
難度 | + | o/o | + | o |
攻撃 | +(ssh) | +/+(ssh) | +(ssh) | +(SSL) |
データ損失 | + | ++/++ | + | + |