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>
その変更点を捨ててもいいのであれば、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
| > 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>
これで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をつかえば適用ずみかどうかチェックがはいるみたいですね。
ですね。ただそれ以上のチェックはしないので注意です。
適用してみるまでわからない、という。
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 ディレクトリの中身を書き換えさせるのはどうよ? …とはみんな思っている
ようです。
(鯉江さんも使ってるはずですが) 自分はEmacsを使ってますので、修正が複雑
でなければ mercurial.el の機能で diff をとってバッファに残しておき、コ
マンドラインで hg qpop -a した後に diffバッファ(diff-mode)にてhunkを適用
(C-c C-a)していくという方法をよく使います。
ついでにいうと複数に分けるべきだった修正/パッチなども、この方法で部分的
にhunkを適用 & commit を繰り返すことでパッチの分割、というのもよくやり
ます。
手動ではありますが。
--
Shun-ichi GOTO
| > あとから加えた修正を先にコミットしたい場合は、このような手順になるでしょうか:
| > 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>
| (鯉江さんも使ってるはずですが) 自分は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>
そんな感じです。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
> > | > 2. バイナリファイルをMQにとりこむと空パッチになってしまいます。
> > | > qrefresh のときに --git をつければよいのですが、
> > | > バイナリかどうかを自動判定しないのはなぜでしょうか?
>
> qrefresh 時にバイナリファイルを警告してくれるといいですよね。
> 「--git を指定しろ」みたいな。
Mercurial 1.5 から自動判別が入りそうです。
http://hg.intevation.org/mercurial/crew/rev/9c2c94934f0d
順調に行けば 1.5 は 3 月 1 日リリースかな。
| で、私もしょっちゅうやってしまうので、シェルのプロンプトに Mq パッチを
| 表示させるようにしています。
|
| http://bitbucket.org/yuja/vcprompt/
ヘルプを追加してみました。
あと、-Wextraをつけたときのwarning対策をしてみました。
--
鯉江英隆 <hi...@koie.org>
KOIE Hidetaka wrote:
> Subject: Re: [mercurial-ja:388] MQのつかいかたの質問
...
> ヘルプを追加してみました。
push しました。どうも!
http://bitbucket.org/yuja/vcprompt/
> あと、-Wextraをつけたときのwarning対策をしてみました。
int i; を size_t i; に変えるのはどうでしょうか?
| > あと、-Wextraをつけたときのwarning対策をしてみました。
|
| int i; を size_t i; に変えるのはどうでしょうか?
size_tの方がいいです。
ただstrlen(format)は毎回呼ぶのもモッタイナイとおもったんで
ループの外の出した方がよいとおもいます。
--
鯉江英隆 <hi...@koie.org>
※ Mercurial の話題からそれてしまってすみません
KOIE Hidetaka wrote:
> size_tの方がいいです。
> ただstrlen(format)は毎回呼ぶのもモッタイナイとおもったんで
> ループの外の出した方がよいとおもいます。
size_t でいきましょう。
で、アセンブラを吐かせてみた所、 gcc は strlen をループ外に出してくれ
てるようなので、ここは可読性をとりたいと思います。
SH4 のアセンブラしか書いたことが無いんで、 x86 のコードをちゃんと読め
てる自信は無いですけど。 -o-
来週いよいよ Mercurial 1.5, TortoiseHg 1.0 リリースですね。
TortoiseHg は野暮ったい中間ダイアログが取れていて、かなり好印象です。
それでは。