MQのつかいかたの質問

107 views
Skip to first unread message

KOIE Hidetaka

unread,
Feb 6, 2010, 12:00:06 AM2/6/10
to mercur...@googlegroups.com
まだまだ修行中の鯉江です。

MQのつかいかたで、いくつか質問があります。

1. パッチを適用した状態で、それをすっかり忘れていて
別のファイルを編集、コミットしようとしてエラーになるという場合、
どうするのがよいのでしょうか。
____________________________________________________________
|
|koie% date >file
|koie% hg commit -A -m xxx file
|koie% hg qnew mypatch
|koie% date >>file
|koie% hg qrefresh
|koie% cat .hg/patches/mypatch
|diff -r 4bb5356012af file
|--- a/file Sat Feb 06 13:33:35 2010 +0900
|+++ b/file Sat Feb 06 13:33:51 2010 +0900
|@@ -1,1 +1,2 @@
| 2010年 2月 6日 土曜日 13時33分23秒 JST
|+2010年 2月 6日 土曜日 13時33分46秒 JST
|koie% date >file2
|koie% hg add file2
|koie% hg commit -m yyy file2
|中止: MQ パッチ適用中はコミットを実施できません
|koie% hg qpop -a
|中止: 作業領域の内容は変更されていますので qrefresh を実施してください
|koie%
|____________________________________________________________

1つは add file2 を revert でとりけして qpop する方法をおもいつきました。
____________________________________________________________
|
|koie% hg revert file2
|koie% hg stat -A file2
|? file2
|koie% hg qpop -a
|mypatch の適用解除
|全てのパッチの適用が解除されました
|koie% hg add file2
|koie% hg commit -m yyy file2
|koie% hg qpush -a
|mypatch を適用中
|適用中の最上位パッチは mypatch です
|koie% hg log --style=compact
|2[qtip,qbase,tip,mypatch] c1d195f32cbe 2010-02-06 13:38 +0900 koie
| imported patch mypatch
|
|1[qparent] 9ed50030c17a 2010-02-06 13:38 +0900 koie
| yyy
|
|0 4bb5356012af 2010-02-06 13:33 +0900 koie
| xxx
|
|koie%
|____________________________________________________________

2. バイナリファイルをMQにとりこむと空パッチになってしまいます。
qrefresh のときに --git をつければよいのですが、
バイナリかどうかを自動判定しないのはなぜでしょうか?
____________________________________________________________
|
|koie% touch file
|koie% hg commit -A -m xxx file
|koie% hg qnew mypatch
|koie% cp /bin/cat file
|koie% ls -l file
|-rw-r--r-- 1 koie wheel 11504 2月 6 13:45 file
|koie% hg qrefresh
|koie% hg qpop -a
|mypatch の適用解除
|全てのパッチの適用が解除されました
|koie% hg qpush -a
|mypatch を適用中
|パッチ mypatch は空です
|適用中の最上位パッチは mypatch です
|koie% ls -l file
|-rw-r--r-- 1 koie wheel 0 2月 6 13:45 file
|koie% cat .hg/patches/mypatch
|diff -r af2df452322f file
|Binary file file has changed
|koie%
|____________________________________________________________

3. MQのパッチの順番を変えたいときは
.hg/patches/seriesを勝手に書き換えるしかないでしょうか?

--
鯉江英隆 <hi...@koie.org>

Yuki KODAMA

unread,
Feb 6, 2010, 12:35:54 AM2/6/10
to mercur...@googlegroups.com
2010/2/6 KOIE Hidetaka <hi...@koie.org>:

> まだまだ修行中の鯉江です。
>
> MQのつかいかたで、いくつか質問があります。
>
> 1. パッチを適用した状態で、それをすっかり忘れていて
> 別のファイルを編集、コミットしようとしてエラーになるという場合、
> どうするのがよいのでしょうか。

その変更点を捨ててもいいのであれば、revertするってのでOKです。
でも破棄したくない場合はqnewでとりあえず新しいパッチに移してしまうのも手です。
それでやっぱりいらなければパッチを削除するだけで済みます。

他だと Shelve (またはAttic) 拡張機能を使うととりあえず別の場所に保管できます:
http://mercurial.selenic.com/wiki/ShelveExtension

Record拡張機能で変更の一部だけを取っておいて、残りの部分は捨てたり、
別パッチを作成して現在のパッチに統合したりもできます。
コマンドラインだと使いにくいのでcursesを使ったCrecoredというのもあります。
それでもこういう操作はTortoiseHgでやるのが一番楽かもしれません。

> 2. バイナリファイルをMQにとりこむと空パッチになってしまいます。
> qrefresh のときに --git をつければよいのですが、
> バイナリかどうかを自動判定しないのはなぜでしょうか?

おそらくほとんどの人が hgrc で以下のように:

[diff]
git = True

このように常にgit形式の差分を使用しているためです。
これを設定しておけば出ない気がするような(未確認)。

> 3. MQのパッチの順番を変えたいときは
> .hg/patches/seriesを勝手に書き換えるしかないでしょうか?

今のところそうですね。ただ、適用済みのパッチの移動はあぶないです。
未適用パッチであっても、絶対にコンフリクトしないとわかっているパッチのみ
移動してください。

一応 Qup という拡張機能がありますが:
http://mercurial.selenic.com/wiki/QupExtension
機能は非常に限定的です。

3/1リリース予定の TortoiseHg 0.10では標準でパッチの移動ができるようになりますので、
それを待つのも手です。もちろん危険であることは変わりませんが・・・。

> --
> 鯉江英隆 <hi...@koie.org>
>
> --
> from Mercurial 日本語コミュニティ <mercur...@googlegroups.com>
> ※ ヘルプ表示は http://groups.google.com/group/mercurial-ja?hl=ja

--
Yuki KODAMA

KOIE Hidetaka

unread,
Feb 6, 2010, 2:39:36 AM2/6/10
to mercur...@googlegroups.com
Message-Id: <28ba5bda1002052135p63...@mail.gmail...
Date: Sat, 6 Feb 2010 14:35:54 +0900
From: Yuki KODAMA <yuki....@gmail.com>
Subject: Re: [mercurial-ja:385] MQのつかいかたの質問

| > MQのつかいかたで、いくつか質問があります。
| >
| > 1. パッチを適用した状態で、それをすっかり忘れていて
| > 別のファイルを編集、コミットしようとしてエラーになるという場合、
| > どうするのがよいのでしょうか。
|
| その変更点を捨ててもいいのであれば、revertするってのでOKです。
| でも破棄したくない場合はqnewでとりあえず新しいパッチに移してしまうのも手です。
| それでやっぱりいらなければパッチを削除するだけで済みます。

あとから加えた修正を先にコミットしたい場合は、このような手順になるでしょうか:
1. hg qnew -fで修正をパッチ化
2. hg qpop -aでパッチ適用なしの状態にする
3. .hg/patches/seriesを編集して先頭にもってくる
4. hg qpush; hg qrefresh -m xxx; hg qfinish -a

| 他だと Shelve (またはAttic) 拡張機能を使うととりあえず別の場所に保管できます:
| http://mercurial.selenic.com/wiki/ShelveExtension
|
| Record拡張機能で変更の一部だけを取っておいて、残りの部分は捨てたり、
| 別パッチを作成して現在のパッチに統合したりもできます。
| コマンドラインだと使いにくいのでcursesを使ったCrecoredというのもあります。
| それでもこういう操作はTortoiseHgでやるのが一番楽かもしれません。

shelveやrecordは便利そうですね。recordをさわってみましたが、
yとn以外の操作は熟練職人でないとつかいこなせないですね。
TortoiseHgのGUIだと直感的に操作できるので安心感がありますね。

ところで、必要になる場面はすくないとおもいますが、
たまたま1つにくっついてしまったhunkを分割するということはできないんですよね?

| > 2. バイナリファイルをMQにとりこむと空パッチになってしまいます。
| > qrefresh のときに --git をつければよいのですが、
| > バイナリかどうかを自動判定しないのはなぜでしょうか?
|
| おそらくほとんどの人が hgrc で以下のように:
|
| [diff]
| git = True
|
| このように常にgit形式の差分を使用しているためです。
| これを設定しておけば出ない気がするような(未確認)。

~/.hgrcにこの設定を追加したら、qrefreshのときにもgit形式でパッチができました。

|
| > 3. MQのパッチの順番を変えたいときは
| > .hg/patches/seriesを勝手に書き換えるしかないでしょうか?
|
| 今のところそうですね。ただ、適用済みのパッチの移動はあぶないです。
| 未適用パッチであっても、絶対にコンフリクトしないとわかっているパッチのみ
| 移動してください。
|
| 一応 Qup という拡張機能がありますが:
| http://mercurial.selenic.com/wiki/QupExtension
| 機能は非常に限定的です。
|
| 3/1リリース予定の TortoiseHg 0.10では標準でパッチの移動ができるようになりますので、
| それを待つのも手です。もちろん危険であることは変わりませんが・・・。

qupをつかえば適用ずみかどうかチェックがはいるみたいですね。

--
鯉江英隆 <hi...@koie.org>

Yuki KODAMA

unread,
Feb 6, 2010, 2:50:33 AM2/6/10
to mercur...@googlegroups.com
2010/2/6 KOIE Hidetaka <hi...@koie.org>:

> Message-Id: <28ba5bda1002052135p63...@mail.gmail...
> Date: Sat, 6 Feb 2010 14:35:54 +0900
> From: Yuki KODAMA <yuki....@gmail.com>
> Subject: Re: [mercurial-ja:385] MQのつかいかたの質問
>
> | > MQのつかいかたで、いくつか質問があります。
> | >
> | > 1. パッチを適用した状態で、それをすっかり忘れていて
> | > 別のファイルを編集、コミットしようとしてエラーになるという場合、
> | > どうするのがよいのでしょうか。
> |
> | その変更点を捨ててもいいのであれば、revertするってのでOKです。
> | でも破棄したくない場合はqnewでとりあえず新しいパッチに移してしまうのも手です。
> | それでやっぱりいらなければパッチを削除するだけで済みます。
>
> あとから加えた修正を先にコミットしたい場合は、このような手順になるでしょうか:
> 1. hg qnew -fで修正をパッチ化
> 2. hg qpop -aでパッチ適用なしの状態にする
> 3. .hg/patches/seriesを編集して先頭にもってくる
> 4. hg qpush; hg qrefresh -m xxx; hg qfinish -a

これでOKです。

> | 他だと Shelve (またはAttic) 拡張機能を使うととりあえず別の場所に保管できます:
> | http://mercurial.selenic.com/wiki/ShelveExtension
> |
> | Record拡張機能で変更の一部だけを取っておいて、残りの部分は捨てたり、
> | 別パッチを作成して現在のパッチに統合したりもできます。
> | コマンドラインだと使いにくいのでcursesを使ったCrecoredというのもあります。
> | それでもこういう操作はTortoiseHgでやるのが一番楽かもしれません。
>
> shelveやrecordは便利そうですね。recordをさわってみましたが、
> yとn以外の操作は熟練職人でないとつかいこなせないですね。
> TortoiseHgのGUIだと直感的に操作できるので安心感がありますね。

コミット・QRefreshの前にプレビューできるのがいいですよね。

> ところで、必要になる場面はすくないとおもいますが、
> たまたま1つにくっついてしまったhunkを分割するということはできないんですよね?

今のところ無理ですねぇ。
TortoiseHgにはずいぶん前から要望として挙がってますが、
未だに実装されていません。もし実装されれば行単位で選択可能になります。
やはりみんなときどきしか困らないからモチベーションが低いのかも。

> | > 2. バイナリファイルをMQにとりこむと空パッチになってしまいます。
> | > qrefresh のときに --git をつければよいのですが、
> | > バイナリかどうかを自動判定しないのはなぜでしょうか?
> |
> | おそらくほとんどの人が hgrc で以下のように:
> |
> | [diff]
> | git = True
> |
> | このように常にgit形式の差分を使用しているためです。
> | これを設定しておけば出ない気がするような(未確認)。
>
> ~/.hgrcにこの設定を追加したら、qrefreshのときにもgit形式でパッチができました。
>
> |
> | > 3. MQのパッチの順番を変えたいときは
> | > .hg/patches/seriesを勝手に書き換えるしかないでしょうか?
> |
> | 今のところそうですね。ただ、適用済みのパッチの移動はあぶないです。
> | 未適用パッチであっても、絶対にコンフリクトしないとわかっているパッチのみ
> | 移動してください。
> |
> | 一応 Qup という拡張機能がありますが:
> | http://mercurial.selenic.com/wiki/QupExtension
> | 機能は非常に限定的です。
> |
> | 3/1リリース予定の TortoiseHg 0.10では標準でパッチの移動ができるようになりますので、
> | それを待つのも手です。もちろん危険であることは変わりませんが・・・。
>
> qupをつかえば適用ずみかどうかチェックがはいるみたいですね。

ですね。ただそれ以上のチェックはしないので注意です。
適用してみるまでわからない、という。

Yuya Nishihara

unread,
Feb 6, 2010, 3:22:07 AM2/6/10
to mercur...@googlegroups.com
西原です。こんにちは。

KOIE Hidetaka wrote:
> あとから加えた修正を先にコミットしたい場合は、このような手順になるでしょうか:
> 1. hg qnew -fで修正をパッチ化
> 2. hg qpop -aでパッチ適用なしの状態にする
> 3. .hg/patches/seriesを編集して先頭にもってくる
> 4. hg qpush; hg qrefresh -m xxx; hg qfinish -a

手順 1. の -f (--force) が気持ち悪ければ、代わりに qrecord が使えます。

> 1. パッチを適用した状態で、それをすっかり忘れていて
> 別のファイルを編集、コミットしようとしてエラーになるという場合、

で、私もしょっちゅうやってしまうので、シェルのプロンプトに Mq パッチを
表示させるようにしています。

http://bitbucket.org/yuja/vcprompt/

> | > 2. バイナリファイルをMQにとりこむと空パッチになってしまいます。
> | > qrefresh のときに --git をつければよいのですが、
> | > バイナリかどうかを自動判定しないのはなぜでしょうか?

qrefresh 時にバイナリファイルを警告してくれるといいですよね。
「--git を指定しろ」みたいな。

> | > 3. MQのパッチの順番を変えたいときは
> | > .hg/patches/seriesを勝手に書き換えるしかないでしょうか?
> |

先日 mercurial-devel でも話題に上っていました。
.hg ディレクトリの中身を書き換えさせるのはどうよ? …とはみんな思っている
ようです。

http://markmail.org/thread/35w5nbiltwtk6exu

Shun-ichi GOTO

unread,
Feb 6, 2010, 4:17:40 AM2/6/10
to mercur...@googlegroups.com
2010年2月6日16:39 KOIE Hidetaka <hi...@koie.org>:

> Message-Id: <28ba5bda1002052135p63...@mail.gmail...
> Date: Sat, 6 Feb 2010 14:35:54 +0900
> From: Yuki KODAMA <yuki....@gmail.com>
> Subject: Re: [mercurial-ja:385] MQのつかいかたの質問
>
> | > MQのつかいかたで、いくつか質問があります。
> | >
> | > 1. パッチを適用した状態で、それをすっかり忘れていて
> | > 別のファイルを編集、コミットしようとしてエラーになるという場合、
> | > どうするのがよいのでしょうか。
> |
> | その変更点を捨ててもいいのであれば、revertするってのでOKです。
> | でも破棄したくない場合はqnewでとりあえず新しいパッチに移してしまうのも手です。
> | それでやっぱりいらなければパッチを削除するだけで済みます。
>
> あとから加えた修正を先にコミットしたい場合は、このような手順になるでしょうか:
> 1. hg qnew -fで修正をパッチ化
> 2. hg qpop -aでパッチ適用なしの状態にする
> 3. .hg/patches/seriesを編集して先頭にもってくる
> 4. hg qpush; hg qrefresh -m xxx; hg qfinish -a

(鯉江さんも使ってるはずですが) 自分はEmacsを使ってますので、修正が複雑
でなければ mercurial.el の機能で diff をとってバッファに残しておき、コ
マンドラインで hg qpop -a した後に diffバッファ(diff-mode)にてhunkを適用
(C-c C-a)していくという方法をよく使います。

ついでにいうと複数に分けるべきだった修正/パッチなども、この方法で部分的
にhunkを適用 & commit を繰り返すことでパッチの分割、というのもよくやり
ます。

手動ではありますが。

--
Shun-ichi GOTO

KOIE Hidetaka

unread,
Feb 7, 2010, 10:34:09 AM2/7/10
to mercur...@googlegroups.com
Message-Id: <201002061722...@gmail.com>
Date: Sat, 6 Feb 2010 17:22:07 +0900
From: Yuya Nishihara <you...@gmail.com>
Subject: Re: [mercurial-ja:388] MQのつかいかたの質問

| > あとから加えた修正を先にコミットしたい場合は、このような手順になるでしょうか:
| > 1. hg qnew -fで修正をパッチ化
| > 2. hg qpop -aでパッチ適用なしの状態にする
| > 3. .hg/patches/seriesを編集して先頭にもってくる
| > 4. hg qpush; hg qrefresh -m xxx; hg qfinish -a
|
| 手順 1. の -f (--force) が気持ち悪ければ、代わりに qrecord が使えます。

普段diffをみながらcommitしているので
最初からrecord系をつかった方がいいですね。

| > 1. パッチを適用した状態で、それをすっかり忘れていて
| > 別のファイルを編集、コミットしようとしてエラーになるという場合、
|
| で、私もしょっちゅうやってしまうので、シェルのプロンプトに Mq パッチを
| 表示させるようにしています。
|
| http://bitbucket.org/yuja/vcprompt/

つかいかたがわからなかったのでソースをみました。
vcprompt -f '[%n:%b%m%u %r] '
でパッチ名が出ました。
%mは現状だれもセットしないんですね..#コストがかかるから実質使えないでしょうね。

| > | > 3. MQのパッチの順番を変えたいときは
| > | > .hg/patches/seriesを勝手に書き換えるしかないでしょうか?
| > |
|
| 先日 mercurial-devel でも話題に上っていました。
| .hg ディレクトリの中身を書き換えさせるのはどうよ? …とはみんな思っている
| ようです。
|
| http://markmail.org/thread/35w5nbiltwtk6exu

この議論にはまったくついていけませんでた。

--
鯉江英隆 <hi...@koie.org>

KOIE Hidetaka

unread,
Feb 7, 2010, 10:45:11 AM2/7/10
to mercur...@googlegroups.com
Message-Id: <2288dbd91002060117w6b...@mail.gmail...
Date: Sat, 6 Feb 2010 18:17:40 +0900
From: Shun-ichi GOTO <shunic...@gmail.com>
Subject: Re: [mercurial-ja:389] MQのつかいかたの質問

| (鯉江さんも使ってるはずですが) 自分はEmacsを使ってますので、修正が複雑
| でなければ mercurial.el の機能で diff をとってバッファに残しておき、コ
| マンドラインで hg qpop -a した後に diffバッファ(diff-mode)にてhunkを適用
| (C-c C-a)していくという方法をよく使います。
|
| ついでにいうと複数に分けるべきだった修正/パッチなども、この方法で部分的
| にhunkを適用 & commit を繰り返すことでパッチの分割、というのもよくやり
| ます。

diff-modeはみるだけでapplyができるとは知りませんでした。
手元で試してみた感じだと以下のような手順になるでしょうか:

0. 修正した
1. M-x vc-diff + C-x C-w diff RET
2. M-x vc-revert
3. C-x C-f diff RET
4. C-c C-a で必要なのをapplyしていき commit

--
鯉江英隆 <hi...@koie.org>

Shun-ichi GOTO

unread,
Feb 7, 2010, 5:57:40 PM2/7/10
to mercur...@googlegroups.com
2010年2月8日0:45 KOIE Hidetaka <hi...@koie.org>:

> diff-modeはみるだけでapplyができるとは知りませんでした。
> 手元で試してみた感じだと以下のような手順になるでしょうか:
>
> 0. 修正した
> 1. M-x vc-diff + C-x C-w diff RET
> 2. M-x vc-revert
> 3. C-x C-f diff RET
> 4. C-c C-a で必要なのをapplyしていき commit

そんな感じです。diff結果をファイルに保存するかどうかは状況に応じて
お好みで。複雑でなければ on-memory でやってしまうことが多いです。

少量なら hg revert / vc-revert するかわりに分割して次のコミットに回したい
hunkを C-u C-c C-a で逆適用していき、一度 commit し、今度はそれらを
再適用して2nd commit というやりかあもあります。

# 逆適用は紛れ込んでしまった修正や無駄な修正を見つけて取り除くのにも便利。

その他にも diff モードバッファ内で k (diff-hunk-kill)で適用済みのhunkを削除し
て整理したり、分割したい修正が1つのhunkに入ってしまってる場合などは
C-c C-s (diff-split-hunk)でhunkを分けるといった操作も有用です。

--
Shun-ichi GOTO

Yuya Nishihara

unread,
Feb 14, 2010, 7:35:35 AM2/14/10
to mercur...@googlegroups.com
西原です。

> > | > 2. バイナリファイルをMQにとりこむと空パッチになってしまいます。
> > | > qrefresh のときに --git をつければよいのですが、
> > | > バイナリかどうかを自動判定しないのはなぜでしょうか?
>
> qrefresh 時にバイナリファイルを警告してくれるといいですよね。
> 「--git を指定しろ」みたいな。

Mercurial 1.5 から自動判別が入りそうです。

http://hg.intevation.org/mercurial/crew/rev/9c2c94934f0d

順調に行けば 1.5 は 3 月 1 日リリースかな。

KOIE Hidetaka

unread,
Feb 25, 2010, 7:10:54 AM2/25/10
to mercur...@googlegroups.com
Message-Id: <201002061722...@gmail.com>
Date: Sat, 6 Feb 2010 17:22:07 +0900
From: Yuya Nishihara <you...@gmail.com>
Subject: Re: [mercurial-ja:388] MQのつかいかたの質問

| で、私もしょっちゅうやってしまうので、シェルのプロンプトに Mq パッチを
| 表示させるようにしています。
|
| http://bitbucket.org/yuja/vcprompt/

ヘルプを追加してみました。
あと、-Wextraをつけたときのwarning対策をしてみました。

--
鯉江英隆 <hi...@koie.org>

diff-vcprompt

Yuya Nishihara

unread,
Feb 25, 2010, 9:28:27 AM2/25/10
to mercur...@googlegroups.com
西原です。こんばんは。

KOIE Hidetaka wrote:
> Subject: Re: [mercurial-ja:388] MQのつかいかたの質問

...
> ヘルプを追加してみました。

push しました。どうも!

http://bitbucket.org/yuja/vcprompt/

> あと、-Wextraをつけたときのwarning対策をしてみました。

int i; を size_t i; に変えるのはどうでしょうか?

extrawarning.diff

KOIE Hidetaka

unread,
Feb 25, 2010, 7:48:26 PM2/25/10
to mercur...@googlegroups.com
Message-Id: <201002252328...@gmail.com>
Date: Thu, 25 Feb 2010 23:28:27 +0900
From: Yuya Nishihara <you...@gmail.com>
Subject: Re: vcpromptへのパッチ (was: [mercurial-ja:406] MQのつか..

| > あと、-Wextraをつけたときのwarning対策をしてみました。
|
| int i; を size_t i; に変えるのはどうでしょうか?

size_tの方がいいです。
ただstrlen(format)は毎回呼ぶのもモッタイナイとおもったんで
ループの外の出した方がよいとおもいます。

--
鯉江英隆 <hi...@koie.org>

Yuya Nishihara

unread,
Feb 26, 2010, 12:53:46 PM2/26/10
to mercur...@googlegroups.com
こんばんは。

※ Mercurial の話題からそれてしまってすみません

KOIE Hidetaka wrote:
> size_tの方がいいです。
> ただstrlen(format)は毎回呼ぶのもモッタイナイとおもったんで
> ループの外の出した方がよいとおもいます。

size_t でいきましょう。
で、アセンブラを吐かせてみた所、 gcc は strlen をループ外に出してくれ
てるようなので、ここは可読性をとりたいと思います。

SH4 のアセンブラしか書いたことが無いんで、 x86 のコードをちゃんと読め
てる自信は無いですけど。 -o-


来週いよいよ Mercurial 1.5, TortoiseHg 1.0 リリースですね。
TortoiseHg は野暮ったい中間ダイアログが取れていて、かなり好印象です。

それでは。

Reply all
Reply to author
Forward
0 new messages