From: Akinori MUSHA Date: 2000-12-28T08:52:56+09:00 Subject: [ruby-dev:11887] How to CVSup  CVSupd も動き出しています。使い方をだーっと書いてみました。 * * *  CVSup とは、 CVS レポジトリの追っかけをするときに便利な、 CVS よりもずっと効率よくソースやレポジトリ自体を同期できる ツールです。CVS と違い commit はできませんし、手元で変更が 入ったファイルまたはレポジトリにマスターの変更をマージする 機能もありません。純粋なミラーリングのためのツールと言えます。 CVSup Home Page: http://www.polstra.com/projects/freeware/CVSup/ cvsup(1) manpage: http://www.FreeBSD.org/cgi/man.cgi?query=cvsup&apropos=0&sektion=1&manpath=FreeBSD+Ports&format=html ちなみに、 CVS レポジトリだけでなく、普通のディレクトリの 同期にも使えます。  さて、まずは CVSup クライアントをインストールしないことには 始まりません。Linux や *BSD をお使いの方は、ディストリビュータ からパッケージが用意されていると思いますのでそれをインストール してください。 # 残念ながら Windows 版はないようです。(Modula-3 の処理系から # 移植する必要がある)  ここでいくつか CVSup の用語を解説します。 * collection CVSup がファイルを持ってくる最小単位。CVS レポジトリの モジュール(ディレクトリ)一つあるいは複数をまとめたもの。 * prefix ダウンロードしたものの置き場所(ディレクトリ)。この prefix ディレクトリの中に、各モジュール名のディレクトリが作られ、 ダウンロードされる。 * base ダウンロードしたものに関する情報の置き場所(ディレクトリ)。 この base ディレクトリの下に sup というディレクトリが 作られ、その中に各 collection 名のディレクトリが作られ、 その中に collection に含まれる各ファイルの情報が保存 される。CVSup はそれらの情報を使うことで、二回目以降の 同期をより高速に行うことができる。(高速化に関しては、 rsync と同じアルゴリズムを使用する等、他にもいろいろな 技術が使われている) * supfile CVSup にどの CVSup server からどの collection (に含まれる モジュール)のどのバージョン(ブランチ、タグ、日付で指定)を 持ってくるか、それとも collection に含まれるモジュール群の レポジトリをまるごと持ってくるのか、等を指定するファイル。 (sup というのは CVSup 以前に使われていた SUP (software update protocol/progarm) というプロトコル/ツールの名前の 名残)  では、 supfile の例を見てみます。 ----ここから---- # 各行の書式は collection-name [option[=value] ...] # # ひとつの supfile で複数の collection を指定することも可能。 # 特別なcollection名 "*default" は、それ以降のオプションの # デフォルト値を設定する。 # compress: データを圧縮してやりとりする # delete: 不要なファイルを削除する # (CVSup の知らない--ユーザが独自に作成した--ファイルを # 勝手に削除することはない) # use-rel-suffix: なにか神秘的なおまじない:) cf. cvsup(1) *default compress delete use-rel-suffix # host: CVSupサーバ *default host=cvs.ruby-lang.org # base: CVSupの base ディレクトリ *default base=/usr/local/src # release: release名 (CVS レポジトリには cvs、CVS レポジトリでない # ものには current を指定) *default release=cvs # prefix: 転送先ディレクトリの prefix *default prefix=/usr/local/src # tag: CVSのタグ名 # `.' (ピリオドひとつ) は「メイン(HEAD)ブランチの先頭」を表す # date: 日付 (GMT) # yyyy.mm.dd.hh.mm.ss (月は 0-11 で指定) # ruby コレクションの ruby_1_6 ブランチの最新ソース ruby tag=ruby_1_6 # ruby コレクションの 2000/12/25 12:34:56 GMT の時点のソース #ruby date=2000.11.25.12.34.56 # # tag/date を指定しないとレポジトリ全体を持ってくる # # レポジトリを持ってくる場合、 prefix を base より一段深くして # レポジトリのディレクトリに sup ディレクトリが入らないように # した方がいい *default base=/home/ruby *default prefix=/home/ruby/cvs # cvs-ruby-all は CVSROOT も含んだコレクション cvs-ruby ----ここまで----  つまり、レポジトリが欲しいときは *default compress delete use-rel-suffix *default host=cvs.ruby-lang.org *default base=/home/ruby *default release=cvs *default prefix=/home/ruby/cvs cvs-ruby というものを用意すればいいということです。/home/ruby/cvs を作って おくのを忘れずに。  ということで supfile ができたら、分かりやすいように cvs-ruby.sup などと 好きな名前で保存し、 $ cvsup -gL2 cvs-ruby.sup とすると同期が始まります。-g を付けないと同期中の統計情報なども 出る GUI 版が立ち上がります。(つまり cron から実行するときは -g が 必須)  -L2 は出力メッセージの詳細度の指定です。2 が適当と思います。  さらに -s を付けると、各ファイルがローカルで変更や削除されて いないかのチェックが省略され、純粋に base 以下に保存された情報 だけを元に同期するため、二回目以降に使うとすごい速さで同期が完了 します。  ただし、何らかの理由: - cvsup 中にサーバまたはクライアントがリブートした - 予期せぬタイミングでのネットワークエラー - ハード不良 ;) で制御情報がおかしくなったりファイルが破損してしまうこともあるので、 cron に登録する場合、たとえば一日一回というスケジューリングなら、 月曜から土曜は -s 付き、日曜は -s なし、というようにしておくと安全 です。  また、一回だけ特定のバージョンを取り寄せて作業して終わり、という 場合はいいですが、特にレポジトリを持ってくる場合、持ってきた レポジトリはリードオンリー(commit 等はしない)で使いましょう。 ローカルで commit しても、次の同期で単純にマスターのファイルで 上書きされてしまいます。  ローカルミラーの賢い使い方は、マスターとの使い分けにあります。 例としてローカルレポジトリを /home/cvs, マスターを master:/home/cvs とすると、 $ alias lcvs='cvs -d /home/cvs' # 普段はローカルを使う $ alias rcvs='cvs -d master:/home/cvs' # マスターを使うための alias $ lcvs co modulex # ローカルから checkout $ cd modulex [..作業..] $ lcvs diff # ローカルで自分の変更箇所を確認 [..作業..] $ rcvs -n update # マスターに他の誰かが commit したか確認 $ rcvs diff # されていた場合、マスターとの差分を調べる $ rcvs update # マスターとマージする [..作業..] [この間に CVSup でローカルレポジトリがマスターに同期されたと仮定] $ lcvs diff # 変更を確認 [..作業..] $ rcvs -n update # commit 前にマスターの状況を確認 $ rcvs commit # マスターに commit のような感じで作業すれば、マスターに対するアクセスを減らすことが でき能率が大きく向上します。  作業中にローカルがマスターよりも古すぎるとやりづらいですが、 cvsup -s は軽く、サーバおよびクライアントマシンに大して負荷が かからないので、短い間隔(毎時とか)で動かしても大丈夫です。  さらに、ここでは割愛しますが、 CVSupd を走らせると、上位サーバ からミラーしながらクライアントを受け付けることができるので、 LAN 内の何人(台)かのマシンでミラーレポジトリを利用したい場合は、 ローカルに一台 CVSupd を立てるとハッピーになれます。(大本の サーバの負荷も減る)  このような手法によって、 FreeBSD などの多くのユーザを抱えた プロジェクトでは、 CVSupd ミラーサーバを各地に階層的に配置し、 committer もアクティブな人はローカルにミラーレポジトリを置いて 作業することで、世界でただ一台しかないマスターレポジトリサーバの 負荷をうまく分散しています。 * * *  さて、今のところ cvs.ruby-lang.org の CVSupd で用意されている collection は ruby (ruby のみ・ソースの同期用) cvs-ruby (CVSROOT と ruby・レポジトリの同期用) だけです。ruby-man* などについては、 cvs.ruby-lang.org にコピー してくだされば今夜にでも collection を用意できます。  なお、 www は cvs.netlab.co.jp にあったものと cvs.ruby-lang.org に あったものの間にコンフリクトがあった(両方それぞれ同じファイルの同じ リビジョンに commit されていたりする)ので、今夜にでも私がマージして みます。なので www に対する commit はそれまで控えてください。  ruby については、今 /var/anoncvs/cvsroot/ruby にあるものが完全な マスターです。どんどん commit していただいてまったく構いません。 他のレポジトリに誤って commit したりすると、またマージしないと いけなくなってしまいます。くれぐれも、 /var/anoncvs/cvsroot/ruby から checkout したものについて commit するよう気を付けてください。  それではまた。 -- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp "We're only at home when we're on the run, on the wing, on the fly"