Mercurialでshelveを使う

Mercurialアドベントカレンダー 2012 の10日目です。

なお、 TortoiseHgアドベントカレンダー 2012 の10日目である、 TortoiseHgで shelveを使う とも関連があります。

shelveって?

みなさま一度は作業領域が編集中な状態でmergeしようとして、「作業領域の変 更が未コミットです」と言われたことがあるかと思います。そして、「い、い や、今はcommitしたくないんだよ!」と思ったことも。

こういう場合に使える拡張が、 hgshelve です。 shelve(棚)という名前の通り、現在の編集状況を一時的に保管し「棚上げ」で きる拡張です。

「棚上げ」した変更はリポジトリの特別な場所に格納され、いつでもその変更 を作業領域に戻せます。

実はMQを使えば同じことが出来るのですが、MQはなんでも出来てしまうので、 ちょっと怖い面もあります。特に慣れないうちはshelveのように特定の用途だ けを行うツールを使うと良いのではないかと思います。

インストール

shelveは標準ではついてきませんので、自分で入れる必要があります。

# どこか好きな場所に
% cd /path/to/hgshelve
# hgshelveをclone
% hg clone https://bitbucket.org/tksoh/hgshelve/

その後 .hgrc にこう書き加えます。

[extensions]
hgshelve=/path/to/hgshelve/hgshelve.py

これでおーけーです。

使い方

変更を一時的に保存

hg shelveと打ちます。

% hg shelve

すると、

diff --git a/ChangeLog b/ChangeLog
1 個の差分、 2 行の変更
shelve changes to 'ChangeLog'? [Ynsfdaq?]

と出てきます。ここでは、ChangeLogというファイルへの変更を行いましたので、 このChangeLogへの変更をどうするか?と聞かれています。

?を押すと選択肢が出てきます。

shelve changes to 'ChangeLog'? [Ynsfdaq?]   ?
y - shelve this change
n - skip this change
s - skip remaining changes to this file
f - shelve remaining changes to this file
d - done, skip remaining changes and files
a - shelve all changes to all remaining files
q - quit, shelving no changes
? - display help
shelve changes to 'ChangeLog'? [Ynsfdaq?]
  • y: この変更を保存する

  • n: この変更を保存せずにスキップする

  • s: このファイルの以降の変更をすべてスキップする

  • f: このファイルの以降の変更をすべて保存する

  • d: 終了。これ以降の全てのファイルの変更をスキップする

  • a: これ以降の全てのファイルの変更を保存する

  • q: なにも保存せずに終わる

です。ここでYを押すと、

shelve changes to 'ChangeLog'? [Ynsfdaq?]  y
@@ -1,4 +1,4 @@
-2010-12-27  r_rudi  <shirou@shiroumac.local>
+hogehogheoghoehgo2012-12-09  r_rudi

   * version 1.1

 shelve this change to 'ChangeLog'? [Ynsfdaq?]  ?

と言うように、変更(hunk)をどうするか聞いてきます。これを全ての変更に対 して繰り替えしていきます。一回目はファイルに対して聞かれており、二回目 は変更(hunk)に対して聞かれています。ファイルの変更にNを押すと、そのファ イル中の変更はすべて保存されないことになります。

ここで述べたように、shelveで保存する変更は「ファイル単位」ではなく、 「変更(hunk)」単位です。したがって、record拡張のようにファイルの一部分 だけ残してcommit、という用途にも使えます。

全部保存

% hg shelve --all

と、 --all をつけると無条件に全ての変更を保存します。

名前付きで保存

保存した変更には --name で名前をつけられます。

% hg shelve --name myshelf

一度保存した変更に、さらに変更を追加したい場合は --append を使います。

あるいは、上書きしたい場合は --force です。

% hg shelve --name myshelf --force
% hg shelve --name myshelf --append

保存してある変更の一覧を見るには --list を使います。

% hg shelve --list

保存した変更を戻す

保存した変更をまた戻して作業領域に反映させるには unshelve を使います。

% hg unshelve

名前をつけた変更を戻したい場合は --name をつけます。

% hg unshelve --name myshelf

保存される場所

shelveの内容は .hg/shelves に保存されています。

%ls .hg/shelves
2012-08-27_17-27-23_parent_rev_1166

注意点

win32text拡張を使っている場合、 .hgrc にこう書いておかないと、変更点の 改行コード解釈がうまくいかないそうです。

[patch]
eol = auto

まとめ

今回はコミット前の変更を「棚上げ」できる hgshelve 拡張を紹介しました。 MQでもできますが、hgshelveの方が慣れない人には分かりやすいかと思います。

なお、この記事ではコマンドラインでの使い方だけを解説しました。 TortoiseHgでの使い方は TortoiseHgでshelveを使う も参照してください。

Comments

comments powered by Disqus