Node: CVS And Binary Files, Next: Removing Files, Previous: Adding Directories, Up: Other Useful CVS Commands
今まで黙っていましたが、CVS にはちょっとしたイヤな秘密があります。CVS は バイナリファイルをうまく扱えないのです(あー、ほかにもちょっとしたイヤな 秘密はありますけど、これは一番イヤな秘密のうちのひとつに数えられるものな んです)。バイナリを全然扱えないというのではないんですが、いいところが全 然ないんです。
いままで扱ってきたのは全てプレーンテキストファイルです。CVS はテキストファ イル用の特別なトリックを使っています。たとえばリポジトリが Unix で作業コ ピーが Windows や Mac にある場合、改行コードをそれぞれの環境に合わせて適 切に変換していたりします。改行コードというのは、Unix ではラインフィード (LF)のみに対し、Windowsではキャリッジリターン/ラインフィード(CRLF)になっ ています。従って Windows の作業コピー中のファイルは CRLF を使う一方で、 同じプロジェクトの Unix マシン上の作業コピーは LF を使っています(リポジ トリではいつも LF です)。
ほかに、CVS は RCS キーワードと呼ばれる特別な文字列を認識するトリックが あって、これはテキストファイルのその文字列を認識したら、リビジョンや他の 便利な情報に置換するというものです。例えば、ファイルがこういう文字列を含 んでいたとすると:
$Revision$
CVS はコミットのたびにリビジョン番号を含むようにこの文字列を展開します。 こんな風に:
$Revision: 1.3 $
CVS はファイルが改良されるのに合わせてこの文字列を最新に保ちます。 (Advanced CVS と Third-Party Tools に、こういうキーワード文 字列についていろいろと説明してあります)
文字列展開は、ファイルを編集しているときにリビジョン番号やほかの情報を見 ることができたりするのでとても便利な機能です、テキストファイルについては ね。でもファイルが JPG の画像だったら? コンパイル済みの実行ファイルだっ たら? そういう種類のファイルで、CVS がキーワードを見つけて展開するような ことがあったら、深刻なダメージを与えるかもしれません。バイナリではそうい う文字列が偶然現われることがあるからです。
ですから、バイナリファイルを追加するときには、CVS に対してキーワード展開 と改行コード変換をやめるように教えてやる必要があります。その場合 -kb オ プションを使ってください:
floss$ cvs add -kb filename floss$ cvs ci -m "added blah" filename (etc)
また、ときどき(テキストファイル中に擬似キーワード文字列を含んでいるよう な場合など) キーワード展開をしたくない場合もあるでしょう。そういう場合は -ko オプションを使います:
floss$ cvs add -ko filename floss$ cvs ci -m "added blah" filename (etc)
(実際、この章はそのようなドキュメントのひとつですね、ここでも例のなかに
$Revision$
だとか書いてありますし)
バイナリファイルのリビジョン間で cvs diff
を走らせても意味が
ないことに注意してください。diff はテキストを前提としたアルゴリズムを使っ
ているので、バイナリファイルの場合はただ違っているということが報告される
だけで違いの内容まではわかりません。CVS の将来のバージョンではバイナリファ
イルの diff をとる方法も提供するかもしれません。