☆ CVS コマンドを Emacs から使う方法 (pcl-cvs) ☆ CVS (Concurrent Versions System) でソフトウェアの管理を行ない, なおかつソースコードの編集に Emacs を用いる場合, Emacs から直接 cvs のコマンドを使いたいと思うことがある. そのような場合には pcl-cvs (https://www.cvshome.org/dev/addonpclcvs.html) を用いると便利である. このソフトウェアは Debian package にもなっているので, Debian ユーザにはさらに便利である. ■ インストール Debian ならば, 以下のコマンド1つで pcl-cvs をインストール 可能である. (Debian GNU/Linux 3.0 woody では, パッケージ名は cvs-pcl なので注意せよ) # apt-get install cvs-pcl 依存するパッケージは cvs, elib, emacsen, make であるため, もしもこれらがインストールされていなければ自動的に インストールされる. cvs インストール時にはリポジトリを指定するようにいわれるが, 自分のローカル PC をリポジトリにする気が無い場合はキャンセル するなどしてどうにかしてほしい. ■ Emacs の設定 基本的に .emacs に設定せずとも動作する. Emacs 自体の設定に関してはここでは述べない. □ コミットメッセージに日本語を用いる場合 コミットメッセージに日本語を用いる場合は, プロジェクト全体で 文字コードとして何を用いるのかを決め, それを固定しておく 必要がある. 文字コードを設定する場合には, 以下の設定の どれかを選択し, .emacs に記述しておく. (他にも文字コードによって いろいろあるだろう). ※ 固定していないと, リポジトリ内のファイルの文字コードが 統一されないため, コミットメッセージなどが化けて しまう場合がある. ; 文字コードは EUC で改行コードは LF で (modify-coding-system-alist 'process "cvs" '(undecided . euc-jp-unix)) ; EUC の場合 (modify-coding-system-alist 'process "cvs" '(undecided . euc-japan)) ; 改行コードだけ UNIX (LF を用いる) (modify-coding-system-alist 'process "cvs" '(undecided . undecided-unix)) ; sjis の場合 (modify-coding-system-alist 'process "cvs" '(undecided . sjis)) ; iso-2022-jp (modify-coding-system-alist 'process "cvs" '(undecided . iso-2022-jp)) ■ 利用方法 ここでは, 既に cvs checkout された作業用コピー内のファイルを Emacs で開いたところからの使い方の解説を行なう. ※ pcl-cvs の機能には checkout するものもあるらしいが, それに関してはここでは述べない. □ cvs update cvs update コマンドは M-x cvs-update で行なう. するとどのディレクトリで update するのか聞かれるので, update したい位置を入力する. すると, 以下のようにアップデートされた情報が表示される. ※ ただし, もしもリポジトリがリモートホストにある場合, update を行なう前に接続を確保しておく必要がある. 下で, ssh 接続によるリモートリポジトリとの接続確保の 方法が載せてあるので参照して欲しい. ================================================================ PCL-CVS release R-2_0-Beta_2. Copyright (C) 1991-1995 .... Pcl-cvs comes with absolutely no warranty; for details .... This is free software, and you are welcome to redistribute .... conditions; again, consult the Texinfo manual for details. In directory /home/morikawa/gt4f90io: Patched Config.mk Updated config.pl Unknown config.cache In directory /home/morikawa/gt4f90io/doc: Patched index.html Updated introduce.html Modified ci README.txt In directory /home/morikawa/gt4f90io/src: Unknown AN_FILE.mod ================================================================ 右側にファイル名が書いてあり, 左がその状態を示している. ここにあるものを簡単に説明する. - Updated 作業用コピー内に無かったファイルが新規に アップデートされた. - Patched 作業用コピー内にあったファイルが patch により アップデートされた. - Modified 作業用コピー内のファイルに変更が加えられている. ci は commit の必要がある場合に表示される. - Unknown 作業用コピー内にのみ存在するファイルで リポジトリ内には存在しないもの. なお, ここにあるような変更があったファイル以外は表示されない. また, デフォルトだと pcl-cvs は cvs update コマンドと同等の 効果しか発揮できないため, 新規に作成されたディレクトリを アップデートできない. もしも cvs update -d と同じ効果を 期待するのならば Ctrl-c Ctrl-u として Optional flags に "-d" を指定した後, 再度アップデートすること (下記の「その他の キー操作」を参照のこと). □ 操作 アップデート後, プログラムの様々な修正をおこなったとして, それらプログラムをアップデートする方法を紹介する. ・ コミット In directory /home/morikawa/dcpam/CVSROOT: Modified ci checkoutlist --------------------- End --------------------- 上記のように Modified になっていることを確認し, 「c」を入力する. デフォルトでは「ci」の付く全ての ファイルをコミットしようとする. もしも選択的に 一部のファイルだけをコミットしたい場合は, 「m」で コミットしたいファイルにだけマークを付け, 「c」を入力する. (マークを消すのは「u」である). In directory /home/morikawa/dcpam/CVSROOT: * Modified ci checkoutlist Modified ci cvswrapper --------------------- End --------------------- するとコミット時のメッセージを入力するためのバッファ *cvs-commit-message* が出てくるので, そこにメッセージを書き込む. 書き込んだら, Ctrl-c Ctrl-c で決定され, ファイルが コミットされる. 結果, 以下のように「ci」(「コミットすべき」 という意味) の記述が消える. In directory /home/morikawa/dcpam/CVSROOT: Modified checkoutlist --------------------- End --------------------- ・ ファイル追加 In directory /home/morikawa/dcpam/CVSROOT: Unknown cvsform.pl --------------------- End --------------------- 上記のように Unknown になっているファイルにカーソルを合わせ, 「a」を入力する. すると, In directory /home/morikawa/dcpam/CVSROOT: Added ci cvsform.pl --------------------- End --------------------- となり, ミニバッファで「Enter description」と聞かれるので メッセージを入力する. そのファイルに関することを入力しても 良いが, 入力しなくとも良い. (単に cvs add とするのと 同じである). バッファが分割され, もう1つの方に cvs コマンドを実行した時と同じメッセージが表示される. さらに, コミットするため, c をどこでも良いので入力する. するとコミット時のメッセージを入力するためのバッファ *cvs-commit-message* が出てくるので, そこにメッセージを書き込む. 書き込んだら, Ctrl-c Ctrl-c で決定され, ファイルが コミットされる. 結果, 以下のように「ci」(「コミットすべき」 という意味) の記述が消える. In directory /home/morikawa/dcpam/CVSROOT: Added cvsform.pl --------------------- End --------------------- ・ ディレクトリ追加 ※ これから追記予定 ・ 削除 まず, (ちょっと無駄だが), 削除したいファイルに ちょっと変更を加えるなどして M-x cvs-update する. (*cvs* バッファに表示するためである). In directory /home/morikawa/DCPAM/dcpam0: Modified ci cvs_test.txt --------------------- End --------------------- ここでファイルを選択して「r」 (または複数を一度に消したい 場合は「m」でそれらにマークを付けて「r」) するとミニバッファで「Delete 2 files? (yes or no)」と 聞かれるので, 良ければ yes を入力する. すると 以下のように, Removed と ci フラグが付く. In directory /home/morikawa/DCPAM/dcpam0: * Removed ci cvs_test.txt * Removed ci cvs_test1.txt --------------------- End --------------------- (この段階で既に作業用コピー内からファイル本体は 削除されている). そこで, 「c」を入力するとコミット時のメッセージを 入力するためのバッファ *cvs-commit-message* が出てくるので, そこにメッセージを書き込む. 書き込んだら, Ctrl-c Ctrl-c で決定され, ファイルが コミットされる. 結果, 以下のように「ci」(「コミットすべき」 という意味) の記述が消え, 削除作業が完了する. In directory /home/morikawa/DCPAM/dcpam0: Removed cvs_test.txt Removed cvs_test1.txt --------------------- End --------------------- ・ log を見る 過去に commit された際の履歴を「l」で見ることが可能である. (ただし, 残念ながら最新版のファイルは *cvs* バッファに現れ ない. もしも最新版ファイルの履歴が見たい場合は, ディレクトリ で「f」を入力して dired モードに入り, ファイルの場所で「!」 を入力し, shell command として「cvs log」を入力して欲しい) □ その他キー操作 ただし, 全てのキー操作の動作確認はしていない. 詳しくは「h h」として表示される詳細ヘルプや パッケージとしてインストールされるマニュアル /usr/share/doc/cvs-pcl/html/pcl-cvs_toc.html を参照せよ. g cvs update の再実行 C-c C-u update のフラグ (デフォルトはなし) を変更. ("-d" を指定すれば新規ディレクトリもアップデート) h, ? ヘルプ(簡易版:ミニバッファに表示される) h h ヘルプ(詳細版:*Help*バッファに表示される) ? ? 〃 p カーソルを上に移動 n カーソルを下に移動 f ファイルを開く o ファイルを別ウィンドウに開く q 終了する(実際にはバッファはまだ存在する) = diff を表示 d d 〃 C-c C-d diff のフラグ (デフォルトは "-u") を変更 m マークする(l 以下のコマンドはマークしたファイル全てが対象となる) u マークを外す Alt + Del 全てのマークを外す l ログの表示 s status の表示 + 分岐情報を表示. ブランチを視覚的に表示. U ワーキングファイルでの変更を破棄し、レポジトリに格納した内容に戻す C commit する. コメントを入力して, Ctrl-c Ctrl-cで commit. ※ ci が付くものを全部選択?? c commit する(前回のコメントがバッファに入力された状態になる) ※ ci が付くものを全部選択?? a add する r remove する x すでに commit したファイル (Up-To-Date なファイル)を表示対象から外す i ファイルを無視させる. バックアップファイルなどに有効. .cvsignore ができるので, *.elc などと直接書いてもいい. e cvs-examine t タグを付ける ■ pcl-cvs でリモートリポジトリに ssh 接続するために 本来, pcl-cvs は ssh アクセスをサポートしていない. しかし, Debian の ssh パッケージに付属する ssh-agent, ssh-keygen, ssh-add などを用いることで, Emacs + pcl-cvs にノンパスログインを可能に させ, pcl-cvs を事実上利用可能にすることが出来る. □ リモートリポジトリサーバ上の設定の確認 リモートホストの /etc/ssh/sshd_config において 以下のようになっていることを確認. RSAAuthentication yes このようになっていないのならば, 下記の方法は不可能である. 設定を変更することが可能であれば変更すること. □ RSA 認証の環境構築 ◆ 秘密鍵, 公開鍵作り ローカル (Emacs + pcl-cvs を起動する) ホスト で, 以下のコマンドで鍵を作る. $ ssh-keygen -t dsa Generating public/private dsa key pair. (鍵生成中...) Enter file in which to save the key (鍵の保存場所) (/home/hero/.ssh/id_dsa): [デフォルト] Enter passphrase (empty for no passphrase): [長めのパスフレーズを] (鍵が生成された) Your identification has been saved in /home/hero/.ssh/id_dsa. Your public key has been saved in /home/hero/.ssh/id_dsa.pub. The key fingerprint is: 71:f0:fb:f9:34:ae:70:0c:ab:66:8f:52:ee:3a:cc:0d hero@hoge ◆ 公開鍵をリモートリポジトリのあるホストに置く リモートリポジトリにあるホストに公開鍵を置く. 当然鍵を一目に見えるようにしてはいけないので, 本当はなんらかの 外付けメディアで運ぶのが一番安全だが, scp ならば暗号化されて いるので, とりあえず OK とする. $ scp /home/hero/.ssh/id_dsa.pub foo.ne.jp:~/.ssh/authorized_keys □ RSA 認証の接続確認 ◆ ssh-agent を起動 ローカルで X を起動し, ssh-agent の後ろにターミナル起動の コマンドをくっつけて ssh-agent なターミナルを起動する $ ssh-agent kterm ◆ ssh-add そのターミナル上で以下のコマンドを入力する. $ ssh-add すると, 先ほどのパスフレーズを聞かれるので入力する. Enter passphrase for /home/hero/.ssh/id_dsa: [先ほどのパスフレーズ] (認証されたら) Identity added: /home/hero/.ssh/id_dsa (/home/hero/.ssh/id_dsa) ◆ 認証 認証後は, そのウィンドウ上でなら, ノンパスでログインが可能となる. □ Emacs + pcl-cvs にノンパスログインさせるには ◆ RSA 認証されたターミナルを準備 上記で示したように, $ ssh-agent kterm と, $ ssh-add によってノンパスログインの可能なターミナルを準備する ◆ そのターミナル上から Emacs を起動 あとはそのターミナル上から Emacs を起動するだけである. (フォアグラウンドジョブでもバックグラウンドジョブでも OK). $ emacs & ◆ Emacs で M-x cvs-update では, その Emacs 上で M-x cvs-update をやってみよう. リモートリポジトリとのアクセスが可能になっているはずである. ◆ 注意 ただし, このアクセスは先の ssh-add をおこなったターミナル によって可能になっている. バックグラウンドジョブとして Emacs を起動した場合, Emacs を起動しておきながらターミナルを 停止させることは可能だが, それをすると Emacs からリモート リポジトリへのアクセスが不可能になるので注意して欲しい. ■ 参考資料1 (pcl-cvs について) - CVS -- pcl-cvs (本家, 英語) https://www.cvshome.org/dev/addonpclcvs.html - cvs-pcl パッケージ付属マニュアル (英語だが最新) /usr/share/doc/cvs-pcl/html/pcl-cvs_toc.html - [書籍] カール フォーゲル (著), バー モシュ (著), Karl Franz Fogel (原著), Moshe Bar (原著), 竹内 里佳 (翻訳), でびあんぐる (翻訳), 2002: CVSによるオープンソース開発. [Open Source Development with CVS, Second Edition]. オーム社, ISBN: 4274064735, 380 pp. - Meadow/Emacs memo: 変更箇所を表示・管理・メモ http://www.bookshelf.jp/soft/meadow_44.html#SEC611 - ぶ〜ちゃんきんぐだむ -- Meadow を活用しよう - Windows で Emacs - PCL-CVS で履歴管理 http://www4.kcn.ne.jp/~boochang/emacs/pcl-cvs-vc.html - Naney's Web Site > computer > CVS > tools > pcl-cvs パッケージ http://www.naney.org/comp/cvs/tool/pcl-cvs/ - Emacs21 -- pcl-cvs http://emacs-21.ki.nu/application/pcl-cvs.html ■ 参考資料2 (ssh で cvs について) - プログラミング豆知識 Linux 編 pcl-cvs http://icp.hicorp.co.jp/letter/p_mame_l30720.html - 迷彩記憶 (2004-02-28) http://nabeken.tdiary.net/20040228.html