CVS

$Date: 2001/12/01 01:55:12 $

CVS とは

CVS (Concurrent Version System) とは, その名前が示す通り, バージョン管理ソフトである. バージョン管理ソフトには, CVS の原型となった RCS (Revision Control System) や商用 UNIX についてくる SCCS (Source Code Control System) などがある. 主として UNIX 系 OS で動作するが, Windows や MAC にも移植されている. programming をする人や文書を管理する人は必ず使うべきソフトウェアである.


CVS を使うことのメリット

CVS を使うと, 以下のような恩恵にあずかることができる.

さらに BSD 系 OS を利用している人は, 基本システムに CVS が組み込まれているので, -stable, -current の追っかけの時に役に立つ, …はず.


CVS の導入

大抵の UNIX 系 OS ならば, あらかじめインストールされていると思われるが, Solaris などの商用 OS では付属しないようだ. その場合は以下のように自分でインストールする必要がある.

UNIX 系 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 の場合

windows には移植版の WinCVS がある. これは CUI の他に GUI も使える. バージョンの遷移がグラフ表示できるのが面白い. 本家の配布には日本語に対応していないので, 適宜日本語化する必要がある. そのためには以下のファイルが必要である.

後者を展開して, 前者をインストールしたフォルダに上書きすればよい.


CVS の使い方

言葉の約束

まず, CVS 使われる言葉の約束をする. "バージョン" とはプログラムや文書における版を指し, "リビジョン" とはプログラムや文書を構成する各々のファイルの版を指す. "リポジトリ" とはファイルを格納しておくタンクのようなものである. "タグ" とは, ある時点の各ファイルに対してつける共通の印のことで, タグを指定すれば特定のリビジョンのファイル群を取り出すことができる.

管理ディレクトリの作成と環境変数の設定

まず, CVS 用の管理ディレクトリを作る. そして, そのディレクトリを環境変数 CVSROOT に設定する. csh 系シェルの場合は,

% cd $HOME
% mkdir repository
% setenv CVSROOT $HOME/repository

とする.

管理ディレクトリの初期化 (init)

管理ディレクトリを初期化する.

% 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

登録 (import)

準備が整ったら, 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 はとくに指定しない限り, カレントディレクトリ以下を再帰的に管理対象とみなすからである.

取り出し (checkout)

リポジトリに登録しただけでは何もはじまらない. 作業用に 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 をあたって欲しい.

格納 (commit)

取り出したファイルを編集し, リポジトリにその変更を反映させるには, 以下のようにする.

% 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 でログを書くことができる.

差分の表示 (diff)

ファイルの内容をどのように変更したのか知りたいときは, 以下のように -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>

履歴の表示 (log)

ファイルの変更履歴を知りたいときは, 以下のようにする.

% 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.
=============================================================================

追加, 削除 (add, remove)

リポジトリにファイルを追加する場合は, 以下のようにする.

% cvs add intro.html

commit するように言われるので, ちゃんと commit しよう. またファイルを削除するときは,

% rm intro.html
% cvs remove intro.html

の用に, 元のファイルを削除してから cvs remove する. これも commit することを忘れないようにする.

タグをつける (tag)

ころあいをみはからって, ファイルにタグをつける.

% cvs tag YET_FINISHED index.html

このタグを基準にしてファイルを取得したい場合は,

% cvs checkout -r www/index.html

とする.

枝の分岐 (rtag)

説明が長くなるので割愛する.


CVS tips

モジュール (module)

CVS には "モジュール" という概念がある. これは「あるディレクトリ階層中の一部分」という意味で, CVS で管理するディレクトリ構造が複雑になってきたときに効果を発揮する (CVS は標準では import 時に使用した名前でしか checkout できない).

モジュールを定義するには $CVSROOT/CVSROOT を checkout する.

% cvs checkout CVSROOT

その中にあるファイル modules を以下のように編集する (書式はファイル中にコメントアウトされている).

style   www/style

このようにすると, 以降はモジュール名を使用して checkout できるようになる.

また, モジュールに対して, commit, checkout, update などを行った時に特定のプログラムを実行することが可能なため,

することが可能である.

vc-mode

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) 過去に入力した内容を検索 (逆順)

pcl-cvs

また, 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 はマークが使えるので, 一定量以上のファイルを同時に操作したい時に向いている.

unified な diff を!

「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 から補間したい!

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 することを指定している.


配布
CVS Home http://www.cvshome.org/
解説
CVS のはなし http://cvs.m17n.org/cvs/
参考
CVS manual の日本語訳 http://www.sodan.org/~penny/vc/
FreeBSD の CVS のオンラインマニュアル cvs(1) (en) http://www.freebsd.org/cgi/man.cgi?query=cvs&apropos=0&sektion=0&manpath=FreeBSD+4.4-RELEASE&%5B%5Bformat%5D%5D=html
FreeBSD の CVS のオンラインマニュアル cvs(5) (en) http://www.freebsd.org/cgi/man.cgi?query=cvs&apropos=0&sektion=5&manpath=FreeBSD+4.4-RELEASE&%5B%5Bformat%5D%5D=html
FreeBSD の CVS のオンラインマニュアル cvs(1) (ja)
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=cvs&dir=jpman-4.4.0%2Fman&sect=0
FreeBSD の CVS のオンラインマニュアル cvs(5) (ja)
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=cvs&dir=jpman-4.4.0%2Fman&sect=5
tcsh の配布に含まれる complete.tcsh
配布
WinCVS http://www.wincvs.org/
WinCVS 1.2 の Shift-JIS ごった煮版 http://www.kmc.kyoto-u.ac.jp/~slakichi/barn/
TCL http://dev.scriptics.com/
ExamDiff http://www.nisnevich.com/examdiff/examdiff.htm
Peggy (CVS インターフェースを持つ windows 用のエディタ(商用)) http://www2.noritz.co.jp/anchor/ashp/peggy/pegindex.html
解説
バージョン管理システム CVS を使う http://www-vox.dj.kit.ac.jp/nishi/cvs/cvs.html
WinCVS の使い方 (初歩の初歩) http://spica.u-aizu.ac.jp/soe/document/cvs/wincvs.html
CVS, WinCVS についてのメモ http://www.koizuka.jp/wincvs.html
WinCVS http://www.interq.or.jp/japan/s-imai/tcltk/wincvs.html
CvsGUIの日本語訳 (for WinCVS/MacCVS) http://www.bekkoame.ne.jp/~bero/docj/cvsgui/cvsgui.html

この文書のバグ

著者はふだん FreeBSD で CUI 指向の生活しているため, グラフィカルな WinCVS や MacCVS についての言及が不足しています.

最初に cvs add する時にキーワード展開しないようにしたので, 文頭の $Date$ が実際の最終更新時刻を反映していません.


Copyright (C) 2001-2003 Hideyuki KURASHINA. <m09010@st.nagaoka-ct.ac.jp>