我在过去的某个时候删除了一个文件或文件中的一些代码。我可以在内容中(而不是在提交消息中)grep 吗?
一个非常糟糕的解决方案是 grep 日志:
git log -p | grep <pattern>
但是,这不会立即返回提交哈希。我玩了git grep一圈无济于事。
git grep
要搜索提交内容(即实际的源代码行,而不是提交消息等),您需要执行以下操作:
git grep <regexp> $(git rev-list --all)
git rev-list --all | xargs git grep <expression>如果您遇到“参数列表太长”错误,它将起作用。
git rev-list --all | xargs git grep <expression>
如果要将搜索限制在某个子树(例如,“lib/util”),则需要将其传递给rev-list子命令,grep并且:
rev-list
grep
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
这将遍历您的所有提交文本regexp。
regexp
在两个命令中传递路径的原因是因为rev-list将返回所有更改lib/util发生的修订列表,但您还需要传递给grep它以便它只会在lib/util.
lib/util
想象一下以下场景:grep可能会在<regexp>包含在返回的同一修订版中的其他文件上找到相同的文件rev-list(即使该修订版上的该文件没有更改)。
<regexp>
以下是一些其他有用的搜索来源的方法:
搜索文本匹配正则表达式正则表达式的工作树:
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 的文本:
搜索 rev1 和 rev2 之间的所有修订以查找匹配正则表达式 regexp 的文本:
git grep <regexp> $(git rev-list <rev1>..<rev2>)