RCS エラー対処

[RCS超入門] [RCS初級講座] [エラー対処]

RCS が出すエラー類はそんな多くないですが。 (CVSは多そうだ…)

$Id: rcs_e.html,v 1.16 2003-01-27 08:35:13+09 kabe Exp $


上書きしてもええんか?

	% co -l rcs21.html
	RCS/rcs21.html,v  -->  rcs21.html
	revision 2.24 (locked)
	writable rcs21.html exists; remove it? [ny](n):

書き込み可能 (-rw-)なファイルがあるということは、 編集中でまだ登録していないものの可能性があるわけで、 本当に上書きしていいかどうか聞いてくるわけです。

▽大好評放置中

一番ありがちなのは、前回の編集を登録せずにほったらかしにしていた場合。 上書きはまずいわけで、n (Ctrl-Cや単なる[CR]でもよい) で抜けて 現状を登録します。

	writable rcs21.html exists; remove it? [ny](n): n
	co: checkout aborted
	% ci -l -d -M rcs21.html	#再ロック、mtime拾う、mtime保持

▽編集放棄

現在の編集を放棄して元からやり直すなら、上書きしてかまわないので yと答えて登録済のものを取り出す。

	writable rcs21.html exists; remove it? [ny](n): y
	done

co -l ではロックは かかったままなので、 今回編集するのは やめて 元に戻す(ロック解除)なら 素直に co -u で取り出した方がいいでしょう。

	% co -u rcs21.html
	RCS/rcs21.html,v  -->  rcs21.html
	revision 2.24 (unlocked)
	writable rcs21.html exists; remove it? [ny](n): y
	done


ロックしてないだろ

	% ci -u rcs.html
	RCS/rcs.html,v  <--  rcs.html
	ci: RCS/rcs.html,v: no lock set by myself
登録は 自分用にロックしてある枝・幹に対してだけ可能ですが、 そのロックがないということ。 現在かかっているロックは rlog -l file で一覧が出ます。
▽chmod +wでむりやり編集した
ありがち。やってはいかんとはいえ、結構やってしまう。 修正の競合が起こらないとわかっている(自分一人だけとか)のであれば、 明示的に rcs -l でロックをかけ直せばよい。
	% rcs -l rcs.html
	
▽すでに他人がロックしている
その人にロックを解除してもらうか、 強制解除します。 この場合のエラーは "ci: file,v: revision 1.2 locked by otherone" となります。

とにかく登録だけしておきたいなら、 新しい枝を生やすという方法もあり。 新しい枝 (X.X.X.1) は事前のロックは不要。

▽自分なんだけど、他人に間違えられた

ロック時には myname でロックされているのだが、 登録時には RCS に root だと 認識された場合とか。 上と同じく素直にロックを強制解除するか、 環境をロック時と揃えます (setenv LOGNAME myname とか…)

人間ならともかく、 USER="root" のままで起動した httpd を nobody で動かしてて、CGIから自動 ci なんかをしようとするときに はまる ことがあります。 (USERが優先されるので rootと誤認される)
▽枝違い
(デフォルト枝が幹(1.X)なのだが、自分がいじっているのは 別の枝(1.2.1.X)である)
ci は自分用のロックがかかっている枝を探して そこに登録するので、実際にはエラーが出る事態は起こらないはずですが、 起こったら 単に ci で自分の枝を明示すれば良い。
	% ci -u1.2.1 rcs.html
	

ファイル毎だけ

	% ci public_html
	public_html,v  <--  public_html
	ci: `public_html' is not a regular file
	ci: public_html: Invalid argument

RCSは ファイル単位での管理 しか できないので、ディレクトリまるごと登録というのはできません。

CVSにステップアップしましょう。 (覚えなきゃならんことが飛躍的に増えますが)

まあ「どーしても」ってんなら public_html/* とか find . -type f -exec ci {} \; なんてのもありますが…


複数ロック

	% co -l file
	file,v  -->  file
	revision 1.2 (locked)
	co: file,v: warning: You now have 2 locks.

同一ファイルに対し、同一人物が2つ以上のロックをかけると 注意書が出ます。というのも、 次回登録時に

	% ci -u file
	file,v  <--  file
	ci: file,v: multiple revisions locked by you; please specify one
どっちのロックに対して登録すべきか判断できなくなるから。

$Id$ みりゃわかるだろと思うかもしれませんが、 ファイル中に $Id$ が必須なわけではないせいか、 ci は そこまでめんどう見てくれません。 (CVSでは sticky tag でこの管理を行っている。 ためかCVS管理下のファイルには $Id$ さえ ついてないことが多い)

複数ロックがしたいという場合もありますから、 警告にびびる必要はないし、登録時には -u1.1.2 などと 枝(版番)を明示すればよい。

ただ、複数ロックで複数の版を同時に編集中というのは、 CVS ならともかく RCS では めったにやらない (できるけど作業ファイルを分けねばならんので めんどくさい) ので、
前回別の枝をロックして編集したままほったらかしにしていた という状況の方が多いでしょう。 登録するなりして掃除するのがおすすめ。 現在のロック一覧は rlog -l


その日付は変だ

	% co -u -d fairu.html
	fairu.html,v  -->  fairu.html
	co: fairu.html,v: Revision 7.79 has date 2002-03-07 15:07:44+09.
	

裸の -d を使うと稀に出ます。大抵 ci -u -d (登録、残す、更新時刻拾う)の 打ちまちがいなので、やり直せばいいんですが。

ま、でも原因は一応追及しときましょう。

-d オプションは、普通は -d日付 (-d'2002/03/04 05:06:07') の 形で使い、裸の -d は 登録時(ci)に「ファイルの更新時刻を拾う」場合のみ、です。 だから、裸の co -d てのは使いません。

まず -u によって、現在ロックがかかっている版番が内部で補完されます。 よって -r7.79 -u。

で、co -d日付 は「この時刻以前のものを取り出せ」の意味ですが、 日付 がないと 今日の 00:00:00 になります。 (たぶんこれバグだと思うんだが…) 00:00:00 は -zタイムゾーン で計られるので、通常は GMTですが -zLTとしている人はローカルの00:00:00 です。

よって、上の例は以下と同等。

	% co -r7.79 -u -d'00:00:00' fairu.html
「00:00:00 以前のものを取り出せ」ということになりますが、 7.79版の登録時刻は 15:07:44 と、00:00:00 以降になっているため、 これは変だとエラーが出るようになるわけです。 (エラーメッセージは事実しか述べてないので、何で問題なのかが全然わからん)

このテの矛盾検知エラーは他にも以下のようなのがあります。 身に覚えがないなら、rcsが内部で補完している各種データを疑ってみましょう。 (どうやって確認するんだよう)


その枝にはないんだなぁ

	% co -d'2002-12-01<' sendmail.cf
	sendmail.cf,v  -->  sendmail.cf
	co: sendmail.cf,v: No revision on branch 9 has a date before 2002-12-01 00:00:00+09.

まこの場合はわかりやすいエラーが出るんですが、

RCSが内部でやっている自動検索は枝をまたがない (またいだら普通困る)ので、 たまに幹の整数部 (1.x → ... → 9.x) を変えていたりすると、 違う枝だと認識されて探してくれません。 -r7 とか明示する必要がある。めんどくさい。


ログぢゃないぜっ!

	% ci -u newfile
	RCS/newfile,v  <--  newfile
	enter description, terminated with single '.' or end of file:
	NOTE: This is NOT the log message!
	>> _
	

ファイルを初めてRCS管理下に入れる時に出ます。 正確にはエラーでもなんでもないですが、 "!" がついてるから初心者はびびるだろうな〜

修正後に ci していくと

	new revision: 1.7; previous revision: 1.6
	enter log message, terminated with single '.' or end of file:
	>> _
と、「(更新)ログを入れろ」になるので、それではないよと言っているわけ。 (そんなこと初心者に言ってもわからんだろーが…)

初めて ci する際に聞かれるのは、「何を変更したか」ではなく (初めてなんだから変更なんてものはない)、 「そのファイルは何なのか」(enter description)です。 機械が読むわけではないので、てきとーに入れておけばよいでしょう。

CVSwebなんかはここの文を説明書きとして ばばばんと出したりするので、そういう使い方をするなら ある程度かっちょいい説明文にしたほうがいいと思いますが

この「何なのか」説明文は、見づらいですが rlog の description: 項に 残ります。

	% rlog -t rcs_e.html
	RCS file: RCS/rcs_e.html,v
	...
	description:
	Encounter to RCS errors		←これ
	=============================================
	
修正したければ rcs -t で修正します。 めったに変えるもんでもないと思いますが


過去は変えられない

	% ci -u -d'1999-01-01 00:00:00' pastfile
	pastfile,v  <--  pastfile
	ci: pastfile,v: Date 1999-01-01 00:00:00+09 precedes 2002-12-08 01:28:38+09 in revision 1.1.

版番が増えるときは必ず更新時刻もすすむように 制限されています。 枝生やしたり -f 使っても無駄無駄無駄。

最新版を登録後、参考のために旧版も入手して 登録しておこうとすると この制限に困ったりするんですが、 回避方法はありません

ま直接管理ファイル (*,v) の date^Ixxxx.xx.xx.xx.xx.xx; 部分をいじくれば 変更できんこともないですが、 超おすすめしません。 版番と更新時刻が逆転していると co -d'date' (この時刻以前のものを取り出す) も ちゃんと?動作しなくなります。あまり使わんけど。


かべ@sra-tohoku.co.jp