VC++の使い方

VC++の使い方 > VC++ Tips > ソース管理 > CVSによるソース管理 > 改行コード問題
このページの内容
改行コード問題とは
解決策
ありがたいスポンサー様
All About ソフトウエアエンジニア
ネットで8%割引!自動車保険はアメリカンホーム・ダイレクト
人生の「チャンス」と「ピンチ」にモビット!
保険料が一生上がらない、保険料最大50%割引の一生涯の医療保険!

改行コード問題とは

http://kotone.bunkasha.co.jp/~kenjo/diary/d041103.html#15-2 によくまとまってあります。ここの内容とだいぶかぶりますが、説明しておきます。


レポジトリは、改行コードが LF(0x0A) であるのが普通らしい。通常、UNIX 上で CVS を利用する分には、なんの問題もないです。でも、でも、Windows で編集したファイルを、直接 CVS のリポジトリに取り込んでしまうと困ったことになります。リポジトリ上のファイルの改行コードが CR LF(0x0D 0x0A)になってしまいます。

レポジトリの改行コードがころころ変わると、差分ファイルが無駄に大きくなって嫌な感じですよね。ここまでの説明なら、別に改行コードを CR LF か LF のどちらかに統一しておけばいいように思えます。しかし、世の中の Windows CVS クライアントはけっこうバカなようです。レポジトリの中のファイルが LF であると決めうちしやがります。チェックアウトするときに

LF -> CR LF

と変換します。これだけなら問題ないんですが、レポジトリの改行コードが CR LF だと

CR LF -> CR CR LF

としてチェックアウトしちゃうわけです。ひどい。Windows 上のエディタで開いたとき、空行がはさまれて間抜けに見えちゃいます。

コミットするときも、

CR CR LF -> CR LF

と変換されるので、レポジトリ内での整合性は保たれるようですが、どうも気持ち悪いですな。

解決策

WinCVS を使う

WinCVSには「checkout text files with Unix LF (0x0a)(日本語パッチ当ててる場合は「テキストファイルの改行コードをLF(0x0A)にする」)」という設定項目があるようです。これを使うと、上のような何も考えていない変換を行いません。その代わりに、レポジトリ内の改行コードが LF だったときに、ちゃんと処理してくれない悲しさはあります。

レポジトリ 内の改行コードを LF に統一

CVS が、改行コード = LF を想定している以上、そうしてあげようじゃないか。でも、こっちには、CVS のいくらかの資産を CR LF で作っちゃったぞ。そういう場合は、どうしたらいいのさ?

はい、ばしっと変換しちゃいましょう。CVSROOT にあるレポジトリファイルの改行コードを変えちゃいます。ここでは Perl でさくっとやってしまいましょう。バイナリのファイルを誤って置換してしまわないように、コマンドライン引数で置換するファイルを指定できるようにしてみます。

perl -ne 's/\r\n/\n/;print;' hoge.cpp,v

こんな感じです。現在のフォルダのソースとヘッダの改行コードを変えるには

perl -ne 's/\r\n/\n/;print;' *.cpp,v *.h,v

としちゃいましょう。変更しちゃうのはこわいのでバックアップを取りたい場合は

perl -i.bak -ne 's/\r\n/\n/;print;' hoge.cpp,v

とすれば、.bak を付加して古いファイルを残してくれます。

変換して、きちんとチェックアウトできることを確認できたら完了です。あ、もちろん、念のためバックアップを取ってから自己責任で行ってくださいね。