$Date: 2001/12/01 01:55:12 $
CVS (Concurrent Version System) とは, その名前が示す通り, バージョン管理ソフトである. バージョン管理ソフトには, CVS の原型となった RCS (Revision Control System) や商用 UNIX についてくる SCCS (Source Code Control System) などがある. 主として UNIX 系 OS で動作するが, Windows や MAC にも移植されている. programming をする人や文書を管理する人は必ず使うべきソフトウェアである.
CVS を使うと, 以下のような恩恵にあずかることができる.
さらに BSD 系 OS を利用している人は, 基本システムに CVS が組み込まれているので, -stable, -current の追っかけの時に役に立つ, …はず.
大抵の UNIX 系 OS ならば, あらかじめインストールされていると思われるが, Solaris などの商用 OS では付属しないようだ. その場合は以下のように自分でインストールする必要がある.
今回はまずはお試しということで, 一般ユーザで以下のものを,
へ, インストールしてみる.
% wget http://www.cvshome.org/files/19/10/cvs-1.11.1p1.tar.gz % tar zxvf cvs-1.11.1p1.tar.gz % cd cvs-1.11.1p1/ % ./configure --prerex=$HOME \ ? --bindir=$HOME/cvs_bin --datadir=$HOME/share/dist \ ? --infodir=$HOME/share/info --mandir=$HOME/share/man % make && make install && make clean && echo 'done!'
紙面の関係で \ で折り返している. インストールが完了したら $HOME/cvs_bin を path に加えよう.
windows には移植版の WinCVS がある. これは CUI の他に GUI も使える. バージョンの遷移がグラフ表示できるのが面白い. 本家の配布には日本語に対応していないので, 適宜日本語化する必要がある. そのためには以下のファイルが必要である.
後者を展開して, 前者をインストールしたフォルダに上書きすればよい.
まず, CVS 使われる言葉の約束をする. "バージョン" とはプログラムや文書における版を指し, "リビジョン" とはプログラムや文書を構成する各々のファイルの版を指す. "リポジトリ" とはファイルを格納しておくタンクのようなものである. "タグ" とは, ある時点の各ファイルに対してつける共通の印のことで, タグを指定すれば特定のリビジョンのファイル群を取り出すことができる.
まず, CVS 用の管理ディレクトリを作る. そして, そのディレクトリを環境変数 CVSROOT に設定する. csh 系シェルの場合は,
% cd $HOME % mkdir repository % setenv CVSROOT $HOME/repository
とする.
管理ディレクトリを初期化する.
% cvs init
以上のようにすると, $CVSROOT/CVSROOT 以下に次のようなファイルが作成される.
% ls $CVSROOT/CVSROOT Emptydir/ config editinfo,v modules,v taginfo checkoutlist config,v history notify taginfo,v checkoutlist,v cvswrappers loginfo notify,v val-tags commitinfo cvswrappers,v loginfo,v rcsinfo verifymsg commitinfo,v editinfo modules rcsinfo,v verifymsg,v
準備が整ったら, CVS で管理するファイルを作成する. 何らかの方法で以下のようなファイルを作成したとする.
<html> <body> <!-- === $Id$ === --> </body> </html>
ここで `$Id$' とは, リビジョンを識別するためのキーワードである.
では, 登録作業に移る.
% cvs import www NISOC RELEASE_0
ここで,
である. これを実行すると, エディタが起動するので, ログを入力する.
initial import. CVS: ---------------------------------------------------------------------- CVS: Enter Log. Lines beginning with `CVS:' are removed automatically CVS: CVS: ----------------------------------------------------------------------
なお, このファイルは新しいディレクトリを作成し, その中に入れた方がよい. その理由は cvs はとくに指定しない限り, カレントディレクトリ以下を再帰的に管理対象とみなすからである.
リポジトリに登録しただけでは何もはじまらない. 作業用に work ディレクトリを作成し, そこへファイルを取り出す.
% cd $HOME/work % cvs checkout www
取り出したファイルを見てみると,
% cd www/ % cat index.html <html> <body> <!-- === $Id: cvs.html,v 1.1 2001/12/01 01:55:12 m09010 Exp $ === --> </body> </html>
の用に, $Id$ としていた部分が,
$Id: ファイル名, リビジョン, 日付, 時間, 作成者 Exp $
に置き換えられている. $Id$ の他にキーワードは何種類もあるので, 詳細は info や man をあたって欲しい.
取り出したファイルを編集し, リポジトリにその変更を反映させるには, 以下のようにする.
% cvs commit index.html
変更理由を尋ねられるので, 適切に答えればよい.
_ add title. _ add 'what's CVS'. CVS: ---------------------------------------------------------------------- CVS: Enter Log. Lines beginning with `CVS:' are removed automatically CVS: CVS: Committing in . CVS: CVS: Modified Files: CVS: index.html CVS: ----------------------------------------------------------------------
なお, UNIX 系 OS なら EUC, windows なら SJIS でログを書くことができる.
ファイルの内容をどのように変更したのか知りたいときは, 以下のように -r オプションでリビジョンを指定して差分をとる.
% cvs diff -r 1.1 -r 1.2 index.html % cvs diff -u -r 1.1 -r 1.2 index.html Index: index.html =================================================================== RCS file: /home/yahiko2/me/m09010/repository/www/index.html,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- index.html 30 Nov 2001 20:46:25 -0000 1.1 +++ index.html 30 Nov 2001 21:05:07 -0000 1.2 @@ -1,7 +1,28 @@ <html> +<title>CVS</title> <body> -<!-- === $Id: cvs.html,v 1.2 2001/12/01 01:55:12 m09010 Exp $ === --> +<h1>CVS</h1> + + + +<h2>CVS とは</h2> +<p> +CVS(Concurrent Version System) とは, +その名前が示す通り, バージョン管理ソフトである. +バージョン管理ソフトには, +CVS の原型となった RCS(Revision Control System) +や商用 UNIX についてくる +SCCS(Source Code Control System) などがある. +主として UNIX 系 OS で動作するが, +Windows や MAC にも移植されている. +<strong>programming +をする人や文書を管理する人は必ず使うべきソフトウェア</strong>である. +</p> + + + +<!-- === $Id: cvs.html,v 1.2 2001/12/01 01:55:12 m09010 Exp $ === --> </body> </html>
ファイルの変更履歴を知りたいときは, 以下のようにする.
% cvs log index.html RCS file: /home/yahiko2/me/m09010/repository/www/index.html,v Working file: index.html head: 1.2 branch: locks: strict access list: symbolic names: RELEASE_0: 1.1.1.1 NISOC: 1.1.1 keyword substitution: kv total revisions: 3; selected revisions: 3 description: ---------------------------- revision 1.2 date: 2001/11/30 21:05:07; author: m09010; state: Exp; lines: +22 -1 _ add title. _ add 'what's CVS'. ---------------------------- revision 1.1 date: 2001/11/30 20:46:25; author: m09010; state: Exp; branches: 1.1.1; Initial revision ---------------------------- revision 1.1.1.1 date: 2001/11/30 20:46:25; author: m09010; state: Exp; lines: +0 -0 initial import. =============================================================================
リポジトリにファイルを追加する場合は, 以下のようにする.
% cvs add intro.html
commit するように言われるので, ちゃんと commit しよう. またファイルを削除するときは,
% rm intro.html % cvs remove intro.html
の用に, 元のファイルを削除してから cvs remove する. これも commit することを忘れないようにする.
ころあいをみはからって, ファイルにタグをつける.
% cvs tag YET_FINISHED index.html
このタグを基準にしてファイルを取得したい場合は,
% cvs checkout -r www/index.html
とする.
説明が長くなるので割愛する.
CVS には "モジュール" という概念がある. これは「あるディレクトリ階層中の一部分」という意味で, CVS で管理するディレクトリ構造が複雑になってきたときに効果を発揮する (CVS は標準では import 時に使用した名前でしか checkout できない).
モジュールを定義するには $CVSROOT/CVSROOT を checkout する.
% cvs checkout CVSROOT
その中にあるファイル modules を以下のように編集する (書式はファイル中にコメントアウトされている).
style www/style
このようにすると, 以降はモジュール名を使用して checkout できるようになる.
また, モジュールに対して, commit, checkout, update などを行った時に特定のプログラムを実行することが可能なため,
することが可能である.
Emacs にはバージョン管理支援のためのモードがあり, それが vc-mode である. 以下にその代表的なキーバインドを示す.
Command | Description |
---|---|
C-x v v (M-x vc-next-action) | ファイルが CVS の管理対象になっていなければ "cvs add" |
"cvs add" されているだけでチェックインされてなければ "cvs checkin" | |
CVS 管理対象ファイルで、 チェックアウト後に編集されていれば "cvs checkout" | |
CVS 管理対象ファイルで、 CVS リポジトリ内のファイルが更新されていれば "cvs update" | |
C-c C-c | ログの入力の終了 |
C-x v l | ログの閲覧 |
C-x v = (M-x vc-diff) | 前のバージョンとの差分を表示 |
M-x vc-version-diff | 特定のバージョン間の差分を表示 |
C-x v d | Dired 形式で各ファイルの状態を表示 (Dired mode と同様の操作が可能) |
C-x v h (M-x vc-insert-headers) | バッファのモードに適したキーワードヘッダーを挿入 (see vc-static-header-alist) |
C-x v i (M-x vc-register) | cvs add と等価 |
M-p (M-x vc-previous-comment) | 過去に入力した、前のログを呼び出す |
M-n (M-x vc-next-comment) | 過去に入力した、次のログを呼び出す |
M-s (M-x vc-comment-search-forward) | 過去に入力した内容を検索 (正順) |
M-r (M-x vc-comment-search-reverse) | 過去に入力した内容を検索 (逆順) |
また, Emacs21 には CVS に特化した pcl-cvs というモードが標準で含まれている (Emacs20 でも後からインストールすれば使えるはず).
M-x cvs-examin で起動して作業ディレクトリを指定すると, 再帰的にファイルの状態を調べてくれる.
また,
Command | Description |
---|---|
c (cvs-mode-commit) | commit する |
l (cvs-mode-log) | ログの閲覧 |
m (cvs-mode-mark) | 対象ファイルにマークを付ける |
u (cvs-mode-unmark) | 対象ファイルのマークをはずす |
= (cvs-mode-diff) | 前のリビジョンとの差分を表示 |
といったように少ないタイプで操作することができる.
pcl-cvs はマークが使えるので, 一定量以上のファイルを同時に操作したい時に向いている.
「CVS の使い方」の「差分の表示 (diff)」では, cvs diff の後に -u オプションをつけて unified 形式で diff をとっていたが, cvs diff の標準の差分形式は context 形式である. unified にするためにいちいち -u オプションを指定するのは面倒であるが, そのための解決策に $HOME/.csvrc がある. これは cvs のサブコマンドに対してグローバルに適用されるもので, 以下のように使用する.
diff -u
これにより, 逐次 -u オプションを指定することなしに unified 形式の diff が得られる.
上記は端末上で有効なオプションであるが, Emacs にも同様なオプションがあり,
(setq diff-switches "-u")
がそれである. これを $HOME/.emacs などに入れておけばよい.
tcsh の complete を使って, cvs コマンドの入力を楽にする.
complete cvs 'c/--/(help help-commands help-synonyms)/' \ 'p/1/(add admin annotate checkout commit diff \ edit editors export history import init log login \ logout rdiff release remove rtag status tag unedit \ update watch watchers)/' 'n/-a/(edit unedit commit \ all none)/' 'n/watch/(on off add remove)/'
単独で $Id$ を使っていても問題はないだろう. しかし, 他のグループが CVS でファイルを管理していて, なおかつ相手も $Id$ をつかっている場合, 自分の repository に import した際に元の情報が失われてしまう.
OS によってまちまちであるが, 独自のタグを定義することができる. ここでは FreeBSD local の手法を紹介しよう.
% cvs checkout CVSROOT % cd CVSROOT/ % cat > options tag=hoge=Id tagexpand=eId ^D % cvs add options; cvs commit options -m 'Forbid to expand $Id$, use $hoge$.' % cat >> checkoutlist options ^D % cvs commit -m 'Add "CVSROOT/options" into checkoutlist in order to reflect its role.' checkoutlist
CVSROOT/options について;
CVSROOT/checkoutlist では CVSROOT/options を作業ディレクトリに checkout することを指定している.
著者はふだん FreeBSD で CUI 指向の生活しているため, グラフィカルな WinCVS や MacCVS についての言及が不足しています.
最初に cvs add する時にキーワード展開しないようにしたので, 文頭の $Date$ が実際の最終更新時刻を反映していません.