我过去某个时候已经删除了文件或文件中的某些代码。我可以在内容中(而不是在提交消息中)grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
但是,这不会立即返回提交哈希。我git grep
无济于事。
我过去某个时候已经删除了文件或文件中的某些代码。我可以在内容中(而不是在提交消息中)grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
但是,这不会立即返回提交哈希。我git grep
无济于事。
Answers:
要搜索提交内容(即,实际的源代码行,而不是提交消息等),您需要执行以下操作:
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
(即使该修订版上的文件没有更改)。
以下是一些其他有用的搜索来源的方法:
在工作树中搜索与正则表达式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匹配的文本:
git grep <regexp> $(git rev-list --all)
搜索rev1和rev2之间的所有修订以查找与正则表达式regexp匹配的文本:
git grep <regexp> $(git rev-list <rev1>..<rev2>)
sh.exe": /bin/git: Bad file number
。VonC的答案也适用于msysgit。
git gc
或退房:stackoverflow.com/questions/1507463/...
您应该使用的pickaxe(-S
)选项git log
。
搜索Foo
:
git log -SFoo -- path_containing_change
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change
查看Git历史记录-通过关键字查找丢失的行以获取更多信息。
正如JakubNarębski所说:
这会寻找引入或删除实例的差异<string>
。它通常指的是“使用'Foo'添加或删除行的修订”。
该--pickaxe-regex
选项允许您使用扩展的POSIX正则表达式而不是搜索字符串。示例(来自git log
):git log -S"frotz\(nitfol" --pickaxe-regex
git log
你的问题有点把我迷惑;)
-p
标志组合以也输出差异。
--branches --all
选项来搜索所有回购。
我最喜欢的方法是使用git log
的-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
,因此将使用显示提交-Ghello
。
-p
用于显示每次提交差异的选项。然后,当在我的寻呼机中打开日志时,我将搜索所需的内容。如果您的寻呼机是less
你git log -Ghello -p
,你可以输入/hello
,按Enter
,然后使用n
和N
找到“你好”下一首/上一出现。
-G
与Regex 有关的有趣问题:如果命令行使用UTF-8,而您正在查看的文件使用某些ISO-Latin(8位)编码,则会.*
失败。例如,我有一个更改Vierter Entwurf
-> Fünfter Entwurf
,而'V.*ter Entwurf'
生成匹配项'F.*ter Entwurf'
却没有。
如果您想浏览代码更改(查看整个历史记录中给定单词实际更改的内容),请选择patch
模式-我发现这样做非常有用:
git log -p
# Hit '/' for search mode.
# Type in the word you are searching.
# If the first search is not relevant, hit 'n' for next (like in Vim ;) )
git log
可以是在所有分支中搜索文本的一种更有效的方法,尤其是在有许多匹配项并且您希望首先查看最新(相关)更改的情况下。
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
这些日志命令列出了提交,这些提交添加或删除了给定的搜索字符串/正则表达式(通常)是最近的。该-p
选项使相关的差异显示在添加或删除模式的位置,因此您可以在上下文中看到它。
找到相关的提交以添加您要查找的文本(例如8beeff00d)后,找到包含该提交的分支:
git branch -a --contains 8beeff00d
'
引号不会将您的搜索字符串作为单个参数分组在一起。相反,'public
是的参数-S
,并将其余部分视为单独的参数。我不确定您在哪个环境中运行,但是该上下文对于帮助进行故障排除是必要的。我建议您在需要时打开一个单独的StackOverflow问题,以帮助您解决git命令如何发送到shell的所有上下文。在我看来,它是通过其他命令发送的?这里的评论不是正确的解决方法。
搜索任何版本,任何文件:
git rev-list --all | xargs git grep <regexp>
仅搜索某些给定的文件,例如 XML文件:
git rev-list --all | xargs -I{} git grep <regexp> {} -- "*.xml"
结果行应如下所示:6988bec26b1503d45eb0b2e8a4364afb87dde7af:bla.xml:找到的行的文本...
然后,您可以使用来获取更多信息,例如作者,日期和差异git show
。
git show 6988bec26b1503d45eb0b2e8a4364afb87dde7af
每当我发现自己在您的位置时,都会使用以下命令行:
git log -S "<words/phrases i am trying to find>" --all --oneline --graph
说明:
git log
-需要在这里写更多吗?它按时间顺序显示日志。-S "<words/phrases i am trying to find>"
-它显示所有Git提交,其中任何文件(添加/修改/删除)都带有我要查找的单词/短语,且没有'<>'符号。--all
-在所有分支机构之间执行和搜索。--oneline
-将Git日志压缩为一行。--graph
-创建按时间顺序排列的提交图。Jeet的答案可在PowerShell中使用。
git grep -n <regex> $(git rev-list --all)
以下显示所有提交中包含的所有文件password
。
# Store intermediate result
$result = git grep -n "password" $(git rev-list --all)
# Display unique file names
$result | select -unique { $_ -replace "(^.*?:)|(:.*)", "" }
那么,您是否要遍历旧版本的代码,以查找最后存在的内容?
如果执行此操作,则可能会使用git bisect。使用bisect,您可以指定一个已知的好版本,一个已知的坏版本以及一个简单的脚本,该脚本进行检查以查看该版本的好坏(在这种情况下,将使用grep来查看您要查找的代码是否存在) )。运行此命令将找到删除代码的时间。
git log -S
和指责)* [有趣的是“ git log --grep”] [2](搜索提交消息) )* [带“ git grep”的乐趣] [3] [2]:gitster.livejournal.com/30195.html [3]:gitster.livejournal.com/27674.html