通过提交消息搜索特定的git commit并排除分支

时间:2014-07-28 07:35:05

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

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

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

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

示例:

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

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

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

如果在提交中找到密钥,请跳过并查找下一个密钥。如果未找到匹配项,请将其打印到stdout。所有代码都正常,但我找不到正确的git命令。

我有以下内容:

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

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

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

我的git命令不正确吗?提前感谢任何指针。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

参见 commit 9cf68b2commit 169a15ecommit 7ab6aafcommit b0c42a5(2021 年 4 月 19 日)、commit 9a2a4f9(2021 年 4 月 12 日)和 commit 628d81bcommit b2025dacommit a812789(2021 年 4 月 9 日),作者: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 将继续打印标签、提交和树,只要求这些小 blob 是不合适的。

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

$ 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= 一起使用。