CVS
管理人
Repositoryを初期化( cvs init )
SYNTAX
cvs -d /srv/cvs init
DESC
Repository の場所を決めたら一度だけする
WARNING
Repository Directory のアクセス権がそのまま
各ユーザが CVS を使ってアクセスするときの権利になる
chmod /srv/cvs g+rw
chmod -R a-w /srv/cvs/
cvs commit -m "test" /proj/foo.txt
Repository.へのアクセス手段をきめる
;; 開発者が 一箇所で作業をする
[.] local : Local FileSystem , NFS におく
;; UNIX の password 認証を利用した network アクセス
[.] pserver : password 認証を必要とする network 経由でのアクセス
;;
[.] ext : rsh, ssh を使用する network 経由でのアクセス
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
export CVSROOT=:pserver:host:/usr/cvs
cvs login
CVS password: ***
ps ax | grep inetd | grep -v grep
kill -HUP 249
Project.を.Import.する( cvs import )
SYNTAX
cvs import [-m "msg"] projName vendorName releaseTag
TIP
projA/file ... : cd proj; cvs import projA
cd /home/project
cvs import -m "init" project xxx rev_init
cd ../
rm -Rf project
cvs checkout project
checkout
SYNTAX
cvs checkout project
DESC
指定した project を checkout する
cd d:
cvs checkout projA
cvs checkout projA -r 1.1
cvs checkout -D xxx projA
WARNING
Rivision を指定すると Stickey Tag がついて
commit できない
commit できるのは
none || branch tag のみ
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
cvs update foo.pl
cvs update
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 -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 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
cd /ProjectX/nhk/
cvs remove -f *.htm
cvs commit -m "del"
cd ../
cvs update -P
Module(Project)を消す
DESC
専用のコマンドがないかもしれないので
Repository のファイルを直接けす
REF
http://www.thinkit.co.jp/images/tech/3/12/9.gif
cd /srv/rep
rm -Rf ProjectX
WorkingFile.の編集を終了する
SYNTAX
cvs release dirName
DESC
編集終了を CVS に通知する
TIP
Lock する仕組みではないため, Local を削除するだけでもOK
/home/projA という WORKFILE を VC からはずす
cd /home
cvs release projA
rm -Rf projA
cvs release -d projA
TIP
CVS は checkout している人のなどの記録をとっている
( $CVSROOT/CVSROOT/history )
ごみとなる記録を消すため
作業を終えたら 明示的に release するのがいい
変更忘れを防止するためにも使える
もし更新しているファイルがあったら教えてくれる
cvs checkout projA
cd projA
echo bar >> ./foo.txt
cd ..
cvs release projA
Confict を解決する
DESC
同一行が変更されていると, Confict をおこす
main.c が Confict をおこす
.#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...]
cd project
cvs tag ver_alpha
cvs log
> symbolic names:
> ver_alpha : 1.5
cvs update -r ver_alpha
OP
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
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 を用意せずに差分をとれる
cvs -r 1.1 -r1.2 projA
cvs rdiff -r 1.1 projA
cvs rdiff -u -r1.1 projA
現在の状態をみる( cvs status )
SYNTAX
cvs status
DESC
変更されているか, 変更元の Rivision, Repository の Revision がわかる
cvs status -R
cvs status -v
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 をする
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: /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 の状況をみたり,
cvs history -m projA
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/*
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 をうつ
cvs rtag -r 1.1 test_rtag public
WARNING
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
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)
cd another
cvs checkout -r branchName
cvs checkout -r branchtag projA
cvs checkout: Updating projA
U projA/test.txt
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 がわかる
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
cat ./CVS/Tag
Tbranchtag
cd another
cvs checkout -r branchtag projA
cat projA/test.txt
...
rev1
rev2
branch_edit
branch_edit2
| / <- ここが落ちる
| /
|/
|
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
/srv/cvs/projA/test.txt,v <-- ~/test/cvs/branch/projA/test.txt
new revision: 1.2.2.3; previous revision: 1.2.2.2
cvs rtag -r HEAD branchmerge1
ここまで |
| / <- 未来の merge
| /
| /
ここから | /<- 今回の merge
| /
|/
|
cvs update -j branchmerge1 -j HEAD
cvs update -r branchtag
cvs update: Updating .
U test.txt
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) #
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 できる
cd project
cvs tag -b ver_alpha
cvs rtag -b -r tag-1 ver_alpha
Branch を編集方法は 2 つ
cvs checkout -r project-ver-alpha tc
cvs update -r project-ver-alpha tc
衝突がどこ で起こったかを知らせます
指示しない限りそこに残り続けます
これは、作業コピーから格納された変更はその枝に新しいリビジョンを加えますが
幹と他の枝には影響を及ぼさないということ
コマンド `status' を使う ことができます
その出力で、`Sticky tag' という名前の場所を探してください
それは現在の作業ファイルに、もし枝があれば
それを教える CVS の方法です
WorkingFile は Repository からの Copy にすぎないから
同一ディレクトリに ブランチが異なるファイルがあっても OK
( Build するときはエラーになるけど )
cvs update -r ver_alpha bun.el
Message: Sticky Tag: (none)
+-----+ +-----+ +-----+ +-----+ +-----+
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
+-----+ +-----+ +-----+ +-----+ +-----+
零で終わる全ての枝番号 (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
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
cd $CVSROOT
mv project/foo.cpp,v project/bar.cpp,v
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 にある次のファイルを消す
EX
登録しないファイルの指定(cvsignore)
DESC
"cvsignore" というファイルに 無視する パターンを記述
Directory 単位かな ?
*.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 : 読み込み専用にする.