バージョン管理システム Mercurial

分散バージョン管理システム。Pythonで実装されている。 git に影響を受けて開発されたと言われている。 git にない特徴として、 http サーバになって他のマシンと通信する機能が便利。

また Windows での環境構築が容易であり、GUI ツール tortoisehg も安定している。

はてな日記(nishimotz)

ツールとサービス

インストール

実体は Python スクリプトなので、Python が入っていれば自分でインストールできる。

Ubuntu Linux

バイナリパッケージでインストールする場合。 ubuntu では sudo aptitude install mercurial

Windows

バイナリパッケージでインストールする場合。

http://mercurial.selenic.com/wiki/Download#Windows

mercurial-1.7.0.msi (2010-11-14現在)

Windows ではエクスプローラと統合された tortoisehg もある。

cygwin にはコマンドライン版 hg が入っている。

Mac (binary)

2011-09-05 SnowLeopard(いまだに。。)

バイナリがある http://mercurial.berkwood.com/

  • Mercurial-1.9.2-py2.6-macosx10.6.zip
$ which hg
/usr/local/bin/hg

Mac (ports)

2010-11-12 SnowLeopard にて MacPorts :成功していない。

$ sudo port install mercurial
db46 requires the Java for Mac OS X development headers

macports の手順でやっと db46 成功。

$ sudo port install mercurial

(omitted)

To fully complete your installation and make python 2.6 the default,  please run:
 	sudo port install python_select
 	sudo python_select python26

なのでやっておく。

$ sudo port install python_select
$ sudo python_select python26

プロジェクトを始めるときの作法

プログラミングではなく latex の例で。

file.tex と style.cls がすでにあるとする。

ファイル名が_で始まるファイルと、各種バイナリや一時ファイルを無視するように設定。

カレントに .hgignore を作る。先頭の "syntax: glob" は必須。書かないと正規表現モードになる。

syntax: glob
*~
_*
*/_*
*.aux
*.dvi
*.idx
*.log
*.toc
*.bbl
*.blg
*.pdf
*.zip
fig_unused/*
$ hg init
$ hg add file.tex style.cls .hgignore
$ hg commit -m "initial commit"

hg status

すべてのファイルについて表示するには -A オプション。

$ hg status -A
M file1  : 更新されたファイル
! file2  : 管理されているのに見つからない。hg remove すれば解決。
A file3  : 追加されてcommitを待っているファイル。
R file4  : hg remove されてcommitを待っているファイル。
? file5  : 管理されていないファイル。hg add するか .hgignore に追加すれば解決。
C file6  : -A しないと出てこない。commit 済みのファイル(?)

設定ファイルの備忘録

[.hgignore]

syntax: regexp
.+~$
^_.*
^\d\d\d\d$
galatea

cygwin Mercurial 0.9.5

$ more ~/.hgrc
[ui]
username = Takuya Nishimoto <nishimoto@m.ieice.org>

$ tail ~/.bashrc
export HGENCODING=UTF-8

コミットにおける習慣

@kuy さんと @nishimotz の Twitter 議論:

  • 日本語でのコミットメッセージがちゃんと使えるためには設定が必要、かも知れない。
  • コミットメッセージには日本語を使わない、という習慣を身につけて欲しい。
  • 1行80文字の簡潔な英語で書くという制約から、適切な単位でコミットする癖が付きます。
  • 慣れないうちは1行目のサマリは英語、必要なら日本語で補足という手もあります。

クロスプラットフォーム(Windows と Linux 環境の混在)で気になるのは、ソースコードの文字コードと改行コードだが、徐々に確認していきたい。 Python スクリプトのバージョン管理であれば、あまり難しく考えなくてよさそう。

サーバとクライアントの通信

サーバから作業ファイルのクローン

[linux-host]
$ hg serve -v

[cygwin]
$ hg clone http://linux-host:8000/ project-name

サーバからの更新反映

[linux-host]
$ hg remove -f gomi.txt
$ hg serve -v

[cygwin]
$ hg pull http://linux-host:8000/
$ hg update

クライアントからの更新反映

Windows からは TortoiseHg で init / add / commit できるが、push はコマンドプロンプトでやる必要がある。

ここでは clone を使わないで init されたディレクトリに push してみる。

[linux-host: ~/.hgrc]

[web]
push_ssl = false
allow_push = *
[linux-host]
$ mkdir project-name
$ cd project-name
$ hg init
$ hg serve

[windows]
$ hg push http://linux-host:8000/

[linux-host]
$ hg checkout

hg revert

ストーリー:

正しく動く状態のスクリプトを hg commit したあとで、 仕様を変更するために、作業ファイルを編集した。

しかし、修正の方針が誤っていたことに気づいた。

作業ファイルの一部を直前に commit された状態に戻したい。

そんなときに hg revert を使う。

$ hg revert ファイル名

編集中のファイルは ファイル名.orig に改名される。

hg push / hg update

ストーリー:

共有レポジトリ masterdir から clone された作業レポジトリ workdir で更新をコミットする。 これを共有レポジトリに戻す。

$ cd workdir
$ hg push masterdir

$ cd masterdir
$ hg update

hg tag

特定のリビジョンにタグ(名前)をつける。 hg tags でタグの一覧を表示できる。

$ hg tag release-091227
$ hg tags
tip                               12:5eff5957c3a7
release-091227                    11:11656305fcc5

hg bookmarks

since 2011-10-11

hg bookmarks はバージョン 1.8 から標準機能になった。

「移動可能なマーキングによる履歴進展の追跡」

  • コミット操作に追従して移動する、リビジョン特定用の情報
  • ブックマークは、リポジトリ間での取り込みや反映が可能

git tag と等価という話 http://www.anlyznews.com/2010/12/gitmercurial8.html

ブランチ

since 2011-11-01

ブランチを確認する:

hg branch

ブランチを作成する:

hg branch ブランチ名

ブランチを切り替える:

hg update -C ブランチ名

他のブランチから取り込む:

    • 「Mercurialはブランチ間のマージの繰り返しをを簡単にできるようにしています。hg pullとhg update -mを走らせてから結果をコミットするだけでマージができます。 」
  • hg merge というコマンドもある http://mercurial.selenic.com/wiki/JapaneseMerge
    • マージが成功したら commit が必要。commit するまで次のマージができない。

git と似ているところ:

  • 同じ作業ファイルの中でブランチの切り替えができる

git と違うところ:

  • ブランチの切り替えは git ではサブコマンド checkout だが、mercurial では update である

mercurial.txt · 最終更新: 2011/11/05 00:47 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0