一尘不染

如何在 Git 历史记录中 grep(搜索)已提交的代码

git

我在过去的某个时候删除了一个文件或文件中的一些代码。我可以在内容中(而不是在提交消息中)grep 吗?

一个非常糟糕的解决方案是 grep 日志:

git log -p | grep <pattern>

但是,这不会立即返回提交哈希。我玩了git grep一圈无济于事。


阅读 331

收藏
2022-02-18

共1个答案

一尘不染

要搜索提交内容(即实际的源代码行,而不是提交消息等),您需要执行以下操作:

git grep <regexp> $(git rev-list --all)

git rev-list --all | xargs git grep <expression>如果您遇到“参数列表太长”错误,它将起作用。

如果要将搜索限制在某个子树(例如,“lib/util”),则需要将其传递给rev-list子命令,grep并且:

git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

这将遍历您的所有提交文本regexp

在两个命令中传递路径的原因是因为rev-list将返回所有更改lib/util发生的修订列表,但您还需要传递给grep它以便它只会在lib/util.

想象一下以下场景:grep可能会在<regexp>包含在返回的同一修订版中的其他文件上找到相同的文件rev-list(即使该修订版上的该文件没有更改)。

以下是一些其他有用的搜索来源的方法:

搜索文本匹配正则表达式正则表达式的工作树:

git grep <regexp>

在工作树中搜索匹配正则表达式 regexp1 或 regexp2 的文本行:

git grep -e <regexp1> [--or] -e <regexp2>

在工作树中搜索匹配正则表达式 regexp1 和 regexp2 的文本行,仅报告文件路径:

git grep -l -e <regexp1> --and -e <regexp2>

在工作树中搜索具有与正则表达式 regexp1 匹配的文本行和与正则表达式 regexp2 匹配的文本行的文件:

git grep -l --all-match -e <regexp1> -e <regexp2>

搜索工作树以查找更改的文本匹配模式行:

git diff --unified=0 | grep <pattern>

在所有版本中搜索匹配正则表达式 regexp 的文本:

git grep <regexp> $(git rev-list --all)

搜索 rev1 和 rev2 之间的所有修订以查找匹配正则表达式 regexp 的文本:

git grep <regexp> $(git rev-list <rev1>..<rev2>)
2022-02-18