Concurrent Versions System ( CVS、またはConcurrent Versioning System ) は、1986 年 7 月にDick Gruneによって開発されたバージョン管理システムです。 [ 4 ]これは、 Revision Control System (RCS)と呼ばれる古いバージョン管理システムの上に構築されており、リポジトリレベルの変更追跡とクライアント/サーバーモデルのサポートが追加されています。CVSサーバーは通常Unixシステムで実行されますが、クライアントは任意のオペレーティングシステムで実行できます。
CVSは、個々のファイルは管理するもののプロジェクト全体は管理しない古いバージョン管理システムであるRevision Control System (RCS)のフロントエンドとして機能します。リポジトリレベルの変更追跡とクライアント/サーバーモデルのサポートを追加することでRCSを拡張しています。 [ 5 ]ファイルはRCSと同じ履歴フォーマットを使用して追跡され、リポジトリ内の各ファイルに対応する履歴ファイルを含む隠しディレクトリがあります。
CVSは、同一ファイルの異なるバージョンを効率的に保存するために、差分圧縮を使用します。これは、バージョン間の変更が少ない大きなテキストファイルに適しています。これは通常、ソースコードファイルに当てはまります。一方、CVSにファイルをバイナリとして保存するように指示すると、各バージョンがサーバー上に個別に保持されます。これは通常、実行可能イメージなど、バージョン間の差分をコンパクトに作成するのが難しい非テキストファイルに使用されます。
CVSではシンボリックリンクは使用しません。バージョン管理システムに保存されると、セキュリティ上のリスクが生じる可能性があるためです。例えば、機密ファイルへのシンボリックリンクがリポジトリに保存されると、ファイルがチェックインされていなくても機密ファイルにアクセスできてしまう可能性があります。シンボリックリンクの代わりに、特定の権限と意識的な操作が必要なスクリプトをCVSにチェックインすることができます。
CVSは、管理する単一のプロジェクト(関連ファイルのセット)をモジュールと名付けます。CVSサーバーは、管理するモジュールをリポジトリに保存します。プログラマーは、チェックアウトすることでモジュールのコピーを取得します。チェックアウトされたファイルは、作業コピー、サンドボックス、またはワークスペースとして機能します。作業コピーへの変更は、コミットすることでリポジトリに反映されます。更新とは、リポジトリ内の変更を作業コピーに取得またはマージすることです。
CVSはクライアント・サーバーアーキテクチャを採用しています。サーバーはプロジェクトの現在のバージョンとその履歴を保存し、クライアントはサーバーに接続してプロジェクトの完全なコピーを「チェックアウト」し、このコピーで作業を行い、後で変更を「チェックイン」します。CVSサーバーは「匿名読み取りアクセス」[ 6 ]を許可できます。この場合、クライアントは空白または公開された単純なパスワード(例:「anoncvs」)を使用してバージョンをチェックアウトして比較できます。これらのシナリオでは、変更のチェックインにのみ個人アカウントとパスワードが必要です。複数の開発者が同じプロジェクトに同時に取り組むことができ、それぞれがプロジェクトの「作業コピー」内のファイルを編集し、変更をサーバーに送信(またはチェックイン)します。競合を避けるため、サーバーはファイルの最新バージョンに加えられた変更のみを受け入れます。したがって、開発者は定期的に他の人の変更を取り込むことで、作業コピーを最新の状態に保つことが求められます。このタスクはほとんどの場合、CVSクライアントによって自動的に処理され、チェックインされた変更とまだチェックインされていないローカルバージョンのファイルとの間で編集の競合が発生した場合にのみ、手動での介入が必要になります。クライアントは「update」コマンドを使用して、ローカルコピーをサーバー上の最新バージョンに更新することもできます。クライアントはバージョンを比較したり、変更履歴全体を要求したり、プロジェクトの履歴スナップショット(たとえば、特定の日付に基づくもの)をチェックアウトしたりすることもできます。チェックイン操作が成功すると、関連するすべてのファイルのバージョン番号が自動的に増加し、サーバーはユーザーが指定した説明行、日付、および作成者の名前をログファイルに書き込みます。CVSは、コミットごとに外部のユーザー指定のログ処理スクリプトを実行することもできます。これらのスクリプトは、CVSのファイル内のエントリによってインストールされloginfo、電子メール通知をトリガーしたり、ログデータをWebベースの形式に変換したりできます。
CVS は、プロジェクトのさまざまな「ブランチ」を管理することもできます。たとえば、ソフトウェア プロジェクトのリリース バージョンは、バグ修正に使用される 1 つのブランチを形成し、大きな変更や新機能を含む現在開発中のバージョンは、別のブランチを形成することができます。CVS は、作業の大部分がトランクで行われ、ブランチは一般的に短命であるか履歴であるべきであると想定しています。設計どおりに使用すれば、ブランチは簡単に管理でき、ブランチ操作は効率的かつ高速になります。[ 7 ] [ 8 ]
サーバーソフトウェアの開発者はUnix向けに開発していますが、CVSNTサーバーはMicrosoft Windowsの様々なバージョンもサポートしており、CVSクライアントは主要なオペレーティングシステムプラットフォームであればどれでも動作可能です。
グルーネは次のように回想した。[ 9 ]
私がCVSを作成したのは、学生のエリック・バールベルゲンとマールテン・ワーゲとACK(アムステルダム・コンパイラ・キット)Cコンパイラの開発で協力するためでした。私たち3人は勤務時間が大きく異なり(1人は9時から5時まで定時勤務、もう1人は不定期勤務、私は夜間しかプロジェクトに取り組めませんでした)、プロジェクトは1984年7月から1985年8月まで続きました。CVSは当初cmtという名前でしたが、これは各自が独立してバージョンをコミットできるという明白な理由によるものです。
グルーンは1986年6月23日にこのコードを公開した。[ 10 ]
現在の CVS のバージョンへと発展したコードは、1989 年 4 月に Brian Berliner によって開始され、その後 Jeff Polk や他の多くの貢献者から意見が寄せられました。Brian Berliner は、CVS プログラムへの改良を紹介する論文を執筆しました。この論文では、ツールがどのように拡張され、SunOS カーネルの開発に携わるサードパーティ開発者である Prisma によって内部的に使用され、GPL の下でコミュニティの利益のために公開されたかが説明されています。[ 11 ] 1990 年 11 月 19 日、CVS バージョン 1.0 が開発と配布のためにフリー ソフトウェア財団に提出されました。[ 12 ]
最新バージョンは2008年5月8日にリリースされました。[ 13 ]
オープンソースソフトウェアの世界では、Concurrent Version System (CVS) が長年バージョン管理のツールとして選ばれてきました。それも当然です。CVS 自体はフリーソフトウェアであり、その制限のない動作方法とネットワーク操作のサポートにより、地理的に分散した数十人のプログラマーが作業を共有できるため、オープンソースの世界の協調的な性質に非常によく合致しています。CVS とその半カオス的な開発モデルは、オープンソースの礎となっています。[ 14 ]
時が経つにつれ、開発者は機能を追加したり、運用モデルを変更したり、開発者の生産性を向上させたりするために、CVS をベースにした新しいバージョン管理システムを作成してきました。CVS の代替プロジェクトには、CVSNTやSubversionなどがあります。[ 15 ] [ 16 ]