CVSメモ。主にCVSを使っていて、嵌ってしまったところや一般的な使用方法の個人用メモなど。
CVS自体の使い方は、下記が今のところ一番安定しているドキュメントか?
http://www.linkclub.or.jp/~tumibito/soft-an/cvs/cvs-man/
バージョン管理システムと言えば、直観的で分かりやすいUIを備えているMSのVisualSourceSafe(VSS)しか会社で使ったことが無かった。しかしUNIX/Linuxでのソースコード管理と言えば CVS と言うことで、実は2003年(*1)の時点から勉強はしていた。
・・・が、どうにも感覚が掴めないのが多く、中々使いこなせなかった。ようやく、頭の中で主要なCVSの概念が焦点を結んだので、そのあたりをメモしておく。
特に断りがない場合、"CVS"と表記するとUNIX/Linux/CygwinのCVSツール全般のこととする。
CVSは カレントディレクトリ指向 のツールである、と思う。どういう事かというと、
$ cd /your/foo/bar/ $ cvs (cvsコマンド)
とすると、"/your/foo/bar" ディレクトリに対していろいろ操作する。 コマンドライン引数として、「操作対象のディレクトリ」を持たない。 さらに言うと、CVSの管理対象としてもっとも上位の単位になる「リポジトリ」であるが、これも環境変数CVSROOTで指定するようになっており、コマンドラインからは指定できない。(*2)
カレントディレクトリを対象とするとして、ではどうやってリポジトリ位置やモジュール名を判別しているのか?それが、"CVS"ディレクトリであり、この中のRepositryやらRootやらを勝手に探索して勝手に判断してくれているだけである。
これを肌で知っていないと、 importで思いっきり嵌る。
importは、 カレントディレクトリの中身 を指定されたモジュール名で登録するコマンドということ。
モジュール名 というのもイヤラシイ用語だが、要はCVSROOTで指定したディレクトリの直下のディレクトリと考えて構わない。 CVSROOT というのにもかなり振り回された。
例えば、リポジトリを作成するコマンドをみてみる。
$ cvs -d /your/cvs/repositry init
これを実行すると、
/your/cvs/repositry/ CVSROOT/
という具合になる。CVSROOTがある。・・・が、 環境変数 CVSROOT で指定するのは"/your/cvs/repositry"までなのだ。
何度、「"CVSROOT"だから".../repositry/CVSROOT"まで指定するんだ」と間違えたかことか!!
間違えてはいけない。 リポジトリの下にある"CVSROOT"は単なるモジュールである。
/your/cvs/repositry/ : こちらがCVSROOT環境変数に使用する「リポジトリ」の位置 CVSROOT/ : これはCVSROOTという名前のモジュール
CVSROOTモジュールは、META-INFとかにした方が紛らわしくなくて良いのでは?とか思うが、ようするにそういった扱いのモジュールなのだ。リポジトリ全体の設定を行う為、これはこれで、CheckOut/CheckInのできるモジュールとして管理できるようになっている、というわけである。
環境変数としてのCVSROOTには何種類か書き方があるが、現在、実際に利用されているのは次の二種類だろう。
CVSROOT=/your/cvs/repositry (これは CVSROOT=:local:/your/cvs/repositry と同義) CVSROOT=:ext:user@cvs.sourceforge.net:/cvsroot/yourproject
このように、リポジトリの位置はあくまでもCVSROOTで決まる。・・・にしても、つくづく紛らわしい。
$ CVSROOT=:ext:user@cvs.sourceforge.net:/cvsroot/yourproject $ cvs co CVSROOT
とかやられた日には、何がなんだか分からなくなる・・・というか、分からなかった。
CVSNTはともかく、Linux/Unix系であればCVSはSSH越しが一般的な使用方法だろう。ここも嵌りやすい。特にWindowsだと、SSHのクライアントとして PuTTY や Cygwin のSSHなど幾つかあるからだ。
重要な点は、CVSコマンドとSSH通信のレイヤーは完全に分離されている 点である。
元々CVSはリモートサーバにログインしてCVSを叩く、RSHが使えた。これが、CVS_RSHという環境変数の由来。詰まるところ、リモートログインできるシェルアプリであれば、PuTTYであろうとCygwinのsshであろうと何だって良いのだ。共有鍵を作るのも、これまた何で作ろうと構わない。TeraTerm(+TTSSH)で作成した公開鍵を、PuTTYの鍵作成ツールでPuTTY用に変換しても良い。あるいは最初からCygwinのOpenSSHで作成しても構わない。
特に自由度が高いのは、CygwinでインストールしたCVSを利用するとき。OpenSSH(Cygwin)とPuTTYを入れていれば、
CVS_RSH=ssh
でも、
CVS_RSH="/cygwin/c/Program Files/PuTTY/plink.exe"
でも、どちらでも構わないのだ。
で、嵌りやすいのがCVS_RSHで指定したツールで 初めて接続するとき 。大概、サーバー側からの公開鍵を受け付けるか聞かれるプロンプトが表示される。なので、理想的にはCVS_RSHで指定したツールで前もってCVSサーバに、普通にログイン・ログアウトしておくこと。こうしておけば、その時にサーバの公開鍵が登録されるので、CVS側で接続したときに正体不明のプロンプトらしき文字列に悩まされることはない。
様々な書籍やWeb上のリンクが豊富にある為、基本的な利用法は特に書かない。
リポジトリの位置はあくまでもCVSROOT環境変数ので決まる。これ、.bash_profileとかに書くと、複数のリポジトリを併用する場合煩わしい。
他のシーンでも自分がよく使っている手として、setenv.shというのを作成しておき、切り替えて使う、というのをメモしておく。以下の様なsetenv.shを、ローカルにcheck outしたディレクトリの一つ上とかに作成しておき、切り替えられるようにしておく。あるいは setenv_(project名).shとかにしておいても良い。
#!/bin/sh unset CVSROOT CVSROOT=:ext:user@your.cvs.server:/your/cvs/repositry
例えば、/your/work/dir 以下で、server1 と server2 のそれぞれのリポジトリのモジュールで作業しているとき、次の様なディレクトリレイアウトを整えておく。
/your/work/dir/ setenv_server1.sh setenv_server2.sh server1/ moduleA/ CVS/ ... server2/ moduleB/ CVS/ ... ---------------------------------- [setenv_server1.sh] #!/bin/sh unset CVSROOT CVSROOT=:ext:user@server1:/your/cvs/repositry ---------------------------------- [setenv_server2.sh] #!/bin/sh unset CVSROOT CVSROOT=:ext:user@server2:/your/cvs/repositry
で、実際に使うときはsetenv_serverX.shを取り込む。
$ cd /your/work/dir $ . setenv_server1.sh $ cd server1/ $ cvs co moduleA $ cd moduleA/ $ cvs update
で、server2のリポジトリに対して作業したい場合は、別のターミナルなりを立ち上げて、
$ . setenv_server2.sh
とすれば良い。