「入門TortoiseHg+Mercurial」発売中


執筆情報

入門TortoiseHg+Mercurial

TortoiseHg の GUI 利用に主眼を置いた、 Mercurialによる履歴管理の入門書が、 「入門TortoiseHg+Mercurial」(ISBN: 978-4-7980-3710-3) と題して、 秀和システムから出版されています。

正誤情報

内容の不備等にお気付きの際には、 @flyingfoozy へのツイート等で、 お気軽にお寄せください。

5.4.1 連携先の登録

94ページ上部の、CUI向け『連携先の登録』:

9.2.3 名前付きブランチのマージ

176ページの2段落目:

A.1.2 Mac OS 環境へのインストール

298ページからの Mac OS 環境へのインストールに関して、 捕捉情報を掲載します。

Xcode/Homebrew のインストール

紙面の都合から書籍では省略した、 Xcode/Homebrew のインストールに関して、 簡単に触れておきます。

Xcode の入手から Homebrew インストールまでの流れは 概ね以下のようになります。

  1. AppStore 経由で Xcode (のインストーラ)を入手
    (あるいは AppStore 起動 ⇒ 『カテゴリ』 ⇒ 『開発ツール』 経由で入手)
  2. Xcode のインストーラを実行して、Xcode をインストール
  3. Xcode を起動
  4. 『Xcode』メニュー ⇒ 『Preferences』 ⇒ 『Downloads』 を経て『Command Line Tools』のダウンロード/インストールを指示
  5. 『ターミナル』ソフトを起動
  6. コマンドラインから Homebrew のインストールを実施
  7. シェルの設定ファイルに PATH 環境変数の設定を追加
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
Homebrew のインストール
# ~/.bash_profile あるいは ~/.bashrc といった設定ファイルに
# 以下の記述を追加
BREW_PREFIX=`brew --prefix`
PATH=$BREW_PREFIX/sbin:$PATH
PATH=$BREW_PREFIX/bin/:$PATH
PATH=$BREW_PREFIX/share/python:$PATH
export PATH
PATH 環境変数の設定

コマンドラインからの操作や、 環境変数設定等にある程度理解があれば、 注意すべきなのは、 以下の点ぐらいでしょうか?

Xcode の入手には AppleID が必要
簡単な登録で入手できます。 詳細は適宜 Google 等で検索してみてください。
『Xcode (のインストーラ)』や 『Command Line Tools』のダウンロード/インストールは、 非常に時間を要する
ネット接続の回線の太さ次第ではありますが、 1〜2時間程度は見込んでおいた方が良いでしょう。

また、 『シェルの設定ファイルに PATH 環境変数の設定を追加』した場合、 既に開かれている『ターミナル』ウィンドウに対しては、 環境変数設定の反映が行われません。

新たな『ターミナル』ウィンドウを開くか、 コマンドライン上で明示的に環境変数を設定するなどしてください。

使用する Python の選択

Mercurial/TortoseHg を使用するには、 Python がインストールされている必要があります。

Xcode には、 Python (+ Subversion Python binding) が同梱されており、 TortoiseHg を使用する範囲であれば、 特に Homebrew の Python をインストールする必要は無いでしょう。

但し、Xcode 付属の Python を使用する場合は、 PYTHONPATH 環境変数を設定する以下のような記述を、 ~/.bashrc などに追加する必要があります。

export PYTHONPATH=/usr/local/lib/python2.7/site-packages:${PYTHONPATH}
PYTHONPATH 環境変数設定

"brew install pyqt" 実施時にも、 同等の操作を促す警告が表示される筈です。 (Homebrew のインストール先や、 Python のバージョンによって、 具体的なパスは異なる可能性があります)

先述したように、 Xcode には Subversion Python binding も付属しているので、 Xcode 付属の Python を使用する場合は、 書籍の実行例 A.3 (下記)のような、 Subversion (+ Python binding) のインストールは必要ありません

$ brew insall --python subversion
書籍での実行例: A.3

逆に、 実行例 A.3 の手順を実行して、 Homebrew の Subversion をインストールしてしまった場合、 Homebrew の Subversion で作成したリポジトリの形式が、 Xcode 付属の Subversion Python binding のサポート範囲外であるために、 リポジトリの変換が失敗する可能性があります。

Xcode の Python を使うケースで、 実行例 A.3 の手順で Homebrew の Subversion をインストールしてしまった場合は、 以下の手順で Homebrew の Subversion をアンインストールしてください。

$ brew uninsall subversion
Homebrew の Subversion をアンインストール

TortoiseHg の実行に、 Xcode 付属の Python ではなく、 Homebrew の Python を使用する場合、 書籍での実行例 A.2 の手順に進む前に、 以下の手順で Homebrew の Python をインストールしてください。

$ brew install python
Homebrew の Python をインストール

Homebrew の Python を利用する場合、 PYTHONPATH に対する設定は不要になります (なる筈)。

また、 "easy_install" や "pip" による Python ライブラリのインストール先が /usr/local 配下になるため、 脚注 (*9) で述べている以下の状況は発生しない筈です:

"easy_install" や "pip" の実行は、 "sudo" 付きで実行する必要があるかもしれません。
メッセージの日本語化のための前準備

書籍では、 TortoseHg のインストール前に、 GNU gettext の利用可否を確認するように書かれています。

$ which msgfmt
$ brew install gettext
$ brew link gettext
$ which msgfmt
/usr/local/bin/msgfmt
書籍でのGNU gettext 利用の可否確認: A.1

書籍執筆時点では、 上記手順で問題なかったのですが、 最近の GNU gettext をインストールした場合、 (1) 以下のようなメッセージが表示され、 (2) --force オプション付きでないと "brew link gettext" が実施できなくなりました。

This formula is keg-only: so it was not symlinked into /usr/local.

OS X provides the BSD gettext library and some software gets confused
if both are in the library path.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/gettext/lib
    CPPFLAGS: -I/usr/local/opt/gettext/include
brew install gettext での警告表示

『GNU gettext と MacOS 添付の BSD 系 gettext ライブラリの混在』 が問題化するようなケースでは、 国際化プログラミング周りの知識が無いと、 対処ができない可能性があります。 そのため、 TortoiseHg のためだけに 『とりえ合えず --force オプション付きで "brew link gettext" を実施してしまいましょう』 と言うわけにもいきません。

この場合は、 msgfmt コマンドが格納されている /usr/local/opt/gettext/binPATH 環境変数に対して追加することで、 MacOS 添付の gettext ライブラリの置き換えは回避しつつ、 msgfmt コマンドを使えるようにするのが妥当でしょう。

後述する "pip install Pygments iniparse Mercurial" 実施の際に、 msgfmt コマンドが使用できないと、 Mercurial のメッセージが日本語化されないので、 この時点で PATH 環境変数の設定漏れが無いように、 注意してください。

メッセージの日本語化のための手順

書籍では、以下の作業が済んだ時点で、 ~/Documents/TortoiseHg 直下の thg コマンドを実行する手順となっていますが、 この手順だけでは、 TortoiseHg のメッセージは日本語化されません。

$ brew install pyqt
$ brew install qscintilla2
$ easy_install pip
$ pip install Pygments iniparse Mercurial
$ hg clone http://bitbucket.org/tortoisehg/thg/ \
      ~/Documents/TortoiseHg
$ cd ~/Documents/TortoiseHg
$ hg update "max(tag() and branch(stable))"
書籍でのインストール手順 A.2

TortoiseHg のメッセージを日本語化する場合、 上記の手順を実施した上で、 更に以下の手順を踏む必要があります。

$ cd ~/Documents/TortoiseHg
$ python ./setup.py build_mo
メッセージ日本語化のための追加手順

以後、 TortoiseHg の最新リリース版に追従する際の手順は、 以下のようになります (リリースのお知らせは、 日本語メーリングリストや、 公式 Twitter アカウントなどでもアナウンスしています)。

$ cd ~/Documents/TortoiseHg
$ hg pull
$ hg update "max(tag() and branch(stable))"
$ python ./setup.py build_mo
最新版 TortoiseHg への追従手順

なお、 TortoiseHg の最新版に追従する場合は、 Mercurial も最新版を使用した方が良いでしょう。

$ pip install -U mercurial
最新版 Mercurial への追従手順

D.3 リモートホストへの接続

D.3.2 接続先ホスト上のhgコマンドの確認

書籍の318ページでは、下記のように記述してあります。

最近のSSHサーバの設定は、 非対話的実行の際に、 /bin/usr/bin 等の、 標準的なパス上のコマンド以外は、 実行できないようになっていることが多々あります。

しかし、 PATH 環境変数の追加設定をはじめとする、 独自の環境設定変更の記述を ${HOME}/.bashrc ファイルに追記する際に、 以下の点にさえ注意すれば、 SSH 経由での非対話的なコマンド実行の際にも、 それらの設定を有効にすることができます。

${HOME}/.bashrc 中に、 [ -z "$PS1" ] && return のような記述がある場合、 非対話的な実行の際には、 それ以降に記述した内容は無視されます。 非対話的実行でも有効にしたい独自設定は、 それよりも前の行に記述してください。

.... 以下の行よりも前の段階で、利用者独自の設定を記述 ....

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

OS のディストリビューションによっては、 上記で例示したような方法ではなく、 全く別な方法で、 対話的実行の有無を判定しているかもしれません (例えば $- パラメータの内容確認)。

そのため、 独自設定の記述を ${HOME}/.bashrc に追加する際には、 少々面倒でも、 ファイル全体を一通り確認してみることをお勧めします。

bash の設定ファイル読み込みに関する詳細は、 私のブログで別途まとめておきましたので、 そちらも参照してみてください。

独自設定の追加記述ができたなら、 本書コマンド実行例 D.3 の要領で、 追加記述が有効になっていることを確認してみましょう (env コマンドは、 設定されている環境変数の一覧を表示します)。

※ hg コマンドの有無の確認
$ ssh -i 秘密鍵ファイルへのフルパス user@remote hg version

※ 環境変数の設定確認
$ ssh -i 秘密鍵ファイルへのフルパス user@remote env
設定内容の有効性の確認

E.2 独自設定の記述例

外部マージツールの引数指定の記述形式

325ページ末尾に、 外部マージツールの引数設定記述に関して、 以下のように記述されています。

Mercurialの設定ファイルでは、 設定の次の行が行頭に空白文字を含む場合は、 『設定内容が継続している』とみなします。 そのため、 上記のような、 複数行に渡る設定の場合でも、 行末にバックスラッシュ等を記述する必要はありません

しかし実際には、 コマンドライン引数指定を複数行で記述した場合、 その内容が以下のように解釈されてしまいます。

Windows 環境:

最初の改行位置までしか引数扱いされません。

結果として、引数設定の2行目以降が無視されます。

それ以外の Unix 系環境:

最初の改行位置までが外部コマンドの引数、 それ以降は次に実行されるコマンドライン指定とみなされます。

例えば、本書325ページの記述例E.3で言えば、 引数設定2行目の "--cs AutoSelectOutEncoding=0" が、 kdiff3 コマンドに引き続いて実行される、 コマンドライン指定とみなされます。 つまり、kdiff3 実行後に、 "--cs" コマンドを、 "AutoSelectOutEncoding=0" 引数付きで呼び出そうとするわけです (3行目以降も同様)。

結果として、引数を指定したつもりが、 引数として認識されない上に、 想定外のコマンドが実行されることになります。

以上のことから、 外部マージツールの引数指定を記述する際には、 少々視認性が悪くても、 一行で記述するようにしてください。

kdiff3 への引数指定

325ページ末尾の kdiff3-utf8 設定記述例は、 以下のような内容になっています。

kdiff3-utf8.executable=c:/Program Files/TortoiseHg/kdiff3
kdiff3-utf8.args=--auto --L1 base --L2 parent1 --L3 parent2 ....
        --cs AutoSelectOutEncoding=0
        --cs EncodingForA=utf-8
書籍での kdiff3-utf8 設定記述(E.3)

上記の設定例には、 先述した『複数行記述』以外にも2点ほど問題があります。

まず一点目は、 EncodingForA への utf-8 指定だけでは不十分な点です。 以下のように、 EncodingForAEncodingForC および EncodingForOutput の全てに対して utf-8 を指定するようにしてください。

kdiff3-utf8.executable=c:/Program Files/TortoiseHg/kdiff3
kdiff3-utf8.args=--auto --L1 base --L2 parent1 --L3 parent2 ....
        --cs AutoSelectOutEncoding=0
        --cs EncodingForA=utf-8
        --cs EncodingForB=utf-8
        --cs EncodingForC=utf-8
        --cs EncodingForOutput=utf-8
推奨される kdiff3-utf8 の設定記述

なお、 上記の設定記述は、 画面上での可読性を考えて複数行で記述しています。 しかし、 先述したように、 複数行に渡る外部マージツールの引数指定は、 予期せぬ挙動になってしまいます。 必ず一行で記述するようにしてください。

もう一点は、 通常の kdiff3 が選択された際に、 適切な文字コードが選択されない可能性がある点です。

kdiff3 は、 (少なくとも Windows 上においては) 明示的な EncodingFor〜 指定が無い場合、 前回起動時の指定内容が、そのまま適用されます。

そのため、 明示的な EncodingFor〜 指定がある kdiff3-utf8 設定を使ってマージを実施した後に、 明示的な EncodingFor〜 指定がない kdiff3 設定でマージを行った場合、 直前の kdiff3-utf8 実行による utf-8 指定が、 有効になってしまうのです。

ですから、 kdiff3-utf8 のような 明示的な EncodingFor〜 指定を伴う設定を追加した場合は、 従来の kdiff3 に対しても、 明示的な EncodingFor〜 指定を追加する必要があります。

kdiff3.args=--auto --L1 base --L2 parent1 --L3 parent2 ....
        --cs AutoSelectOutEncoding=0
        --cs EncodingForA=cp932
        --cs EncodingForB=cp932
        --cs EncodingForC=cp932
        --cs EncodingForOutput=cp932
kdiff3 への設定追加

「Mercurial: The Definitive Guide」日本語版

オンライン上で公開されている Bryan O'Sullivan 氏の「Mercurial: The Definitive Guide」(通称「BOS本」ないし「hgbook」) の、 2年ほど前の時点の版を元に、私が翻訳した日本語版を公開しています。

HTML 版を直接ブラウザ経由で参照することも可能です。

1.0 版以前の Mercurial について書かれているものをベースとした翻訳ですので、 最新の Mercurial 事情とは異なる内容も含まれていますが、 Mercurial そのものの基本コンセプトは大きく変化していませんから、 十分有用な内容であると思います。

特に Mercurial の詳細 (例えば、リポジトリの内部構造など)に興味のある方にとっては、 有益な情報が含まれていると思います。

O'Reilly 社から出版されている最新版(Amazon からも購入可能です)を目指し、 翻訳版の更新も随時行う予定です。

なお、日本語翻訳版ならびにその公開に関しては、 O'Sullivan 氏および O'Reilly 社とは一切関係がありませんので、 お問い合わせ等は藤原宛にお願いします。

入門Mercurial Linux/Windows対応

重要: Mercurial の 1.x ⇒ 2.0 では、 コンセプト/操作性/互換性等における大きな改変はありません。

本書の帯には、 出版当時の最新版である『1.1 対応』が記載されていますが、 日々の作業で必要とされる基本的な事柄に関しては、 最新の 2.x 版においても適用可能な内容となっています。

1.1 以降に追加されたコマンド/オプションに関しては、 オンラインヘルプ ("hg help コマンド名/トピック等") 出力の多くが日本語訳されていますので、 そちらもご覧ください (オンラインヘルプ出力の日本語化に関しては、 『言語設定』 を参照してください)。

私の執筆した Mercurial の入門書が、 「入門Mercurial Linux/Windows対応」(ISBN:978-4-7980-2174-4)と題して、 秀和システムから出版されています (Amazon からも購入可能です) 。

私自身にとっては初めての書籍執筆となりましたので、 至らない点も多々あるとは思いますが、 構成管理初心者はもちろん、 CVS/Subversion からの乗り換えを検討されている方、 Mercurial の使いこなしを目指す方など、 多くの方のお役に立てるようにすべく、 (執筆者本人としては)採算度外視で内容の充実に努めましたので、 Mercurial に少しでも興味をお持ちであれば是非ご一読ください。

バージョン対応情報

1.1 版以前をご利用の方へ

本書では、 Mercurial 1.1 版で導入された "hg resolve" を使用したマージに対応した解説を行なっておりますので、 それ以前の版をご利用の方はご注意ください (機能性の面からも、 個人的には 1.1 版へのアップグレードを強くお勧めします)。

1.1.1 版以降をご利用の方へ

出版スケジュールの関係から、 Mercurial 1.1.1 版で導入された "hg resolve" の "-a" オプションは、 「付録 F コマンドリファレンス」において掲載されておりませんのでご注意ください。

正誤情報

内容の不備等にお気付きの際には、 メール等でお知らせ頂ければ幸いです (はてなのアカウントをお持ちの方は、 こちらのエントリにコメントして頂いても構いません)。

Matt Mackall氏から読者のみなさんへ

IIIページにおける、 Matt Mackall 氏からのメッセージの4段落目:

  • 誤: 2003年4月上旬
  • 正: 2005年4月上旬

第5章 マージ:「パラレルワールド」間の調停

56ページにおける、 5.3 節に対する図版付きの概要説明の箇所:

  • 誤: 5.3 作業領域 vs コミット済み成果ベース
  • 正: 5.3 未コミット成果ベース vs コミット済み成果ベース

5.2.2 マージの開始

60ページにおける、 コラム「tip≠最新?」の3段落目:

  • 誤: リポジトリへの繁栄順序の関係から
  • 正: リポジトリへの反映順序の関係から

5.2.3 衝突の解消

62ページにおける、 実行例 5.7 の1行目:

  • 誤: $ hgmerge
  • 正: $ hg merge

7.3.1 ブランチに名前を付ける

96ページにおける、 名前付きブランチの生成に関する説明の際に:

"hg log" を使用すれば、 名前付きブランチの分岐元リビジョンを特定することは一応可能なのですが、 名前付きブランチの分岐元リビジョンを即座に特定できるようにしておくことは、 運用上の点で非常に有用ですので、 名前付きブランチ生成時にブランチ名に対応するタグを付与する、 というこの運用方法はお勧めです。

上記のように記述してありますが、 1.6 版で導入された revset 機能を使用することで、 名前付きブランチ全体の作業成果に関しても、 比較的容易に取得することができることから、 実行性能的な問題が無ければ、 名前付きブランチ生成の際の、 分岐元リビジョンへのタグ付けは必要ありません。

13.3.1 同期状況の確認

164ページにおける脚注 5 で 『CVSは通常のdiff形式』と書いていますが、 cvs diff -u 指定により unified diff 形式での出力が可能です。

14.3.3 パッチの適用・解除

180 〜 181 ページの実行例 14.8, 14.10 それぞれの3行目:

  • 誤: $ hg applied
  • 正: $ hg qapplied

C.3 [decode]/[encode] の設定

210ページにおける [decode]/[encode] 設定に関する説明は、 改行コード変換に主眼を置いて説明しています。

しかし、Mercurial の 1.5.4 以降では、 [decode]/[encode] 設定による改行コードの変換は、 非推奨となっています。

改行コードの変換を行う際には、 eol エクステンションを利用するようにしてください。

※ eol エクステンションの詳細は、私が書いたブログエントリ等を参照してください。

F.6.4 "hg archive"

244ページにおける hg archive コマンドの --prefix オプションに対する「詳細」記述欄:

  • 誤: 無指定時はリビジョンのハッシュIDが使用されます
  • 正: 無指定時はアーカイブ名から拡張子部分を抜いたものが使用されます

Matt Mackall 氏からのメッセージ(原文)

紙媒体での Mercurial 専門解説書としては世界初となる書籍が日本で出版される、 ということで、 Mercurial の作者である Matt Mackall 氏に寄せて頂いたメッセージの原文を、 氏の許諾を得て本ページに掲載します (書籍には翻訳版を掲載)。

If someone told me five years ago that I would be the lead developer of a popular version control system, I would have laughed. Version control was about the most boring, tedious thing imaginable.

Version control systems were systems that got in the way of getting work done. They were slow, they were were complex, and they were often down for maintenance. Doing anything beyond a basic check-in or check-out often required seeking out one of the wizards in charge of managing the repository. And doing a branch merge meant everyone had to stop and wait, sometimes for days.

In short, traditional version control systems were no fun. Thus, users quickly developed bad habits. Because checking in was slow, users would put off doing it as long as possible. And the longer they delayed, the slower (and harder) it would become. The same was true of branch merging: it often became so slow and complex that it was effectively impossible. And when the server went down or the wizards were on vacation, users would work around the system.

One morning in early April 2005, I was riding the train to work and I had a realization: version control could be fast. I pulled out my laptop and did some experiments confirming my idea. Within a few days, I had a simple system that could handle large projects with unprecedented speed. Within a couple weeks, it could communicate with other clients in a distributed fashion. No need to wait for hours to do things, no need for unreliable servers, and no need for wizards. It was time to share it with the world.

And the world shared with me. Hundreds of developers have contributed to Mercurial and made it one of the most powerful development tools available, while still being easy to use. It's also been adopted as the system of choice for some of the largest projects and companies around. And three years later, I'm still enjoying working on a project I would have never believed would be fun.

But the most surprising thing is that just about every day, a user writes to tell me how much they enjoy using Mercurial. I hope that after reading this book, you will enjoy using Mercurial as they have.

Matt Mackall
Minneapolis, October 2008

Merruail ではじめる分散構成管理

技術評論社 gihyo.jp において、 「Merruail ではじめる分散構成管理」 と題した全 6 回の入門記事を掲載中です。

ページ等の都合から「入門Mercurial Linux/Windows対応」では割愛した 大規模開発時の拠点間連携に関する説明もありますので、 興味のある方は是非ご覧ください。