今回は、
「リリース」における成果混交の問題 
「一度だけリリースしてしまえば、
- 製品の出荷
 - 本リリース前の試用版の提供
 - 個別カスタマイズ版の提供
 - 障害修正版の提供
 - 開発期間途中での中間納品
 
こういった
- ベースとなる版の決定
 - 固有の成果物の作成
 - 継続的な保守
 
しかし、
一方、
共有リポジトリの立ち上げ
「メイン開発」
「メイン開発」
- リポジトリはメンバーで共有可能なUNIX系サーバ上で運用
(以下"host")  - 開発用にプロジェクトアカウントを用意
(以下"proj")  - "~proj"配下にリポジトリを作成
(以下"~proj/ hgrepo/ dev")  - メンバーはsshでリポジトリにアクセス
 
共有サーバの用意や、
リポジトリ~proj/
proj@host% mkdir -p ~/hgrepo/dev proj@host% cd ~/hgrepo/dev proj@host% hg init proj@host%
各メンバーのsshによるアクセスに関しては、
- 専用グループを作成
(以下"proj")  - "proj"アカウントのプライマリグループは"proj"
 - "~proj"配下はグループ書き込み可能に
 - メンバーを"proj"グループに所属
 - メンバーは自身のアカウントでsshログイン
 
しかし、
- umask設定による書き込み権限のマスク:
 「プロジェクト遂行以外の用途でのサーバアクセスは無い」 と断言できる場合は別ですが、 メンバーの個人設定はumaskが022、 即ち 「自分以外の書き込み禁止」 以上の強度に設定するのが一般的です。 しかし、
その設定で共有リポジトリに書き込みを行った場合、 別なメンバーは同じファイルに対して書き込みができなくなってしまいます。 - NFS併用時のグループ所属上限:
 NFSを併用する環境では、
ユーザが16以上のグループに属する場合に、 権限判定が適切に行われません。 これはNFSプロトコル仕様上の制約であるため、
実行時に設定ファイル記述等で回避できる類のものではありません。 
以上の理由から、
sshアクセスの準備が整ったなら、
@client% hg clone ssh://proj@host/hgrepo/dev.... .... @client%
自身のアカウント
ssh://myaccount@host//home/proj/hgrepo/dev
上記例では"~proj"の絶対パスを"/home/
"hg clone"が失敗する場合、
ssh proj@host hg help
実行結果により、
- "hg help"実行が成功:
 - リポジトリの位置指定が間違っているか、
リポジトリ (あるいはそこに至るディレクトリ) のアクセス権限設定が不適切である可能性が考えられます。  - "hg help"実行が失敗:
 hgコマンドにPATHが通っていないか、
PYTHONPATH設定が不適切でMercurialのモジュールがロードできない可能性が考えられます。 対話的なログイン時と、
非対話的なログインでは、 読み込まれる設定ファイルが異なる場合がありますので、 sshでenvコマンドを実行することで、 環境変数設定を確認してみてください。 - sshの実行そのものが失敗:
 - 各自の環境のssh設定を見直してください。
 
以上で共有リポジトリの立ち上げは完了です。
"hg clone"に対するのと同じように対象リポジトリを指定することで、
「リリース作業」用リポジトリの分離 
それではいよいよ
「リリース作業」
- 運用するサーバは
「メイン開発」 用と同じ ("host")  - アカウントは
「メイン開発」 用と同じ ("proj")  - "~proj"配下にリポジトリを作成
(以下"~proj/ hgrepo/release")  - メンバーはsshでリポジトリにアクセス
 - ベースとする版のチェンジセットハッシュ値は"123456789abc"
 
1~4までは、
「リリース作業」
proj@host% cd ~/hgrepo/releasse proj@host% hg pull -r 123456789abc ~/hgrepo/dev .... proj@host%
以上で、
後は、
"~proj/
隔離度合いの強化
先の説明で例示した
通常はこれでも十分だと思われますが、
たとえば、
proj@host% mkdir -p ~/hgrepo/123456789abc proj@host% cd ~/hgrepo/123456789abc proj@host% hg pull -r 123456789abc ~/hgrepo/dev .... proj@host%
他にも以下のような隔離方法が考えられます。
- 「リリース作業」
リポジトリ運用の専用アカウントを新設する  - 「リリース作業」
リポジトリを別のサーバで運用する  
「リリース」後の成果の統合 
「リリース」
とは言うものの、
- 「リリース作業」
リポジトリから最新の成果を"hg pull"  - 「メイン開発」
リポジトリから最新成果を"hg pull"  - マージを実施
 - マージ結果を
「メイン開発」 リポジトリに"hg push"  
以上で終わりです。どうです、
なお、
もっとも、
% hg push xxxxxx pushing to xxxxxx searching for changes abort: push creates new remote heads! (did you forget to merge? use push -f to force) %