RCS に関するよくある質問について。
test.txt
をリビジョン管理するとする。
test.txt
のあるディレクトリに移動する。
./RCS
ディレクトリがなければ作成する(作成しなくても良い)。
$mkdir RCS
$ci test.txt
test.txt
は削除され./RCS
ディレクトリの下にtest.txt
の情報を格納したtest.txt,v
というファイルが作成される(./RCS
ディレクトリを作成していなかった場合はtest.txt
のあったディレクトリにtest.txt,v
が作成される)。
check-in すると作業ファイルは削除される。
しかしファイルの内容はRCSファイルに格納されているのでファイルの情報が失なわれてしまっているわけではない。
ファイルを取り出すにはco
コマンドを使う。
$co ファイル名
$co -l ファイル名
これはリビジョングループを格納するRCSファイルというものである。 すべてのリビジョンや履歴情報などが格納されている。 管理しているファイルが不要になった場合を除いてこのファイルを削除してはならない。
version の v。
check-in すると作業ファイルは削除されてしまう。 しかし編集作業を続けたいときもある。 その場合はあらためて check-out すればよいのであるが若干面倒である。
$ci -l ファイル名
と -l オプションを指定すると
$ci ファイル名
$co -l ファイル名
としたのと同じ処理がなされる。
check-in すると作業ファイルは削除されてしまう。 しかし編集はしないけれどもコンパイルなどのためにファイルが読めるようにしておきたいこともある。 その場合はあらためて check-out すればよいのであるが若干面倒である。
$ci -u ファイル名
と -u オプションを指定すると
$ci ファイル名
$co ファイル名
としたのと同じ処理がなされる。
問題ない。
その場合RCSファイルがカレントディレクトリに作成される。
もしも整理するために RCSファイルを RCS ディレクトリに移したければ ./RCS
ディレクトリを作成し RCSファイル(通常は ',v' で終わるファイル)を ./RCS
に移動すればよい。
普通に check-in をするとRCSファイル中にある最新のレベル番号を 1 増やしたものが新しいリビジョンのリビジョン番号となる。
明示的に指定したい場合は -r オプションを指定する。
$ci -rリビジョン番号 ファイル名
-f オプションを指定することで強制的に check-in することができる。
$ci -f ファイル名
$ci -f -rリビジョン番号 ファイル名
-m オプションで指定することができる。
$ci -mメッセージ ファイル名
ロックしていない RCSファイルに対して check-in しようとすると
ci: RCSファイル名: no lock set by ログイン名
というエラーメッセージが返される。
もし check-in したければ rcs -l
でRCSファイルにロックをかけることができる。
$rcs -l ファイル名
$ci ファイル名
$ci -nリビジョン番号につける名前 ファイル名
で新しいリビジョンのリビジョン番号にシンボル名をつけることができる。 ただしすでに同じ名前が利用されている時はつけることができない。 古いものに上書きしたい場合は
$co -Nリビジョン番号につける名前 ファイル名
とすれば新しくつけなおすことができる。
check-in の時に rcs は対象ファイルを削除しようとする。この時エディタなどで開いたままだったりすると、対象ファイルを削除できないためエラーが発生する。
この場合新しいリビジョンは格納されている。
開いていたファイルを編集してもよいが、RCSファイルにはロックはかかっていないことに注意。
co
コマンドで取り出すことができる。
$co ファイル名
ァイルを編集して後でまた check-in したい場合はロックをかけて check-out する。
$co -l ファイル名
-r オプションでリビジョン番号を指定することができる。
$co -rリビジョン番号 ファイル名
とすると指定したリビジョン番号と同じか、それより小さい最新のリビジョンがとりだされる。
-r オプションでシンボル名を指定すればよい。
$co -rシンボル名 ファイル名
-d オプションの後に以下のような文字列を指定することで可能である。
8:00 pm lt 4:00 AM, Jan. 12, 1990 default is UTC 1990-01-12 04:00:00+00 ISO 8601 (UTC) 1990-01-11 20:00:00-08 ISO 8601 (local time) 1990/01/12 04:00:00 traditional RCS Thu Jan 11 20:00:00 1990 LT output of ctime(3) + LT Thu Jan 11 20:00:00 PST 1990 output of date(1) Fri Jan 12 04:00:00 GMT 1990 Thu, 11 Jan 1990 20:00:00 -0800 Internet RFC 822 12-January-1990, 04:00 WET
-f オプションでできる。
$co -f ファイル名
で作業ファイルがある場合は check-out して上書きする。
-p オプションでできる。
$co -p ファイル名
で標準出力に check-out したリビジョンを出力する。
チェックアウトしようとしたものと同じファイル名のファイルがすでに存在している。
y[return]
とすれば作業中のファイルは削除されてあたらしく作業ファイルが check-out される。
n[return]
とすれば check-out はされないで、もとのファイルが残る。
すでにあるファイルがロックなしで check-out し更新していないものであれば、このメッセージはでないで上書きされる。
co コマンドで明示的にワークファイル名(check-out して生成したいファイル名)を指定する。
例えば
/tmp/my-project/RCS/test.c,v
がある状態(/tmp/my-project ディレクトリで test.c をRCSで管理している状態)で、カレントディレクトリ /tmp/my-work に test.c をチェックアウトするには
co ../my-project/RCS/test.c,v ./test.c
で行える。 ci する時も同様に RCS ファイルとワークファイルの両方を指定する(しない場合、通常の使用と同じようにカレントディレクトリやカレントディレクトリの RCS サブディレクトリに check-in してしまう)。
詳しくは ci のオンラインマニュアルの FILE NAMING(ファイル名規則)セクションを参照。
コマンドの引数が繁雑になり(明示的に2つのファイルを指定する必要あり)作 業ミスもしやすくなるので、このような作業を頻繁に行う場合には cvs の利用を検討するとよいであろう。
$rcs -U ファイル名
でロック機構を無効にすることができる。
$rcs -L ファイル名
でロック機構を有効にすることができる。
check-in するときに新しく作成するブランチの番号を指定する。
$co -r1.3 test.txt
test.txt を編集
$ci -r1.3.1 test.txt
上記の例では test.txt のリビジョン 1.3 を check-out し編集の後にブランチ 1.3.1 へ check-in している。 このブランチをはじめてつくった場合 check-in したリビジョンは 1.3.1.1 になる。
1.3.1 はブランチの番号であり、そのブランチ上のリビジョンには 1.3.1.1, 1.3.1.2, ... が与えられる。 もしリビジョンに 1.3.1, 1.3.2, ...としてしまうと、 1.3 にさらに別のブランチを作成する時に困ってしまうであろう。
以下のようなキーワードがある。
$ident ファイル名
でファイル中に含まれている identification marker を取出すことができる。 c言語などのプログラム中でコンパイル後のファイルに identification marker が文字列として残るようにしておけば、あとでどのリビジョンから構成されているか確認することができる。
rcsid('$Id$').
という fact をファイルごとに定義することによって、実行時に rcsid(X) で取り出すことができる。 またコンパイルした場合は identによって取り出すこともできる(はず)。
\def\defrcsid$#1${\def\rcsid{\$#1\$}} \def\defrcsrevision$#1: #2 ${\def\rcsrevision{#2}} \defrcsid$Id$ \defrcsrevision$Revision$
という行をプリアンブルに記述すれば \rcsid で $Id$ が($マーク付きで)で展開される。 また \rcsrevision でリビジョン番号(番号部分のみ)が展開される。
ただし、一回チェックアウトしてキーワードが展開されていないと、コンパイルに失敗する(\defrcsrevision の引数エラー)。
また CTAN には RCS のために rcs パッケージや rcsinfo パッケージがあるのでそれを利用してもよい。 ログなどもきれいに出力することができる。
rcs パッケージに関しては拙作のページにて使い方を紹介している。
rlog
コマンドを用いてログを出力させることができる。
$rlog ファイル名
で指定したファイルのログを見ることができる。
c-x v i とタイプする バッファが変更されていれば
Buffer filename modified: save it? (y or n)
と聞いてくるので y とすると check-in される(そして再びロックしないで check-out されバッファで read-only として参照できるようになる)。 n と答えた場合は中断される。
またはC-x v vとタイプする。 バッファが変更されていれば
Buffer filename modified: save it? (y or n)
と聞いてくるので y とすると check-in される(そして再びロックして check-out され、バッファで編集できるようになる)。 n と答えた場合は中断される。
C-x C-qも check-in に用いられるが、まだ RCS で管理していないバッファに対してタイプするとバッファが read-only になるだけである。
変数 vc-make-backup-files に nil 以外の値を設定しておくと、バックアップファイルを作成するようになる(vc package)。 例えば .emacs に
(setq vc-make-backup-files t)
という設定を追加しておけばよい。
変数 vc-command-messages に nil 以外の値を設定しておくと、実行しているコマンドがミニバッファに順次表示される。 これらは *Messages* バッファに残る(vc.el 内で message 関数により出力)。 例えば .emacs に
(setq vc-command-messages t)
という設定を追加しておけばよい。
XEmacs では *Message* バッファのかわりに *Message-Log* バッファで確認できる。 *Message-Log* バッファは M-x show-message-log か Menu から[編集] -> [メッセージログ表示] ([Edit] -> [Show Message log])で見られるようになる(XEmacs 21.1 (patch 12) で確認)。
XEmacs では *Messages* バッファがない?のでミニバッファに順次表示されるだけである(XEmacs 21.1)。
Thanks 武井伸光氏、栗山氏。
ログメッセージに日本語を使いたい時などは、きちんとコーディングシステムを統一しておく必要がある。 異なるコーディングシステム混在していると、ログをとりだす時に不便である。
Emacs 20.5 の場合は、default-process-coding-system に使用したいコーディングシステムを指定しておく。 ただし、この場合は他のプロセスにも影響してしまう。 もし、rcs に関して設定したい場合は process-coding-system-alist に設定する。 例えば、.emacs に
(setq process-coding-system-alist (append '(("rcs" . utf-8) ("ci" . utf-8) ("co" . utf-8) ("rlog" . utf-8) ("rcsdiff" . utf-8) ("rcsmerge" . utf-8) ("ident" . utf-8) ("rcsclean" . utf-8)) process-coding-system-alist))
としておけば rcs 関連のコマンドは UTF-8 で処理される。
C-x v a (vc-update-change-log) で ChangeLog のエントリを自動的に生成する事ができる。
ここで使用されるフルネームとメールアドレスはそれぞれ、add-log-full-name, add-log-mailing-address を設定することで変更できる。 emacs の初期化ファイル等で、
(setq add-log-full-name "My Full Name") (setq add-log-mailing-address "[email protected]")
等と設定しておけば良い。
$rcsclean
で現在のディレクトリにある、ロックしないで check-out し、更新していないファイルが削除される。 必要になったらあらためて check-out すればよい。
(注:rcsclean
はインストールされていない可能性もある。)
$rcsdiff ファイル名
で RCSファイル中の最新のリビジョンと比較することができる。
$rcsdiff -rリビジョン番号 ファイル名
とすれば指定したリビジョンと比較することができる。
check-out しているファイルがなければ RCSファイルの名前を変えればよい。 check-out しているファイルがある場合はそれぞれ変更する必要がある。