我目前正在开发一个程序来过滤存储在命令行数据库中的慢速数据库查询。
我想搜索除指定的所有分支之外的所有提交,并返回所有匹配的提交。
我的过滤条件存储在数据库中(为我提供)。
示例:
我在数据库中有以下条目:
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命令不正确吗?提前感谢任何指针。
答案 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 9cf68b2、commit 169a15e、commit 7ab6aaf、commit b0c42a5(2021 年 4 月 19 日)、commit 9a2a4f9(2021 年 4 月 12 日)和 commit 628d81b ,commit b2025da,commit 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:limit
、object:type
、tree
、sparse:oid
或 combine
。
如果使用组合过滤器,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=
一起使用。