-1

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

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

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

例子:

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

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

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

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

我有以下内容:

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

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

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

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

4

2 回答 2

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。

于 2014-07-28T08:07:14.037 回答
0

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

请参阅提交 9cf68b2提交 169a15e提交 7ab6aaf提交 b0c42a5(2021 年 4 月 19 日)、提交 9a2a4f9(2021 年 4 月 12 日)和提交 628d81b提交 b2025da提交 a812789(2021 年 4 月 9 日),作者Patrick Steinhardt ( pks-t)
(由Junio C Hamano 合并 -- gitster--提交 8585d6c中,2021 年 5 月 7 日)

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

签字人:Patrick Steinhardt

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

这使得一些过滤器不太有用。

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

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

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

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

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

git config现在在其手册页中包含:

blob:limit, object:type, tree, sparse:oid, 或combine. 如果使用组合过滤器,则combine必须允许所有嵌套过滤器类型。默认为uploadpackfilter.allow.

rev-list-options现在在其手册页中包含:

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

和:

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

签字人:Patrick Steinhardt

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

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

rev-list-options现在在其手册页中包含:

--filter-provided-objects

过滤显式提供的对象列表,否则即使它们与任何过滤器都不匹配,也会始终打印这些对象。仅对 有用--filter=

于 2021-05-13T20:26:48.493 回答