【问题标题】:Search specific git commit by commit message and exlude branches通过提交消息搜索特定的 git commit 并排除分支
【发布时间】:2014-09-19 08:38:17
【问题描述】:

我目前正在开发一个程序来过滤存储在命令行数据库中的慢速数据库查询。

我想搜索除指定分支之外的所有分支中的所有提交,并返回所有匹配的提交。

我的过滤条件存储在数据库中(为我提供)。

例子:

我在数据库中有以下条目:

ID key       Query
1  ABCDEF    select * from example
2  0ABCDE    select * from another_example
3  1ABCDE    select * from you_get_the_picture

我现在对代码中尚未修复的查询感兴趣。所以我需要使用 key 作为搜索过滤器来搜索分支。

如果在提交中找到密钥,则跳过并查找下一个。如果未找到匹配项,则将其打印到标准输出。所有代码都可以正常工作,但我无法找到正确的 git 命令。

我有以下:

git grep 'ABCDEF' $(git rev-list ^origin/master) | xargs git show -s --format=%N%s

这应该返回除 origin/master 之外的所有分支的提交消息中包含“ABCDEF”的所有提交。

但是,git 命令不会返回任何不可能的内容,因为我知道这些提交就在那里。

我的 git 命令不正确吗?在此先感谢您的任何指点。

【问题讨论】:

  • 您是否验证过 git grep 'ABCDEF' $(git rev-list ^origin/master) 为您提供了预期的输出?
  • 我已经检查了 git grep 'ABCDEF' $(git rev-list --all) 并且结果还可以。我现在正在检查,但需要一段时间...

标签: git git-branch git-commit git-show


【解决方案1】:

您现在(2021 年 5 月,七年后)使用 Git 2.32(2021 年第二季度)有了更精确的过滤机制:“git rev-list(man) 学习了 --filter=object:type=<type>选项,可用于从 pack-objects 生成的包文件中排除给定类型的对象。

commit 9cf68b2commit 169a15ecommit 7ab6aafcommit b0c42a5(2021 年 4 月 19 日)、commit 9a2a4f9(2021 年 4 月 12 日)和commit 628d81bcommit b2025da、@9876211@(2020 年 4 月 9 日) ) by Patrick Steinhardt (pks-t)
(由 Junio C Hamano -- gitster -- 合并于 commit 8585d6c,2021 年 5 月 7 日)

list-objects:实现对象类型过滤器

签字人:Patrick Steinhardt

虽然已经可以在git-rev-list 中按某些条件过滤对象,但还不能只过滤掉特定类型的对象。

这会降低一些过滤器的用处。

blob:limit 过滤器例如过滤 blob,以便只返回小于给定限制的 blob。
但考虑到git-rev-list 将继续打印标签、提交和树,只要求这些小块是不合适的。

现在我们已经有了过滤标签和提交的基础设施,我们可以通过实施一个新的过滤器来改善这种情况,该过滤器根据对象的类型选择对象。
因此,上述查询可以使用以下命令轻松实现:

$ git rev-list --objects --filter=object:type=blob \
    --filter=blob:limit=200

此外,此过滤器允许针对某些其他情况进行优化:例如,如果仅选择了标签或提交,则无需遍历树。

位图中尚不支持新过滤器。
这将在后续提交中实现。

git config 现在包含在其man page 中:

blob:limitobject:typetreesparse:oidcombine。 如果使用组合过滤器,combine 和所有嵌套的 必须允许过滤器种类。默认为uploadpackfilter.allow

rev-list-options 现在包含在其man page 中:

--filter=object:type=(tag|commit|tree|blob)”形式省略了所有对象 不属于请求的类型。

还有:

rev-list: 允许过滤提供的项目

签字人:Patrick Steinhardt

提供对象过滤器时,目前无法同时过滤提供的项目。
例如
在执行 git rev-list(man) HEAD 时,此引用指向的提交将被视为用户提供,因此被排除在过滤机制之外。
这使得正确使用新的--filter=object:type 过滤器变得比必要更加困难,因为即使用户只想查看 blob,他仍然会看到提供的引用的提交。

通过在 git-rev-parse(1) 命令中引入一个新的 --filter-provided-objects 选项来改进这一点。
如果给出,则所有用户提供的参考都将受到过滤。

rev-list-options 现在包含在其man page 中:

--filter-provided-objects

过滤显式提供的对象列表,否则会 即使它们与任何过滤器都不匹配,也总是会被打印出来。仅有的 与--filter= 一起使用。

【讨论】:

    【解决方案2】:

    不是你想要的:

    $ git rev-list ^origin/master
    $
    

    您要求git rev-list 排除所有可从origin/master 获得的转速,并且不包含任何内容,因此它不会产生任何结果。

    这可能是你的意思:

    $ git rev-list --branches ^origin/master
    c2eb39026567499ba9fe0c679766c370462ae26f
    

    或者您可能也想要--tags 和/或--remotes,或者取而代之;甚至--all,尽管其中包括refs/stash之类的引用。

    当然,正如您在示例代码中显示的那样,它包含在 git grep 提交参数中;它应该从那里开始工作——除了 git grep 产生匹配的行,而不是提交 ID。

    【讨论】:

    • 感谢您的回复。但是,我该如何过滤提交消息呢? git rev-list --branches ^origin/master | grep filter 只过滤提交ID
    • 您可能不想要git grep,而是想要git log-S 或-G。请参阅git log documentation
    猜你喜欢
    • 1970-01-01
    • 2011-10-30
    • 2017-03-24
    • 1970-01-01
    • 2019-07-14
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多