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

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

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

  • Python プロフェッショナルプログラミング:ある nakagami の日記:So-netブログ http://bit.ly/ZwAnYP

ツールとサービス

インストール

実体は 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 · 最終更新: 2012/12/16 10:50 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