[CVS超入門]
要するに、他から持ってきたプログラムを改造しまくっているが、 そろそろバージョン管理しないと収拾つかなくなってきた、という事例。
大抵の場合、すでにいじくり倒したブツが入っているディレクトリ がありますね? とりあえず projectY/ と しときましょう。
まだRCS化もしてないとします。 RCSからの移行は別途。
$Id: cvs-lmod.html,v 2.4 2017-10-05 21:18:18+09 kabe Exp $
まず別のところに projectY のオリジナルを展開します。 んでオリジナルの ディレクトリに入り込んで (basename `pwd` == projectY)
% cvs -d ~/cvsroot import projectY VENDOR RELEASE_Xおもむろにエディタが起動しますが、要するに RCS の初回登録と 同じです。適当に入力してエディタを修了すれば オリジナル版がリポジトリに登録されます。
マニュアルとかでは "repository" "vendor-tag" "release-tags" としか書かれてないからわけわからん。
repositoryで指定したものが、 あとで cvs checkout で指定する「モジュール名」や 作業用に掘られるディレクトリ名として使われていくので、 ここに細かいバージョン番号が入ったもの (projectY-2.5.3とか)は 使い勝手が悪くなるのでおすすめしません。 細かいバージョン番号は release-tagsで指定すべし。
タグ名のつけ方には特に構造はなく、人間が勝手に決めます。 VERSION_1_0 でも version-1-0 でも CVS にとっては単なる 文字列なので、プロジェクト内(もしくは俺様脳内)でなんらかの 合意をしておくこと。
一人称がリポジトリ側なので import なんですねぇ。 export コマンドは「リポジトリから配布用に取り出す」です。
俺様がいじくる枝が幹 (X.X) として使えるように、です。
将来、ベンダから別のリリースが出たとき、
別の版番がつけられるように、です。
VENDORで索けば最新版を指すようになります。
ベンダリリース | タグ | RCS版番 |
---|---|---|
X-1.0 | RELEASE_X | 1.1.1.1 |
X-1.1 | RELEASE_X_1_1 | 1.1.1.2 |
(最新版) | VENDOR | 1.1.1.x |
cvs import ... -kb とすれば、 $Id ... $ などのキーワードは置換されずにそのままになります。 実際は、リポジトリへの登録は常にオリジナルのままで行われている (RCSも同じ)ので、 次の checkout や update でのキーワード置換を抑制せよ、という 「ひっつきオプション」(sticky option)がつきます。
% ident Makefile.in Makefile.in: $Id: cvs-lmod.html,v 2.4 2017-10-05 21:18:18+09 kabe Exp $ % cvs stat Makefile.in =================================================================== File: Makefile.in Status: Up-to-date Working revision: 1.1.1.1 Fri Jun 14 19:39:25 2002 Repository revision: 1.1.1.1 /usr/local/src/wnn/cvsroot/FreeWnn/Makefile.in,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: -kbベンタ枝は常に 1.1.1.X なので、-kb つけても 実際には既存の RCS版番は拾われるわけではなく、 単に以後の $Id$ キーワード置換が行われなくなる だけなのですが (∴あまり役に立たない)
とりあえず気が済んだら、オリジナルは不要なので消します。
確認してみましょ。ls -lR ~/cvsroot/projectY の中身が詰まっていることで 納得すればそれでもいいですが、明示的に取り出してみましょう。 安全のため新しくディレクトリを掘って、その中で
% cvs -d ~/cvsroot checkout projectY cvs checkout: Updating projectY U ...../projectY/ が生成されれば成功です。 消すときはとりあえず rm -fr projectY でいいです。
まあまあ。実は大きな問題があって、今あなたが保有している 修正ソースツリーは 「作業領域」(working directory) として 認知されていないので、CVS関係のコマンドが使えんのです。 (cvs import は数少ない例外。) 具体的には各ディレクトリに CVS/ がない。
マージ作業は「まっとう」な方法がないらしく、 しょうがないので力業です。…
これで新しい projectY/ が作業領域として使えるようになりました。
だから今までの修正ツリーをCVS化したわけではなく、 新しい CVS 作業領域に今までのツリーをコピっただけです。 もちろん逆手順も可能ですが、間違えると被害が大きい。
確認:新しい projectY/ に入り込んで
% cvs -n update cvs update: Updating . ....とすれば、オリジナルから変更されているファイルには 頭に 'M' がついて一覧が出ます。
-n
は「何もいじるな」オプション。
作業領域の中であれば
リポジトリの位置は CVS/ 以下に記憶されているので、
いちいち -d ~/cvsroot をつける必要はありません。
その前に、 cvs -n update で、頭に '?' がついているファイルがあれば 始末をつけておきます。
'?'がつくファイルは、リポジトリ中にはない未認知ファイルを 表します。単なる一時ファイルとかであれば無視していいですが、 今後必要なファイルであれば cvs add filename で登録します。
% cvs add new_file cvs add: scheduling file `new_file' for addition cvs add: use `cvs commit' to add this file permanentlyディレクトリを追加している場合も同様に cvs add new_dir しますが、 このコマンドは再帰しないので、中身のファイルも同様にいちいち cvs add します。
この段階で cvs diff を使えば、一網打尽 diff が取れるので、 更新ログの文句を考えておくこと。 cvs diff -u なんかも使用可能。
いよいよ本登録を cvs commit で行います。 やっぱりエディタが起動するので、書けるのであれば 更新ログを書き連ねておきます。
% cvs commit ((エディタ起動中)) Checking in new_file; /....../cvsroot/projectY/new_file,v <-- new_file ...
しばらくいじくりまわしてみて、何とかなりそうだと思ったら、 以前まで使っていた俺様ディレクトリを廃棄して現行の作業領域と入れ替えます。 どこかで cvs checkout projectY として、必要なものが全部出てくれば完全です。