【问题标题】:Mercurial - files modified in current branchMercurial - 在当前分支中修改的文件
【发布时间】:2017-01-19 17:02:21
【问题描述】:

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

hg status --rev "branch(foo)"

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

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

【问题讨论】:

    标签: mercurial mercurial-revsets


    【解决方案1】:

    这似乎很简单(请参阅hg help revsetshg help revisions 了解其来源)。

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

    -r 'branch(foo)'
    

    显然,这会产生十几个甚至一百万个修订;但是您想查看“分支创建”(需要检查 first 此类修订的父级)和“分支的当前状态”(需要检查 last 这样的修订。

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

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

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

    要获得与分支中最后一个 commit 的完整差异:

    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 的原因。


    1first 函数选择集合中的第一个,这可能与数字优先的版本不同。例如,假设集合由x | y 组成,y 中的修订在数值上低于x 中的修订,或者您使用reverse(branch(foo)) 将提交按从高到低的顺序排列。在这种情况下,min 而不是 first 将是要使用的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多