このページは MultipleCommitters の翻訳です。

複数人のコミッター認める方法

伝統的なCVS的なやりかたでは複数のユーザが1つのメインのリポジトリにコミットすることを認めます。まあCVSではそうするしかないのですが。

しかしMercurialではある意味ではそういった 'メインの' リポジトリは存在しません。各開発者が自分のリポジトリを持ち、それにコミットし、他のユーザのリポジトリから変更を引っ張ってきます。これはCVSの方式とは根本的に異なる方法であり、多くの利点があります。

当然、公開されたリポジトリへpushすることで変更点を公開することもできます。

しかし、(あまりお勧めはしませんが)単一のリポジトリへ複数のユーザがpushするように設定することもできます。こうすればMercurialをCVS方式で使うことができます。以下にいくつかのやりかたを書きます。

SSHで共有アカウントを使う方法

SSHでアクセスできるようにするには、プロジェクト専用のアカウントを作り、そのアカウントでリポジトリを作り、各ユーザがSSH鍵対でそのアカウントを使えるようにするのが一般的です。詳しい設定は[:JapaneseSharedSSH: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経由のアクセスをすることができます。 上の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で引っ張ってきた変更をマージし忘れているのでしょう。

[:SyncEarlySyncOften:同期を頻繁に取る]よう心掛けてください。