CVS





管理人





Repositoryを初期化( cvs init )


SYNTAX cvs -d /srv/cvs init DESC Repository の場所を決めたら一度だけする WARNING Repository Directory のアクセス権がそのまま 各ユーザが CVS を使ってアクセスするときの権利になる
# Group に Repository への R/W の権利をあたえておく chmod /srv/cvs g+rw # 試してみる # Write 禁止にする chmod -R a-w /srv/cvs/ # RET: # cvs [commit aborted]: could not open lock file `/srv/cvs/proj/,foo.txt,': Permission denied cvs commit -m "test" /proj/foo.txt



Repository.へのアクセス手段をきめる


;; 開発者が 一箇所で作業をする [.] local : Local FileSystem , NFS におく ;; UNIX の password 認証を利用した network アクセス [.] pserver : password 認証を必要とする network 経由でのアクセス ;; [.] ext : rsh, ssh を使用する network 経由でのアクセス
# Repository の場所を CVS におしえる export CVSROOT=:local:/srv/cvs
Server の設定は root 権限がいる inetd 経由でき cvs を daemon として動作させる /etc/services /etc/inetd.conf に記述 cvspserver 2401/tcp # CVS network server cvspserver 2401/udp # CVS network server cvspserver stream tcp nowait root /usr/local/bin/cvs cvs --allow-root=/usr/cvs/pserver # client からの Access # export CVSROOT=:pserver:host:/usr/cvs cvs login CVS password: *** # 後はいつもとおり # # ps ax | grep inetd | grep -v grep # SIGHUP を inetd におくる # これで 設定 File を reload する kill -HUP 249



Project.を.Import.する( cvs import )


SYNTAX cvs import [-m "msg"] projName vendorName releaseTag TIP projA/file ... : cd proj; cvs import projA
# /home/project を VC する # project 以下の file を "project" という名前で管理開始 cd /home/project # import cvs import -m "init" project xxx rev_init # Original Directory 削除 cd ../ rm -Rf project # REP から WORKFILE Checkout cvs checkout project



checkout


SYNTAX cvs checkout project DESC 指定した project を checkout する
# checkout する Directory へ移動 cd d: # projA という Directory がつくられて Repository からファイルがコピーされる # cvs checkout projA # Rivision を指定する cvs checkout projA -r 1.1 # 日付指定 cvs checkout -D xxx projA
WARNING Rivision を指定すると Stickey Tag がついて commit できない commit できるのは none || branch tag のみ
# Stickey を取り, 最新に cvs update -A



利用者





全体の流れ


cvs update edit cvs update confict がおきたら merge Program の動作検証 cvs commit



update


SYNTAX cvs update [-d] [file...] TIP working file にないものは -d fileName 状態を確認したいときも使える
cd /home/pl # foo.pl を更新 cvs update foo.pl # file を指定しないと Current Directory 以下すべてが対象 cvs update
# RET # M foo.pl # M bar.pl


commit


SYNTAX cvs commit [-m "msg"] [file...] DESC cvs を Commit する TIP fileName.指定なしで ModifyFile すべて -> Message をうつのメンドイ ! WARNING commit する前に update が必須 -> ERROR になる


File.を追加


SYNTAX cvs add [-k keywordflag] [-m "cmt"] file ... TIP cvs add は file に追加予約( ie. CVS に記述するのみ) dir も file 同様. WARNING 再帰的に追加できない
// index.htm を追加状態にする cvs add index.htm



File.をけす


SYNTAX cvs delete [file ...] WARNING 先に WorkingFile を消さなくてはならない # cvs remove: file `foobar still in working directory # cvs remove: 1 file exists; remove it first
# WorkFile があっても削除する cvs -f remove -f bar.class cvs -f remove -f /work/log/htm/private/tax.hym_bk cvs -f remove -f /work/log/htm/public/cmd.htm_bk cvs -f remove -f /work/log/htm/public/__tmp__



cvs remove


TIP # 削除予約をする cvs delete foobar # cvs remove: scheduling `foobar for removal # cvs remove: use `cvs commit' to remove this file permanently # Repository 側を削除する cvs commit -m "delete file" foobar cvs commit -m "delete file" /log/ WARNING cvs delete xxx を忘れると cvs update 時におちてくる


Directory.をけす


DESC Directory には cvs delete は無い
/ProjectX/nhk/foo.htm /ProjectX/nhk/bar.htm # 中の file を消す cd /ProjectX/nhk/ cvs remove -f *.htm # 反映 cvs commit -m "del" # ひとつ↑へ ( ここ重要 ! ) cd ../ # ( prune: 枝刈り ) cvs update -P



Module(Project)を消す


DESC 専用のコマンドがないかもしれないので Repository のファイルを直接けす REF http://www.thinkit.co.jp/images/tech/3/12/9.gif
# cd $CVSROOT cd /srv/rep rm -Rf ProjectX # 中に "v," というファイルがある



WorkingFile.の編集を終了する


SYNTAX cvs release dirName DESC 編集終了を CVS に通知する TIP Lock する仕組みではないため, Local を削除するだけでもOK
/home/projA という WORKFILE を VC からはずす cd /home # cvs release projA # 消す rm -Rf projA # release と同時に Local Copy 消す cvs release -d projA
TIP CVS は checkout している人のなどの記録をとっている ( $CVSROOT/CVSROOT/history ) ごみとなる記録を消すため 作業を終えたら 明示的に release するのがいい 変更忘れを防止するためにも使える もし更新しているファイルがあったら教えてくれる
cvs checkout projA # 変更する cd projA echo bar >> ./foo.txt cd .. cvs release projA # M foo.txt # You have [1] altered files in this repository. # Are you sure you want to release directory `projA':



Confict を解決する


DESC 同一行が変更されていると, Confict をおこす
main.c が Confict をおこす # workingfile の backup がつくられる .#main.c.1.2
Confict をおこした file は次のように衝突箇所が明記される
<<<<<<<<<<<< main.c printf("riv 1.2"); ====== printf("riv 1.3"); >>>>>>>>>>>> 1.3



現在の.Rivision.に名前をつける


REF http://www.sodan.org/~penny/vc/cvs-ja_4.html#SEC48 DESC 特定のリビジョンに名前 (タグ名) を付けることができます キリのいいときに, 複数のファイルに名前をつけておくと便利 ( ver_alpha とか ) 各バージョンのファイルはそれぞれ一意なリビジョン番号をもつ リビジョン番号はピリオドで分けられた偶数個の十進整数です 初期設定ではファイルの最初のリビジョンは 1.1 で 新しくなると一番右の番号が1つ増えます こんな感じ ---------- ver_alpha ---------- main.c : riv 1.4 sub1.c : riv 1.2 sub2.c : riv 1.3 sub3.c : riv 1.2 SYNTAX cvs tag [op] tagName [file...]
# 現在の Rivision を ver_alpha という名前にする cd project cvs tag ver_alpha # log を見ると Rivision と Pair になっている cvs log > symbolic names: > ver_alpha : 1.5 # ある日 ver_alpha を見たくなったら cvs update -r ver_alpha
OP # Branch をつくるときも Tag をうつ b : branch tag 生成 TIP cvs tag version-1_0 WARNING Tag 名に SPACE はだめらしい


Rivsion.をくらべる


SYNTAX cvs diff [opFormat] [-r srcRev [-r tgtRev]] file... DESC revision 間の差を比較 CVS は すべての変更履歴をとっているため, 差分をみれる
// WorkingFile と 最新 Rivision の比較 cvs diff /work/log/htm/private/tax.htm // 2 つの Rivision の比較 cvs diff -r1.1 -r1.8 /work/log/htm/private/tax.htm // 指定 Rivision と WorkingFile の比較 cvs diff -r1.1 /work/log/htm/private/tax.htm cvs diff -u -r1.20 /work/log/htm/private/book.htm # Format Option は diff の format # Unified 形式 cvs diff -u -r1.1 /work/log/htm/private/tax.htm DESC rev 間の差分を比較 2. tgtRev == NULL -> tgtRev = working file 3. tgtRev == NULL -> srcRev = newest rev; tgtRev = working file



Rivision 間の diff をとる


SYNTAX cvs rdiff [op] [src [dst]] module DESC 指定 module の Rivision 間の diff をつくる TIP CVS は差分情報を管理するため, 2 つの Rivision を用意せずに差分をとれる
# 比較元 1.1 比較先 1.2 の差分をとる cvs -r 1.1 -r1.2 projA # dst がなければ WorkingFile との比較 cvs rdiff -r 1.1 projA # Unified 形式 cvs rdiff -u -r1.1 projA



現在の状態をみる( cvs status )


SYNTAX cvs status DESC 変更されているか, 変更元の Rivision, Repository の Revision がわかる
# Recursive cvs status -R # Verpose cvs status -v # 現在の Local Directory のみ cvs status -l
cvs status foo.txt =================================================================== File: foo.txt Status: Locally Modified # 変更状態 Working revision: 1.132 2010-06-25 07:04:24 +0900 # 変更元の Rivision Repository revision: 1.132 /srv/cvs/projA/foo.txt,v # Repository Rivision Commit Identifier: gZknrvbTj6ak74Eu Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none)



remote の Repository へログインする


SYNTAX cvs login cvs logout DESC remote の Repository へアクセスするときは login, logout をする
# ~/.cvspass という file が作成される # これを元に pserver と通信する cvs login



annotate


SYNTAX cvs annotate [file ...] DESC 各行の編集履歴の表示
cvs annotate Annotations for emacs.htm *************** 1.13 (usr 03-May-08): 1.124 (usr 21-Jun-10): m-x animate 1.124 (usr 21-Jun-10): m-x zone 1.124 (usr 21-Jun-10): m-x dunnet 1.124 (usr 21-Jun-10): m-x blackbox



file.の修正履歴(rev.の確認)( cvs log )


SYNTAX cvs log [op] [file ...] DESC file の 修正履歴をみる 行数単位で追加, 削除がわかる
# RCS file の場所もわかる RCS file: /srv/cvs/projA/test.txt,v Working file: ~/test/cvs/projA/test.txt head: 1.1 branch: 1.1.1 locks: strict access list: symbolic names:



編集履歴をみる


SYNTAX cvs history [op] DESC 変更履歴を見る CVSのアクセスログを表示する checkout の状況をみたり,
# 指定した Project の履歴をみる cvs history -m projA # O : # F : Finish O 2007-09-29 15:18 +0000 usr projA =projA= /cygdrive/d/work/log/htm/* O 2007-09-29 15:22 +0000 usr projA =projA= /dust/tako/* O 2007-10-02 15:19 +0000 usr projA =projA= /log/* O 2010-06-24 21:54 +0000 usr projA =projA= /dust/cvs/* # 指定ファイルの commit 履歴を見る cvs history -c foo.txt M 2010-06-24 22:04 +0000 usr 1.132 foo.txt public == /log M 2010-06-24 22:28 +0000 usr 1.133 foo.txt public == /log M 2010-06-24 22:44 +0000 usr 1.134 foo.txt public == /log M 2010-06-24 22:44 +0000 usr 1.135 foo.txt public == /log M 2010-06-24 22:45 +0000 usr 1.136 foo.txt public == /log M 2010-06-24 22:46 +0000 usr 1.137 foo.txt public == /log M 2010-06-24 22:46 +0000 usr 1.138 foo.txt public == /log



過去の rivision にタグを打つ


SYNTAX cvs rtag [op] module DESC cvs tag は 現在の Working File に rivision をうつ # 指定 rivision の module に "test_rtag" という名前のタグをつける cvs rtag -r 1.1 test_rtag public WARNING # file 単位ではだめらしい ? cvs rtag -r 1.1 test_rtag2 emacs.htm


Branch.をつくる


REF http://www.sodan.org/~penny/vc/cvs-ja_5.html#SEC55( Branch ) DESC 枝 (branch) として知られる別の開発ラインをわける 枝のファイルを変更しても、幹や他の枝には影響しない こういうときに便利 ver1.0 をリリース 致命的なバグが見つかる 現在のバージョンは進行中で, お客さんにだせるものではない そこで ver1.0 のときに 枝(branch)を作成しておけばバグ修正をすることで対応できる また branch で追加した bug fix を Trunk に Merge もできる
Trunk | | / bug fix version |/ | ver1 |
SYNTAX cvs tag tagName # branch 用の Tag を打つ # branch ( 枝 )を作成( ここの名前は Project-branch とかがいい ) cvs tag -b branchtag cvs tag: Tagging . T test.txt cvs status -v Existing Tags: branchtag (branch: 1.2.2) # branch Tag ( Rivision 番号もひとつ階層が追加 ) branch_test (revision: 1.2) # branch 元のタグ yyy (revision: 1.1.1.1) xxx (branch: 1.1.1) # branch に対する編集をする -> Trunk と WorkingCopy と重複しないように Local の場所を移動 cd another cvs checkout -r branchName # branch を Checkout ( 以後, 編集は branch に影響する -> branch が伸びる ) cvs checkout -r branchtag projA cvs checkout: Updating projA U projA/test.txt # 編集して Commit echo "branch_edit" >> test.txt Working revision: 1.2.2.1 2010-07-19 18:44:45 +0900 Repository revision: 1.2.2.1 /srv/cvs/projA/test.txt,v Commit Identifier: kXWovHy8wzQLddHu Sticky Tag: branchtag (branch: 1.2.2) # Sticky Tag を見れば編集中の Branch がわかる # 2 回目 echo "branch_edit2" >> test.txt Working revision: 1.2.2.2 2010-07-19 18:46:16 +0900 Repository revision: 1.2.2.2 /srv/cvs/projA/test.txt,v # CVS Directory の中に "Tag" というファイルがあり, Branch 名が記述されている cat ./CVS/Tag Tbranchtag # POINT # branch Tag を指定して落とすときは, Branch を指定するのであって # branch 生成時の Rivision ではない cd another cvs checkout -r branchtag projA cat projA/test.txt ... rev1 rev2 branch_edit branch_edit2
| / <- ここが落ちる | / |/ |
# Branch に HEAD をとりこむ cvs update -j HEAD cvs update: Updating . RCS file: /srv/cvs/projA/test.txt,v retrieving revision 1.2 retrieving revision 1.4 Merging differences between 1.2 and 1.4 into test.txt # Branch 元( 1.2 ) から HEAD( 1.4 )までの分をとりこみ rcsmerge: warning: conflicts during merge # conflict はしたが 取り込みは成功 rev1 <<<<<<< test.txt rev2 branch_edit branch_edit2======= rev2 rev3 rev4>>>>>>> 1.4 # 手で編集して Commit ( Branch として rivision が増加 ) /srv/cvs/projA/test.txt,v <-- ~/test/cvs/branch/projA/test.txt new revision: 1.2.2.3; previous revision: 1.2.2.2 # さらに Trunk 側に Tag を打ち, 次の Merge が必要最小限になるようにする # cvs rtag -r HEAD branchmerge1
ここまで | | / <- 未来の merge | / | / ここから | /<- 今回の merge | / |/ |
# これを繰り返せば, Trunk と並行して branch が作成できる cvs update -j branchmerge1 -j HEAD # Trunk に Branch を取り込むには Branch Tag を指定する( Branch の最新が Merge される ) cvs update -r branchtag cvs update: Updating . U test.txt # Stickey Tag # Branch Tag 以外を 指定した場合は Commit ができない # # Branch の芽がないところで 伸ばそうとすると Error になる cvs commit: sticky tag `branch_test' for file `~/test/cvs/projA/test.txt' is not a branch cvs status Working revision: 1.2 2010-07-19 19:28:54 +0900 Repository revision: 1.2 /srv/cvs/projA/test.txt,v Sticky Tag: branch_test (revision: 1.2) # # Stickey Tag を解除 && 最新版に Update cvs status -A Working revision: 1.4 2010-07-19 19:33:03 +0900 Repository revision: 1.4 /srv/cvs/projA/test.txt,v Sticky Tag: (none) # Stickey がない状態( 幹 )なら Commit できる
# 現在の WorkingFile の Rivision に対して ver_alpha という名前のブランチをつくる # POINT # 枝はリポジトリに作成するのであり、作業コピーに作成されているの ではない # 作業コピーを新しい枝に切り換えることはしない cd project cvs tag -b ver_alpha # WorkingFile ではなく, Rivision を指定して枝をつくる # -r tag-1' はこの枝がタグ `tag-1' に対応するリビジョンを根であることを指定する # 最新のリビジョンでなくても OK # 古いリビジョンから枝を生やすことが役に立つことがしばしばあります # (例えば、他の部分は安定していることが知られている過去のリリースのバグ を修正するとき) cvs rtag -b -r tag-1 ver_alpha
Branch を編集方法は 2 つ
# Repository から枝をとりだす cvs checkout -r project-ver-alpha tc # 既に作業コピーがあれば、`update -r' で任意の枝に切り換えれる cvs update -r project-ver-alpha tc # 作業コピーが元々幹にあったか他の枝にあったかは関係なし # 上のコマンドはそれを指定された名前の枝に切り換えます # 普通の `update' コマンドと同様に、`update -r' は全ての変更をマージし 衝突がどこ で起こったかを知らせます # 一度特定の枝に結び付けられた作業コピーを手に入れると 指示しない限りそこに残り続けます これは、作業コピーから格納された変更はその枝に新しいリビジョンを加えますが 幹と他の枝には影響を及ぼさないということ # 作業コピーがどの枝であるかを知るために コマンド `status' を使う ことができます その出力で、`Sticky tag' という名前の場所を探してください それは現在の作業ファイルに、もし枝があれば それを教える CVS の方法です WorkingFile は Repository からの Copy にすぎないから 同一ディレクトリに ブランチが異なるファイルがあっても OK ( Build するときはエラーになるけど ) cvs update -r ver_alpha bun.el # ってことは Current の Branch という状態があるわけね ! # Sticky を確認 # Sticky Tag: version_alpha (revision: 1.2) # Trunk は何もつかない Message: Sticky Tag: (none) # 問題は branch をきりかえると, 最新版が落ちてこない
# Rivision はこんな感じ
+-----+ +-----+ +-----+ +-----+ +-----+ ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! +-----+ +-----+ +-----+ +-----+ +-----+
# それぞれの枝には枝番号 があり、 # . で分けられた奇数個の10進 整数から成ります # 枝番号は枝が分岐した元の枝に対応するリビジョン番号に整数を追加することによって作成されます # # 枝番号により、特定のリビジョン から 1 つ以上の枝を枝分かれすることができます。 # 枝をつくると, 子供の index がつく ( 親子だと思えば OK )
# 枝の全てのリビジョンは枝番号に普通の数字を追加することで形成されます # 枝番号が作成される厳密な詳細は普通は気にしなくて良い # CVS が枝番号を作成するときは、2 から始まる最初の未使用の偶数を選びます # ので リビジョン 6.4 から枝を作成したいとき は、それは 6.4.2 という番号になるでしょう 零で終わる全ての枝番号 (6.4.0 のように) は CVS の内部で使用されます +-------------+ Branch 1.2.2.3.2 -> ! 1.2.2.3.2.1 ! / +-------------+ / / +---------+ +---------+ +---------+ Branch 1.2.2 -> _! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 ! / +---------+ +---------+ +---------+ / / +-----+ +-----+ +-----+ +-----+ +-----+ ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk +-----+ +-----+ +-----+ +-----+ +-----+ ! ! ! +---------+ +---------+ +---------+ Branch 1.2.4 -> +---! 1.2.4.1 !----! 1.2.4.2 !----! 1.2.4.3 ! +---------+ +---------+ +---------+
WARNING trunk 用 dir の場合は 別 dir で行う


古い.Revision.をとる


SYNTAX cvs update -rNR file // p: stdout cvs update -r1.2 foo.txt cvs update -p -r1.2 foo.txt cvs update -r1.8 /work/log/htm/private/tax.htm cvs update -r1.8 /work/log/htm/private/tax.htm cvs update -r1.79 /log/pro_tip.htm cvs update -A /log/pro_tip.htm # tag 名で指定する cvs update -r tag_xxx WARNING // Sticky がつくので , 最新版をとりたいときは cvs update -A /work/log/htm/private/tax.htm cvs update -A /log/cmd.htm TIP Sticky の目的は 最新でない Rivision を Comit させない目印 cvs update -C -r 1.64 /work/log/htm/private/tax.htm DESC 2. ファイル名を変更 mv old new cvs remove old cvs add new cvs commit -m "add new" new WARNING new rev 1.0


FAQ


* http://www.mikamama.com/CVSBook/Q_and_A.html#Q5


Rivision.を指定して.Update.したら最新が落ちなくなった


// Rivision 1.8 から おとす cvs update -r 1.8 /home/project/test.htm // 最新版がおちてこない ! cvs update /home/project/test.htm // 状態をしらべてみる cvs status /home/project/test.htm =================================================================== File: test.htm Status: Up-to-date Working revision: 1.8 2009-12-20 15:25:11 +0900 Repository revision: 1.8 /srv/cvs/project/test.htm,v Commit Identifier: G9QZcIl4lctsv9eu Sticky Tag: 1.8 Sticky Date: (none) Sticky Options: (none) // Sticky Tag を削除する cvs update -A


diff-modeで変更箇所がみれます


= : m-x : cvs-mode-diff RET : diff-goto-source // 変更箇所へ jump


FrontEndとしてのVC


WARNING vc mode が利用できないなら明示的に load する
(load-library "vc")
emacs は backend に複数の VC をもつ frontend VC をもつ. [未登録] -> [登録 && lockなし] <-> [編集可能 <-> lockあり] c-x v v : m-x : vc-next-action c-x v u : m-x : vc-revert-buffer // comment buf の編集は 次の3 pattern check in lock の奪取 file 登録 -> c-c c-c 作業終了. -> m-p, m-n : buf 移動.


VCcommand


c-x v v : m-x vc-next-option : 次の管理状態へ c-x v d : m-x vc-directory : 登録すみファイル表示. -> cur dir 以下のすべての版管理すみの file 表示に便利 -> しかも dired mode c-x v = : vc-diff : rev の差分を表示 差分 report が作成できるよ c-u c-x v = で rev 指定. Etr key で空指定ならば 最新rev と workfile の差分. dir 指定で 以下のすべての 差分作成可能. patch format で出力される. c-x v ~ : vc-version-other-window: 指定 rev を表示. -> file.ext~rev~ として保存される. c-x v l : vc-print-log file 変更履歴( rlog の結果が *vc* Buffer に表示 ) c-x v i : vc-register : file を版管理にする -> 非平行管理 では checkout もされる c-x v h : vc-insert-headers : file に version 管理ヘッダ挿入 -> 最終更新者 , 日付がセットされる. -> 登録済み && 編集可能でOK c-x v r : vc-retrieve-snapshot : 名前つきのprojectをcheckoutする -> snapshot とは 複数の rev に対する tag ie. grouping する. きりのよいところで tag をうつと便利. -> SVN はすべの rev が snapshot に相当. 指定した SS名に対応する file を checkout c-x v s : vc-create-snapshot : 名前つきのprojectのsnapshot作成 -> 作成した SS は rev名を指定する際に代用 OK c-x v a : vc-update-changelog : ChangeLog file に RCS の履歴を元に AutoUpdate c-x v c : vc-cancel-revision : 保存すみ revision を破棄する.


vc mode のマーク説明.


modeline に 版管理の内容が記述. [-] : file 未変更 [:] : file 変更


版管理システムを選択する


版管理の指定は master file を見て判断する -> master file とは 変更履歴を含んだファイルのこと VC が master をさがす手順. working file と同一 dir (RCS | SCCS | CVS | .svn) dir を検索 -> VAR:vc-handled-backends に 検索順番があるよ -> (RCS | CVS | SCCS) の順番.


VC.管理下のファイル名をかえる


いろいろメンドイ RCS ならば master も変更する必要あり -> m-x: vc-rename-file で変更可能 CVS はもっとメンドイらしい SVN は workfile の rename が簡単な設計目標があったらしい http://shimaki-hp.hp.infoseek.co.jp/cvs/x161.html # ばか正直に 古いのを消して, 新規に登録する
cd project # けす cvs remove foo.cpp # たす cvs add bar.cpp # コミット cvs commit
# log を残したいとき # REPOSITORY を rename する
cd $CVSROOT # 名前を変更 mv project/foo.cpp,v project/bar.cpp,v # update して おちてくるのを確認 cd project cvs update U: bar.cpp



Lock.がかかった


* network ごしの master ではなく, local に キャッシュしておく [ lock情報... ] * なにかの拍子に cvs の transaction が abort すると commit するたびに次のメッセージがでる * 複数の人が cvs command を利用しているときに Lock がかかる File Lock とは別
cvs commit: [07:10:47] waiting for XXX's lock in /home/yokoyama/CVS_DB/public_html
* こんなときは REPOSITORY にある次のファイルを消す # cvs.rfl.hostname.pid EX # cvs.pfl.USR.696


登録しないファイルの指定(cvsignore)


DESC "cvsignore" というファイルに 無視する パターンを記述 Directory 単位かな ?
# obj file と backup file 無視 *.obj *_bk



VC を制御する変数


vc-handled-backends: VC が使用する, backend ( CVS に変更してみる ) vc-display-status nil : modeline での VC 表示 ONOFF vc-backend-header vc-CVS-header == $Id: emacs.htm,v 1.170 2015-03-01 03:01:42 USER Exp $ vc-keep-workfiles VC は checkin 時に readonly の file を cp する vc-mistruct-permissions VC に file権限をあてにしないようにする. vc-suppress-confirm t: 確認 prompt をとめる. vc-initial-comment t: checkin 時にコメントをもとめる. diff-switches diff にわたす command line option WARNING file をひとつの sub tree 以下で管理する必要あり


Ediff による比較


Ediff は VC の interface から起動される. Ediff を使うことで, conflict を検出した際に便利 m-x : ediff-revision RET -> default ( 最新rev, workfile ) control window で各種制御をする -> SVN みたいなもの ? buf をスクロールさせて, 相違点を探すこと. 発見した相違点を修復する control window から 次の command を打つ. -> *Ediff Control Panel* ができています ? : reference を表示させるとさらに便利. n : ediff-next-diffrence p : ediff-previous-diffrence j : ediff-jump-to-diffrence <> : ediff-scroll-horizontally vV : ediff-scroll-vertically | : ediff-toggle-split m : ediff-toggle-wide-display a : ediff-copy-A-to-B b : ediff-copy-B-to-A r a r b : ediff-restore-diff -> copy する前の状態に戻す. A. B : ediff-toggle-read-only w : ediff-save-buffer q : ediff-quit ! : ediff-update-diffs E : ediff-documentation z : ediff-suspend S-idBuf : 読み込み専用にする.