CVSリポジトリをGitに変換する

文:Vincent Danen(TechRepublic) 翻訳校正:石橋啓一郎
2010-03-19 07:00:00
  • このエントリーをはてなブックマークに追加

 何週間か前、私は上流のCVSリポジトリから、複数のディレクトリにある複数のファイルを含むパッチセットを抽出しなくてはならない立場になっていることに気づいた。1回のコミットを、1つの簡単に取り出すことのできるdiffにまとめるという、Subversionのコンセプトに慣れていた私は、今回バージョンコントロールの世界にどれほどの進化があったのか悟り、ショックを受けた。

 例えば、CVSではコミットを行うと、各ファイルにそれぞれ別のリビジョンが作成されるため、特定の時点のコミットで何が変更されたかをすべて知りたいとしても、リポジトリ全体のdiffを取ることはできない。SubversionGitでは、3つのファイルを1度にコミットした場合でも、変更された部分のdiffをまとめて取ることは簡単にできる。ところがCVSの場合は、同時にコミットされたものであっても、まずそれら3つのファイルのリビジョンをそれぞれ調べ、それらのファイルのdiffを別々に取らなくてはならない。

 このことによって、CVSで複数のファイルに対する1つのパッチを作成することは、よくて面倒、悪ければひどく腹立たしい作業になってしまっている。幸運なことに、git-cvsプラグインを使えば、CVSのリポジトリをGitのリポジトリに変換することが可能だ。この裏技を使うことによって、リポジトリに対して同時にコミットした複数のファイルを、1度に扱うことができる。

 これを行うには、git-cvsプラグインをインストールする必要がある。Fedoraでは、yum install git-cvs cvspsを実行して、git-cvsパッケージをインストールすればよい(CVSのパッチセットを作成するには、cvspsユーティリティが必要になる)。この作業が終わったら、次のように、Gitに対してCVSリポジトリを指定する。

$ git cvsimport -v -d :pserver:anonymous@cvs.sv.gnu.org:/sources/classpath classpath

 このコマンドは、cvs.sv.gnu.org:/sources/classpathにあるGNU Classpath CVSリポジトリを、./classpath/にあるGitのローカルリポジトリに変換する。変換しようとするCVSリポジトリの大きさによっては、この処理に何時間もかかることがある(上記のコマンドは、終了までに約12時間かかった)。

 これが終われば、git logコマンドを使って、コミットの変更履歴を見ることができる。各ファイルのCVSバージョン番号はなくなっており、その代わり、コミットごとに、Gitがコミットを識別するために使っている一意の識別子が割り振られる。また、同時に複数のファイルを対象にしたコミットは、1つのコミットとして扱えるようになる。

 git logの出力を見れば、求めているチェンジセットのコミットIDを知ることが出来る。そのIDと、その直前のコミットのコミットIDをメモしておく。その後、次のコマンドを実行すれば、そのチェンジセットのdiffを生成することができる。

$ git diff [new_revision] [old_revision]

 このコマンドの出力は、チェンジセット全体を1つにまとめたものになっている。1回のコミットで変更した複数のファイルの差分を、1つのコマンドで得ることができれば、個々のファイルについて、それぞれリビジョンを調べ、それらのdiffを1つにまとめる場合よりも、はるかに時間を節約できる。ただしこれは、最初にリポジトリの変換にかかる12時間を考慮に入れなければの話だ(公平を期すために記しておくが、今回の例で使ったリポジトリにあるデータは大量で、変換されたリポジトリのgitのログだけでも、テキストで6Mバイトもある)。もちろん、cvspsツールだけでも、これらのパッチセットを作ることはできるが、Gitに変換することで、Git関連のほかの素晴らしい機能も使えるようになる。

 もしなんらかの理由で、CVSで行き詰まっており、まだSubversionやGitに移行していないのであれば、変換ツールを使うことを検討してみるといいだろう。簡単に使え、非常にうまく動作する変換ツールがあるし、それで利用できるようになる機能は、切り替えるだけの価値のあるものだ。

この記事は海外CBS Interactive発の記事を朝日インタラクティブが日本向けに編集したものです。原文へ

  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]