Mercurial - 在当前分支

时间:2017-01-19 17:02:22

标签: mercurial mercurial-revsets

你能帮我为mercurial hg status创建一个合适的revset吗? 我想列出自创建以来当前分支中已更改的所有文件。 我试过了

hg status --rev "branch(foo)"

其中foo是我的分支的名称,但是这也列出了在创建分支的分支中更改的文件(?)。 我不知道如何为此创建一个适当的revset。

我创建了我的分支并在多个文件中进行了多处更改。现在我想在我的应用程序中重新加载这些文件,但只有它们。

1 个答案:

答案 0 :(得分:1)

这看起来非常简单(请参阅hg help revsetshg help revisions了解其来源)。

我们可以从分支中所有提交的集合开始,例如,对于分支foo

-r 'branch(foo)'

显然,这可以产生十几个,甚至一百万个版本;但是你想看看"分支创建"之间发生了什么 - 它需要检查第一个这样的修订的父级 - 以及"分支的当前状态",需要检查最后这样的修订。

大集合的第一个 1 修订版由first()获得,最后一个由last()获得。但是,当为各种命令提供修订说明符时,它们会将其查找为单个修订版,并且此处的分支名称足以命名分支上的最后一次提交。

要获取修订版的(第一个)父级,我们使用p1()函数(后缀^仅允许在文字修订版上,而不是返回修订版的函数)。因此,分支foo上的第一个修订版的父级是:

-r 'p1(first(branch(foo)))'

要对分支中的最后一个提交获取完全差异:

hg diff -r 'p1(first(branch(foo)))' -r 'foo'

但是你不想要一个完整的差异,你想要文件名。产生它的命令是hg status,它的语法略有不同:

hg status --rev 'p1(first(branch(foo)))' --rev 'foo'

状态包括前面的字母以及名称:A表示新添加的文件,M表示已修改的文件,等等。请注意使用--rev而非-r(事实上,您也可以将--revhg diff一起使用。)

请注意,有一个更短的语法::foo,它可以获取给定分支的所有祖先,包括命名分支中的最后一个修订。但是,这会导致太多祖先。但是,您可以使用p1(first(branch(foo)))::foo作为--rev的(整个)参数,这也有效。这样:

hg status --rev 'p1(first(branch(foo)))::foo`

是一种稍微简短的表达方式。

最后,请注意,将分支中的第一个提交与最后一个提交进行比较(例如,与hg status --rev 'first(branch(foo))' --rev foo一样)可能会错过在分支上的第一次提交中所做的更改。这就是我们在这里使用p1的原因。

1 first函数选择集合中的第一个,它可能与数字第一个修订版本不同。例如,假设该集合来自x | yy中的修订版在数字上低于x中的修订版,或者您使用reverse(branch(foo))将提交设置为高到低顺序。在这种情况下,min代替first将是要使用的功能。

相关问题