我曾经删除过一个文件或文件中的一些代码。我可以在内容(而不是提交消息)中进行grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
然而,这不会立即返回提交哈希。我和吉特·格里普玩得不亦乐乎。
我曾经删除过一个文件或文件中的一些代码。我可以在内容(而不是提交消息)中进行grep吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
然而,这不会立即返回提交哈希。我和吉特·格里普玩得不亦乐乎。
当前回答
在任何版本、任何文件(Unix/Linux)中搜索:
git rev-list --all | xargs git grep <regexp>
仅在某些给定文件中搜索,例如XML文件:
git rev-list --all | xargs -I{} git grep <regexp> {} -- "*.xml"
结果行应如下所示:6988bec26b1503d45eb0b2e8a4364afb87dde7af:bla.xml:找到的行的文本。。。
然后,您可以使用gitshow获取更多信息,如作者、日期和差异:
git show 6988bec26b1503d45eb0b2e8a4364afb87dde7af
其他回答
git rev-list --all | xargs -n 5 git grep EXPRESSION
是对Jeet解决方案的一个调整,因此它在搜索时显示结果,而不仅仅是在最后(在大型存储库中可能需要很长时间)。
场景:您使用IDE对代码进行了大清理。问题:IDE清理的比它应该清理的多,现在代码无法编译(缺少资源等)
解决方案:
git grep --cached "text_to_find"
它将找到更改“text_to_find”的文件。
现在可以撤消此更改并编译代码。
我在这里有点惊讶,也许我错过了我正在寻找的答案,但我来到这里是为了寻找所有树枝的顶端。并不是针对存储库中的每一个修订,所以对我来说,使用git-rev列表——所有信息都太多了。
换句话说,对我来说,最有用的变化是
git grep -i searchString $(git branch -r)
or
git branch -r | xargs git grep -i searchString
or
git branch -r | xargs -n1 -i{} git grep -i searchString {}
当然,您可以在这里尝试正则表达式方法。这里的方法很酷的是,它直接针对远程分支。我不必在这些分支机构中的任何一家进行检查。
所以,您是否正在尝试翻看旧版本的代码,以查看最后存在的内容?
如果我这样做的话,我可能会使用git平分。使用平分线,您可以指定已知的好版本、已知的坏版本,以及一个简单的脚本,该脚本可以检查版本是好还是坏(在本例中,一个grep可以查看您正在查找的代码是否存在)。运行此命令将发现代码何时被删除。
要搜索提交内容(即实际的源代码行,而不是提交消息等),您需要执行以下操作:
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>)