CVSの導入

Red Hat Linux 7.3にインストールされているCVSを使って、リポジトリの作成と管理、 WindowsXPのPCからの遠隔アクセスを行う手順のメモです。


CVSの導入メリット

  1. 最新版をセンター管理することで、成果物の散逸を防ぐことができます。
  2. センター管理することで、複数人による共同開発の際のバージョンの衝突や、先祖がえりなど、 プログラム開発の初歩的なミスを防止することができます。
  3. 履歴管理を自動化します。 いつ誰がどんな変更を加えたかは累積的に記録され、後で一覧することができます。
  4. プログラムや開発資料のバックアップに使えます。 変更を行う際に、念のためバックアップをローカルPC上に取っておく、 といった作業を解消します。


CVSリポジトリの作成とモジュール登録

 以下の作業は全てRed Hat Linux 7.3上で行ったものです。

  1. リポジトリを作成します。ルートとなるディレクトリは自由に決めます。

    cd /usr/local/share
    mkdir cvsroot
    cvs -d /usr/local/share/cvsroot init
    

    CVSROOTというディレクトリが作られます。
  2. 以後リポジトリを固定する場合は、利用ユーザのログインシェルで、 環境変数CVSROOTに設定しておきます。

    export CVSROOT=/usr/local/share/cvsroot
    

  3. モジュールを作って登録(インポート)してみます。 ここではモジュール名「cvsmemo」 ベンダータグ「uranom」 リリースタグ「cvsmemo_0_1」 とします。ベンダータグ、リリースタグはとりあえず、適当につけても問題ないです。
  4. インポート元ですが、空のディレクトリでもよいですし、 初期文書の入ったディレクトリでもよいです。またそのパスはどこでもOKです。 ここでは ~/cvsmemo というディレクトリを作り、 その中に初期文書としてファイルを1つだけ、cvsmemo.txtというのを作ったとします。
  5. 次のコマンドでインポートできます。

    cd ~/work/cvswork/cvsmemo
    cvs import -m "Module Import Test" cvsmemo uranom cvsmemo_0_1
    

    ここで重大な注意! cvs importコマンドを使うときには、インポート元のディレクトリの中に入って 作業する必要があります。 その上のディレクトリで実行するとドツボにはまるので要注意です。 "No Conflicts created by this import" とメッセージが出ればOKです。
    なお、インポート元が初期文書としてバイナリファイルを含む場合、 それらをバイナリと認識させるにはオプション(-W)の指定が必要ですが、 ややこしいです。そこで私はバイナリファイルを含むモジュールを登録する場合、 後述のWinCVSを使ってWindows環境からインポートするようにしています。 WinCVSを使えばバイナリと思われる拡張子のファイルを一覧で事前警告してくれるので、 間違いが少ないと思います。
  6. このインポート元のディレクトリは不要なので、とりあえず改名して退避します。 後でチェックアウトが正常にできたら、削除してしまって構いません。

    mv cvsmemo cvsmemo_back
    

  7. 次にCVSで文書編集の作業を開始するために、チェックアウトしてみます。 このときは、利用ユーザのホームディレクトリ内に、作業用ディレクトリをどこか作って、 その下に各モジュールをチェックアウトするとよいでしょう。 これは強制ではないので、モジュールによって作業ディレクトリをいくつか切り替えることも可能です。 ここでは、~/work/cvsworkの下に各モジュールをチェックアウトすると仮定します。

    cd ~/work/cvswork
    cvs checkout cvsmemo
    

    作られたモジュールのディレクトリ内には、CVSというディレクトリが増えているのが確認できます。 つまり cvsmemo/cvsmemo.txtの他に、cvsmemo/CVS というディレクトリがあるはずです。 この中には管理ファイルが置かれているので、触らないようにします。
  8. cvsmemo.txtを編集し、更新を保存(=コミット)してみます。

    cd ~/work/cvswork/cvsmemo
    cvs commit cvsmemo.txt
    

    cvs commitコマンドでは、1つ以上のファイルやディレクトリを指定できます。 ファイルやディレクトリの指定を省略すると、カレントディレクトリ以下を再帰的に調べて、 変更が加わっているファイルを全て更新します。
    また-mオプションで更新コメントを指定しないと、環境変数CVSEDITOR (CVSEDITORが未設定ならばEDITOR)で指定しているエディタが起動し、コメントの入力を求められます。 このコメントは更新ログとして記録されるので、 できればちゃんとした文章を書きます。 日本語のコメントを書く際には、エディタの文字コードに注意します。 今回の環境では、日本語EUCに統一することにしました。 なおWindows環境のGUIクライアントであるWinCVSの日本語対応「ごった煮」版には、 更新ログの文字コードを自動的に日本語EUCにする機能があるので、 日本語EUCに統一してもWindows環境で困る、ということはないと思います。
  9. 新規のファイルを追加する際には、ファイルを作っていきなりcommitしても認識されません。 まず、cvs addコマンドを実行します。

    cvs add newfile.txt
    cvs commit newfile.txt
    

    ディレクトリの場合は、cvs addだけでリポジトリに反映されるので、 commitする必要はありません。 また、バイナリファイルの場合はaddの後ろに-kbオプションをつけることでバイナリと認識させます。
  10. cvs updateコマンドは、 CVSリポジトリの内容が更新されていたら、 それをダウンロードし、ローカルの作業ディレクトリに反映します。

    cvs update
    

    ディレクトリが追加されているとき、それをローカルに取得するには-dオプションをつけます。 常に-dをつけても問題ないでしょう。
  11. 状態の確認と履歴の確認を行うには、次のようなコマンド群があります。

    cvs status
    cvs annotate
    cvs history
    cvs log cvsmemo.txt
    

    どのコマンドも、ファイルやディレクトリを指定する事も、省略する事もできます。 省略すると、カレントディレクトリの全ファイルが対象になります。
  12. 今作業中のファイルと最後のコミットとの比較をするには、 cvs diffコマンドを使います。

    cvs diff cvsmemo.txt
    

    cvs diffコマンドは強力で、過去のある時点やあるバージョンのファイルと作業中のファイルを比較したり、 過去の複数の版同士の内容を比較したりすることもできます。


pserverでリモートPCから使えるようにする

  1. 管理ファイル(CVSROOTディレクトリ内にあるファイル)を編集するために、CVSROOTをcheckoutします。

    cd ~/work/cvswork
    cvs checkout CVSROOT
    

    ./CVSROOT/configをエディタで編集。次の部分を変更します。

    SystemAuth=no
    

    これで、pserverパスワードにユーザがいなかった場合に、 OSのパスワード(/etc/passwd)で認証を試みるのをやめさせることができます。 編集できたらコミットします。

    cvs commit config
    

  2. 次にpasswdファイルを作ります。このファイルは初期状態ではCVSROOT内に存在しないので、addします。 passwdファイルを作る方法ですが、 CVSには暗号化ツールは用意されていないので、 暗号化ツールをどこからかもって来る必要があります。 一番簡単なのは、Apache Web Serverに含まれるhtpasswdツールを使うことでしょう。 ここでは、ユーザ「uranocvs」だけを登録しています。 このユーザは、OSのアカウントに登録されていても、いなくても構いません。

    cd ~/work/cvswork/CVSROOT
    /usr/local/apache2/bin/htpasswd -c passwd uranocvs
    New Password: ******
    Retype Password: ******
    cvs add passwd
    cvs commit passwd
    

    ここで、ユーザ(ここではuranocvs)がOSに存在しない場合は、 最後に:OSアカウントとして、OS上で代理となるアカウントを指定します。

    uranocvs:XXXXXXXXXXX:urano
    

    これでuranocvsはOSアカウントuranoとしてサーバ上では活動することになります。
    なお、これでリポジトリにはpasswd,vというファイルはできますが、 passwdというファイルはできません。 これを追加するために、今度はcheckoutlistファイルを編集します。 デフォルトではコメントしか書かれていませんが、最後に 'passwd'という行(管理ファイルのエントリ)を追加してcommitします。 これで、passwdというファイルがリポジトリに作られているはずです。
  3. /etc/servicesに次の2行を追加(RHL 7.3では最初から書かれています)

    cvspserver	2401/tcp
    cvspserver	2401/udp
    

  4. /etc/xinetd.d/cvspserverを次のように作ります。

    service cvspserver
    {
    	disable	= no
    	port	= 2401
    	socket_type	= stream
    	protocol	= tcp
    	user		= urano
    	wait		= no
    	only_from	= 127.0.0.1 192.168.0.0
    	server		= /usr/bin/cvs
    	server_args	= -f --allow-root=/usr/local/share/cvsroot pserver
    }
    

  5. xinetdを再起動します。

    cd /etc/init.d
    ./xinetd restart
    

  6. ローカルホストでtelnetを使って、接続を試します。

    telnet localhost 2401
    

    ... bad auth protocol start:と出て終了したら一応OKです。
  7. ここで、RetHat Linuxの場合は、ipchainsファイアウォールの働きによって、 リモートPCからのポート2401への接続が許可されない設定になっているので、 /etc/sysconfig/ipchainsを編集して、2401を開ける必要があります。

    :input ACCEPT
    :forward ACCEPT
    :output ACCEPT
    ...(略)
    -A input -s 0/0 -d 0/0 2401 -p tcp -y -j ACCEPT
    -A input -s 0/0 -d 0/0 2401 -p udp    -j ACCEPT
    ...
    

    これでリモートPCから接続を試すことができます。 リモートPCとしてWindowsXPを使い、その上で動くWinCVSで接続を確認する手順は、 別のページでご説明します。


不要になったモジュールを削除するには

CVSにはモジュールを削除するコマンドというものはありません。 作業としては、

  1. 単にリポジトリから消す。
  2. CVSROOT/historyとCVSROOT/val-tagsファイルの中に、 このモジュールに関する記述があったら削除する。(オプション)
これだけです。

Misc. Topics Top

(first uploaded 2004/09/26 last updated (not ever), URANO398)

Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!