■ 管理人
■ 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.へのアクセス手段をきめる
# 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
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 させない目印
// u-n 再度 uddate しても 怒られる( ここは別途対処 )
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 する
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.169 2012-06-17 13:32:26 tomita 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 : 読み込み専用にする.