$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $

%Hd: CVS をテストで使ってみる

以下の作業は /var/tmp で行うとする。適当に読み変えてください。
cvs-test.sh を起動すると

	% cd /var/tmp
	% sh cvs-test.sh

/var/tmp 以下に元のソースがあるorigツリーとcvsrootディレクトリが出来る。
	cvs-test/
	  |
	  +-------+
	  |       |
	orig/   cvsroot/
	  |
	  +-------+
	  |       |
	 A/      B/
	          |
	         Ba/

そして、origツリーのディレクトリ A, B に、それぞれリビジョン 2.0の
ファイル a01, b01 が、ディレクトリ Ba にリビジョン 4.0 の
ファイル ba01 が出来る。

	orig/
	 |
	 +-------+
	 |       |
	 A/a01   B/b01
	         |
	         Ba/ba01

	% cat cvs-test/orig/A/a01
	$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $

	% cat cvs-test/orig/B/Ba/ba01 
	$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $

さて、ここで環境変数 CVSROOT を設定して cvs init すると

	% setenv CVSROOT /var/tmp/cvs-test/cvsroot
	% cvs init

cvsroot 以下に管理用ファイルが勝手に作成される。

	% ls -R cvs-test/cvsroot
	CVSROOT/

	cvs-test/cvsroot/CVSROOT:
	checkoutlist    cvswrappers     history         modules,v       rcsinfo,v
	checkoutlist,v  cvswrappers,v   loginfo         notify          taginfo
	commitinfo      editinfo        loginfo,v       notify,v        taginfo,v
	commitinfo,v    editinfo,v      modules         rcsinfo

では、まずorigツリーをリポジトリsrcに突っ込んで見よう。

	% cd cvs-test/orig
	% cvs import src orig rel

リポジトリの内容を確認してみると、

	% cvs co -p src/A/a01
	===================================================================
	Checking out src/A/a01
	RCS:  /var/tmp/cvs-test/cvsroot/src/A/a01,v
	VERS: 1.1.1.1
	***************
	$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $

$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $ が変更されて、リビジョンが 1.1.1.1 になっている!
そこでリポジトリを削除して -ko オプションを使って突っ込み直してみよう。

	% cd /var/tmp/cvs-test/cvsroot
	% rm -rf CVSROOT src
	% cvs init
	% cd /var/tmp/cvs-test/orig
	% cvs import -ko src orig rel

内容を確認してみると…

	% cvs co -p src/A/a01
	===================================================================
	Checking out src/A/a01
	RCS:  /var/tmp/cvs-test/cvsroot/src/A/a01,v
	VERS: 1.1.1.1
	***************
	$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $

おお!今度は $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $ は保存されている。が、VERS: 1.1.1.1 となっているぞ。
CVS のリビジョンと $Revision: 1.1.1.1 $ は違うものなのか?うーん。よくわからん。
再度リポジトリを削除して突っ込み直してみよう。

	% cvs import -ko -b 1.0.0 src orig rel
	% cvs co -p src/A/a01
	===================================================================
	Checking out src/A/a01
	RCS:  /var/tmp/cvs-test/cvsroot/src/A/a01,v
	VERS: 1.0.0.1
	***************
	$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $

import の時 -b を使って CVSのリビジョンがコントロールできる。
CVSのリビジョンとは branch (枝)と呼ばれる物か?

それでは checkout して、いろいろ編集して見よう。が、このままではベンダーの枝に
直接変更する事になるので、タグ rel から自分用の枝 work01 を作って checkout する。
	% cvs rtag -b -r rel work01 src
	% mkdir /var/tmp/cvs-test/work
	% cd /var/tmp/cvs-test/work
	% cvs co -r work01 src

では、とりあえずファイル a01 をいじって見よう。でも、その前に status を覚えておく。
	% cd src/A
	% cvs status -v a01
	===================================================================
	File: a01               Status: Up-to-date

	   Working revision:    1.0     Wed Nov 19 03:49:23 1997
	   Repository revision: 1.0     /var/tmp/cvs-test/cvsroot/src/A/a01,v
	   Sticky Tag:          work01 (branch: 1.0.2)
	   Sticky Date:         (none)
	   Sticky Options:      -ko

	   Existing Tags:
	        work01                          (branch: 1.0.2)
	        rel                             (branch: 1.0.1)
	        orig                            (branch: 1.0.0)

	なんでリビジョンが 1.0 なんだ? 1.0.2.1 じゃないのか?
	さらに、-r オプションを使わないで checkout するとどうなるんだろう?

	% cvs co src
	% cvs status a01
	===================================================================
	File: a01               Status: Up-to-date

	   Working revision:    1.0.0.1 Wed Nov 19 03:49:23 1997
	   Repository revision: 1.0.0.1 /var/tmp/cvs-test/cvsroot/src/A/a01,v
	   Sticky Tag:          (none)
	   Sticky Date:         (none)
	   Sticky Options:      -ko

	多分 orig (1.0.0) の枝になっている?うーん。

では編集してみる。

	% echo "first edition." >> a01
	% cvs commit

さて status はどうなったかと言うと、

	% cvs status -v a01
	===================================================================
	File: a01               Status: Up-to-date

	   Working revision:    1.0.2.1 Wed Nov 19 06:39:12 1997
	   Repository revision: 1.0.2.1 /var/tmp/cvs-test/cvsroot/src/A/a01,v
	   Sticky Tag:          work01 (branch: 1.0.2)
	   Sticky Date:         (none)
	   Sticky Options:      -ko

	   Existing Tags:
	        work01                          (branch: 1.0.2)
	        rel                             (branch: 1.0.1)
	        orig                            (branch: 1.0.0)

	% cvs co -n -r work01 -p src/A/a01
	===================================================================
	Checking out src/A/a01
	RCS:  /var/tmp/cvs-test/cvsroot/src/A/a01,v
	VERS: 1.0.2.1
	***************
	$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $
	first edition.

リビジョンが 1.0.2.1 になっているが、$Revision: 1.1.1.1 $ は 2.0 のままである。
Sticky Options の -ko が臭い?でも、-ko を外すと元の $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $ が消えちゃう…
そこで -kkv を使った checkout を行って編集、commit してみよう。
まず、さっきと違う枝を作ってから、

	% cvs rtag -b -r rel work02 src
	% mkdir /var/tmp/cvs-test/work2
	% cd /var/tmp/cvs-test/work2
	% cvs co -kkv -r work02 src
	% cd src/A
	% echo "new first edition." >> a01
	% cvs commit
	% cvs status -v a01
	===================================================================
	File: a01               Status: Up-to-date

	   Working revision:    1.0.4.1 Wed Nov 19 06:42:09 1997
	   Repository revision: 1.0.4.1 /var/tmp/cvs-test/cvsroot/src/A/a01,v
	   Sticky Tag:          work02 (branch: 1.0.4)
	   Sticky Date:         (none)
	   Sticky Options:      -kkv

	   Existing Tags:
	        work02                          (branch: 1.0.4)
	        work01                          (branch: 1.0.2)
	        rel                             (branch: 1.0.1)
	        orig                            (branch: 1.0.0)

	% cvs co -n -r work02 -p src/A/a01
	===================================================================
	Checking out src/A/a01
	RCS:  /var/tmp/cvs-test/cvsroot/src/A/a01,v
	VERS: 1.0.4.1
	***************
	$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $
	new first edition.

お、変わった。けど枝:1.0.4 となって 1.0.3 を飛ばしてるぞ。まぁ置いといて、
ところで今タグの構造は、

	orig --- rel -- ..
	          |
	          +---- work01 (rel から派生)
	          |
	          +---- work02 (rel から派生)

だがこの構造を忘れてしまったらどうすんだろう…うーん…

次にファイル a01 のタグ rel とタグ work01 の差分を作ってみよう。

	方法その1:リポジトリと作業ディレクトリを使う。
	ファイル a01 のあるディレクトリに行ってから、

	%  cvs diff -r rel a01
	Index: a01
	===================================================================
	RCS file: /var/tmp/cvs-test/cvsroot/src/A/a01,v
	retrieving revision 1.0
	retrieving revision 1.0.4.1
	diff -r1.0 -r1.0.4.1
	1c1,2
	< $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $
	---
	> $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $
	> new first edition.

	方法その2:リポジトリだけを使う。
	これは、どこにいても実行可能。

	% cvs rdiff -r rel -r work02 src/A/a01
	Index: src/A/a01
	diff -c src/A/a01:1.0 src/A/a01:1.0.4.1
	*** src/A/a01:1.0       Wed Nov 19 15:38:08 1997
	--- src/A/a01   Wed Nov 19 15:42:09 1997
	***************
	*** 1 ****
	! $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $
	--- 1,2 ----
	! $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $
	! new first edition.

ん?このパッチを配布するとオリジナルの $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $ を書き換えてしまって具合が悪い。
やっぱり -ko のまま checkout した方が良いのかも…
と言うわけで work01 にもどって、今度はファイル a02 を作ってみる。

	% cd /var/tmp/cvs-test/work/src/A
	% printf '$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $\ncreate a new file.\n' > a02

ファイルの追加は cvs add を使う。-kkv を使って単独でリビジョン管理を可能にする。

	% cvs add -kkv a02
	% cvs status -v a02
	===================================================================
	File: a02               Status: Locally Added

	   Working revision:    New file!
	   Repository revision: No revision control file
	   Sticky Tag:          work01 - MISSING from RCS file!
	   Sticky Date:         (none)
	   Sticky Options:      -kkv

なんか MISSING from RCS file! とか言って怒られているが構わず、

	% cvs commit
	% cvs status -v a02
	===================================================================
	File: a02               Status: Up-to-date

	   Working revision:    1.1.2.1 Wed Nov 19 07:25:00 1997
	   Repository revision: 1.1.2.1 /var/tmp/cvs-test/cvsroot/src/A/Attic/a02,v
	   Sticky Tag:          work01 (branch: 1.1.2)
	   Sticky Date:         (none)
	   Sticky Options:      -kkv

	   Existing Tags:
	        work01                          (branch: 1.1.2)

あれ?いきなり枝: 1.1.2になってる!うー構造が…
タグ work01 でグループ化されているから気にしなくて良いのだろうか?
さて、ここまでの work01 の src に対して新たにタグ work011 を付けてみる。

	% cd /var/tmp/cvs-test/work
	% cvs tag work011 src

こうすると work01 と work011 の diff が取れるようになる。
では、試しにディレクトリ A の下にディレクトリ Aa を掘って、
さらにファイル aa01 を作ってみる。

	% cd src/A
	% mkdir Aa
	% cvs add Aa
	% cd Aa
	% printf '$Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $\ncreate a new file\n' > aa01
	% cvs add aa01
	% cvs commit 

で diff とると、

	%  cvs rdiff -r work01 -r work011 src
	cvs rdiff: Diffing src
	cvs rdiff: Diffing src/A
	cvs rdiff: Diffing src/A/Aa
	Index: src/A/Aa/aa01
	diff -c /dev/null src/A/Aa/aa01:1.1.2.1
	*** /dev/null   Wed Nov 19 18:04:30 1997
	--- src/A/Aa/aa01       Wed Nov 19 17:58:21 1997
	***************
	*** 0 ****
	--- 1,2 ----
	+ $Id: howto-cvsexp.html,v 1.1.1.1 1999/10/26 17:19:14 sakane Exp $
	+ create a new file
	cvs rdiff: Diffing src/B
	cvs rdiff: Diffing src/C
	cvs rdiff: Diffing src/C/Ca

うむ確かに。さて今タグの構造は、

	orig --- rel -- ..
	          |
	          +---- work01 (rel から派生)
	          |       |
	          |       +---- work011 (work01 から派生)
	          |
	          +---- work02 (rel から派生)

とりあえずおしまい。
ところで、このファイルを RCS 管理する方法は? :-p