バージョン管理

バージョン管理, RCS

Computer をしばらく使っていると気づくだろうが, われわれは一つのファイルを何度も修正することがある.

このファイルが大きかったり内容が複雑だったりする場合, 修正は常に「改善」であるとは限らず,「改悪」であるかもしれない. 修正作業そのもののミスにより,意図しない修正を施してしまうこともある. また,修正によって大事な情報を削除しないといけないというケースも存在するだろう.
こうしたとき,以前の状態のファイルを全てバックアップして保存しておけば, こうした問題は解決できる.
つまり,「ファイルのバージョン違い版を管理する」ことが適切に行えれば良いのだ.

こうした,ファイルのバージョン変更にまつわる情報を管理するツールを 「バージョン管理ソフト」と呼ぶ.

本講義では,バージョン管理ソフトとして,かなり古いソフトではあるがまずは入門として「RCS」を学ぶことにする. この RCS は個人ユーザが使うのに適しており,比較的使いやすく,かつ, unix の歴史上も由緒正しいものであり,最初に学ぶには最適である. また,単純な分だけ,単独のファイルを管理するには後述のものより適しているとも言える.
また,より進化したバージョン管理ソフトとして他に 「CVS」や「Subversion」「Git」がある. これらは機能がより高度化した優れたツールであるが,その分,使い始めるにはやや敷居が高く,また, 個人ユーザにはやや over spec な感がある. そこで,RCS の機能に不満を感じるようになったらこれらの利用を検討すればよい.

なお,本講義では RCS を一人で単独で使うことを前提に解説する. 複数の人間で同一ファイルを編集する際にはまた異なった注意が必要であるが, そうした目的には今だと Git (CVS や Subversionでも良いが)がより適しているので,それらを使うのが良かろう.



RCS 参考資料

RCS は 1982 年には既に姿を見せていたバージョン管理ソフトであり, 古くからよく知られている. 概念はシンプルで,使うコマンドもそう複雑ではないが, 参考となる資料があればより理解も深まるだろう.

資料名 解説
Official RCS Homepage RCS の公式 web. 配布ファイルが少しだけ古いかな.
Windows でも使えるバイナリが置いてあるのは大変助かる.
ちなみに、Windows 用としては rcs57pc1.zip だけ取得すれば良い.
これを解凍して実行ファイルをパスの通ったディレクトリに置き、
あとはとりあえず環境変数 TZJST-9 に、
環境変数 RCSINIT-x,v に設定しておけば良い.
ちなみに、環境変数 RCSINIT-zLT -x,v に設定しておくと
もっと楽だろう.
GNU RCS 泣く子も黙る GNU の RCS. まあ,ここを情報の起点としておけば間違いない.
2015年 1月公開の最新バージョン 5.9.4 も置いてある.
「Unix 流プログラミング 36–42」 今泉氏 in “Unix Magazine”, 1993.10 – 1994.04, ASCII社.
man rcsintro と入力して unix 上で入門マニュアルを読む.
簡潔で良くできた入門マニュアルである.
Revision Control System RCS 渡部氏 の web.
ここの RCS FAQ は RCS を使っていて困ったときに役立つだろう.
昔あった資料. ネットワークからは消えているが、wayback machine を使おう.
RCS: Revision Control System (http://www.swlab.csce.kyushu-u.ac.jp/Info/services/rcs.html)
RCS 超入門,RCS 初級講座,等々(http://www.dais.is.tohoku.ac.jp/~kabe/vsd/rcs/rcs.html).
RCS を使おう講座 (http://www.proc.org.tohoku.ac.jp/~minatsu/guide/rcs0.html)
The RCS Mini-Howto (http://www.linux.or.jp/JF/JFdocs/RCS.html)

RCS の概念

RCS を理解するには,おおざっぱに言って バージョン, バージョン管理ファイル,チェックイン,チェックアウト,ロック という概念が分かれば良い. それらについて説明しよう.

概念, 単語 解説
バージョン(Version), リビジョン(Revision) 日本語で言うと「バージョン = 版」,「リビジョン = 改版」.
ファイルを更新して「新しい版になる=バージョンが上がる」
と考えれば良い.
バージョン管理ファイル 管理対象ファイルの情報全てが詰まったファイル.
管理対象ファイル名が dummy.tex だとすると,
通常は dummy.tex,v という名前になる.
つまり,元のファイル名の末尾に “,v”
をつけたファイルと思えば良い.
なお,バージョン管理ファイルは,初めてチェックインするときに自動的に作られる.
通常は,管理ファイルがあるディレクトリ(仮に dirA とする)の下に
RCS
という名前のディレクトリがあればその中(dirA/RCS)に,
無ければそのディレクトリ(dirA)に, バージョン管理ファイルが作られる.
どうするか尋ねてくることもある.その時は好きな方を答えれば良い.
ロック バージョン管理ファイルに「鍵」をかけること.
「ただいま私が編集中なので,他の人はいじれません」という意味.
ファイルをロックすると,他の人は新しいバージョンのファイルを登録できない.
この場合でも,他人はそのファイルを読み出すことはできる.
この機構によって,RCS は複数の人間による単一ファイルのバージョン管理を行っている.
これを「ロッキングによるファイル衝突の防止」とよぶ.
チェックイン 「このファイルが最新バージョンです」とファイルを登録する作業.

注意: ロックしてあるファイルしか登録できない!
ロックしていないファイルはチェックインできない.

こういう時は
rcs -l ファイル名
とするとファイルがロックされ,チェックインできるようになる.
詳しくは後述の rcs コマンドを参照すること.

初めて登録する時には,「そのファイルがどんなファイルなのか」を尋ねてくる.
また、登録時に「そのファイルのどこをどのように変更したのか」を尋ねてくるので,
これも後々のために丁寧に記述しておく.
チェックアウト バージョン管理ファイルからファイルを取り出す作業.

注意: ロックして取り出すと編集可能に,
ロックしないで取り出すと編集不可になる.

一人だけで使う場合は,常にロック状態で作業するか,
ロック機構を無効にするかすればよい.
詳しくは後述の rcs コマンドを参照すること.

RCS でのファイル管理,編集の流れ

a


RCS を個人一人で用いる時は,通常は上の図にあるように 「ロックつき」でチェックイン,チェックアウトしていればまず問題はないだろう(ちょっと邪道だが).

流れをもう少し詳しく書くと,RCS では

  1. 管理したいファイルを「バージョン管理ファイル」に チェックインする.
    バージョン管理ファイルは,初めてチェックインするときに自動的に作られる.
  2. バージョン管理ファイルから,使いたいファイルを ロックつきでチェックアウト して取り出す.
  3. ファイルを編集する.
  4. 1. へ戻る.

という繰り返しで用いるのが普通である.
何か特別なことをしたい時だけ,別のことをすればよい.

RCS で使うコマンドは実質的に一つだけ

実は,下で示す ci -l -zLT というコマンドだけ覚えておけばだいたいなんとかなる.

  実習
以下の手順に従い,rcs を試してみながら理解せよ.

  1. RCS の練習用に適当なディレクトリに移動する.
  2. そのディレクトリの下に,バージョン管理ファイルを置く特別なディレクトリ RCS を作っておく.
    具体的には、そのディレクトリで

    mkdir RCS
    

    とする.

  3. 次のような内容のサンプルファイルを,ファイル名 dummy.txt で作る.

    Sample File
    My name is hogehoge.
    なんでもいいから書け.
    $Id$
    $Date$
    

    なお、最後の2行だけは必ずそっくりに書き入れること.

  4. 初めてのチェックインを, 「ロック付きでチェックイン & チェックアウト」という動作で行ってみる.
    具体的な操作としては

    ci -l dummy.txt
    

    とするだけでよい.
    注: ci -l は「チェックインした後,自動的にロック付きでチェックアウト」 するという便利なコマンドである.
    すると,最初は次のようにメッセージが出る.

    dummy.txt,v  <--  dummy.txt
    enter description, terminated with single '.' or end of file:
    NOTE: This is NOT the log message!
    >>
    

    ここでは 「このファイルの内容を記述せよ」と言われているので, 後々のためにも(なるべく英語で?)きちんと記入する.
    なお,記入し終わったら, . (ピリオド)のみの行を記入すれば「記入終わり」となる.
    記入が終わると,

    initial revision: 1.1
    done
    

    という表示が出て,バージョン 1.1 という真新しいバージョンでこのファイルが登録されたことが分かる.

  5. ディレクトリ RCS の中にバージョン管理ファイルができているか確認する.
    操作としては

    ls RCS
    

    とすればよいだろう.

  6. ci -l の自動チェックアウトがうまくいったかを確認する. つまり,チェックアウトされたファイル dummy.txt が存在するか確認する. 操作としては

    ls dummy.txt
    

    とすればよいだろう.

  7. チェックアウトされたファイルがどう変わったか見てみる. これは

    less dummy.txt
    

    とすればよいだろう. どこがどう変わったかよく見てみよう.
    また,時間がどう記述されているか,自分の腕時計などと比べてみよ.

  8. サンプルファイルの中身の無難な場所を編集して変えてみよう.
    実際は Emacs などのエディタを起動しての作業になる.
    なお、$Id$, $Date$ の部分はいじらないようにしよう.

  9. そして、再びチェックイン & チェックアウトを行ってみる.
    ただし今度は,-zLT という特別なオプションをつけて、

    ci -l -zLT dummy.txt
    

    としてみよう.
    注: -zLT は,「ローカル時間を用いて時間表示を記述する」というオプションである. われわれの場合、「日本時間」で時間が表示される.

    こうすると,

    RCS/dummy.txt,v  <--  dummy.txt
    new revision: 1.2; previous revision: 1.1
    enter log message, terminated with single '.' or end of file:
    >>
    

    という表示が出るだろう. ここでは 「このファイルをどう変更したか記述せよ」と言われているので, 後々のためにもこれも(なるべく英語で?)きちんと記入する.
    なお,記入し終わったら,やはり . (ピリオド)のみの行を記入すれば「記入終わり」となる. 今度の終了は単に

    done
    

    と表示されるだけだろう.

  10. チェックアウトされたファイルがどう変わったか再び見てみる.

    less dummy.txt
    

    とすればよいだろう. どこがどう変わったかよく見ておこう.
    とくに時間の記述がどう変わったか,よく比べてみよう.

  11. dummy.txt を消去してみる!
    バージョン管理のありがたさを実感するための作業の一つとして、対象ファイルを一回消してみよう.

    rm dummy.txt
    

    としてみれば良いだろう.

  12. dummy.txt を復活!
    上の作業で、情報の詰まったバージョン管理ファイルは消えていないので, そこからチェックアウトすればファイルを復活できる. やってみよう.
    具体的には,

    co -l -zLT dummy.txt
    

    とすればよい.
    注: チェックアウトコマンド co は(特に指定しなければ)最新バージョンのファイルを取り出す.

  13. 最新バージョンのファイルと、古いバージョンのファイルの違いを調べてみよう.
    それには、具体的には

    rcsdiff -zLT -r1.1 dummy.txt
    

    とすればよい. これは,「今ある dummy.txt とそのバージョン 1.1 の内容を比べよ」というコマンドになる.

  14. これまで dummy.txt に加えた編集の履歴を見る.
    具体的には,

    rlog -zLT dummy.txt
    

    とすればよい. こうすると,今までのチェックインの際に記述した変更内容などがリストアップされる.

  15. dummy.txt に埋め込んであるキーワード(Id, Date)を取り出してみる.
    具体的には,

    ident dummy.txt
    

    とすればよい. こうすると,$Id$$Date$ と書き込んだ部分が出力される.

    注: この機能はバイナリファイルに対しても有効であるので,本格的なプログラミングにも適用できる.
    例えば,バイナリであるコマンド rcs 自身にはどのようなキーワードが埋め込まれているのか、調べてみよう.

RCS: キーワードの埋め込み

上にも出てきたように, $Id$$Date$ のように、ファイルのなかに決まったキーワードを $ で囲んで埋め込んでおくことで, RCS の様々な情報を自動的に記述することができる. 以下に,どのようなキーワードがあるのかを示そう.

キーワード 意味
Id ファイルの名前,バージョン,日時,作成者,状態,ロックした者
という情報.大体はこれで十分だろう.
Header Id とほぼ同じ情報になるが,ファイル名が「フルパス」で記述される.
情報が無駄に長くなるだけなので一般にあまり使われないが,使いたい場面もあるかも知れない.
Date そのバージョンがチェックインされた日時.
Revision バージョン.
Author そのバージョンをチェックインしたユーザ名.
Locker 現在そのファイルをロックしているユーザ名.
RCSfile ファイル名.
Source ファイル名.ただし,フルパス.
State そのバージョンの「状態」.通常は Exp になっているだろう.
Log そのチェックインの際の「変更点記述」を表示する.
ファイルが大きくなってしまうのと,rlog で同じことができるということから,あまり使われない.

  実習
上のキーワードを全て書き込んだファイルを作成し,チェックイン & チェックアウトして,キーワードがどう作用しているか確認せよ.



RCS の コマンド

以下に,RCS のコマンドについて簡単な一覧を載せよう. 通常はこれぐらい知っていれば十分なはずである(詳しくは man コマンドで調べれば良い).

コマンド 解説
ci オプション ファイル名 チェックインコマンド.
何もオプションをつけないと,ファイルが登録 & 吸収
されてしまって,手元に元のファイルが無くなる.
こういう時は慌てずにチェックアウトしよう.

オプションは以下の通り.
-l
チェックイン後,自動的に「ロック付きで」チェックアウトする.
-u
チェックイン後,自動的に「ロックなしで」チェックアウトする.
-zLT
時間表記を「ローカル時間」で行う.
これが無いときは,グリニッジ標準時で時間表記される.
-rリビジョン番号
指定したリビジョン番号でチェックインする.
リビジョンを大きくあげたい,というときなどに用いる.
-f
ファイルが変更されていなくても強制的にチェックインする.
co オプション ファイル名 チェックアウトコマンド.

オプションは以下の通り.
-l
「ロック付きで」チェックアウトする.
-u
「ロックなしで」チェックアウトする.
-zLT
時間表記を「ローカル時間」で行う.
これが無いときは,グリニッジ標準時で時間表記される.
-rリビジョン番号
指定したリビジョン番号のバージョンのファイルをチェックアウトする.
-f
既にファイルが存在していても,チェックアウトして強制的に上書きする.
ident オプション ファイル名 ファイル内のキーワードを読み出すコマンド.

大きく動作が変わるオプションは無い.
rlog オプション ファイル名 バージョン管理ファイルの履歴記録や関連情報を出力する.

オプションは以下の通り.
-L
ロックされているファイルだけを対象とする.
-R
バージョン管理ファイル名を表示する.
-h
関連情報を表示する.
-t
関連情報を表示する.-h オプションよりも少しだけ情報が多い.
-rリビジョン番号
指定されたリビジョン番号のファイルの情報のみを表示する.
rcsdiff オプション -r番号1 -r番号2 ファイル名 バージョン管理されているファイルのバージョン違いを比べる.
二個の番号は省略が可能で,番号の個数によって次のように動作する.
番号1 と番号2 が与えられている
各々の二つのバージョンのファイルを比較する.
番号1 のみが与えられている
番号1 のバージョンのファイルと,現在存在するファイルとを比較する.
番号は一つも与えられていない
登録済みの最新バージョンと,現在存在するファイルとを比較する.
rcs オプション ファイル名 バージョン管理ファイルの様々な性質を変更する.

オプション(省略できないかも)は以下の通り.
-l
ファイルをロックする.
-u
ファイルをロック解除する.
-L
ロックを厳密に行うモードにする(普通はデフォルト).
-U
ロック機構をほぼ無効にする.
このモードでは,ロックされていないファイルでもチェックインできる.
ロックが役に立つこともあるので,ロック機構を無効にすることは
あまりお勧めしない.

レポート

以下の課題について能う限り賢明な調査と考察を行い,
AppliedMath7-Report-11
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.

課題

  1. この授業でこれまでに作成したファイルの全てに RCS でのバージョン管理を試みてみよ.
    その際,$Log$ 機能を盛り込んでみて支障がないかどうかチェックせよ. もし支障があるならば,どうやって解決すれば良いかマニュアルを調べるなどして考えよ.
  2. RCS の面白い使い方が何かないか考えてみよ.
  3. RCS の GUI(グラフィカルユーザーインターフェース)版というべきソフトウェアが無いか探してみよ. 見つけたならば,使ってみてレビューせよ.
  4. 現在はより進化したバージョン管理ソフトとして Git が定番と言われる. これについて調べ,RCS のチェックイン,チェックアウトに相当する操作は Git ではどうなっているのかを記せ.
  5. 自分のマシンがあるならば、RCS と Git を導入して、簡単にで良いので両方使ってみよ. そしてその様子をレビューして報告せよ.