アフィリエイトリンクまたはスポンサーシップを通じて、ベンダーから収益を得る場合があります。これにより、サイト上の商品配置が影響を受ける可能性がありますが、レビューの内容には影響しません。詳細は利用規約をご覧ください。
Vincent Danen は、git-cvs プラグインを使用して CVS リポジトリを Git に変換し、それに伴うスピードと効率のメリットを享受する方法を紹介します。
数週間前、上流のCVSリポジトリから、複数のディレクトリにまたがる複数のファイルを含むパッチセットを抽出しなければならないという、非常に厄介な状況に陥りました。Subversionの「1つのコミットで1つの簡単に取得できる差分が生成される」というコンセプトに慣れきっていたため、バージョン管理の進歩の速さに改めて驚かされました。
例えば、CVSにコミットすると、各ファイルはそれぞれ異なるリビジョンを持つため、コミット番号30で何が変更されたのかを知りたい場合、リポジトリ全体のdiffを実行することができません。SubversionとGitでは、一度に3つのファイルをコミットすれば、その1つのコミットからの変更点のdiffを簡単に取得できます。CVSでは、たとえ3つのファイルが同時にコミットされたとしても、それぞれのファイルで異なるリビジョンを特定し、個別にdiffを実行する必要があります。
そのため、CVSから複数のファイルから単一の一貫性のあるパッチを取得しようとすると、せいぜい面倒で、最悪の場合、実に腹立たしい思いをします。幸いなことに、git-cvsプラグインを使えばCVSリポジトリをGitリポジトリに変換できます。このプラグインは、これらの単一ファイルのコミットを一貫性のあるリポジトリコミットに変換する魔法を、舞台裏で実行してくれます。
cvs-git プラグインがインストールされている必要があります。Fedora では、git-cvs パッケージをインストールすることでインストールできます: yum install git-cvs cvsps (CVS パッチセットを作成するには cvsps ユーティリティが必要です)。インストールが完了したら、Git を CVS リポジトリに指定できます。
$ git cvsimport -v -d :pserver:[email protected]:/sources/classpath クラスパス
上記のコマンドは、 cvs.sv.gnu.org:/sources /classpath にある GNU Classpath CVS リポジトリを./classpath/ にあるローカル Git リポジトリに変換します。変換する CVS リポジトリのサイズによっては、この処理に数時間かかる場合があります(上記のコマンドは、文字通り約 12 時間かかりました)。
完了したら、git logコマンドを使ってコミットの変更履歴を確認できます。各ファイルのCVSバージョン番号はなくなり、代わりに各コミットにgitが区別するために使用する一意の識別子が割り当てられます。また、複数のファイルにまたがる同時コミットが、単一のコミットとして表示されるようになったことにも注目してください。
git log の出力を見ると、必要なチェンジセットのコミットIDが確認できます。それと、前のコミットのコミットIDをメモしておきましょう。これで、以下のコマンドでそのチェンジセットのdiffを生成できます。
$ git diff [新しいリビジョン] [古いリビジョン]
出力は、変更セット全体をグループ化したものです。単一のコミットにおける複数のファイル間の差分を1つのコマンドで取得できるため、個々のファイルを調べてそれぞれの更新リビジョンを見つけ、それらをまとめて比較するよりも、大幅に時間を節約できます。ただし、リポジトリの変換に12時間かかったことを考慮に入れなければの話です(公平を期すために言っておきますが、リポジトリには膨大なデータ量があり、変換後のリポジトリのgit logだけでも6MBのテキストがあります)。もちろん、cvspsツールだけでもこれらのパッチセットを生成できますが、Gitへの変換によって、Gitの他の便利な機能もすべて使用できるようになります。
何らかの理由で CVS を使い続けていて、Subversion や Git に移行していない場合は、簡単に変換できるツールがあり、それらは非常にうまく機能し、切り替える価値がある素晴らしい新機能と機能を提供します。

ヴィンセント・ダネン
Vincent Danenは、Red Hat Security Response Teamに所属し、カナダに住んでいます。10年以上にわたりLinuxに関する執筆と開発に携わっており、Macのベテランユーザーでもあります。