このページは MultipleCommitters の翻訳です。
複数人のコミッター認める方法
伝統的なCVS的なやりかたでは複数のユーザが1つのメインのリポジトリにコミットすることを認めます。まあCVSではそうするしかないのですが。
しかしMercurialではある意味ではそういった 'メインの' リポジトリは存在しません。各開発者が自分のリポジトリを持ち、それにコミットし、他のユーザのリポジトリから変更を引っ張ってきます。これはCVSの方式とは根本的に異なる方法であり、多くの利点があります。
- 差分を引っ張ってきてマージする前に差分のレビューを簡単にできる
- マージの順番やタイミングを自由に変えられる(テストやデプロイに便利)
- アクセス制御のような概念が必要なくなる
- ロックによる待ち時間が必要なくなる
当然、公開されたリポジトリへpushすることで変更点を公開することもできます。
しかし、(あまりお勧めはしませんが)単一のリポジトリへ複数のユーザがpushするように設定することもできます。こうすればMercurialをCVS方式で使うことができます。以下にいくつかのやりかたを書きます。
SSHで共有アカウントを使う方法
SSHでアクセスできるようにするには、プロジェクト専用のアカウントを作り、そのアカウントでリポジトリを作り、各ユーザがSSH鍵対でそのアカウントを使えるようにするのが一般的です。詳しい設定はSSHで共有アカウントを使うを見てください。
HTTPSを使う
CGIを使ってpushもできるようにできます。認証等はウェブサーバのものを使います。詳しくはHgWebDirStepByStepを見てください。
ファイルシステムのパーミッションを利用する
利用者が特定のグループに属し、リポジトリがそのグループに属するようにする方法です。
以下のやりかたは *nix OS で使えます。
まずは新しいグループを/etc/groupに追加します。システムごとに「正しい」追加のしかたは異なりますが、結局は/etc/groupに以下のような行を追加することになります。
project-x:x:100001:alice,bob,charlie
次にこのグループから書き込めるリポジトリを作ります。
mkdir /home/mercurial/project-x cd /home/mercurial/project-x hg init chgrp project-x .hg .hg/* chmod g+w .hg .hg/* chmod g+s .hg .hg/data
chgrpコマンドでこのプロジェクトが project-x に属しているという印を付けます。最初のchmodでリポジトリのデータをそのグループから書き込めるようにします。最後に二番目のchmodで 'setgid' ビットをディレクトリに立てます。こうすることでこのリポジトリ内で作られたファイルが利用者のデフォルトのグループではなくproject-xグループに属するようになります。
次に、各利用者はumaskを002か何かにしてください。もし022などにしておくと、新しくファイルが作られたときにそのファイルのグループ書き込み権がなくなるるため、他の利用者がそのファイルを変更できなくなります。
訳注: redhat Linuxなどのように、各ユーザごとにグループを作り、それをデフォルトグループにするようなシステムを使っている場合はこの通りにすれば良いでしょう。システム上のユーザが共通のグループに属するようにしている場合は、umaskを常時002にすると都合が悪いので、以下のようなスクリプトを作って利用するのが良いかもしれません。
$ cat /usr/local/bin/hg-push #!/bin/sh umask 002 hg push "$@"
あとは、以下のようにします。
hg clone /home/mercurial/project-x cd project-x [make changes] hg commit hg push /home/mercurial/project-x
SSHでユーザごとのアカウントを利用する(訳者による追加)
小規模なプロジェクトで、サーバに各利用者のアカウントがある場合、上の節に書かれたのと同様にファイルパーミッションを設定することで、SSH経由のアクセスをすることができます。
まずはサーバにMercurialをインストールし、各ユーザがSSHでリモートコマンドを実行できるように設定してください。 サーバはhg.example.comで参照できることとします。あとはサーバ上で
cd /mercurial hg init project-x chgrp project-x .hg .hg/* chmod g+w .hg .hg/* chmod g+s .hg .hg/data
としリポジトリを作りパーミッションを調整し、 クライアント側で
hg pull ssh://hg.example.com//mercuial/project-x/ [make changes] hg push ssh://hg.example.com//mercuial/project-x/
として変更点をリポジトリに反映します。
上のumaskの問題も同様に生じるため、umaskを002にできない場合はサーバ上に以下のようななラッパスクリプトを作ってそちらを使うようにしたほうが良いでしょう。
$ cat /usr/local/bin/hg-wrap #!/bin/sh umask 002 hg "$@"
さらに.hg/hgrcに以下のように書くとhg pushを呼ぶたびに --remotecmd を指定する必要がなくなります。
[ui] remotecmd = /usr/local/bin/hg-wrap
同期し続ける
pushしたとき時には以下のようなエラーが生じるかもしれません。
abort: unsynced remote changes!
こうなったときは、pushする前にpullするべきです。
abort: push creates new remote branches!
これはきっと、pushしようとした変更とpullで引っ張ってきた変更をマージし忘れているのでしょう。
同期を頻繁に取るよう心掛けてください。