Hatena::ブログ(Diary)

ursmの日記

2009-09-04

hg --config で設定を解除する方法

値に ! を指定する。

$ hg help | grep imerge
 imerge       interactive merge
$ hg --config extensions.hgext.imerge=! help | grep imerge
(何も出ない)

2008-12-03

Mercurial 1.1 released

WhatsNew - Mercurial

なかなか盛り沢山なリリースです。以下、目に付いたところなど。

Rebase Extension

チェンジセットが分岐しているときに、片方を分岐点から引っこ抜いてもう片方の頭に付け替えるような挙動を実現する extension です。詳しくは RebaseProject をご覧ください。

Bookmarks Extension

"provide (local-only) git-like branches" とのことですが、Git は殆ど使ってないのでいまいちピンと来ません。

Zeroconf Extension

hg serve した時、Bonjour でサービスを公開する extension です。リポジトリを公開しているマシンのホスト名や IP アドレスを知らなくても clone できるようになります。

あるマシンで hg serve して

ursm@gentoo ~/dotfiles$ hg serve

他のマシンで hg clone zc- をタブ補完すると

ursm@macbook ~$ hg clone zc-[TAB]

補完されます。当然、Enter を押せば clone できます。

ursm@macbook ~$ hg clone zc-dotfiles

この extension はまだ安定性に欠けるようで、手元の Mac OS X マシンでは hg serve の時点で落ちました (clone はできた)。avahi-daemon をインストールした Linux マシンだと動作しているようです。

Color Extension の改善

標準で色々なコマンドに色が付くようになりました。diff も色付きです。

Pager Extension の改善

特定のコマンドにだけページャを起動できるようになりました。例えば log と diff にページャを噛ましたい場合は ~/.hgrc に以下のように設定します。

[pager]
attend = log, diff

Web インターフェースの改善

デフォルトのスタイルが格好良くなりました。あと、Mercurial の公式リポジトリみたいなリビジョングラフが出ます。

2008-10-11

Bitbucket Extension

http://www.bitbucket.org/boredzo/bitbucketextension/wiki/Home

Bitbuket からの clone を簡単にしてくれる Mercurial Extension です。

インストール

~/.hgext に extension を clone してきます。

$ cd
$ mkdir .hgext && cd .hgext
$ hg clone https://bitbucket.org/boredzo/bitbucketextension/
$ mv bitbucketextension/bitbucketrepo .
$ rm -rf bitbucketextension

~/.hgext に Python のロードパスを通します。zsh を使っているなら ~/.zshenv

export PYTHONPATH=$HOME/.hgext:PYTHONPATH

とでもしておきましょう。

次に、~/.hgrc でこの extension を使うように設定します。

[extensions]
bitbucketrepo =

使い方

Bitbucket で管理されているリポジトリを指定するときに以下の形式が使えるようになります。

  • bb://username/repository
  • bb+ssh://username/repository

例えば Bitbucket Extension を clone するなら、hg clone bb://boredzo/bitbucketextension です。

2008-09-14

MQ で既存のチェンジセットを変更する

Mercurial は Git と違ってローレベルなコマンドが提供されていないため、コミット済みのチェンジセットを直接変更するようなことはできません。しかし、MQ を使うと同様のことが実現できます。

チェンジセットの内容を変更する

直前のコミットであれば hg rollback で取り消してから改めてコミットすれば良いのですが、二つ以上前のコミットだとそうはいきません。そこで MQ を使います。

$ hg glog --style=compact
@  2[tip]   913584a04c04   2008-09-14 20:49 +0900   ursm
|    piyo
|
o  1   f690c7ccb7e8   2008-09-14 20:49 +0900   ursm
|    fuga
|
o  0   87e4066eea46   2008-09-14 20:48 +0900   ursm
     hoge

試しに 1 を変更してみます。

まず、1 から tip をパッチに変換します。

$ hg qimport -r 1:tip
$ hg qapplied
1.diff
2.diff

1 に変更を加え、パッチを更新します。-m または -e でコミットメッセージを修正できます。

$ hg qgoto 1.diff
$ echo fuga >> fuga
$ hg qrefresh -m 'modified'

すべてのパッチを通常のチェンジセットに変換します。

$ hg qpush -a
$ hg qdelete -r qbase:qtip # Mercurial 1.0.3 以降なら hg qfinish -a が使えるはず
$ hg glog --style=comapct
@  2[tip]   481826546de8   2008-09-14 20:49 +0900   ursm
|    piyo
|
o  1   a1259d9e8484   2008-09-14 20:49 +0900   ursm
|    modified
|
o  0   87e4066eea46   2008-09-14 20:48 +0900   ursm
     hoge

できました。

変更後のチェンジセットは変更前のものとは完全に別物として扱われます (それぞれのハッシュを見てください)。つまり、他のリポジトリに伝播したチェンジセットには変更が及ばないということです。

複数のチェンジセットを一つにまとめる

squash merge がないのは Mercurial の弱点の一つですが、それでも MQ なら何とかしてくれます。

$ hg glog --style=comapct
@  2[tip]   481826546de8   2008-09-14 20:49 +0900   ursm
|    piyo
|
o  1   a1259d9e8484   2008-09-14 20:49 +0900   ursm
|    modified
|
o  0   87e4066eea46   2008-09-14 20:48 +0900   ursm
     hoge

1 と 2 を一つにまとめてみます。

先程と同様に 1 から tip をパッチに変換します。

$ hg qimport -r 1:tip
$ hg qapplied
1.diff
2.diff

1 に 2 を統合します。

$ hg qgoto 1.diff
$ hg qfold -m 'folded' 2.diff

すべてのパッチを通常のチェンジセットに変換します。

$ hg qdelete -r qbase:qtip
$ hg glog --style=comapct
@  1[tip]   a972b66c452e   2008-09-14 20:49 +0900   ursm
|    folded
|
o  0   87e4066eea46   2008-09-14 20:48 +0900   ursm
     hoge

できました。

チェンジセットを消す

MQ の strip コマンドを使います。

$ hg glog --style=comapct
@  1[tip]   a972b66c452e   2008-09-14 20:49 +0900   ursm
|    folded
|
o  0   87e4066eea46   2008-09-14 20:48 +0900   ursm
     hoge

1 を消します。

$ hg strip 1
$ hg glog --style=compact
@  0[tip]   87e4066eea46   2008-09-14 20:48 +0900   ursm
     hoge

消えました。

hg strip は指定したチェンジセットとそれにぶら下がるすべてのチェンジセットを消すので注意してください。失敗した場合は hg unbundle で復旧できます。

$ hg unbundle .hg/strip-backup/a972b66c452e-backup
$ hg glog --style=compact
o  1[tip]   a972b66c452e   2008-09-14 20:49 +0900   ursm
|    folded
|
@  0   87e4066eea46   2008-09-14 20:48 +0900   ursm
     hoge

あと MQ で rebase もできるんですが、Mercurial 1.0.3 で追加される (はずの) Rebase Extension を使った方が幸せになれると思います。

2008-09-08

Mercurial でコミットする時に diff を出す Vim スクリプト

.hgrc[ui] セクションに以下の設定を足して

[ui]
editor = vim '+set filetype=hg-commit'

.vim/ftplugin/hg-commit.vim に以下のスクリプトを置くと

hg commit で diff が出るようになります。