【问题标题】:What is the git equivalent of Mercurial revsets?Mercurial revsets 的 git 等价物是什么?
【发布时间】:2014-03-20 00:00:00
【问题描述】:

Mercurial 有一种名为 revsets 的特定领域语言,允许用户指定修订集。

例如,您可能希望列出尚未合并到分支default 中的补丁:

hg log -r "all() - ancestors('default')"

作为一个更复杂的示例,上面的链接给出了列出标记为 1.3 的修订版和标记为 1.5 的修订版之间的变更集的示例,其中提到了“错误”并影响了目录 hgext 中的文件:

hg log -r "1.3::1.5 and keyword(bug) and file('hgext/*')"

revset 语言非常丰富,允许根据日期、用户名、提交消息、提交是否存在于特定远程位置等来选择变更集。

git 是否有等效的机制来查询变更集,无论是在核心程序中还是作为扩展提供?

【问题讨论】:

  • 语言完全不同,但 git 中用于生成修订列表的一般命令是 git rev-list。大多数 git 命令都使用它(或者直接通过编译访问,或者通过调用它作为命令,因为它们本身就是 shell 脚本)。如果仅git rev-list 不够用,您可以编写读取其输出、提供输入等的 shell 脚本。
  • @torek:使用revsets 的意义在于我厌倦了编写shell 脚本:)git rev-list 看起来至少提供了revsets 的部分功能。您是否会考虑将您的评论作为答案,或许可以对两者进行快速比较?
  • 恐怕比较会变得很长并且我对 hg revsets 的行为不太熟悉(我一直对 hg 和例如 git),所以我有点犹豫 :-)
  • 您有什么具体的需要帮助编写脚本的吗?
  • @davidg,虽然我祝你好运实现这一点,但我首先考虑你似乎是地球上第一个想要这种东西的人。我的意思是,在 Git 周围有一群高效的黑客,但还没有人想实现这样的功能。对我来说,这意味着最好只采用解决问题的方法,即使他们目前觉得不如你在 Mecrurial 中学到的方法。

标签: git mercurial mercurial-revsets


【解决方案1】:

要列出除默认主分支之外的所有提交,就像我假设第一个示例所做的那样:

git log --all --not master

要获得与第二个示例相同的结果:

git log 1.3...1.5 --grep="bug" -- hgext

【讨论】:

  • 感谢您的想法。您的回答确实解决了我给出的特定示例,但不是我希望的通用解决方案。我真的很希望有一个插件/扩展,它提供一个 DSL 来指定类似于 Mercurial 的 revsets DSL 的修订。形象地说,您已经使用grep 解决了我的示例,而我真正想要的是 SQL。目前 git 似乎不存在这样的 DSL,但我会留下这个问题,以防将来发生变化。 (我应该举更多有趣的例子;当orand 谓词嵌套时,grep 开始分解。
  • 我理解这个问题,但是,可以在 git log 中添加多个 grep 参数,每个 grep 参数就像一个 or 子句,假设您要匹配字符串“Create”或字符串“添加”你可以运行git log --grep "Create" --grep "Add"对于受影响的文件或文件夹,只需在 -- 参数后添加你想要包含的文件/文件夹。
【解决方案2】:

git 是否有等效的机制来查询变更集,无论是在核心程序中还是作为扩展提供?

在 git 中最接近的等价物是 gitrevisions(7),但它完全是临时的,而且明显不那么规则,也不那么可组合。并非所有命令都使用它(众所周知,git diff 具有相同的构造,但行为完全不同,因为 gitrevisions 适用于范围,但 git diff 适用于成对提交)。

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2017-09-23
    • 2010-10-09
    相关资源
    最近更新 更多