RCS中級講座

-- You sometimes wanted to do this.

[RCS超入門] [RCS初級講座] [RCS中級講座] [RCS上級講座] [RCSエラー対処] [リンク集]

少しRCSを使い込んでくるようになると、ちょっと変わったことを したくなることもあります。さぁどうする?

$Id: rcs21.html,v 2.35 2003/12/14 17:58:37 kabe Exp $


他人のロックをこじ開ける

	% co -l httpd.conf
	RCS/httpd.conf,v  -->  httpd.conf
	co: RCS/httpd.conf,v: Revision 3.4 is already locked by otherone.

便利だ便利だと RCS の使用を布教していると、必ずや 他人がロックしたまま忘れているファイルを編集したくなることがあります。 その人にロックを解放してもらうのが正道ですが、 そうするほどでもなかったりめんどくさかったりする場合は ロックをこじ開けて(break a lock)編集することもできます。

% rcs -l filename
(rcs -u ...; rcs -l ... の省略形)
ロックを強制解除し、自分が乗っとる。 「破った理由を述べよ」と聞かれますが、これは元ロック者への メールの文面に使われます。 特にRCS管理ファイルに記録が残るわけではありません。
% ci -l -w悪人名 filename
(ci -w...; co -l ... の省略形)
すでに他人が施した変更を、その人の名前で登録。 別にやんなくてもいいんですが、自分が変更する部分とは 分けておきたいでしょ。
-l がついているので、実行後は 自分用にロックがかかっています。 ではお好きなようにいじって下さい。

メールを送りたくなければ rcs -M -lとしますが、 推奨はされてません(なぜだろう)。


ロックしたまま放置したものを今 登録

昔いじったままで登録せず、しばらく放置していたファイルを 再度いじる場合なんかは、まず現状を登録したい場合がありますが、 単に ci -u とすると登録される更新時刻は「現在」になります。

ファイルの更新時刻で登録するには、

% ci -u -d  filename

ファイルの更新時刻が信用ならんような場合は、 -d"1999-02-03 04:05:06+09" とすると更新時刻を偽造できます。 時刻の形式は co(1) 参照。


日付も含めてなかったことにする

編集中に「やっぱりやめた」と思ったら co filename とすれば 元に戻せるんですが、ファイル自身の更新時刻(mtime)までは戻りません。 co を実行した時刻になります。 HTMLファイルなんかで更新時刻も戻したいような場合は

	% co -M filename
で戻せます。

普通のwebサーバーではファイルの更新時刻を Last-Modified: として使用するので、キャッシュのことを考えると 変更がないのなら更新時刻も変えるべきではない。 (いや別に変えても害があるわけではないですが)

*.c でこれを行なうと make が発狂することがあるので避けましょう。

co でファイルを戻してもロックはかかったままなので、 手動で rcs -u file として解除するのも忘れないように。 (一人で使っていると気がつかない)

変わってないけど強制登録

何も変更してないものを登録しようとしても、通常はとりあってくれません。

	% ci -u forceci
	file is unchanged; reverting to previous revision 1.50

強制的に別のリビジョン番号を付けたい場合は、-fとします。

	% ci -f forceci
	forceci,v  <--  forceci
	new revision: 1.51; previous revision: 1.50
	enter log message, terminated with single '.' or end of file:
	>>

▽どんな時に使うんじゃい


File Mode (パーミッション・実行属性)について

ファイルのfile modeは、初回登録時に RCS管理ファイル のfile modeとして記録されるので、 その後作業ファイルのパーミッションや実行属性 を変更してもcoした時点で戻されてしまいます。
従って、 実行属性などを変更したら管理ファイル の方も同時に変更 しましょう。

【失敗例】

	% co -l sample.pl
	sample.pl,v  -->  sample.pl
	revision 1.1 (locked)
	done
	% ls -l
	-rw-r--r--  1 kabe           85 Dec  6 23:54 sample.pl
	-r--r--r--  1 kabe          222 Dec  6 23:54 sample.pl,v
	% chmod +x sample.pl	#実行属性だけを立てる
	% ls -l
	-rwxr-xr-x  1 kabe           85 Dec  6 23:54 sample.pl
	-r--r--r--  1 kabe          222 Dec  6 23:54 sample.pl,v
	% ci -u sample.pl	#登録する
	sample.pl,v  <--  sample.pl
	file is unchanged; reverting to previous revision 1.1
	done
	% ls -l
	-r--r--r--  1 kabe           80 Dec  6 23:54 sample.pl	#戻ってしまう
	-r--r--r--  1 kabe          212 Dec  6 23:54 sample.pl,v
	% 

ファイル名の変更

履歴等はそのままでファイル名だけ変更する場合は、 RCS管理ファイル (,v) の名前を変更する だけ です。

% mv RCS/oldname,v RCS/newname,v
(作業中の oldname も当然変わらないので変更しましょう)

RCS管理ファイルの中にはファイル名に関する情報は含まれてないんですねぇ。 ということは、rlogで出る履歴には ファイル名の変更に関する事実は残らない てことです。 残したければ 強制登録 で メモを入れておくこともできます。

なお CVS の場合はまた手順が違います。 RCS でのやり方をそのまま使うと CVS が発狂するのでやめましょう。 (古い名前を消してから新しい名前で再登録するらしい)

roff -man に更新時刻を入れる

roff なマニュアルのページ末にある更新時刻



SunOS 5.6            Last change: 7 Jan 1997                    1

は、.THマクロの第3引数で設定します。

てきとーでいいなら

	.TH HOGECMD 1 "$Date: 2001-10-15 20:29:39+09 $"
でも、文字数が多いせいもあって nroff ってみるとかなり不格好。

RCS自体に年月日だけというキーワードはないので、 roff自身に年月日部分だけを取り出させるのがスマートでしょう。 RCSのマニュアルページ (man/man1/rcs.1) も同じことをしています。

	.de Id
	.ds Dt \\$4
	..
	.Id $Id: hogecmd.man,v 2.25 2001-10-15 20:29:39+09 kabe Exp $
	.TH HOGECMD 1 \*(Dt


rlog が長すぎるんぢゃなんとかしろ

改版を大量にため込むと、 rlog の出力がえらい長くなって

% rlog /etc/mail/sendmail.cf |wc
    1160    5574   48465
やってられんという場合は…ふつーは less とかに通して見るんでしょうけど、 rlog にも出力範囲を指定するオプションがあるので活用してみよう。 (使いやすくはないが…)

▽(最新) 最新版の履歴1コだけ出す:
% rlog -r sendmail.cf
直前に他人がいじったかどうかの確認くらいには使えるかも。 裸の -r は最新版、てのは他の RCS コマンドと同様。
▽(ヘッダのみ) 更新履歴以前のヘッダ部分だけ出す:
% rlog -r0 sendmail.cf
版番 0.x は普通は存在しないので履歴が出ない。
▽(枝で指定) 版番 6.x のもの全部出す:
% rlog -r6 sendmail.cf
少々やっかいなのは「幹を全部」(x.x) という指定ができないので、 幹の最上位版番をたまに変えていたような場合は -r4 -r5 -r6 と手で指定する必要があります。
▽(最新枝) 最新の枝のもの全部出す:
% rlog -b sendmail.cf
最新枝つーか幹つーかが 6.x である場合は -r6 と同様。
▽(日付で指定) 2002/10/01 以降の版の履歴だけを出す:
% rlog -d'2002/10/01<' sendmail.cf
'<' は生で打ち込むと当然リダイレクトと思われるので クオートすること。 find や GNU date のように「何日前」という指定ができないので いまいちめんどくさい。

rlog(1) のマニュアルにも他の例が出てますが、 複数のファイルを扱ってるんでなければ -L とかはあまり使わん ような気がする。 (複数ファイルなら CVS を使うべきだし…)


かべ@sra-tohoku.co.jp