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

Iva*_*var 145 git search branch github

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

Github具体:是否可以在所有github分支上执行上述搜索?(在我的远程github repo上有几个远程分支,理想情况下我不需要为此搜索降低...)

man*_*lds 144

你可以在Git仓库上做到这一点:

git grep "string/regexp" $(git rev-list --all)
Run Code Online (Sandbox Code Playgroud)

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

代码搜索将查看GitHub上公开托管的所有代码.您还可以按以下方式过滤:

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

  • 这真的不是最好的方法.它不控制传递给`git grep ...`的git引用的数量.看看其他答案,即使它被标记为已接受的答案,它们也远胜于这个答案! (6认同)
  • 我怎样才能列出分支名称.目前,它列出了包含字符串的所有哈希. (3认同)
  • Github搜索仅在主分支上。来自https://help.github.com/articles/searching-code/:“仅对默认分支进行索引以进行代码搜索。在大多数情况下,这将是master分支。” (3认同)
  • 这仅适用于相对较小的 git 存储库。一个 git sha 是 40 个字符加上它们之间的空格(在本例中为 LF)。在 Linux 上,您的 arg 列表限制为 ~128kb(在 Mac 上为 ~256kb)。在提交 3k-4k 次之后(Mac 上为 6k - 8k),您的参数列表将变得太大。对于一个相当大小的存储库来说,这根本不是不合理的。 (3认同)
  • 如果您可以为过滤器添加一个示例,例如“路径:”,那就太好了,因为乍一看文档并不清楚在哪里应用此过滤器,我假设它在查询示例中的引号之前? (2认同)
  • 这给出 `Wed Oct 17 02:39 PM liminex: git grep '["]Welcome' $(git rev-list --all)` -> `bash: /usr/bin/git: Argument list too long` (2认同)

tea*_*urn 108

如果您使用@manojlds git grep命令并收到错误:

-bash: /usr/bin/git: Argument list too long" 
Run Code Online (Sandbox Code Playgroud)

那么你应该使用xargs:

git rev-list --all | xargs git grep "string/regexp"
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!!!使用 ZSH 并且这有效,而@manojlds 命令给出了您提到的错误!但是警告,对于历史悠久的大型回购,这可能需要很长时间。 (3认同)
  • 如果您正在查找特定文件,可以使用: `git rev-list --all | xargs -J % git grep "string/rexexp" % -- 文件名`. 这将在插入“%”出现的提交块上运行“git grep”。 (3认同)

Zit*_*rax 43

在许多情况下,git rev-list --all可以返回大量的提交,永远扫描.如果您不是在存储库历史记录中的每个分支上搜索每个提交,而只想搜索所有分支提示,则可以将其替换为git show-ref --heads.所以总的来说:

git grep "string" `git show-ref --heads`
Run Code Online (Sandbox Code Playgroud)

要么:

git show-ref --heads | xargs git grep "string"
Run Code Online (Sandbox Code Playgroud)

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

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt
Run Code Online (Sandbox Code Playgroud)

  • `git show-ref --heads`列出了散列和引用名称,因此它(第二行)将搜索两次.所以`git show-ref --heads | cut -d'' - f2`更好,因为它只会列出引用名称. (5认同)
  • 我不敢相信这个问题有多少次被问过和回答过,但你是唯一一个有*正确答案的人. (4认同)
  • `git show-ref --heads -s` 仅输出 SHA1 哈希值。此外,如果有多个分支指向同一个提交,您将有重复项。你可以用`sort -u`删除它们,就像`git show-ref --heads -s | 排序 -u | xargs git grep ...` (4认同)
  • 这是我添加到 bashrc 中的函数。希望它可以帮助某人:`function gsearch { git grep $1 $(git show-ref --heads) | grep "参考文献/标题" | grep $1 } # 最后一个 grep 保持 grep 颜色突出显示` (3认同)
  • 这应该是公认的答案。在所有分支上 Grepp 字符串*但仅针对最新内容*是一个非常常见的用例。 (3认同)

Vic*_*hoy 15

你可以试试这个:

git log -Sxxxx  # Search all commits
git log -Sxxxx  --branches[=<pattern>]   # Search branches
Run Code Online (Sandbox Code Playgroud)

  • 跨所有分支: `git log --all -s"search_string"` (6认同)
  • 以上需要大写S (5认同)

hIp*_*pPy 13

这里列出的解决方案几乎没有问题(甚至被接受).

  1. 您不需要列出所有哈希值,因为您将获得重复项,也需要更多时间.

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

git grep "test -f /" master dev
Run Code Online (Sandbox Code Playgroud)

与...相同

printf "master\ndev" | xargs git grep "test -f /"
Run Code Online (Sandbox Code Playgroud)

所以这里.

这将查找所有本地分支的提示的哈希值,并仅在这些提交中进行搜索.

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"
Run Code Online (Sandbox Code Playgroud)

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

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"
Run Code Online (Sandbox Code Playgroud)

更新:

# 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"
Run Code Online (Sandbox Code Playgroud)

  • 至少对于所有分支中的搜索应该是:`git branch -a | 切-c3- | cut -d'' - f 1 | xargs git grep"string"`或者它将在文件列表中以` - >`符号失败,表示远程分支关系的本地 (4认同)
  • 这个评论,就在我的评论之上,是正确的答案!这是唯一一个没有出错的。 (2认同)

小智 5

按照@peter-mortensen & manojlds的解决方案,我使用git for-each-ref作为子命令仅列出具有名称的分支。

git grep "string/regexp" $(git for-each-ref --format='%(refname:short)' refs/heads)
Run Code Online (Sandbox Code Playgroud)

这实现了更好的可视化,仅显示命名分支并为每个分支仅生成一个结果。