Mercurial ~ ひと通り(チームで)

前置き

ここでは、定番のワークフローの中から、チーム開発(複数のリポジトリを使った開発)で行う作業について、ひと通り解説します。

例として、ひと通り(個人で)で使ったサンプルプロジェクト(proj1)を引き続き使います。Linux上に置いたproj1に加えて、Windowsマシン上に別のリポジトリを作ります。

本文

サーバ

マシン間でリポジトリを分散管理するためには、どれか1つをサーバにする必要があります。また、他のマシンからサーバのリポジトリに対して更新をかけるために、設定ファイルの修正が必要です。ここでは、Linuxの方をサーバにしましょう。

設定ファイル~/.hgrcに以下のセクションとエントリを追加します。

[web]
push_ssl = False
allow_push = *

こうすると、誰からの更新要求でも受け付けるようになります(セキュリティ上、問題ありですが…)。

では、サーバを起動しましょう。

~/sandbox/proj1 $ LC_ALL=en_US hg serve -p 8080 -d   # 8080番ポートでサーバを実行。

サーバがUTF-8のメッセージを出力するとWindows側で文字化けしてしまうので、一時的に、ロケールをen_USに変更しています。また、-dオプションを付けてバックグラウンドで動作するようにしています。

プロトコルはhttpなので、例えばLinuxマシンのIPアドレスが192.168.1.1だった場合、ブラウザでhttp://192.168.1.1:8080/を開くと、リポジトリのログなどを見ることができます。

クローン化

Windowsマシン側にproj1のクローンを作ります。

D:\tmp\sandbox>hg clone http://192.168.1.1:8080/ proj1.win
requesting all changes
adding changesets
adding manifests
adding file changes
added 11 changesets with 11 changes to 5 files
updating to branch default
3 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\tmp\sandbox>cd proj1.win

D:\tmp\sandbox\proj1.win>dir /b
.hg
.hgtags
foo
sub

D:\tmp\sandbox\proj1.win>hg ll           # llは、.hgrcに登録したalias。
10[tip]   2f178affaf0d   2011-04-19 18:47 +0900   maru
  Added tag VERSION1.0 for changeset 50f3095c9a73

9[VERSION1.0]   50f3095c9a73   2011-04-19 18:46 +0900   maru
  remove barrr

8   b63d3a430609   2011-04-19 18:44 +0900   maru
  edit barrr(d)

チーム開発(Windows側)

Windows側でproj1の開発を進めます。

D:\tmp\sandbox\proj1.win>type foo
a
b
c
d

D:\tmp\sandbox\proj1.win>echo e >>foo

D:\tmp\sandbox\proj1.win>hg com -m "edit foo(e)"

D:\tmp\sandbox\proj1.win>hg ll
11[tip]   016115e9b7a7   2011-04-19 21:45 +0900   maru
  edit foo(e)

10   2f178affaf0d   2011-04-19 18:47 +0900   maru
  Added tag VERSION1.0 for changeset 50f3095c9a73

9[VERSION1.0]   50f3095c9a73   2011-04-19 18:46 +0900   maru
  remove barrr

サーバ側を更新

Windows側の開発成果をLinux側へ反映しましょう。

D:\tmp\sandbox\proj1.win>hg out              # サーバへ更新すべき差分があるかどうかをチェック。
comparing with http://192.168.1.1:8080/
searching for changes
changeset:   11:016115e9b7a7
tag:         tip
user:        maru
date:        Tue Apr 19 21:45:49 2011 +0900
summary:     edit foo(e)

D:\tmp\sandbox\proj1.win>hg push             # サーバへ更新。
pushing to http://192.168.1.1:8080/
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

これで、Windows側のリポジトリとLinux(サーバ)側のリポジトリとが同期しました。

~/sandbox/proj1 $ hg ll
11[tip]   016115e9b7a7   2011-04-19 21:45 +0900   maru
  edit foo(e)

10   2f178affaf0d   2011-04-19 18:47 +0900   maru
  Added tag VERSION1.0 for changeset 50f3095c9a73

9[VERSION1.0]   50f3095c9a73   2011-04-19 18:46 +0900   maru
  remove barrr

~/sandbox/proj1 $ hg parents     # 親は変わってない。
チェンジセット:   10:2f178affaf0d
ユーザ:           maru
日付:             Tue Apr 19 18:47:13 2011 +0900
要約:             Added tag VERSION1.0 for changeset 50f3095c9a73

pushするとサーバ側のリポジトリが更新されますが、サーバ側の作業ディレクトリは変更されません。よって、Linux側の親はR10のままです。

push

チーム開発(Linux側)

今度は、Linux側でproj1の開発を進めます。

~/sandbox/proj1 $ hg update               # 親をティップに変更。
ファイル状態: 更新数 1、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1 $ cat foo
a
b
c
d
e
~/sandbox/proj1 $ echo f >>foo
~/sandbox/proj1 $ hg com -m "edit foo(f)"
~/sandbox/proj1 $ hg ll
12[tip]   7bd4095568fb   2011-04-19 22:21 +0900   maru
  edit foo(f)

11   016115e9b7a7   2011-04-19 21:45 +0900   maru
  edit foo(e)

10   2f178affaf0d   2011-04-19 18:47 +0900   maru
  Added tag VERSION1.0 for changeset 50f3095c9a73

サーバから最新を取得

Linux側の開発成果をWindows側へ取り込みましょう。

D:\tmp\sandbox\proj1.win>hg in               # サーバから取り込むべき差分があるかどうかチェック。
comparing with http://192.168.1.1:8080/
searching for changes
changeset:   12:7bd4095568fb
tag:         tip
user:        maru
date:        Tue Apr 19 22:21:04 2011 +0900
summary:     edit foo(f)


D:\tmp\sandbox\proj1.win>hg pull             # サーバから取り込む。
pulling from http://192.168.1.1:8080/
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)

pull

競合とマージ

Linux側とWindows側で同時に開発が進められている場合、pushやpullのときに競合が発生する可能性があります。この場合は、マージが必要です(マージに関しては、別の記事ブランチでも取り上げます)。

まず、Linux側とWindows側でfooを変更しておきます。

~/sandbox/proj1 $ hg update
ファイル状態: 更新数 0、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1 $ cat foo
a
b
c
d
e
f
~/sandbox/proj1 $ echo linux >>foo
~/sandbox/proj1 $ hg com -m "edit foo(linux)"
D:\tmp\sandbox\proj1.win>hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\tmp\sandbox\proj1.win>type foo
a
b
c
d
e
f

D:\tmp\sandbox\proj1.win>echo win >>foo

D:\tmp\sandbox\proj1.win>hg com -m "edit foo(win)"

では、Windows側からLinux側へpushしてみましょう。

D:\tmp\sandbox\proj1.win>hg out
comparing with http://192.168.1.1:8080/
searching for changes
changeset:   13:1940bb6b0950
tag:         tip
user:        maru
date:        Tue Apr 19 22:33:44 2011 +0900
summary:     edit foo(win)


D:\tmp\sandbox\proj1.win>hg push
pushing to http://192.168.1.1:8080/
searching for changes
abort: push creates new remote heads on branch 'default'!
(you should pull and merge or use push -f to force)

「pushするとリモート側にヘッドが増える」と怒られてしまいました。ヘッドが増えるというのは、ブランチが増えることと同じです。ブランチを増やすようなpushは認められないので「pull&mergeするか、-fオプション付きのpushを使え」と言っています。しかし、-f付きのpushは禁断の力技なのでやめておきましょう。

というわけで、先にLinux側の変更をWindows側へpullします。

D:\tmp\sandbox\proj1.win>hg in
comparing with http://192.168.1.1:8080/
searching for changes
changeset:   14:d65260c6cc7e
tag:         tip
parent:      12:7bd4095568fb
user:        maru
date:        Tue Apr 19 22:34:27 2011 +0900
summary:     edit foo(linux)


D:\tmp\sandbox\proj1.win>hg pull
pulling from http://192.168.1.1:8080/
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

D:\tmp\sandbox\proj1.win>hg heads             # pullによってヘッドが増えた。
changeset:   14:d65260c6cc7e
tag:         tip
parent:      12:7bd4095568fb
user:        maru
date:        Tue Apr 19 22:34:27 2011 +0900
summary:     edit foo(linux)

changeset:   13:1940bb6b0950
user:        maru
date:        Tue Apr 19 22:33:44 2011 +0900
summary:     edit foo(win)

D:\tmp\sandbox\proj1.win>hg parent            # 作業ディレクトリの親はR13
changeset:   13:1940bb6b0950
user:        maru
date:        Tue Apr 19 22:33:44 2011 +0900
summary:     edit foo(win)

ヘッドが増えました(pullの場合はヘッドが増えても許されます)。

pull_conflict

次に、2つのヘッドをマージします。

D:\tmp\sandbox\proj1.win>hg merge
merging foo
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

fooに対する変更が競合しているので、自動マージができません。こんな場合はマージツールが起動して、手動マージを促されます(マージツールに関する情報は、あらかじめ設定ファイル.hgrcに書いておく必要があります)。ここでは、fooの内容を以下のようにマージしました。

D:\tmp\sandbox\proj1.win>type foo
a
b
c
d
e
f
win
linux

コミットしておきます。

D:\tmp\sandbox\proj1.win>hg sta
M foo

D:\tmp\sandbox\proj1.win>hg com -m "merge foo(win) and foo(linux)"

D:\tmp\sandbox\proj1.win>hg ll
15[tip]:13,14   22c3628734ce   2011-04-19 22:56 +0900   maru
  merge foo(win) and foo(linux)

14:12   d65260c6cc7e   2011-04-19 22:34 +0900   maru
  edit foo(linux)

13   1940bb6b0950   2011-04-19 22:33 +0900   maru
  edit foo(win)

D:\tmp\sandbox\proj1.win>hg heads          # ヘッドが1つになった。
changeset:   15:22c3628734ce
tag:         tip
parent:      13:1940bb6b0950
parent:      14:d65260c6cc7e
user:        maru
date:        Tue Apr 19 22:56:05 2011 +0900
summary:     merge foo(win) and foo(linux)

conflict_sorted

これで、ようやくWindows側からpushできるようになりました。

D:\tmp\sandbox\proj1.win>hg out
comparing with http://192.168.1.1:8080/
searching for changes
changeset:   13:1940bb6b0950
user:        maru
date:        Tue Apr 19 22:33:44 2011 +0900
summary:     edit foo(win)

changeset:   15:22c3628734ce
tag:         tip
parent:      13:1940bb6b0950
parent:      14:d65260c6cc7e
user:        maru
date:        Tue Apr 19 22:56:05 2011 +0900
summary:     merge foo(win) and foo(linux)


D:\tmp\sandbox\proj1.win>hg push
pushing to http://192.168.1.1:8080/
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 2 changesets with 2 changes to 1 files

無事、両者のリポジトリが同期しました。Windows側でmergeしている間にLinux側でさらに開発が進んでしまうと、再度mergeするハメになります。mergeすると決めたら、迅速に終わらせましょう。

Last modified:2011/04/19 23:01:01
Keyword(s):
References:[Mercurial(分散SCM)]
This page is frozen.