CVS, WinCVSについてのメモ

1999-10-20 戀塚昭彦
1999-11-2更新
1999-12-12更新
2001-04-26 リンク切れをいくつか修正
2002-03-25,28 トラブルシューティングなどに追加
2005-03-22 リンク切れをいくつか修正

もくじ


CVSの用語・命令

repositry(リポジトリ) - サーバ上で全履歴を格納する場所

module(モジュール) - リポジトリ内のディレクトリをこう呼ぶ。

tag(タグ) - あるファイル集団に対して串刺しで設定する名前。二種類の用途がある。第一には、複数のファイルからなるプロジェクトの一区切りごとにタグを名づけておけば、あとからそれぞれの時点の全ファイルを取り出して確認したりするのに使える。第二には、ブランチタグという、ブランチを識別する名前を付ける。sticky参照

作業ディレクトリ - ローカルで作業するためのコピーを展開する場所。このディレクトリの中にCVSというディレクトリが作られ、その中に管理情報(取り出した元のリポジトリの場所、および各ファイルの取り出したときのリビジョンなど)が入る。この作業ディレクトリに対する修正情報は、すべて(commitするまでは)この管理情報内で完結するため、いらなくなったら単に作業ディレクトリごと消しても大丈夫。また、複数の作業ディレクトリに同じものを展開することもできる。

sticky(スティッキー) - 作業ディレクトリ内の管理情報の記述によって、指定したバージョンより新しい更新が登録がされていても取ってこないように設定する。古いバージョンを指定して取り出したときなどに設定される(まちがってupdateして上書きされてしまわないように)。現在の最新版を取ってくるためには、stickyを取り除く必要がある。また、ブランチタグを指定した場合は、そのbranchの最新版を追うことができる。

branch(ブランチ、枝) - バージョン更新ツリーを分岐させたもの。安定ツリーと先進ツリーに分けたりするのに使う。識別するために、開始点にブランチタグを作成する必要がある。ブランチタグをsticky指定することで、どのbranchを追うかを指定できる。

trunk(トランク、幹) - モジュールを作成したときに必ず最初から存在し、デフォルトで利用される履歴。HEADブランチとも言う。

 

import(インポート) - 指定ディレクトリにあるファイル群をまるごとをリポジトリにモジュールとして登録する。ただしCVS管理ファイルは作られないため、このディレクトリ自体はそのままではCVSに管理させることはできない。簡単な手順としては、importしたらこのディレクトリ自体を消すかリネームし、checkoutしなおしてから作業する。

checkout(チェックアウト) - リポジトリからツリー丸ごと作業ディレクトリにコピーしてくる。同時に、CVSディレクトリを作成し、その中に管理ファイルを作成する。作業ディレクトリ用のコマンドはすべてこの管理ファイルが存在しないと動作しない。<VSSでいうチェックアウトとは違う>

commit(コミット) - 作業ディレクトリに対する変更をリポジトリに送り込む。具体的には、すべてのファイルを比較し、違いがあれば差分情報を送り込み、また管理ファイル(CVS/Entries)に削除指定などがあればそれもリポジトリに反映させる。なお、自分が編集のために取り出したバージョンよりも後に他人がすでに同じファイルを変更してcommitしてしまっていた状況の場合、パッチが必要などと表示されてcommitが行われない場合があるが、そのときはupdateすることによって混ぜることができる。

update(アップデート) - 前回updateまたはcheckoutしてからリポジトリ上で行われた変更を取り込み、作業ディレクトリと管理情報に反映する。作業ディレクトリ上でなにか変更してあっても、衝突(同じ位置に対する異なる変更)が生じない限り自動的に混ぜてくれる。衝突が生じた場合、該当ファイルの衝突部分は <<<<,----, >>>> というような行で囲んで両方の内容が併記されるので、手で修正してからcommitすること。

merge(マージ) - 作業ディレクトリにある内容に対して、リポジトリ上の任意の区間で行われた変化内容を反映させること。updateコマンドで区間指定をすることで行う。

remove(削除) - 作業ディレクトリ以下の管理ファイルに対して、指定ファイルをリポジトリ上、最新リビジョンとしてファイルが存在しない状態にするよう設定する。(次回のcommitによってリポジトリに実際に反映させる)

add(追加) - 作業ディレクトリ内にある[CVS管理されていない]ファイルを任意に指定して、CVS管理ファイルに情報登録する。(次回のcommitによってリポジトリ内にファイルが新規追加される)

release(解放) - 作業ディレクトリが要らなくなったときにこれを使えばCVS管理下のファイルを消すことができる。全部管理下なのならこれを使わずとも全部消すのもいい(ただしその前にeditは解除しておくこと)。

edit(編集)/unedit(編集取り消し) - 編集開始するときは、他の人に伝える目的でeditコマンドで宣言するのがいい(Editorsコマンドで現在edit中の人を一覧できる)。編集をやめて元にもどすときはunedit、編集結果を送り込むにはcommitを使う。

watch(監視) - 特定のモジュールやファイルに対してadd watch設定すると、他の人がeditやcommitするごとにcvsからメールが送られてくるようになる。


VSSとCVSの違い

操作 Microsoft VSS CVS
サーバから最初に取り出す チェックアウト(ファイル単位) Checkout module(モジュール全体)
ファイルの編集を開始する チェックアウト Edit(必須ではない)
編集結果をサーバに送る チェックイン Commit
ディレクトリ(ファイル群)をサーバに新規に追加する

プロジェクトの作成後、チェックイン

すぐにチェックインしたファイルを同じ場所でチェックアウトして編集できる

あらかじめ構成ファイルを全部用意したあと、Import

このままではCVS管理ディレクトリが作られていないため、Importしたファイルが存在しないディレクトリにCheckoutしてから編集することになる

ファイルを新規に追加する チェックイン AddしたあとCommit
サーバ上の最新ファイルを得る 最新バージョンの取得 Update
管理情報の所在 サーバのみ(常に通信が発生) Checkout時にコピーをCVSディレクトリに作成し、変更はそこに対してのみ行う。Commitによってサーバに送信する

 

特徴 VSS CVS
ライセンス クライアント一つごとにライセンス購入が必要 ライセンスに支払いは不要
ネットワーク接続 リモートドライブ共有(128kbps程度では全く使い物にならない) pserver:TCP接続(低速でも十分使える)
またはrsh/ssh, リモートドライブ共有
サーバOS Windows系ドライブ公開

pserver, ssh/rsh: UNIXまたはそれに類するOS群

ドライブ共有: ドライブ共有が可能であれば可

クライアントOS Windows系 ほとんどなんでもあり
統合環境との連携

Visual Studioと強く連携する

なし
GUIのツリーの表示 サーバ上のツリー(チェックアウトしていなくても、すべてのツリーが見える)

WinCVS: ローカルのディレクトリツリー内に、チェックアウトされたモジュールならバージョン情報などを合成表示する
(チェックアウトしていないモジュールは見えない)

複数サーバー利用 データベースを開くコマンドで切り替える CVSディレクトリにチェックアウト手段(サーバー)が記録されているため、チェックアウトされたファイルに対するアクションは自動的に対応するサーバと通信する
アクセス権の管理 VSSアドミニストレータで設定する サーバ上のファイルシステムレベルで設定する
複数人による開発

通常は編集する人がロックし、解除するまで他者は編集できない。

取り出したファイルを編集した場合、その変更は必ず登録するか破棄しなければならない。

複数人が編集できるようにすることもできるが、その場合の競合解決はGUIでその場で解決が要求される。不便。

ロックしないで、複数人が同時に編集できる。

作業ディレクトリ上で前回取り出してからファイルに変更を行っている状態でリポジトリからupdateすると、自動的にマージされる。そのときに同じ場所に異なる変更が発生していた場合(競合)、両方を記号で区切って収め、修正が要求される。

修正結果はcommitしなければならないということはない。手元でのみちょっといじった版にして、その変更を残したままリポジトリを追いかけ続けることができる。

変更結果をリポジトリにcommitするためには、手元の元リビジョンとサーバの最新リビジョンが一致している必要がある。これは updateコマンドによって一致する。

 


管理メモ


トラブルシューティング/Tips

CVS, WinCVSで失敗したときの対策集にしたいな。

・ファイルを間違ってremoveしてしまったので、リポジトリから取り出しなおしたい(commit前)

 消すつもりはないのに、間違ってremoveコマンドを行ってしまったとします。WinCVS上では破れた紙マークで残骸が表示され、updateなど、何をやっても拒否されます。こういうときは、commitは絶対しちゃいけません。

 対処としては、そのディレクトリのCVS/Entriesというファイルをテキストエディタで開き、該当ファイル名のある行をただ削除しましょう。WinCVSは起動したままでokです。このファイルをセーブするだけで、即座にWinCVS側の表示も更新され、破れた紙マークの残骸がなくなります(NTの場合)。そうしたらあとは(存在しないファイルは作成する指定つきで)updateをかければリポジトリから取得しなおすことができます。

・ファイルを間違ってaddしてしまったのを取り消したい(commit前)

 CVS/Entriesから該当行を消すだけで取り消せます。

・ファイルを間違ってaddしてしまったのを取り消したい(commit後)

 すぐに remove コマンドを実行すればサーバ上にほとんど見えない状態で残るくらいですが、どうしてもというならサーバのリポジトリ上で該当ファイルを消すしかありません。

・ブランチを間違って作ってしまったので取り消したい

 該当するコマンドはありません。無理やりリポジトリを手修正するか、可能ならばリポジトリをバックアップから復元しましょう。タグだったらコマンドで消せるんですが。

・ディレクトリ(モジュール)名をリネームしたい

 サーバ上でリポジトリ内のディレクトリ名を直接変更してしまえば変更になります。ただし履歴は取られないため、過去のリビジョンのファイルを取り出したときに、古いディレクトリ名を参照している場合に引っかかります。できることなら変更をしないのが望ましいっすね。

・ファイルやモジュールを違うディレクトリに移動したい

 サーバ上のリポジトリで移動してしまえば、次に cvs updateすれば作業ディレクトリに反映されますが、上とで同じ履歴が取られない問題があります。通常は新しい場所にコピーをaddし、古い場所からremoveして、履歴コメントにその旨書き残すのが無難でしょう。ただしこれでは移動前の履歴が分断してしまいます。

・あるブランチ内で作成したファイルを、他のブランチにも持って来たい

 まずモジュールの移動先のブランチを取得し、ファイルが増えているブランチからモジュール自体をマージ指定でupdateすれば追加ファイルが丸ごと現れます。あとはcommitすれば定着できます。

・あるブランチ内で作成したディレクトリ(=モジュール)を、他のブランチにも持って来たい

 WinCVSでは、ディレクトリが現れるはずの親ディレクトリ自体を、(更新タブ)「リポジトリにあってローカルに存在しないディレクトリを作成」をチェックし、(共通設定タブ)「空のディレクトリを削除」のチェックを解除してupdateすれば空のディレクトリが現れます。中身も持って来たい場合は、ここで前記のようにマージすれば現れます。最後にcommitで定着させます。先ほどのupdateのときに欲しいディレクトリ以外も出来てしまった場合は、空のまま「空のディレクトリを削除」をチェックしてupdateすれば全部消えます。

・空のディレクトリを登録したい

 空のディレクトリをCVSに追加しても、updateときに消えてしまう。これは空にしないことによって回避すべきです(オプションで空のディレクトリも展開できるが、これをやると他の消えて欲しいディレクトリまで現れてしまいます)。ダミーで置くファイルとして良いのは、.cvsignore というファイル名のテキストファイルです(ファイル名の頭にピリオドがついていることに注意)。これはCVSで管理したくないファイル名パターンを一行づつ並べておくもので、WinCVS上でもこれに従ってファイル一覧表示から除去されます。CVSにとって空として存在させたいディレクトリならば書ける内容もあることでしょう。

・モジュールを削除したい

 モジュール内のすべてのファイルを remove することで削除したことになります。履歴を残す上ではこれ以上の消し方はありません。履歴も残さず消したいのなら、リポジトリ上でディレクトリを抹消するだけですが…。

・Microsoft Office(2002)の文書をCVSで管理したい

 Office 2002はXML形式で保存できます。これはUTF-8文字セットによるテキストファイルなので、cvsでテキストベース管理できます。ただし頭にプレビューイメージが入ってしまうみたいで結構容量食いますが。それでもバイナリのときは毎回全部格納されるので、それよりはかなりマシです。あとまあ、UTF-8に対応したdiffツールとかが無いと差分確認もつらいですが。


とりあえず重要なサイト

バージョン管理システム CVS を使う (日本語)
http://www-vox.dj.kit.ac.jp/nishi/cvs/cvs.html -> 移転 http://radiofly.to/nishi/cvs/

CVS Japan (日本語)
http://www.aqut.homeip.net/cvsjp/ -> http://sourceforge.jp/projects/cvs-jp/

CVSのはなし (日本語)
http://cvs.m17n.org/cvs/

CVS Home (CVS official site)
http://www.cvshome.org/

Concurrent Versions System CVS (CVS FAQ) (日本語)
http://www.naney.org/comp/cvs/link/index.html

Gembook.jp - WinCVS 1.2 ごった煮版インストーラあり。
http://www.gembook.jp/tsum/page.pys

ExamDiff - VSS風のファイル比較。WinCVSのPreferencesで外部diffに登録するとGraph画面でのdiff表示で使えるヨ!
http://www.prestosoft.com/ps.asp?page=edp_examdiff