%%Title: CVS の使い方

%%Created: Tue Dec 15 12:00:00 JST 1998
%%Updated:



o CVSとは
	cvs の 日本語manがあると便利。だけど、原文も見るべし。

	Kernel hackerのためのcvs入門 (初心者向け)を参考すると、非常にためになる。と言うか、ここを参考にして以下を書きました :-p。
	ここもタメになる。


o リポジトリ
	ソース管理を行なうディレクトリのこと。これが無ければ始まらない。
	環境変数 CVSROOT に設定。
	cvs -d でも指定可。
	cvs co した後、ディレクトリに CVS/Root があるとそっちを見てくれる。


o cvs-1.9 を突っ込む。
	ftp://ftp.sra.co.jp/pub/gnu/prep/gnu-0.2/src/へんから cvs-*.tar.gz の最新版を拾ってくる。
	軽く INSTALL を読む。
	% ./configure
	% make
	% make install


o これだけは覚えよう。
	cvs のヘルプは
		% cvs --help
	cvs のコマンドのヘルプは
		% cvs --help command

	まず覚えるコマンド
	% cvsinit...
	% cvsimport...
	% cvsco...
	% cvsadd...
	% cvscommit...
	
	実行しないモード
	% cvs -n command ...

o リポジトリを作る。
	環境変数 CVSROOT に設定されたディレクトリが
	無ければ勝手に作られ、その下に管理用ファイルも勝手に作られる。

	% setenv CVSROOT /cvsroot
	% cvs init
	とか
	% cvs -d /cvsroot init
	する

o CVS管理したいソースをリポジトリに突っ込む。

	% cvs import [-b branch] [-ko] repository vendortag releasetag

	カレントディレクトリ以下のファイルを vendortagreleasetag として
	repository に登録する。repository$CVSROOT からみたパスで、無ければ作られる。

	以下にマッチするファイルは無視される。
                        RCSLOG  RCS  SCCS
                        CVS*  cvslog.*
                        tags  TAGS
                        .make.state  .nse_depinfo
                        *~  #*  .#*  ,*
                        *.old  *.bak  *.orig  *.rej  .del-*
                        *.a  *.o  *.Z  *.elc  *.ln  core
	import に無視するファイルを教えるには -I を使う。
	例えば、*.jpg と *.gif を無視したければ。
		% cvs import -I '*.jpg *.gif' diary current s981111

	各ディレクトリに .cvsignore という名のファイルを作り、
	無視したいファイルをリストしておけば、import時にばかりでなく
	diff 等でも無視される。

	もともとの RCS tag を保存する場合は、-ko オプションをつける。
	このままだと未来永劫 $Id: howto-cvs.html,v 1.6 2005/03/14 06:00:31 sakane Exp $ は変わらなくなるので、必要に応じて checkout や add の際 -kkv とかを使う。
	でも面倒臭くなるからRCS tag は忘れる方が無難かも。-ko 禁止?

	デフォルトの枝番号は 1.1.1 になるので、最初のリビジョンは 1.1.1.1 になる。
	これを変更する場合は、-b オプションをつける。

	例えば、BSD/OS2.1 patchlevel 27 の ソースをリポジトリ $CVSROOT/sys へ枝番号1.0.0 で突っ込む場合、
	% cd /usr/src/sys
	% cvs import -ko -b 1.0.0 sys bsdi21 p27

	どうなったかと言うと
	% ls -a $CVSROOT/sys
	./              compile/        kern/           netinet/        scripts/
	../             conf/           miscfs/         netiso/         stand/
	.MAP,v          dev/            msdosfs/        netns/          sys/
	PATCHLOG,v      i386/           net/            netyips/        ufs/
	common/         isofs/          netccitt/       nfs/            vm/

	となる。
	cvsweb.cgi を使うと.MAPをかっこよく出力できる。

o 自分用作業環境を作る。

	% cvs co -b -r tag symbolic_tag modules...

	例えば、yips12 用の作業ディレクトリを掘る。
	% mkdir $WORKDIR
	% cd $WORKDIR
	% cvs co -r yips12 sys

	CVSROOT を設定するのが面倒だなぁ。
	% cvs -d /cvsroot/yips co -r yips12 sys

o ファイルを変更する。
	思ううがままに。

o 新たにファイルを追加する。

	% cvs add [-ko] files...

	例えば xyz.c を追加するならば、xyz.c があるディレクトリに行って、

	% cvs add xyz.c

	こうすると checkout しているモジュールに xyz.c が追加される。

	% cvs commit することで、実際にリポジトリに追加される。
	ディレクトリを追加する時も同じ。

	例えば、sys/sys/malloc.h の修正をもとに戻す時は、
	% cd $WORKDIR
	% cvs co -r yips12 sys/sys/malloc.h

o ファイルを削除する。
	例えば、xyz.c を削除したい時、xyz.c があるディレクトリに行って、

	% rm xyz.c
	% cvs remove -f xyz.c

	実際には % cvs commit されるまで削除されない。
	% cvs remove で消しても % cvs commit を行なう前であれば、また作って % cvs add すれば良い。
	ディレクトリの消し方は? -> 消せない!

	消されたファイルは、ディレクトリ Attic に移動する。復活させる方法は? --> 人力。

o 作業ディレクトリとリポジトリの差分を取る。
	% cvs diff [-r rev1] files...

	オプションを何も指定しないと、checkout した時のリビジョンと比較する。

	% cvs diff sys

o リポジトリへ修正を繁栄させる。

	% cvs commit [-m log_message] [-r revision] file...

	今いるディレクトリだけを対象にしたいならば、-l を指定する。

	% cvs commit -m 'foge' sys

o 元々のソースツリーから自分用の枝を作る。

	% cvs rtag -b -r tag symbolic_tag modules...

	$CVSROOT/modulestag に、symbolic_tag という新しい枝を作る。

	例えば、BSDI 2.1 の sys の p27 から yips12 と言う枝を作る。
	% cvs rtag -b -r p27 yips12 sys

o タグを付ける。
	% cvs tag [-d] symbolic_tag [files...]

	作業ディレクトリにあるソースに最も近いリポジトリのリビジョンに対してタグをふる。
	rtag のようにタグを振るファイルのバージョンを明示的に指定するのではなく、作業ファイルの履歴を利用する。
	タグを削除する時は、-d を使う。

	例えば、今 commit した作業ファイルに tag を付ける場合、
	% cvs tag yipf1211

o リリースのための diff を作る。
	% cvs rdiff -r p27 -r yips12 sys

	BSDI のもともとのリビジョンも変わっちゃうけど、どうすんだろう? --> -ko していれば変わらないはず。
	commit する前に、作業ディレクトリで
		% cvs diff -r p27 sys
	すれば良いのだろうか?
	それとも、出来た diff ファイルを grep -v 'BSDI $Id:' とかするか?

o 元々のソースのバージョンが上がったら。

	releasetag を変えて import する。

	例えば、BSDI 3.0 が出た。
	% cd /usr/src/sys
	% cvs import -ko sys BSDI r30

o ファイルの状態を表示する。

	% cvs status -v file

o その他
	% cvs export -r[ tag|release ] module
		リリース版のファイルを作る。(CVSで管理されない)

	% cvs [-d] update
		他の開発者が行なった変更をローカルの作業ファイルに反映させる。

	% cvs release [-d] module
		checkin せずに作業ファイルを削除する。使わなくても良い?

	% cvs log [file..]
		ファイルのログ情報を出力する。


o これは便利
	- 環境設定ファイルをCVS管理する。ノートPC買いかえてもすぐに環境移行できる。
		内緒で .ssh も管理しちゃう?
		そんときは ssh/random_seed は除くべし。
		ただし CVSサーバがクラックされると死ぬ。
	- ツール群をCVS管理すると、適当にリリースできちゃう。
	- ドキュメントをCVS管理すると、いつでもどこでも編集できちゃう。
	- public_html をCVS管理すると、いつでもどこでも編集できちゃう。
		画像ファイルは別管理すべし。
	- バイナリを repositoryに入れたい時は -koを着ける。

	- 共同開発してる時、cvs annotateすると誰がいつその行を編集したか
	  わかってしまう。


o CVSROOTの中

	CVSROOTの中身も cvsで管理されるので、編集するときは

	% cvs co CVSROOT
	する

	% ls -1 CVSROOT
	checkoutlist
	commitinfo
	config
	cvswrappers
	editinfo
	loginfo
	modules
	notify
	rcsinfo
	taginfo
	verifymsg

	編集して cvs commit すると自動的にCVSROOT内を再構築しなおしてくれる。
	これ以外にファイルを追加するときは cvs addするが、追加したファイル名を
	再構築するリストにも追加しなければならない。checkoutlist に追加する。