$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