CVS $Date: 2001/12/01 01:55:12 $ CVS とは CVS (Concurrent Version System) とは, その名前が示す通り, バージョン管理ソ フトである. バージョン管理ソフトには, CVS の原型となった RCS (Revision Control System) や商用 UNIX についてくる SCCS (Source Code Control System) などがある. 主として UNIX 系 OS で動作するが, Windows や MAC にも移植されて いる. programming をする人や文書を管理する人は必ず使うべきソフトウェアであ る. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CVS を使うことのメリット CVS を使うと, 以下のような恩恵にあずかることができる. ・ 変更の履歴が残せる (なぜ変更する必要があったのか, その意図を探れる). ・ 変更の差分を取得できる (任意の時点でのファイルを比較できる). ・ 設定のバックアップになりうる (集中管理方式であるため, 本体が倒れない限 り復旧可能). ・ 複数人での作業ができる (衝突が発生すれば, merge を頑張ってくれる). さらに BSD 系 OS を利用している人は, 基本システムに CVS が組み込まれている ので, -stable, -current の追っかけの時に役に立つ, …はず. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CVS の導入 大抵の UNIX 系 OS ならば, あらかじめインストールされていると思われるが, Solaris などの商用 OS では付属しないようだ. その場合は以下のように自分でイ ンストールする必要がある. UNIX 系 OS の場合 今回はまずはお試しということで, 一般ユーザで以下のものを, ・ 実行ファイルは $HOME/cvs_bin ・ info ファイルは $HOME/share/info ・ man ページは $HOME/share/man ・ 配布物に含まれるものは $HOME/share/dist へ, インストールしてみる. % wget http://www.cvshome.org/files/19/10/cvs-1.11.1p1.tar.gz % tar zxvf cvs-1.11.1p1.tar.gz % cd cvs-1.11.1p1/ % ./configure --prerex=$HOME ¥ ? --bindir=$HOME/cvs_bin --datadir=$HOME/share/dist ¥ ? --infodir=$HOME/share/info --mandir=$HOME/share/man % make && make install && make clean && echo 'done!' 紙面の関係で ¥ で折り返している. インストールが完了したら $HOME/cvs_bin を path に加えよう. windows の場合 windows には移植版の WinCVS がある. これは CUI の他に GUI も使える. バージ ョンの遷移がグラフ表示できるのが面白い. 本家の配布には日本語に対応していな いので, 適宜日本語化する必要がある. そのためには以下のファイルが必要である. ・ http://prdownloads.sourceforge.net/cvsgui/WinCvs120.zip ・ http://www.kmc.kyoto-u.ac.jp/‾slakichi/barn/data/wincvsj/ wincvs120-sjis_gottani.20010601.bin.lzh 後者を展開して, 前者をインストールしたフォルダに上書きすればよい. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CVS の使い方 言葉の約束 まず, CVS 使われる言葉の約束をする. "バージョン" とはプログラムや文書におけ る版を指し, "リビジョン" とはプログラムや文書を構成する各々のファイルの版を 指す. "リポジトリ" とはファイルを格納しておくタンクのようなものである. "タ グ" とは, ある時点の各ファイルに対してつける共通の印のことで, タグを指定す れば特定のリビジョンのファイル群を取り出すことができる. 管理ディレクトリの作成と環境変数の設定 まず, CVS 用の管理ディレクトリを作る. そして, そのディレクトリを環境変数 CVSROOT に設定する. csh 系シェルの場合は, % cd $HOME % mkdir repository % setenv CVSROOT $HOME/repository とする. 管理ディレクトリの初期化 (init) 管理ディレクトリを初期化する. % cvs init 以上のようにすると, $CVSROOT/CVSROOT 以下に次のようなファイルが作成される. % ls $CVSROOT/CVSROOT Emptydir/ config editinfo,v modules,v taginfo checkoutlist config,v history notify taginfo,v checkoutlist,v cvswrappers loginfo notify,v val-tags commitinfo cvswrappers,v loginfo,v rcsinfo verifymsg commitinfo,v editinfo modules rcsinfo,v verifymsg,v 登録 (import) 準備が整ったら, CVS で管理するファイルを作成する. 何らかの方法で以下のよう なファイルを作成したとする. ここで `$Id$' とは, リビジョンを識別するためのキーワードである. では, 登録作業に移る. % cvs import www NISOC RELEASE_0 ここで, ・ 3 つめの引数はリポジトリに格納するときの名前. ・ 4 つめはファイルを特徴づけるもの. ・ 5 つめはそのファイルにつける最初のタグ. である. これを実行すると, エディタが起動するので, ログを入力する. initial import. CVS: ---------------------------------------------------------------------- CVS: Enter Log. Lines beginning with `CVS:' are removed automatically CVS: CVS: ---------------------------------------------------------------------- なお, このファイルは新しいディレクトリを作成し, その中に入れた方がよい. そ の理由は cvs はとくに指定しない限り, カレントディレクトリ以下を再帰的に管理 対象とみなすからである. 取り出し (checkout) リポジトリに登録しただけでは何もはじまらない. 作業用に work ディレクトリを 作成し, そこへファイルを取り出す. % cd $HOME/work % cvs checkout www 取り出したファイルを見てみると, % cd www/ % cat index.html の用に, $Id$ としていた部分が, $Id: ファイル名, リビジョン, 日付, 時間, 作成者 Exp $ に置き換えられている. $Id$ の他にキーワードは何種類もあるので, 詳細は info や man をあたって欲しい. 格納 (commit) 取り出したファイルを編集し, リポジトリにその変更を反映させるには, 以下のよ うにする. % cvs commit index.html 変更理由を尋ねられるので, 適切に答えればよい. _ add title. _ add 'what's CVS'. CVS: ---------------------------------------------------------------------- CVS: Enter Log. Lines beginning with `CVS:' are removed automatically CVS: CVS: Committing in . CVS: CVS: Modified Files: CVS: index.html CVS: ---------------------------------------------------------------------- なお, UNIX 系 OS なら EUC, windows なら SJIS でログを書くことができる. 差分の表示 (diff) ファイルの内容をどのように変更したのか知りたいときは, 以下のように -r オプ ションでリビジョンを指定して差分をとる. % cvs diff -r 1.1 -r 1.2 index.html % cvs diff -u -r 1.1 -r 1.2 index.html Index: index.html =================================================================== RCS file: /home/yahiko2/me/m09010/repository/www/index.html,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- index.html 30 Nov 2001 20:46:25 -0000 1.1 +++ index.html 30 Nov 2001 21:05:07 -0000 1.2 @@ -1,7 +1,28 @@ +CVS - +

CVS

+ + + +

CVS とは

+

+CVS(Concurrent Version System) とは, +その名前が示す通り, バージョン管理ソフトである. +バージョン管理ソフトには, +CVS の原型となった RCS(Revision Control System) +や商用 UNIX についてくる +SCCS(Source Code Control System) などがある. +主として UNIX 系 OS で動作するが, +Windows や MAC にも移植されている. +programming +をする人や文書を管理する人は必ず使うべきソフトウェアである. +

+ + + + 履歴の表示 (log) ファイルの変更履歴を知りたいときは, 以下のようにする. % cvs log index.html RCS file: /home/yahiko2/me/m09010/repository/www/index.html,v Working file: index.html head: 1.2 branch: locks: strict access list: symbolic names: RELEASE_0: 1.1.1.1 NISOC: 1.1.1 keyword substitution: kv total revisions: 3; selected revisions: 3 description: ---------------------------- revision 1.2 date: 2001/11/30 21:05:07; author: m09010; state: Exp; lines: +22 -1 _ add title. _ add 'what's CVS'. ---------------------------- revision 1.1 date: 2001/11/30 20:46:25; author: m09010; state: Exp; branches: 1.1.1; Initial revision ---------------------------- revision 1.1.1.1 date: 2001/11/30 20:46:25; author: m09010; state: Exp; lines: +0 -0 initial import. ============================================================================= 追加, 削除 (add, remove) リポジトリにファイルを追加する場合は, 以下のようにする. % cvs add intro.html commit するように言われるので, ちゃんと commit しよう. またファイルを削除す るときは, % rm intro.html % cvs remove intro.html の用に, 元のファイルを削除してから cvs remove する. これも commit すること を忘れないようにする. タグをつける (tag) ころあいをみはからって, ファイルにタグをつける. % cvs tag YET_FINISHED index.html このタグを基準にしてファイルを取得したい場合は, % cvs checkout -r www/index.html とする. 枝の分岐 (rtag) 説明が長くなるので割愛する. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CVS tips モジュール (module) CVS には "モジュール" という概念がある. これは「あるディレクトリ階層中の一 部分」という意味で, CVS で管理するディレクトリ構造が複雑になってきたときに 効果を発揮する (CVS は標準では import 時に使用した名前でしか checkout でき ない). モジュールを定義するには $CVSROOT/CVSROOT を checkout する. % cvs checkout CVSROOT その中にあるファイル modules を以下のように編集する (書式はファイル中にコメ ントアウトされている). style www/style このようにすると, 以降はモジュール名を使用して checkout できるようになる. また, モジュールに対して, commit, checkout, update などを行った時に特定のプ ログラムを実行することが可能なため, ・ HTML ファイルなどならば commit と同時に web に反映させたり ・ 変更点を知らせたり ・ ログを採取したり ・ etc. することが可能である. vc-mode Emacs にはバージョン管理支援のためのモードがあり, それが vc-mode である. 以 下にその代表的なキーバインドを示す. ┏━━━━━━━━━━━━━┯━━━━━━━━━━━━━━┓ ┃ Command │ Description ┃ ┠─────────────┼──────────────┨ ┃ │ファイルが CVS の管理対象に ┃ ┃ │なっていなければ "cvs add" ┃ ┃ ├──────────────┨ ┃ │"cvs add" されているだけでチ┃ ┃ │ェックインされてなければ ┃ ┃ │"cvs checkin" ┃ ┃C-x v v (M-x ├──────────────┨ ┃vc-next-action) │CVS 管理対象ファイルで、チェ┃ ┃ │ックアウト後に編集されていれ┃ ┃ │ば "cvs checkout" ┃ ┃ ├──────────────┨ ┃ │CVS 管理対象ファイルで、 CVS┃ ┃ │リポジトリ内のファイルが更新┃ ┃ │されていれば "cvs update" ┃ ┠─────────────┼──────────────┨ ┃C-c C-c │ログの入力の終了 ┃ ┠─────────────┼──────────────┨ ┃C-x v l │ログの閲覧 ┃ ┠─────────────┼──────────────┨ ┃C-x v = (M-x vc-diff) │前のバージョンとの差分を表示┃ ┠─────────────┼──────────────┨ ┃M-x vc-version-diff │特定のバージョン間の差分を表┃ ┃ │示 ┃ ┠─────────────┼──────────────┨ ┃ │Dired 形式で各ファイルの状態┃ ┃C-x v d │を表示 (Dired mode と同様の ┃ ┃ │操作が可能) ┃ ┠─────────────┼──────────────┨ ┃C-x v h (M-x │バッファのモードに適したキー┃ ┃vc-insert-headers) │ワードヘッダーを挿入 (see ┃ ┃ │vc-static-header-alist) ┃ ┠─────────────┼──────────────┨ ┃C-x v i (M-x vc-register) │cvs add と等価 ┃ ┠─────────────┼──────────────┨ ┃M-p (M-x │過去に入力した、前のログを呼┃ ┃vc-previous-comment) │び出す ┃ ┠─────────────┼──────────────┨ ┃M-n (M-x vc-next-comment) │過去に入力した、次のログを呼┃ ┃ │び出す ┃ ┠─────────────┼──────────────┨ ┃M-s (M-x │過去に入力した内容を検索 (正┃ ┃vc-comment-search-forward)│順) ┃ ┠─────────────┼──────────────┨ ┃M-r (M-x │過去に入力した内容を検索 (逆┃ ┃vc-comment-search-reverse)│順) ┃ ┗━━━━━━━━━━━━━┷━━━━━━━━━━━━━━┛ pcl-cvs また, Emacs21 には CVS に特化した pcl-cvs というモードが標準で含まれている (Emacs20 でも後からインストールすれば使えるはず). M-x cvs-examin で起動して作業ディレクトリを指定すると, 再帰的にファイルの状 態を調べてくれる. また, ┏━━━━━━━━━━━┯━━━━━━━━━━━━━━━━┓ ┃ Command │ Description ┃ ┠───────────┼────────────────┨ ┃c (cvs-mode-commit) │commit する ┃ ┠───────────┼────────────────┨ ┃l (cvs-mode-log) │ログの閲覧 ┃ ┠───────────┼────────────────┨ ┃m (cvs-mode-mark) │対象ファイルにマークを付ける ┃ ┠───────────┼────────────────┨ ┃u (cvs-mode-unmark) │対象ファイルのマークをはずす ┃ ┠───────────┼────────────────┨ ┃= (cvs-mode-diff) │前のリビジョンとの差分を表示 ┃ ┗━━━━━━━━━━━┷━━━━━━━━━━━━━━━━┛ といったように少ないタイプで操作することができる. pcl-cvs はマークが使えるので, 一定量以上のファイルを同時に操作したい時に向 いている. unified な diff を! 「CVS の使い方」の「差分の表示 (diff)」では, cvs diff の後に -u オプション をつけて unified 形式で diff をとっていたが, cvs diff の標準の差分形式は context 形式である. unified にするためにいちいち -u オプションを指定するの は面倒であるが, そのための解決策に $HOME/.csvrc がある. これは cvs のサブコ マンドに対してグローバルに適用されるもので, 以下のように使用する. diff -u これにより, 逐次 -u オプションを指定することなしに unified 形式の diff が得 られる. 上記は端末上で有効なオプションであるが, Emacs にも同様なオプションがあり, (setq diff-switches "-u") がそれである. これを $HOME/.emacs などに入れておけばよい. tcsh から補間したい! tcsh の complete を使って, cvs コマンドの入力を楽にする. complete cvs 'c/--/(help help-commands help-synonyms)/' ¥ 'p/1/(add admin annotate checkout commit diff ¥ edit editors export history import init log login ¥ logout rdiff release remove rtag status tag unedit ¥ update watch watchers)/' 'n/-a/(edit unedit commit ¥ all none)/' 'n/watch/(on off add remove)/' 独自タグが欲しい! 単独で $Id$ を使っていても問題はないだろう. しかし, 他のグループが CVS でフ ァイルを管理していて, なおかつ相手も $Id$ をつかっている場合, 自分の repository に import した際に元の情報が失われてしまう. OS によってまちまちであるが, 独自のタグを定義することができる. ここでは FreeBSD local の手法を紹介しよう. % cvs checkout CVSROOT % cd CVSROOT/ % cat > options tag=hoge=Id tagexpand=eId ^D % cvs add options; cvs commit options -m 'Forbid to expand $Id$, use $hoge$.' % cat >> checkoutlist options ^D % cvs commit -m 'Add "CVSROOT/options" into checkoutlist in order to reflect its role.' checkoutlist CVSROOT/options について; ・ 一行目… $hoge$ を $Id$ と同じ意義のタグと定義する ・ 二行目… $Id$ は展開しない (exclusive) CVSROOT/checkoutlist では CVSROOT/options を作業ディレクトリに checkout す ることを指定している. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ リンク UNIX 用 配布 CVS Home http://www.cvshome.org/ 解説 CVS のはなし http://cvs.m17n.org/cvs/ 参考 CVS manual の日本語訳 http://www.sodan.org/‾penny/vc/ FreeBSD の CVS のオンラインマニュアル cvs(1) (en) http:// www.freebsd.org/cgi/man.cgi?query=cvs&apropos=0&sektion=0&manpath= FreeBSD+4.4-RELEASE&%5B%5Bformat%5D%5D=html FreeBSD の CVS のオンラインマニュアル cvs(5) (en) http:// www.freebsd.org/cgi/man.cgi?query=cvs&apropos=0&sektion=5&manpath= FreeBSD+4.4-RELEASE&%5B%5Bformat%5D%5D=html FreeBSD の CVS のオンラインマニュアル cvs(1) (ja) http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=cvs& dir=jpman-4.4.0%2Fman§=0 FreeBSD の CVS のオンラインマニュアル cvs(5) (ja) http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=cvs& dir=jpman-4.4.0%2Fman§=5 tcsh の配布に含まれる complete.tcsh windows 用 配布 WinCVS http://www.wincvs.org/ WinCVS 1.2 の Shift-JIS ごった煮版 http://www.kmc.kyoto-u.ac.jp/ ‾slakichi/barn/ TCL http://dev.scriptics.com/ ExamDiff http://www.nisnevich.com/examdiff/examdiff.htm Peggy (CVS インターフェースを持つ windows 用のエディタ(商用)) http:// www2.noritz.co.jp/anchor/ashp/peggy/pegindex.html 解説 バージョン管理システム CVS を使う http://www-vox.dj.kit.ac.jp/nishi/cvs /cvs.html WinCVS の使い方 (初歩の初歩) http://spica.u-aizu.ac.jp/soe/document/cvs /wincvs.html CVS, WinCVS についてのメモ http://www.koizuka.jp/wincvs.html WinCVS http://www.interq.or.jp/japan/s-imai/tcltk/wincvs.html CvsGUIの日本語訳 (for WinCVS/MacCVS) http://www.bekkoame.ne.jp/‾bero/ docj/cvsgui/cvsgui.html ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ この文書のバグ 著者はふだん FreeBSD で CUI 指向の生活しているため, グラフィカルな WinCVS や MacCVS についての言及が不足しています. 最初に cvs add する時にキーワード展開しないようにしたので, 文頭の $Date$ が 実際の最終更新時刻を反映していません. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Copyright (C) 2001-2003 Hideyuki KURASHINA. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━