第2章 協同作業

複数の開発者が関わるすべてのプロジェクトでは、効果的な改訂管理が必須になります。改訂管理を効果的に行うことで、チーム内の開発者全員が組織的かつ規則的な方法でコードを作成、見直し、改訂、記録できるようになります。Red Hat Enterprise Linux 6 は、オープンソースの改訂管理システムのなかで最も人気のある 3 つのシステム (CVS、SVN、Git) をサポートしています。これらの改訂管理システムのツールは、個別の内部コードリポジトリーを設定する機能や、公開されているさまざまなオープンソースコードを使用できるようにします。
以下のセクションでは、各ツールの関連資料の概要と参照先を説明します。

2.1. Concurrent Versions System (CVS)

通常 CVS と略される Concurrent Versions System は、クライアントサーバーアーキテクチャーで構成される 集中型バージョン管理システム です。CVS は、以前の Revision Control System (RCS) の後継で、リビジョン管理が行われるファイルへの変更をすべてトラッキングしつつ、複数の開発者が同じプロジェクトで協同で作業できるようにします。

2.1.1. CVS のインストールおよび設定

cvs パッケージのインストール

CVS は、Red Hat Enterprise Linux 6 では cvs パッケージで提供されます。cvs パッケージとすべての依存関係をお使いのシステムにインストールするには、root として、シェルプロンプトで以下のコマンドを入力します。
yum install cvs
これにより、コマンドライン CVS クライアントとその他の関連ツールがシステムにインストールされます。

デフォルトのエディターの設定

コマンドラインで CVS を使用する場合に、cvs import または cvs commit など、特定のコマンドでは短いログメッセージを記述する必要があります。cvs クライアントアプリケーションはまず環境変数 $CVSEDITOR のコンテンツを読み込み、次に、より一般的な環境変数 $EDITOR を読み込み、どのテキストエディターを起動するかを決定します。どちらの変数も指定されていない場合には、vi が起動します。
環境変数 $CVSEDITOR の値を永続的に変更する場合は、以下のコマンドを実行します。
echo "export CVSEDITOR=command" >> ~/.bashrc
これにより、export CVSEDITOR=command の行を ~/.bashrc に追加します。command は、任意のエディターを実行するコマンドに置き換えます (例: emacs)。現在の shell セッションで、この変更を有効にするには、シェルプロンプトで以下のコマンドを入力して ~/.bashrc のコマンドを実行する必要があります。
. ~/.bashrc

例2.1 デフォルトのテキストエディターの設定

CVS クライアントがテキストエディターとして Emacs を使用するように設定するには、以下を入力します。
~]$ echo "export CVSEDITOR=emacs" >> ~/.bashrc
~]$ . ~/.bashrc

2.1.2. 新規リポジトリーの作成

CVS リポジトリー は、リビジョン管理がされているファイルやディレクトリー、完全な変更履歴や変更者や変更時間の情報などの追加データを保存する中央の場所となっています。一般的な CVS リポジトリーは、モジュール と呼ばれる個別のサブディレクトリーで複数のプロジェクトを保存します。公開されている場合には、複数の開発者がモジュールの 作業コピー を作成したり変更したりできるだけでなく、リポジトリーに コミット することで他の作業者と変更を共有することができます。

空のリポジトリーの初期化

任意のディレクトリーに空の CVS リポジトリーを新規作成するには、以下のコマンドを実行します。
cvs -d path init
path は、リポジトリーの保存先のディレクトリーへの絶対パスを指定する必要がある点を念頭に置いてください (例: /var/cvs/)。または、$CVSROOT の環境変数の値を変更して、このパスを指定することもできます。
export CVSROOT=path
これにより cvs init やその他の CVS 関連のコマンドの実行時にパスを省略することができます。
cvs init

例2.2 新規 CVS リポジトリーの初期化

~/cvs/ ディレクトリーに空の CVS リポジトリーを作成するには、以下を入力します。
~]$ export CVSROOT=~/cvs
~]$ cvs init

リポジトリーへのデータのインポート

既存のプロジェクトでリビジョン管理を行うように設定するには、プロジェクトの保存されているディレクトリーに移動して、以下のコマンドを実行します。
cvs [-d cvs_repository] import [-m "commit message"] module vendor_tag release_tag
cvs_repository は CVS リポジトリーへのパス、module はプロジェクトのインポート先のサブディレクトリー (例: project)、vendor_tagrelease_tag はベンダーとリリースタグを指す点に注意してください。

例2.3 CVS リポジトリーへのプロジェクトのインポート

プロジェクトのディレクトリーに以下のコンテンツが含まれていると仮定します。
~]$ ls myproject
AUTHORS  doc  INSTALL  LICENSE  Makefile  README  src  TODO
また、~/cvs/ に空の CVS リポジトリーがあるとします。このリポジトリーの project に、ベンダータグ mycompany と、リリースタグ init を付けて、プロジェクトをインポートするには、以下を実行します。
myproject]$ export CVSROOT=~/cvs
myproject]$ cvs import -m "Initial import." project mycompany init
N project/Makefile
N project/AUTHORS
N project/LICENSE
N project/TODO
N project/INSTALL...

2.1.3. 作業コピーのチェックアウト

CVS リポジトリーにあるプロジェクトの作業中のコピーをチェックアウトするには、以下のコマンドを実行します。
cvs -d cvs_repository checkout module
このコマンドでは、プロジェクトの作業コピーが含まれた module と呼ばれる新規ディレクトリーが作成されます。cvs_repository は、CVS リポジトリーの URL で、module はプロジェクトの保存先のサブディレクトリー (例: project) である点に注意してください。また $CVSROOT の環境変数は以下のように設定できます。
export CVSROOT=cvs_repository
次に、-d オプションなしで cvs checkout コマンドを使用することもできます。
cvs checkout module

例2.4 作業コピーのチェックアウト

CVS リポジトリーに ~/cvs/ があり、このリポジトリーにproject という名前のモジュールが含まれていると仮定します。このモジュールの作業コピーをチェックアウトするには、以下を入力します。
~]$ export CVSROOT=~/cvs
~]$ cvs checkout project
cvs checkout: Updating project
U project/AUTHORS
U project/INSTALL
U project/LICENSE
U project/Makefile
U project/TODO

2.1.4. ファイルの追加および削除

ファイルの追加

CVS リポジトリーへ既存のファイルを追加して、リビジョン管理を行うには、作業コピーのあるディレクトリーに移動して、以下のコマンドを実行します。
cvs add file
これにより、CVS リポジトリーへファイルを追加するようにスケジュールします。先に進め、実際にリポジトリーにファイルを追加するには、「変更のコミット」に説明されているように cvs commit コマンドを実行します。

例2.5 CVS リポジトリーへのファイルの追加

CVS リポジトリーの作業コピーが含まれるディレクトリーに以下のコンテンツが含まれていると仮定します。
project]$ ls
AUTHORS  ChangeLog  CVS  doc  INSTALL  LICENSE  Makefile  README  src  TODO
このディレクトリーに含まれる ChangeLog 以外のファイルとディレクトリーはすべてリビジョンが管理されています。このファイルを CVS リポジトリーに追加するようにスケジュールするには、以下を入力します。
project]$ cvs add ChangeLog
cvs add: scheduling file `ChangeLog' for addition
cvs add: use 'cvs commit' to add this file permanently

ファイルの削除

CVS リポジトリーからファイルを削除するには、作業コピーが含まれるディレクトリーに移動して、ローカルでそのファイルを削除しあmす。
rm file
以下のコマンドを使用して、このファイルの削除をスケジュールします。
cvs remove file
実際にリポジトリーからファイルを削除するように進めるには、「変更のコミット」の説明のとおりに、cvs commit コマンドを実行します。

例2.6 CVS リポジトリーからのファイルの削除

CVS リポジトリーの作業コピーが含まれるディレクトリーに以下のコンテンツが含まれていると仮定します。
project]$ ls
AUTHORS  ChangeLog  CVS  doc  INSTALL  LICENSE  Makefile  README  src  TODO
このディレクトリーのファイルはすべてリビジョン管理されています。TODO ファイルを CVS リポジトリーから削除するようにスケジュールするには、以下を入力します。
project]$ rm TODO
project]$ cvs remove TODO
cvs remove: scheduling `TODO' for removal
cvs remove: use 'cvs commit' to remove this file permanently

2.1.5. 変更の表示

ステータスの表示

作業コピーの現在の状況を確認するには、作業コピーが含まれるディレクトリーに移動して、以下のコマンドを実行します。
cvs status
このコマンドにより、現在のステータス (Up-to-dateLocally AddedLocally Removed または Locally Modified) およびリビジョンなど、リビジョン管理が行われるファイルごとに詳細情報が表示されます。ただし、作業コピーの変更内容だけを確認するには、シェルプロンプトで以下を入力して、出力を簡素化することができます。
cvs status 2>/dev/null | grep Status: | grep -v Up-to-date

例2.7 作業コピーのステータスの表示

CVS リポジトリーの作業コピーが含まれるディレクトリーに以下のコンテンツが含まれていると仮定します。
project]$ ls
AUTHORS  ChangeLog  CVS  doc  INSTALL  LICENSE  Makefile  README  src
CVS リポジトリーへの追加が予定されている、このディレクトリー内のファイルとディレクトリーはすべて (ChangeLog 以外の)、すでにリビジョン管理がされています。リビジョン管理がされている TODO ファイルは、削除のスケジューリングがされており、この作業コピーはすでに存在しません。最後に Makefile にはローカルの変更内容が含まれます。このような作業コピーのステータスを表示するには、以下を入力します。
project]$ cvs status 2>/dev/null | grep Status: | grep -v Up-to-date
File: ChangeLog         Status: Locally Added
File: Makefile          Status: Locally Modified
File: no file TODO              Status: Locally Removed

差異の表示

作業コピーとチェックアウトしたコンテンツの差異を表示するには、作業コピーが含まれるディレクトリーに移動して、以下のコマンドを実行します。
cvs diff [file]
このコマンドにより、作業コピーにあるすべてのファイルへの変更が表示されます。特定のファイルに対する変更のみを表示するには、コマンドラインでそのファイル名を指定します。

例2.8 作業コピーへの変更の表示

CVS リポジトリーの作業コピーが含まれるディレクトリーに以下のコンテンツが含まれていると仮定します。
project]$ ls
AUTHORS  ChangeLog  CVS  doc  INSTALL  LICENSE  Makefile  README  src
このディレクトリー内のすべてのファイルはリビジョン管理されており、Makefile にはローカルでの変更が含まれます。これらの変更を表示するには以下を入力します。
project]$ cvs diff
cvs diff: Diffing .
cvs diff: ChangeLog is a new entry, no comparison available
Index: Makefile
===================================================================
RCS file: /home/john/cvs/project/Makefile,v
retrieving revision 1.1.1.1
diff -r1.1.1.1 Makefile
156c156
<       -rm -f $(MAN1)
---
>       -rm -f $(MAN1) $(MAN7)
cvs diff: TODO was removed, no comparison available
cvs diff: Diffing doc...

2.1.6. 変更のコミット

他の人と変更の共有や CVS リポジトリーへの変更のコミットを行うには、作業コピーのあるディレクトリーに移動して、以下のコマンドを実行します。
cvs commit [-m "commit message"]
コマンドラインにコミットメッセージを指定しない限り、CVS により、ログの記述用に外部テキストエディター (デフォルトでは vi) が開きます。どのエディターを起動するか決定する方法については「CVS のインストールおよび設定」を参照してください。

例2.9 CVS リポジトリーへの変更のコミット

CVS リポジトリーの作業コピーが含まれるディレクトリーに以下のコンテンツが含まれていると仮定します。
project]$ ls
AUTHORS  ChangeLog  CVS  doc  INSTALL  LICENSE  Makefile  README  src
作業コピーでは、ChangeLog は CVS リポジトリーへの追加がスケジューリングされており、Makefile はすでにリビジョン管理がされ、ローカルの変更が含まれます。また、リビジョンが管理されている TODO ファイルは削除するようにスケジューリングされており、作業コピーには存在しません。CVS リポジトリーにこれらの変更をコミットするには、以下を入力します。
project]$ cvs commit -m "Updated the makefile."
cvs commit: Examining .
cvs commit: Examining doc...
RCS file: /home/john/cvsroot/project/ChangeLog,v
done
Checking in ChangeLog;
/home/john/cvsroot/project/ChangeLog,v  <--  ChangeLog
initial revision: 1.1
done
Checking in Makefile;
/home/john/cvsroot/project/Makefile,v  <--  Makefile
new revision: 1.2; previous revision: 1.1
done
Removing TODO;
/home/john/cvsroot/project/TODO,v  <--  TODO
new revision: delete; previous revision: 1.1.1.1
done

2.1.7. 作業コピーの更新

作業コピーを更新して、CVS リポジトリーから最新の変更を取得するには、作業コピーが含まれるディレクトリーに移動して、以下のコマンドを実行します。
cvs update

例2.10 作業コピーの更新

CVS リポジトリーの作業コピーが含まれるディレクトリーに以下のコンテンツが含まれていると仮定します。
project]$ ls
AUTHORS  CVS  doc  INSTALL  LICENSE  Makefile  README  src TODO
このリポジトリーに ChangeLog を追加し、TODO ファイルを削除し、さらに Makefile に変更を加えたと仮定します。この作業コピーを更新するには、以下を入力します。
myproject]$ cvs update
cvs update: Updating .
U ChangeLog
U Makefile
cvs update: TODO is no longer in the repository
cvs update: Updating doc
cvs update: Updating src

2.1.8. その他のリソース

サポートされる全機能に関する詳しい説明は、本書の対象外となっています。詳細情報は、以下に記載のリソースを参照してください。

インストールされているドキュメント

  • cvs(1)cvs クライアントプログラムの man ページでは、使用方法に関する詳しい情報が提供されます。