一番一般的な意味で、Subversion はバイナリファイルを CVS よりももっと 適切に扱います。CVS は RCS を利用するので、変更されたバイナリファイルの 完全なコピーを、常に格納するしかありませんでした。しかし Subversion はバイナリ差分アルゴリズムを使ってファイル間の相違を 表現します。そのファイルがテキストなのかバイナリなのかによらず そうします。これはすべてのファイルがリポジトリ中に差分の形として( 圧縮されて)格納されるということを意味します。
CVS ユーザは、-kb
フラグを使ってバイナリファイルを マークする必要がありましたが、それはデータが文字化けすることを 防ぐためです。(キーワード展開や行末変換によってこのようなことが 起こります)。このことはときどき忘れられてしまいます。
Subversion はもっと神経質な方法をとります—まず、キーワード展開や 行末変換は、明示的にそのような指示を出さなければ実行されません (詳細はキーワード置換項 と 行末文字コード項 を見てください)。 デフォルトでは、Subversion はすべてのファイルデータを文字通り 単なるバイトの並びとして扱い、ファイルは常に、無変換の状態で リポジトリに保存されます。
次に、Subversion はファイルが「テキスト」 であるか 「バイナリ」 であるかの内部的な記録を管理しますが、 この記録は、作業コピー中にしか ありません。 svn update実行中、Subversion は、ローカルに 修正のあったテキストファイルについて文脈マージをやりますが、 バイナリファイルに対してはそうしません。
文脈マージが可能かどうかを決めるのに、Subversion は svn:mime-type
属性を調べます。もしファイルが svn:mime-type
属性を持たないか、テキストを 示すような内容であれば(たとえば、text/*
)、Subversion はそれを テキストであると判断します。それ以外の場合、ファイルはバイナリ であるとみなされます。Subversion はsvn import とsvn add 実行時に、バイナリ検出アルゴリズムを 実行することでユーザを助けます。これらのコマンドは、良い推測を 行い、(可能なら)バイナリのsvn:mime-type
属性 を追加されるファイルに設定します。(もし Subversion の推測が間違って いた場合は、ユーザはいつでも手でその属性を削除することができます)