使用Git,如何在所有分支中搜索字符串?


170

使用Git,如何在所有本地分支的所有文件中搜索给定的字符串?

特定于GitHub:可以在所有GitHub分支上执行上述搜索吗?(在我的远程GitHub存储库上有几个远程分支,理想情况下,我不必为此搜索关闭...)


1
git-grep可能就是您想要的,但是我不确定您需要哪些选项……
johnny

Answers:


170

您可以在Git存储库上执行此操作:

git grep "string/regexp" $(git rev-list --all)

GitHub高级搜索具有代码搜索功能:

代码搜索将浏览GitHub上公开托管的所有代码。您还可以过滤:

  • 语言: language:
  • 存储库名称(包括用户名): repo:
  • 文件路径: path:

这导致我出现分段错误。不过,可能是tortoisegitmerge(Windows)。
bean5 2014年

6
这确实不是最好的方法。它无法控制传递到的git ref的数量git grep ...。看看其他答案,即使它被标记为可接受答案,它们也比这个答案好得多!
slm

1
如果您可以为过滤器添加一个示例,那就太好了,例如path:,因为乍一看文档看不清楚在何处应用此过滤器,而是假设它在查询示例中的引号之前?
blamb

3
如何只列出分支名称。当前,它列出所有包含该字符串的哈希。
哈里丰

4
Github上搜索是在主分支。来自help.github.com/articles/searching-code:“只有默认分支被索引以进行代码搜索。在大多数情况下,这将是master分支。”
RedPanda

124

如果使用@manojlds Git grep命令并出现错误:

-bash: /usr/bin/git: Argument list too long" 

那么您应该使用xargs

git rev-list --all | xargs git grep "string/regexp"

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


此外,这似乎与其他的有点像游戏机更兼容fishshell
丹尼尔·

1
谢谢!!!使用ZSH,这在@manojlds命令给出您提到的错误时有效!但是警告,对于具有悠久历史的大型回购来说,这可能需要很长时间。
lacostenycoder

54

在许多情况下,git rev-list --all可能会返回大量的提交,因此要花很长时间进行扫描。如果您不想搜索存储库历史记录中每个分支上的每个提交,而只想搜索所有分支提示,则可以将其替换为git show-ref --heads。因此总计:

git grep "string" `git show-ref --heads`

要么:

git show-ref --heads | xargs git grep "string"

提示:您可以在文件中写入输出以在编辑器中查看:

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt

6
git show-ref --heads列出哈希值和引用名称,以便它(第二行)将搜索两次。因此git show-ref --heads | cut -d' ' -f2更好,因为它只会列出引用名称。
嬉皮

4
我不敢相信这个问题被问过多少次,但您是唯一获得正确答案的人。
Sammitch

1
git show-ref --heads -s仅输出SHA1哈希。另外,如果有多个分支指向同一提交,则将有重复项。您可以使用删除它们sort -u,就像这样git show-ref --heads -s | sort -u | xargs git grep ...
Steve

这是我添加到我的bashrc中的函数。希望它对某人有帮助:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
AFP_555 '19

这应该是公认的答案。跨所有分支使用字符串,但仅用于最新内容是一个非常常见的用例。
dr_

21

这里列出的解决方案存在一些问题(甚至可以接受)。

您不需要列出所有哈希,因为您将得到重复的哈希。另外,这需要更多时间。

它建立在这个地方,你可以搜索字符串"test -f /"的多个分支master,并dev作为

git grep "test -f /" master dev

与...相同

printf "master\ndev" | xargs git grep "test -f /"

所以去。

这会找到所有本地分支的尖端的哈希值,并且仅在那些提交中搜索:

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

如果您还需要搜索远程分支,请添加-a

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

进一步:

# Search in local branches
git branch | cut -c3- | xargs git grep "string"

# Search in remote branches
git branch -r | cut -c3- | xargs git grep "string"

# Search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"

# Search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"

5
至少对于所有分支的搜索都应该是: git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" 否则它将失败->,并且文件列表中的符号失败,这表示本地到远程分支之间的关系
Ilya Sheershoff

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.