1

リポジトリが特定の既知の以前の状態にあった場合に完全に適用される順次パッチのリストを出力するコマンドを探しています。これは、私が遭遇したいくつかのhg glog問題を含むリポジトリです (自分のクローンでプレイしたい場合は、 https://bitbucket.org/dusty/funny_repo/からも入手できます):

@  changeset:   8:ffd749c92f3b
|  tag:         tip
|  summary:     h
|
o    changeset:   7:bc959885f6aa
|\   parent:      6:dfe021fa52a4
| |  parent:      5:4d8bc738f0ab
| |  summary:     MERGE
| |
| o  changeset:   6:dfe021fa52a4
| |  parent:      3:1374ea53e7b7
| |  summary:     e
| |
o |  changeset:   5:4d8bc738f0ab
| |  branch:      branch2
| |  summary:     g
| |
o |  changeset:   4:e46fa4632d36
|/   branch:      branch2
|    summary:     f
|
o  changeset:   3:1374ea53e7b7
|  summary:     d
|
o  changeset:   2:59712a781f0c
|  branch:      branch1
|  summary:     c
|
o  changeset:   1:ff7f8724ad17
|  branch:      branch1
|  summary:     b
|
o  changeset:   0:a3b3a87aa422
   summary:     a

hg export基本的に、変更セット 0、1、2、3、6、7、および 8 を出力するために、どのリビジョンセットに渡すかを知りたいのです。これらの変更セットの「効果」が適用されるため、変更セット 4 および 5 は必要ありません。変更セット 6 のマージ コミットで。

ancestors(default)すべての変更セットを出力しますが、変更branch('default')セット 1 と 2 を無視します。変更セット 1 と 2 は、別のブランチ上にあり、パッチを完全に適用するために必要です。

明らかに、このインスタンスでは使用できますhg log -r "0..default and not branch(branch2)"が、すべてのケースで機能するより一般的なコマンド revset を探しています。

テストのために、コマンドhg export -r "0..default and not branch(branch2)" -o ../%R.patchと次の for ループを使用して、結果のパッチを適用しています。

cd ../
mkdir patched
cd patched
for n in ../*.patch ; do
    patch -p1 <$n
done
4

1 に答える 1

0

より一般的な試み:

  • それでも、1つの予備的な人間によるチェックと構成アクションが必要です。
  • 比較的新しいMercurialでのみ機能し、p(1 | 2)関数がrevsetに追加されます

事前チェック:マージセットのあるリポジトリの場合、使用するマージセットの親行を定義する必要があります。p1(MERGESET)とp2(MERGESET)には「Whoiswho」と表示されます。マージセットの改訂を覚えておいてください。あなたのためにテストケース

hg log -r "p1(7)"
changeset:   6:dfe021fa52a4
parent:      3:1374ea53e7b7
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:54:01 2012 -0700
summary:     e

hg log -r "p2(7)"
changeset:   5:4d8bc738f0ab
branch:      branch2
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:53:55 2012 -0700
summary:     g

そしてただ注意してください:p1ラインは生き残る必要があります。

  • 何かの除外は「x--y」(または「xと!y」ですが、最初の形式は単に読み取り可能です)です。

  • 私たちの場合のxは完全な履歴です

0:tip)、

y- p1(7)のすべての間接的な親戚

! (ancestors(p1(7)) | descendants(p1(7)))

  • 最終的なリビジョンセットは"0:tip - ! (ancestors(p1(7)) | descendants(p1(7)))"

リポジトリでのrevsetのテスト実行

hg log -r "0:tip - ! (ancestors(p1(7)) | descendants(p1(7)))"
changeset:   0:a3b3a87aa422
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:51:43 2012 -0700
summary:     a

changeset:   1:ff7f8724ad17
branch:      branch1
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:52:25 2012 -0700
summary:     b

changeset:   2:59712a781f0c
branch:      branch1
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:52:27 2012 -0700
summary:     c

changeset:   3:1374ea53e7b7
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:52:36 2012 -0700
summary:     d

changeset:   6:dfe021fa52a4
parent:      3:1374ea53e7b7
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:54:01 2012 -0700
summary:     e

changeset:   7:bc959885f6aa
parent:      6:dfe021fa52a4
parent:      5:4d8bc738f0ab
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:54:20 2012 -0700
summary:     MERGE

changeset:   8:ffd749c92f3b
tag:         tip
user:        Dusty Phillips <dusty@buchuki.com>
date:        Mon Dec 17 17:54:25 2012 -0700
summary:     h

最終編集

正式な論理の教訓を思い出します。式「x-! SET」(xにはあるが、設定されていない)には二重否定があります。精製されたレブセットはプレーンでクリーンです

"ancestors(p1(7)) | descendants(p1(7))"

(これも| p1(7)最初は追跡されていましたが、現在/ Mercurial Distributed SCM (version 2.4.2)/、私には不明な理由で、チェンジセットは自分の祖先であり子孫です:hg log -r "ancestors(p1(7)) & descendants(p1(7))"チェンジセット6を返します)

于 2013-01-11T23:01:15.757 に答える