Chapter 2
A tour of Mercurial: the basics
2.1 Installing Mercurial on your system
一般的な全ての OS 向けに、ビルド済みの Mercurial バイナリ版が提供されています。バイナリ版を使用することで、簡単に
Mercurial をセットアップすることができます。
2.1.1 Linux
Linux ディストリビューションは、それぞれ固有のパッケージ管理ツール、パッケージ作成方針、ならびに開発ペースを持っていますので、全てのバイナリ版
Mercurial のインストール手順に関する包括的な説明を行うのは困難です。また、バイナリ版のインストールによって利用可能な
Mercurial のバージョンは、当該ディストリビューションのパッケージ保守担当者が、どの程度活発であるかによって異なります。
簡便化のため、著名な Linux ディストリビューションにおける、コマンドラインを用いた Mercurial のインストールに限定して説明します。殆どのディストリビューションでは、
mercurial という名前のパッケージを探したならば、クリックひとつで
Mercurial がインストールできるような、グラフィカルなパッケージ管理ツールが提供されています。
-
Debian
-
1 apt-get install mercurial
-
Fedora Core
-
-
Gentoo
-
-
OpenSUSE
-
-
Ubuntu
- Ubuntu の Mercurial パッケージは非常に古いので、使用すべきではありません。できれば、 Debian パッケージをリビルドしてインストールしてください。おそらく
Mercurial をソースからビルドする方が簡単でしょう。その場合の詳細は、A.1 節を参照してください。
2.1.2 Mac OS X
Mac OS X 向けの Mercurial インストーラは、 Lee Cantey によってhttp://mercurial.berkwood.com で公開されています。この
パッケージは、 Intel および Power の両 Mac で動作します。このインストーラを使用する前に、 Universal MacPython [BI]と互換性
のある Python をインストールする必要があります。 Lee 氏のサイトにある手順を踏めば、簡単にインストールできま
す。
2.1.3 Solaris
未校。 XXX
2.1.4 Windows
Windows 向けの Mercurial インストーラは、 Lee Cantey によってhttp://mercurial.berkwood.com で公開されています。この
パッケージは他のパッケージへの依存性がありませんので、単独で利用できます。
備考: 基底状態の Windows 版 Mercurial は、 Windows と Unix の改行形式の自動変
換は行いません。 Unix 利用者と変更成果を共有したい場合は、少々追加設定を行う必
要があります。詳細未校 XXX。
2.2 Getting started
Mercurial を使い始めるにあたり、実際に利用可能な Mercurial コマンドのバージョンを確認するため、“hg version” コマンドを
使ってみましょう。実際のバージョン情報にはそれほど重要性はありませんが、何も表示されない場合は対処が必要で
す。
1 $ hg version
2 Mercurial Distributed SCM (version 1.3)
3
4 Copyright (C) 2005-2009 Matt Mackall <mpm@selenic.com> and others
5 This is free software; see the source for copying conditions. There is NO
6 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2.2.1 Built-in help
Mercurial は組み込みヘルプ機能を持っています。この機能は、コマンドの実行方法を思い出せない場合に有用です。何をして良いのか
完全にわからなくなってしまった場合は、単に“hg help” を実行することで、それぞれがどのような機能を持っているかの説明が付い
た、簡単なコマンド一覧が表示されます。以下に示すような形式で、特定のコマンドについて“hg help” を実行した場合、そのコマン
ドに関する詳細な情報が表示されます。
1 $ hg help init
2 hg init [-e CMD] [--remotecmd CMD] [DEST]
3
4 create a new repository in the given directory
5
6 Initialize a new repository in the given directory. If the given
7 directory does not exist, it will be created.
8
9 If no directory is given, the current directory is used.
10
11 It is possible to specify an ssh:// URL as the destination.
12 See ’hg help urls’ for more information.
13
14 options:
15
16 -e --ssh specify ssh command to use
17 --remotecmd specify hg command to run on the remote side
18
19 use "hg -v help init" to show global options
更に多くの詳細な(通常は必要としない)情報を表示するには、“hg help -v” を実行します。-v オプションは--verbose の省
略形で、通常よりも多くの情報を Mercurial に表示させます。
2.3 Working with a repository
Mercurial では、全てがリポジトリに閉じています。例えば、あるプロジェクトのために作成したリポジトリには、プロジェクトに “属
する” 全てのファイルだけでなく、ファイルに関する履歴情報も格納されています。
リポジトリはファイルシステム上にある只のディレクトリツリーですので、 Mercurial が特別扱いするということ以外には、通常の
ディレクトリやファイルと比較して特に変わっている点はありません。コマンド行やファイルブラウザを利用して、任意の時点で改名や
削除することができます。
2.3.1 Making a local copy of a repository
リポジトリの複製は、少々特別です。通常のディレクトリ複製のコマンドでもリポジトリを複製できますが、 Mercurial 組み込みの複
製コマンドを使用した方が良いでしょ。このコマンドは、既存のリポジトリと同一の複製を生成するため、“hg clone” と呼ばれていま
す。
1 $ hg clone http://hg.serpentine.com/tutorial/hello
2 destination directory: hello
3 requesting all changes
4 adding changesets
5 adding manifests
6 adding file changes
7 added 5 changesets with 5 changes to 2 files
8 updating working directory
9 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
チュートリアル用のリポジトリからの複製に成功したなら、ローカルファイルシステム上にhello という名前のディレクトリがある
筈です。このディレクトリにはファイルが幾つか格納されていることでしょう。 This directory will contain some
files.
1 $ ls -l
2 total 4
3 drwxr-xr-x 3 vmuser vmuser 4096 Jul 20 21:59 hello
4 $ ls hello
5 Makefile hello.c
これらのファイルは、複製元になったリポジトリにおけるファイルと、全く同じ内容と履歴情報を持っています。
全ての Mercurial リポジトリは、機能提供に必要なものを全て格納しているため、それ自体で完結している、独立した存在です。リ
ポジトリには、プロジェクトに属するファイルの私的な複製と履歴情報が格納されます。複製されたリポジトリは、複製元となったリポ
ジトリの位置を記憶していますが、特に明示的な指示をしない限り、複製元リポジトリとの連携(および、それ以外のリポジトリとの連
携も)は行われません。
それぞれのリポジトリは、他のリポジトリに影響を及ぼすことの無い、私的な “箱庭” と言えますから、自身のリポジトリで自由に
実験ができるわけです。
2.3.2 What’s in a repository?
リポジトリ内部を仔細に見てみると、.hg という名前のディレクトリがあることに気が付くことでしょう。このディレクトリは、
Mercurial がリポジトリのメタデータを格納しているディレクトリです。
1 $ cd hello
2 $ ls -a
3 . .. .hg Makefile hello.c
.hg およびその配下のディレクトリの内容は、 Mercurial が私的に使用するものです。リポジトリにおけるそれ以外のディレクト
リ・ファイルは、自由に利用して構いません。
用語の定義をするにあたり、.hg ディレクトリを “本当の” リポジトリとするなら、それと共存する他のファイル・ディレクトリは
作業領域ディレクトリにあるもの、と呼ばれます。両者の区分を簡単に言うなら、リポジトリがプロジェクトの履歴を保持する一方
で、作業領域ディレクトリは、履歴上のとある時点におけるプロジェクトのスナップショットを保持する、と言えま
す。
2.4 A tour through history
馴染みの無い新しいリポジトリに対しては、まずはその履歴を参照してみようと思うことでしょう。“hg log” コマンドは、履歴情報を
出力します。
1 $ hg log
2 changeset: 4:2278160e78d4
3 tag: tip
4 user: Bryan O’Sullivan <bos@serpentine.com>
5 date: Sat Aug 16 22:16:53 2008 +0200
6 summary: Trim comments.
7
8 changeset: 3:0272e0d5a517
9 user: Bryan O’Sullivan <bos@serpentine.com>
10 date: Sat Aug 16 22:08:02 2008 +0200
11 summary: Get make to generate the final binary from a .o file.
12
13 changeset: 2:fef857204a0c
14 user: Bryan O’Sullivan <bos@serpentine.com>
15 date: Sat Aug 16 22:05:04 2008 +0200
16 summary: Introduce a typo into hello.c.
17
18 changeset: 1:82e55d328c8c
19 user: mpm@selenic.com
20 date: Fri Aug 26 01:21:28 2005 -0700
21 summary: Create a makefile
22
23 changeset: 0:0a04b987be5a
24 user: mpm@selenic.com
25 date: Fri Aug 26 01:20:50 2005 -0700
26 summary: Create a standard "hello, world" program
27
このコマンドの基底動作では、プロジェクトに加えられた個々の変更の記録に対して簡単な出力を行います。 Mercurial の用語
では、複数のファイルに対する変更を保持し得ることから、記録されたこれらの出来事をチェンジセットと呼称しま
す。
“hg log” の出力形式における各欄は、以下のようになっています。
-
changeset
- この欄は、 10 進数、コロン(colon: :)および 16 進数の連続形式となっています。2つの数値は共にチェンジ
セットの識別子です。 16 進数のものよりも、 10 進数の方が短く、入力が容易であることから、2つの識別氏が存在し
ます。
-
user
- チェンジセットの作成者に関する識別情報です。この欄は自由形式ですが、殆どの場合、人名と電子メールアドレスが
格納されます。
-
date
- チェンジセットが作成された日時と、そのタイムゾーンです(日時は当該タイムゾーンにおける値ですので、チェンジ
セットの作成者にとっての日時を表します)。
-
summary
- チェンジセット作成者が、作成の際にチェンジセットの説明として入力したメッセージの最初の行です。
基底動作における“hg log” の出力は、単純な要約ですので、多くの詳細データが欠けています。
図 2.4 は、履歴の “動向” を把握し易くするために、hello リポジトリにおける履歴を図示したものです。本章および以降の章にお
いて、何度かこの図に立ち返ることになることでしょう。
2.4.1 Changesets, revisions, and talking to other people
英語が不正確さで悪名高い言語であり、計算機科学では用語の混乱はいつものことですので、構成管理の分野では、同じことを表す複数
の用語や言い回しが存在します。 Mercurial での履歴管理について話をする場合、 “チェンジセット” (changeset)という
用語が時には “チェンジ” (change)や(文書の場合は) “cset” などと省略されていたり、チェンジセットという言
い回しが、 “リビジョン” (revision)ないし “rev” を表すものとして使用されたりするのを目にするかもしれませ
ん。
“チェンジセット” の概念をどのような用語で表そうが問題ではありませんが、 “特定のチェンジセット” を指すための識別子は非常
に重要です。“hg log” の出力における changeset 欄が、 10 進数と 16 進数の両方の識別子を使ってチェンジセットを識別してい
る、ということを思い出してください。
-
10 進数の識別子(= リビジョン番号)が、当該リポジトリでのみ有効な値である一方で、
-
16 進数の識別子は、全ての複製リポジトリに渡って、厳密にチェンジセットを識別可能な恒久普遍の識別子です。
この区別は重要です。電子メールで他の人と “リビジョン 33” の話をした場合、相手のリビジョン 33 は、自分の意図するそれとは
高い確率で異なります。これは、リビジョン番号の割り付けが、当該チェンジセットがリポジトリに認識された順序に依存しており、
チェンジセットの認識順序が同一であることを、異なるリポジトリの間では保障できないためです。3つのチェンジセット a,b,c が、
とあるリポジトリでは 0,1,2 の順序で認識される一方で、別なリポジトリでは 1,0,2 の順序で認識される、といったことは容易に起こ
り得ます。
Mercurial がリビジョン番号を使用しているのは、純粋に記述簡略化の利便性のためです。他の人とチェンジセットに関して話をす
る場合や、何らかの理由(例えば、障害報告における記録)によってチェンジセットに関する記録を残す場合は、 16 進数の識別子を使
いましょう。
2.4.2 Viewing specific revisions
“hg log” の出力を単一のリビジョンのものに限定する場合、-r(ないし--rev)オプションを使用します。 10 進数のリビジョン番号
と、 16 進数のチェンジセット識別子のどちらも使用できますし、必要に応じて複数のリビジョンを指定することもできま
す。
1 $ hg log -r 3
2 changeset: 3:0272e0d5a517
3 user: Bryan O’Sullivan <bos@serpentine.com>
4 date: Sat Aug 16 22:08:02 2008 +0200
5 summary: Get make to generate the final binary from a .o file.
6
7 $ hg log -r ff5d7b70a2a9
8 abort: unknown revision ’ff5d7b70a2a9’!
9 $ hg log -r 1 -r 4
10 changeset: 1:82e55d328c8c
11 user: mpm@selenic.com
12 date: Fri Aug 26 01:21:28 2005 -0700
13 summary: Create a makefile
14
15 changeset: 4:2278160e78d4
16 tag: tip
17 user: Bryan O’Sullivan <bos@serpentine.com>
18 date: Sat Aug 16 22:16:53 2008 +0200
19 summary: Trim comments.
20
個別に列挙すること無しに複数のリビジョンの履歴を参照したい場合は、範囲記法を使用します。この記法は、 “a から b の間の全
てのリビジョン” という意図を表現します。
1 $ hg log -r 2:4
2 changeset: 2:fef857204a0c
3 user: Bryan O’Sullivan <bos@serpentine.com>
4 date: Sat Aug 16 22:05:04 2008 +0200
5 summary: Introduce a typo into hello.c.
6
7 changeset: 3:0272e0d5a517
8 user: Bryan O’Sullivan <bos@serpentine.com>
9 date: Sat Aug 16 22:08:02 2008 +0200
10 summary: Get make to generate the final binary from a .o file.
11
12 changeset: 4:2278160e78d4
13 tag: tip
14 user: Bryan O’Sullivan <bos@serpentine.com>
15 date: Sat Aug 16 22:16:53 2008 +0200
16 summary: Trim comments.
17
Mercurial はりビジョンの記述順序に忠実に振舞いますので、“hg log -r 2:4” というコマンド起動が 2,3,4 の順序で表示する一
方、“hg log -r 4:2” というコマンド起動は 4,3,2 の順序で表示します。
2.4.3 More detailed information
目当てのチェンジセットが既に判明している場合は“hg log” が出力する概要情報は有用ですが、あるチェンジセットが目当て
のものか否かを判定しようとする場合には、変更についての完全な説明文や、変更されたファイルの一覧が必要にな
ることでしょう。“hg log” コマンドの-v(ないし--verbose)オプションは、これら追加の詳細情報を表示しま
す。
1 $ hg log -v -r 3
2 changeset: 3:0272e0d5a517
3 user: Bryan O’Sullivan <bos@serpentine.com>
4 date: Sat Aug 16 22:08:02 2008 +0200
5 files: Makefile
6 description:
7 Get make to generate the final binary from a .o file.
8
9
説明文と変更内容の両方を見たい場合は、-p (ないし--patch)オプションを付加してください。このオプションにより、変更内
容が unified diff 形式(これまでに unified diff 形式を見たことが無いのでしたら、12.4 節に概要の説明があります)で出力されま
す。
1 $ hg log -v -p -r 2
2 changeset: 2:fef857204a0c
3 user: Bryan O’Sullivan <bos@serpentine.com>
4 date: Sat Aug 16 22:05:04 2008 +0200
5 files: hello.c
6 description:
7 Introduce a typo into hello.c.
8
9
10 diff -r 82e55d328c8c -r fef857204a0c hello.c
11 --- a/hello.c Fri Aug 26 01:21:28 2005 -0700
12 +++ b/hello.c Sat Aug 16 22:05:04 2008 +0200
13 @@ -11,6 +11,6 @@
14
15 int main(int argc, char **argv)
16 {
17 - printf("hello, world!∖n");
18 + printf("hello, world!∖");
19 return 0;
20 }
21
2.5 All about command options
Mercurial のコマンド探検をここで少々中断して、 Mercurial コマンドの動作パターンについて説明しましょう。本章におけるツアーを
続けるにつれて、このことを覚えておいて良かったと思うことでしょう。
Mercurial は、コマンドに対して指定可能なオプションの取り扱いに関して、近年の Linux および Unix システムに共通のオプショ
ン記述慣習を踏襲した、一貫した素直な扱い方を採用しています。
-
全てのオプションはロングネーム(long name)を持っています。例えば、既に見てきたように、“hg log” コマン
ドは--rev オプションを受け付けます。
-
殆どのオプションがショートネーム(short name)も持っています。--rev オプションの代わりに-r を使用できま
す(ショートネームを持たないオプションがあるのは、それらのオプションが滅多に利用されないためです )。
-
ロングネームオプションは2つのマイナス記号 で
始まります(例: --rev)がショートネームオプションは1つのマイナス記号で始まります(例: -r)。
-
オプションの命名と用法は、コマンド間で一貫性が取られています 。
例えば、チェンジセット識別子やりビジョン番号を指定可能なコマンドは、全て-r および--rev オプションを受理
します。
本書の実行例では、ロングネームオプションの代わりにショートネームオプションを使用します。これは単に筆者の好みというだけ
のことですので、特に気にする必要はありません。
何らかの表示を行うコマンドの多くは、
-v(ないし--verbose)オプションを付与することでより多くの情報の表示を、-q(ないし
--quiet)オプションを付与することで表示を抑止することができます。
2.6 Making and reviewing changes
この時点で、 Mercurial における履歴を把握できていますので、変更の実施や、その検証を行ってみましょう。
まず始めにすべきことは、独自の実験を元々のリポジトリから隔離することです。リポジトリの複製に、先程は“hg clone” を使用
しましたが、この時点での遠隔リポジトリからの複製は必要ありません。既に手元にある複製リポジトリから複製すれば良いのです。
ローカルリポジトリの複製は、ネットワーク越しの複製よりも非常に高速ですし、多くの場合においてディスク領域消費も少なくて済み
ます 。
1 $ cd ..
2 $ hg clone hello my-hello
3 updating working directory
4 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 $ cd my-hello
話は逸れますが、作業に着手しようとした際に、作業用サンドボックスとしての一時的な複製を何時でも作成できますので、遠隔
リポジトリの複製を “まっさらな” 状態で保つように心掛けるのが良いでしょ。こうすることで、複数の作業を平行
に行うことができますし、作業完了後にそれらを統合するまでは、互いの作業を隔離された状態にすることができま
す。ローカルリポジトリの複製は低コストですから、リポジトリの複製および破棄にはオーバヘッドが殆どありませ
ん。
my-hello リポジトリには、典型的な “hello, world” プログラムが格納されたhello.c ファイルがあります。ではここで、いにし
えの sed コマンドを使用して、2行目を出力するように変更してみましょう。(変更のためにsed を使用するのは、単にスクリプトに
よる自動化が簡単であるからです。自動化の必要が無ければ、おそらくsed を使用する必要は無いでしょう。好みのエディタで編集を
してください。)。
1 $ sed -i ’/printf/a∖∖tprintf("hello again!∖∖n");’ hello.c
“hg status” コマンドにより、リポジトリ配下のファイルの状況に関する Mercurial の認識が表示されます。
1 $ ls
2 Makefile hello.c
3 $ hg status
4 M hello.c
幾つかのファイルに対しては、“hg status” コマンドは特に何も表示しませんが、hello.c に対しては “M” で始ま
る行を表示します。明示的に指定しない限り、変更されていないファイルに対して“hg status” は何も表示しませ
ん。
“M” 表示は、 Mercurial が hello.c ファイルの変更を検知していることを表します。ファイルの変更に先立って(あるいは変更
の後に)、 Mercurial に対して通知する必要はありません。 Mercurial 自身で変更の実施を検知することができま
す。
“hg status” の表示は、hello.c を変更したことを知るのに役立ちますが、どのような変更を行ったのかを厳密に知りたい場合も有るでしょう。変更内容を知るためには、
“hg diff” コマンドを使用します。
1 $ hg diff
2 diff -r 2278160e78d4 hello.c
3 --- a/hello.c Sat Aug 16 22:16:53 2008 +0200
4 +++ b/hello.c Mon Jul 20 21:59:02 2009 +0000
5 @@ -8,5 +8,6 @@
6 int main(int argc, char **argv)
7 {
8 printf("hello, world!∖");
9 + printf("hello again!∖n");
10 return 0;
11 }
2.7 Recording changes in a new changeset
変更内容に満足して、新規チェンジセットに変更内容を記録するに足る状況に到達するまでは、ファイルの内容を変更し、ビルドと変更
内容に対する試験を行い、“hg status” および“hg diff” による変更内容を確認する、という作業を繰り返しま
す。
“hg commit” コマンドを用いることで、チェンジセットを新たに作成することができます。通常これを “コミットの実施”
(“making a commit”)ないし “コミットする” (“committing”)と言います。
2.7.1 Setting up a username
最初に “hg commit” 実行を行う際には、必ずしも実行が成
功 すると
は限りません。チェンジセットのコミットの際に Mercurial は、コミットしたユーザの名前と電子メールアドレスを、チェンジセット
毎に記録しますので、誰もが後からチェンジセット作成者を知ることができます。 Mercurial は以下の手順で、変更内容と共に記録す
る妥当なユーザ名を自動的に検出しようとします。
- “hg commit” コマンド起動の際に-u オプションによってユーザ名を指定した場合、常にその値が優先的に使用され
ます。
- 次にHGUSER 環境変数設定の有無が確認されます。
- ホームディレクトリ直下に、username要素を持つ.hgrc
がある場合、その値が使用されます。このファイルに書くべき内容に関しては、2.7.1節を参照してください。
- EMAIL 環境変数が設定されている場合は、その値が使用されます。
- それ以外の場合、 Mercurial は稼動しているシステムにユーザとホストの名前を問い合わせた上で、電子メールアドレス形式のユーザ名を生成し、これを使用します。この方法で生成されたユーザ名は往々にして役に立たないため、
Mercurial は警告を表示します。
上記の方法が全て失敗した場合、 Mercurial によるコミットは失敗し、エラーメッセージを表示します。そのような場合では、明示
的にユーザ名を指定しない限り、コミットは成功しないでしょう。
HGUSER 環境変数と“hg commit” コマンドへの-u オプション指定は、 Mercurial 設定ファイル中の username 設定を無効にする点
に注意してください。通常の使用において、自身のユーザ名を簡単且つ確実に指定するには、.hgrc ファイルで指定するのが良いで
しょ。記述方法に関する詳細は後述します。
Creating a Mercurial configuration file
ユーザ名を設定するには、まずは好みのエディタを使って、ホームディレクトリ直下に.hgrcファイルを作成します。 Mercurial はこの
ファイルから利用者の個人設定を参照します。.hgrc の内容は、まずは以下のようになるでしょう。
1 # This is a Mercurial configuration file.
2 [ui]
3 username = Firstname Lastname <email.address@domain.net>
“[ui]” 行は、設定ファイルのセクション開始を意味し、 “username = ...” という記述行は “ui セクションにおける username
項目への値の設定” とみなされます。一度セクションが開始されたなら、新たなセクションが開始されるか、ファイルの末尾に達するま
で当該セクションが続きます。空の行と、 “#” の次の文字から行末までは、 Mercurial によってコメントとみなされ無視されま
す。
Choosing a user name
username 設定項目は、 Mercurial に与える値ではありますが、リポジトリを参照する他の利用者のための情報ですの
で、任意の文字を使用可能です。殆どの利用者は、名前と電子メールアドレスを用いた前述のような形式を用いていま
す。
備考: Mercurial の組み込みウェブサーバ機能では、スパムメールの送付者が利用する電子メールアドレス自動収集ツールに対して、電子メールアドレスを難読化すること
が可能です。この機能を用いることで、 Mercurial リポジトリをウェブ上に公開した際
に、益体も無いメール受信の増加を抑止することができます。
2.7.2 Writing a commit message
当該チェンジセットでの変更内容を説明するメッセージを入力するために、 Mercurial はコミットの際にエディタを起動します。この
メッセージをコミットメッセージと呼び、読み手に変更の内容と理由を伝えるために記録されるもので、コミット後の“hg log” コマ
ンドにより表示されます。
“hg commit” コマンドが起動するエディタは、 “HG:” で始まる数行が後に続く空行を表示していることでしょう。
1 空行
2 HG: changed hello.c
Mercurial は “HG:” で始まる行を無視します。これらの行は、チェンジセットへの変更記録対象となるファイルの一覧を、コミット
しようとしているユーザに知らせるためだけのものです。そのため、これらの行の変更や削除は何も意味を持ちませ
ん。
2.7.3 Writing a good commit message
“hg log” はコミットメッセージの最初の1行しか表示しませんので、最初の1行だけで意味の通じる内容にするのが良いでしょう。こ
の方針から外れているために、読み難いコミットメッセージの実例を以下に示します。
1 changeset: 73:584af0e231be
2 user: Censored Person <censored.person@example.org>
3 date: Tue Sep 26 21:37:07 2006 -0700
4 summary: include buildmeister/commondefs. Add an exports and install
コミットメッセージの2行目以降に関しては、特に厳密なルールは存在しません。コミットメッセージに対して、プロジェクト
運用上の方針として何らかの形式を要求するかもしれませんが、 Mercurial 自身が解釈や忖度をすることはありませ
ん。
筆者の個人的な好みは、“hg log --patch” を一瞥しただけでは判断できない事柄について、簡潔でありながら有益な情報をもたら
すようなコミットメッセージです。
2.7.4 Aborting a commit
コミットメッセージの記述中にコミットを取りやめを決意した場合には、編集中のファイルを保存せずにエディタを終
了すれば良いのです。この場合、リポジトリと作業領域ディレクトリのいずれに対しても、何ら操作は加えられませ
ん。
引数無しで“hg commit” コマンドを実行した場合、“hg status” および“hg diff” によって報告された全ての変更内容が記録さ
れます。
2.7.5 Admiring our new handiwork
コミットが完了したなら、今しがた新規作成したチェンジセットを“hg tip” コマンドで表示することができます。こ
のコマンドは“hg log” と同一の出力を行いますが、表示されるのはリポジトリにおける最新のリビジョンだけで
す。
1 $ hg tip -vp
2 changeset: 5:30682a1ee732
3 tag: tip
4 user: Bryan O’Sullivan <bos@serpentine.com>
5 date: Mon Jul 20 21:59:02 2009 +0000
6 files: hello.c
7 description:
8 Added an extra line of output
9
10
11 diff -r 2278160e78d4 -r 30682a1ee732 hello.c
12 --- a/hello.c Sat Aug 16 22:16:53 2008 +0200
13 +++ b/hello.c Mon Jul 20 21:59:02 2009 +0000
14 @@ -8,5 +8,6 @@
15 int main(int argc, char **argv)
16 {
17 printf("hello, world!∖");
18 + printf("hello again!∖n");
19 return 0;
20 }
21
リポジトリにおける最新のリビジョンを tip リビジョン、あるいは単に tip と呼びます。
2.8 Sharing changes
先の記述で、 Mercurial におけるリポジトリは、それ自身で完結している旨述べました。これは即ち、たった今新規に作成したチェン
ジセットは、手元の my-hello リポジトリにしか存在しないことを意味します。この変更内容を他のリポジトリへと伝播する方法を、
順に見てゆきましょう。
2.8.1 Pulling changes from another repository
まず始めに、元々の hello リポジトリを複製して、たった今新規に作成した変更のコミットされていないリポジトリを作成しましょ
う。この複製したリポジトリを、hello-pull と呼びます。
1 $ cd ..
2 $ hg clone hello hello-pull
3 updating working directory
4 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
“hg pull” コマンドにより、my-hello からhello-pull へと変更を取り込みます。しかしながら、未知の変更を闇雲にリポジトリ
に取り込むのは、あまりぞっとしません。 Mercurial が提供する“hg incoming” コマンドは、実際に変更を取り込む事無く、“hg
pull” によってリポジトリに取り込まれる予定のチェンジセットを表示します。
1 $ cd hello-pull
2 $ hg incoming ../my-hello
3 comparing with ../my-hello
4 searching for changes
5 changeset: 5:30682a1ee732
6 tag: tip
7 user: Bryan O’Sullivan <bos@serpentine.com>
8 date: Mon Jul 20 21:59:02 2009 +0000
9 summary: Added an extra line of output
10
(勿論、“hg incoming” コマンドを実行したリポジトリに対して、“hg pull” による変更取り込みの機会よりも前に、より多くの
変更を追加することは可能ですので、実際の変更取り込みは予定とは異なる可能性が有ります。)
リポジトリへの変更の取り込みは、どのリポジトリから取り込むかを指示しつつ、“hg pull” コマンドを実行するという簡単なもの
です。
1 $ hg tip
2 changeset: 4:2278160e78d4
3 tag: tip
4 user: Bryan O’Sullivan <bos@serpentine.com>
5 date: Sat Aug 16 22:16:53 2008 +0200
6 summary: Trim comments.
7
8 $ hg pull ../my-hello
9 pulling from ../my-hello
10 searching for changes
11 adding changesets
12 adding manifests
13 adding file changes
14 added 1 changesets with 1 changes to 1 files
15 (run ’hg update’ to get a working copy)
16 $ hg tip
17 changeset: 5:30682a1ee732
18 tag: tip
19 user: Bryan O’Sullivan <bos@serpentine.com>
20 date: Mon Jul 20 21:59:02 2009 +0000
21 summary: Added an extra line of output
22
実施前後の“hg tip” 出力から見て取れるように、手元のリポジトリへの変更内容の反映が成功しています。取り込んだ変更内容を
作業領域ディレクトリにおいて参照するためには、もうひと手順必要です。
2.8.2 Updating the working directory
リポジトリと作業領域ディレクトリの関係について、これまでは大雑把にしか説明してきませんでした。2.8.1 節で実行した“hg
pull” コマンドは、リポジトリへの変更の取り込みを行いますが、確認してみればわかるように、作業領域には何ら影響を及ぼしませ
ん。これは、“hg pull” の(基底の)挙動が、作業領域に影響を及ぼさないものであるためです。作業領域の更新には、“hg pull” で
はなく“hg update” を用います。
1 $ grep printf hello.c
2 printf("hello, world!∖");
3 $ hg update tip
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 $ grep printf hello.c
6 printf("hello, world!∖");
7 printf("hello again!∖n");
“hg pull” 実行時に作業領域を自動的に更新しないことは、一見奇異に見えるかもしれませんが、実はそれには理由が有ります。
“hg update” を用いることで、リポジトリに記録された任意の版の状態へと、作業領域ディレクトリの内容を更新することができます。作業領域ディレクトリを
— 例えば、バグの原因調査などのために — 古い版にして作業していた場合などは、
“hg pull” 実行が作業領域ディレクトリを最新の版に自動的に更新してしまうのは、あまりよろしくないでしょ
う。
しかし、“hg pull” 〜 “hg update” という流れは非常に頻繁な作業ですから、“hg pull” に-u オプションを指定することで、
Mercurial はこれら2つを組み合わせた機能を提供します。
2.8.1 節での-u オプションを指定しない“hg pull” 実行の出力には、作業領域ディレクトリの更新に明示的な手順が必要であるこ
とを示す、注意喚起のメッセージが表示されているのが見て取れます。
1 (run ’hg update’ to get a working copy)
作業領域ディレクトリがどの版の内容に基づいているかを見るには、“hg parents” コマンドを使用します。
1 $ hg parents
2 changeset: 5:30682a1ee732
3 tag: tip
4 user: Bryan O’Sullivan <bos@serpentine.com>
5 date: Mon Jul 20 21:59:02 2009 +0000
6 summary: Added an extra line of output
7
図 2.4 では、個々のチェンジセットを繋ぐ矢印が描かれています。矢印の根元にあたるチェンジセットが親を、そして矢印の先にあ
たるチェンジセットが子を表しています。同じように、作業領域ディレクトリも親を持っており、現時点で保持している作業領域ディレ
クトリの内容は、そのチェンジセットに基づいたものです。
作業領域ディレクトリの内容を特定の版のものにする場合、“hg update” コマンドにリビジョン番号ないしチェンジセット ID を
指定します。
1 $ hg update 2
2 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 $ hg parents
4 changeset: 2:fef857204a0c
5 user: Bryan O’Sullivan <bos@serpentine.com>
6 date: Sat Aug 16 22:05:04 2008 +0200
7 summary: Introduce a typo into hello.c.
8
9 $ hg update
10 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
明示的な版指定をしなかった場合、上記の例における2つ目の“hg update” 実行で見て取れるように、“hg update” は tip が指
定されたものとして振舞います。
2.8.3 Pushing changes to another repository
Mercurial では、現在作業を行っているリポジトリから他のリポジトリへの、変更内容の反映が可能です。先に示した“hg pull” の例
と同様に、まずは変更反映先とするための一時的なリポジトリを作成します。
1 $ cd ..
2 $ hg clone hello hello-push
3 updating working directory
4 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
“hg outgoing” コマンドは、他のリポジトリへの反映対象となるチェンジセットを一覧表示します。
1 $ cd my-hello
2 $ hg outgoing ../hello-push
3 comparing with ../hello-push
4 searching for changes
5 changeset: 5:30682a1ee732
6 tag: tip
7 user: Bryan O’Sullivan <bos@serpentine.com>
8 date: Mon Jul 20 21:59:02 2009 +0000
9 summary: Added an extra line of output
10
そして“hg push” コマンドが実際の反映作業を行います。
1 $ hg push ../hello-push
2 pushing to ../hello-push
3 searching for changes
4 adding changesets
5 adding manifests
6 adding file changes
7 added 1 changesets with 1 changes to 1 files
“hg pull” と同様に、“hg push” コマンドは変更反映先のリポジトリ側において、作業領域ディレクトリの更新は行いません
(“hg pull” と違い、“hg push” は変更反映先のリポジトリ側での作業領域ディレクトリを更新する-u オプションを持ちませ
ん)。
当該リポジトリが既に相当するチェンジセットを持っている場合、変更の取り込みあるいは反映を行うとどうなるのでしょう?驚く
ようなことは何も起こりません。
1 $ hg push ../hello-push
2 pushing to ../hello-push
3 searching for changes
4 no changes found
2.8.4 Sharing changes over a network
先の幾つかの節で触れたコマンドの利用は、手元にあるリポジトリにのみ限定されているわけではありません。全く同様の形式で、
ネットワーク接続経由でも機能します。ローカルファイルシステムのパスの代わりに、 URL を指定すれば良いので
す。
1 $ hg outgoing http://hg.serpentine.com/tutorial/hello
2 comparing with http://hg.serpentine.com/tutorial/hello
3 searching for changes
4 changeset: 5:30682a1ee732
5 tag: tip
6 user: Bryan O’Sullivan <bos@serpentine.com>
7 date: Mon Jul 20 21:59:02 2009 +0000
8 summary: Added an extra line of output
9
この例では、遠隔リポジトリに対して反映可能な変更の一覧を見ることができますが、このリポジトリは匿名での変更反映を許すよ
うには当然ですが設定されていません。
1 $ hg push http://hg.serpentine.com/tutorial/hello
2 pushing to http://hg.serpentine.com/tutorial/hello
3 searching for changes
4 ssl required