我曾经删除过一个文件或文件中的一些代码。我可以在内容(而不是提交消息)中进行grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
然而,这不会立即返回提交哈希。我和吉特·格里普玩得不亦乐乎。
我曾经删除过一个文件或文件中的一些代码。我可以在内容(而不是提交消息)中进行grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
然而,这不会立即返回提交哈希。我和吉特·格里普玩得不亦乐乎。
当前回答
要搜索提交内容(即实际的源代码行,而不是提交消息等),您需要执行以下操作:
git grep <regexp> $(git rev-list --all)
git rev list--如果遇到“Argument list too long”错误,则所有|xargs git grep<expression>都可以工作。
如果要将搜索限制在某个子树(例如,“lib/util”),则需要将其传递给rev-list子命令和grep:
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
这将快速浏览正则表达式的所有提交文本。
在两个命令中传递路径的原因是rev-list将返回对lib/util所做的所有更改所在的修订列表,但您还需要传递给grep,以便它只在lib/util中搜索。
想象一下下面的场景:grep可能会在rev列表返回的同一版本中包含的其他文件上找到相同的<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>
搜索与正则表达式正则表达式匹配的文本的所有修订:
git grep <regexp> $(git rev-list --all)
搜索rev1和rev2之间的所有修订,以查找与正则表达式regexp匹配的文本:
git grep <regexp> $(git rev-list <rev1>..<rev2>)
其他回答
gitlog可以是搜索所有分支中文本的更有效的方法,特别是如果有很多匹配项,并且您希望首先看到最近的(相关的)更改。
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
这些日志命令列出了添加或删除给定搜索字符串/regex的提交,(通常)是最新的。-p选项会导致相关的diff显示在添加或删除模式的位置,因此您可以在上下文中看到它。
找到了添加您要查找的文本的相关提交(例如,8beeff00d)后,找到包含该提交的分支:
git branch -a --contains 8beeff00d
我最喜欢的方法是使用gitlog的-G选项(在1.7.4版本中添加)。
-G<regex>
Look for differences whose added or removed line matches the given <regex>.
-G和-S选项确定提交是否匹配的方式存在细微差异:
-S选项本质上统计提交前后搜索在文件中匹配的次数。如果前后计数不同,则提交将显示在日志中。例如,这不会显示移动了与搜索匹配的行的提交。使用-G选项,如果您的搜索与添加、删除或更改的任何行相匹配,则提交将显示在日志中。
以此次提交为例:
diff --git a/test b/test
index dddc242..60a8ba6 100644
--- a/test
+++ b/test
@@ -1 +1 @@
-hello hello
+hello goodbye hello
因为在提交之前和之后“hello”在文件中出现的次数相同,所以使用-Shello将不匹配。然而,由于对匹配hello的行进行了更改,提交将使用-Gello显示。
为了简单起见,我建议使用GUI:gitk——Git存储库浏览器。它很灵活
要搜索代码:要搜索文件,请执行以下操作:当然,它还支持正则表达式:
您可以使用向上/向下箭头浏览结果。
在git历史记录中搜索的命令
git log -S"alter" --author="authorname" --since=2021.1.1 --until=2023.1.1 -- .
我接受了Jeet的答案,并将其改编为Windows(多亏了这个答案):
FOR /F %x IN ('"git rev-list --all"') DO @git grep <regex> %x > out.txt
注意,对于我来说,出于某种原因,删除这个正则表达式的实际提交并没有出现在命令的输出中,而是出现在它之前的一次提交。