在Github项目中搜索代码

424

有没有一种方法可以在 Github 项目的代码中搜索某些内容?

我可以拉取源代码并在本地使用 grep 进行搜索,但我想知道是否可以通过 Web 界面或第三方替代方案实现。

有什么好的思路吗?


也请查看http://code.ohloh.net :) - obimod
针对Java/Scala代码库,可以尝试使用Codota语义化代码搜索 - drorw
2
在以下网址开启了一个功能请求:https://github.com/isaacs/github/issues/1495 - Ciro Santilli OurBigBook.com
12个回答

305
更新于2023年5月:

新的代码搜索和代码查看现已全面推出(2023年5月)

(正如holydragon评论中所指出的,这确实需要先登录GitHub)

去年在GitHub Universe上,我们宣布了GitHub代码搜索和导航体验的全面改版,由我们从头开始构建的全新代码搜索引擎驱动。
而在二月份,我们宣布了我们的公测版本。
今天,我们将这个功能推出给所有GitHub用户。
请查看我们的博客文章,了解更多关于GitHub新的代码搜索和代码查看如何帮助您搜索、导航和理解您的代码的信息。
如果您有反馈,请在我们的反馈讨论中与我们分享。
2021年12月更新:搜索功能再次改进,现在支持搜索精确字符串、子字符串匹配和特殊字符,还有正则表达式。

regex

但只限于在cs.github.com上,并且仍处于测试阶段(需要等待名单)。
更新于2013年1月:基于elasticsearch.org的全新搜索已经到来!:
在ruby repo中搜索stat将被表示为stat repo:ruby/ruby,现在将会正常工作(TM)。 (repo名称不区分大小写:test repo:wordpress/wordpress返回的结果与test repo:Wordpress/Wordpress相同)

enter image description here

会给:

enter image description here

而且你还有很多其他的搜索示例,基于关注者,或者分叉,或者...

2012年7月更新(Lucene搜索和糟糕的代码索引的旧日子,加上破碎的GUI,保存在这里以供存档):

搜索(基于SolrQuerySyntax)现在更宽松,当使用“默认”搜索选择器“Everything”时,不再出现可怕的“无效搜索查询。尝试引用它。”的提示:)

(我想我们都应该感谢Tim Pease,他在他的目标之一中提到了“改进所有GitHub属性的搜索体验”,当时我也提到了这个Stack Overflow问题;))

这是一个在Ruby代码中进行grep的示例:它将查找存储库和用户,但还会查找我最初想要搜索的代码!

GitHub more permissive search results


初始答案和前一个问题的说明(2012年9月=>2012年3月)

您可以使用高级搜索GitHub表单

  • 从下拉菜单中选择代码仓库用户,并
  • 使用相应的前缀列出的搜索类型。

例如,使用repo:用户名/仓库名称指令将搜索限制在代码仓库中。
初始的“高级搜索”页面包括以下部分:

代码搜索:

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

  • 语言language:
  • 仓库名称(包括用户名)repo:
  • 文件路径path:
所以,如果您选择了“Code”搜索选择器,那么您在存储库中搜索文本的查询将起作用。

Good Search selector


GitHub的一个非常不方便的地方是:
如果你忘记输入正确的搜索选择器(这里是“Code”),你会收到一个错误信息:“无效的搜索查询。请尝试加引号。”

Wrong selector for the code filer

错误信息对你一点帮助都没有。无论你如何“引用它”,都无法解决这个错误。
一旦你收到这个错误信息,你就不会再看到提醒你正确关联搜索选择器(“Repositories”,“Users”或“Language”)和正确搜索过滤器(这里是“repo:”)的部分。任何进一步的尝试都不会显示这些关联(选择器-过滤器)。你只能看到上面的错误信息...
唯一恢复这些数组的方法是点击“高级搜索”图标:

Advance Search Icon on GitHub

"Everything"这个搜索选择器,虽然是默认的,但实际上对于所有的搜索过滤器来说都是错误的!除了"language:"...(你可以想象/假设"Everything"会帮助你选择与搜索过滤器"repo:"实际配合的搜索选择器,但事实并非如此。那样太简单了)
通过"高级搜索"字段单独指定所需的搜索选择器是不可能的!(但对于"language:"来说是可以的,尽管"Search Language"是在"Search for" 'type' 下面的另一个组合框中...)

Wrong search selector


所以,用户的体验通常如下:

  • 你点击“高级搜索”,浏览那些筛选器的部分,并注意到一个你想要使用的筛选器:“repo:”
  • 你进行了第一次高级搜索“repo:jruby/jruby stat”,但使用了默认的搜索选择器“Everything”
    => 失败!(并且显示关联“选择器-筛选器”的数组已经消失)
  • 你注意到了“搜索”选择器,选择了第一个选项“Repositories”(我想要在仓库中搜索...)
    => 失败!
  • 沮丧的你选择了下一个选择器(这里是“Users”),甚至没有看过该选择器,只是为了再试一次...
    => 失败!
  • “去他妈的,GitHub的搜索功能坏了!我走了!”
    ...
    (GitHub的高级搜索实际上并没有坏。只是他们的图形界面有问题...)

所以,简单回顾一下,如果你想要在一个Github项目的代码中"grep某个东西",就像原帖中的Ben Humphreys所说的那样,别忘了选择"Code"搜索选项...

1
@DannyStaple 嗯,如果你看一下在 https://github.com/blog/1116-tim-pease-is-a-githubber 描述的任务,“Tim 很可能会……改进所有 GitHub 属性的搜索体验”,他们似乎已经意识到了这个问题。确保回复他们在 Twitter 上的推文 (https://twitter.com/#!/github/status/197070106768048128),就像我做的那样 (https://twitter.com/#!/VonC_/status/197565733830541313)。 - VonC
9
就我联系了 GitHub,因为当我把搜索限制在我的仓库时,没有找到任何搜索结果。Tim Pease 回复说他们的仓库指数量很大,所以正在迁移到分片索引服务器。目前还没有确定所有仓库何时会完成迁移。 - sourcenouveau
3
我刚刚使用了这个答案提供的建议,它对我也起作用,但我有一个要注意的地方要补充。即使GitHub在其他地方以不同的方式列出了它,仓库名称始终应该以小写形式呈现。例如,(在按照上述设置代码下拉菜单等之后)尝试使用以下搜索:repo:wordpress/wordpress vs repo:WordPress/WordPress,只有第一个会产生结果。 - ethanpil
1
@MWO 在2021年,您需要注册到cs.github.com:请参见https://github.blog/2021-12-08-improving-github-code-search/和https://cs.github.com/about。 - VonC
1
@holydragon 很好的观点,谢谢你的反馈。我已经编辑了答案,包括了你的评论。 - undefined
显示剩余21条评论

80
在一个代码仓库中进行搜索,需要在仓库的根目录下添加URL参数/search?q=search_terms,例如:

https://github.com/bmewburn/vscode-intelephense/search?q=phpstorm

enter image description here

在上面的示例中,它返回Code中的 2 个结果和 Issues中的 160 个结果。


这很酷!你知道如何让它在主仓库的分支上工作吗?当我按照你提供的格式操作时,它对我不起作用。 - piedpiper
1
截至目前:仅索引默认分支以进行代码搜索。请参阅https://docs.github.com/en/free-pro-team@latest/github/searching-for-information-on-github/searching-code - kiatng

23

最近的私有代码库有一个搜索字段,用于搜索该代码库。

enter image description here

令人困惑的是,似乎这个功能对于公共代码库并不可用。


1
我在想这是否是一种卑劣的商业手段,让人们升级到付费版本?虽然这听起来不像是Github的风格。 - Sylvain
3
@Sylvain 我认为这并不是作为升级的鼓励,因为即使升级后,您也不会在公共存储库中获得该搜索字段。相反,我认为主要搜索使用的索引不包括私有存储库,因此当支付私有存储库时,您不会失去功能,他们必须添加另一种仅通过该私有存储库搜索的方法,因此添加了额外的文本字段。 - avernet
2
想象一下,如果他们为每个存储库中的每行代码都建立一个搜索索引,那么会有多大的开销!疯狂!这就是为什么他们只为私人存储库这样做的原因。 - Jonny Nott
2
搜索现在位于页眉,与全局搜索相同。 - Tib

20

更新

下面的书签小工具因XHR问题和API更改而失效。

幸运的是,Github现在有了一个全新的代码搜索,非常出色地完成了这项工作。


Checkout this voodoo: Github code search userscript.

Follow the directions there, or if you hate bloating your browser with scripts and extensions, use my bookmarkified bundle of the userscript:

javascript:(function(){var s='https://raw.githubusercontent.com/skratchdot/github-enhancement-suite/master/build/github-enhancement-suite.user.js',t='text/javascript',d=document,n=navigator,e;(e=d.createElement('script')).src=s;e.type=t;d.getElementsByTagName('head')[0].appendChild(e)})();doIt('');void('');

Save the source above as the URL of a new bookmark. Browse to any Github repo, click the bookmark, and bam: in-page, ajaxified code search.

CAVEAT Github must index a repo before you can search it.

Before the Bookmarklet

Abracadabra...

After - Look in the second menubar after the leftmost tabs: Files, Commits, Branches...

Here's a sample search from the annotated ECMAScript 5.1 specification repository:

Sample search in the annotated ECMAScript 5.1 specification repository


当我使用插件(Chrome)时,它在scratchdot/github-code-search存储库中运行良好,但在任何其他存储库中都无法正常工作。 - forforf
喜欢书签小工具的想法,但不符合现代浏览器的要求。 - user456584
2
@user456584 这对我来说是个新闻。你可能也想告诉GoogleMozilla知道。 - fny
2
我找出了插件不工作的原因,那是因为仓库名称需要小写字母。(请参见我在上面对VonC答案的评论)。我已经在GitHub上提交了一个补丁,希望原作者能看到它。https://github.com/skratchdot/github-code-search.user.js/pull/5 - ethanpil
1
似乎 Github 代码搜索用户脚本的搜索选项不再起作用了。 - alper
显示剩余2条评论

11

尽管@VonC的回答适用于某些存储库,但遗憾的是对于许多存储库,您目前无法这样做。Github简单地没有将它们索引(正如最初由@emddudley所评论的)。他们在网站上没有声明这一点,但如果您向支持人员询问,他们会告诉您:

发件人:Tim Pease
我们已经停止将新推送的代码添加到我们的代码搜索索引中。代码量已超出了我们当前的搜索索引,我们正在努力转移到更具可扩展性的搜索架构。很抱歉给您带来不便。我们还不知道什么时候会启动这个新的搜索索引,但准备好后,将发布一篇博客文章(https://github.com/blog)。

令人恼火的是,除了缺少结果(这也可能来自错误的查询)之外,没有办法知道哪些存储库未被索引。

此外,除了等待他们博客中的更新(或在这里关注),没有其他方法可以追踪这个问题:

发件人:Tim Pease
很遗憾,我们的问题跟踪器是内部的,但我们可以在新的搜索索引准备好时立即通知您。


他们至少应该提到一些搜索结果可能会被省略。当我重构代码并搜索存在但未在GitHub中提到的代码出现时,这真的很糟糕。 - Nicodemuz

10

有一个非常好的项目叫做github1s,位于https://github.com/conwnet/github1s.

基本上你可以把任何存储库的url从 https://github.com/microsoft/vscode 改为 https://github1s.com/microsoft/vscode, 然后你就可以使用编辑器内置的搜索功能,搜索存储库中的任何内容。


与 Github1s 类似,GitHub 也支持在线 vscode 编辑器,在 github.dev 上。所以你可以在 https://github.dev/microsoft/vscode 查看代码。更多信息请阅读此处 - Tal Jacob - Sir Jacques

7

在搜索框中使用您的搜索词和in:file

搜索会创建一个下拉框,询问您要在哪里进行搜索。

输入图像描述


1
截至目前撰写时,最快的解决方案 - DaReal
最好和最快的一个。 - Bilaal Abdel Hassan

7
前往这个链接:https://github.com/search,并输入"pattern repo:user_name/repo_name"。
例如,要在用户fastaifastai仓库中搜索cnn_learner,请输入以下内容: cnn_learner repo:fastai/fastai 就是这样。唯一的烦恼是你需要额外的一次点击。它会告诉你:
“我们找不到任何与'cnn_learner repo:fastai/fastai'匹配的存储库”
因为默认情况下,它搜索匹配该搜索字符串的存储库...
所以只需在左侧单击“Code”,它将显示您想要的内容。
或者使用以下URL直接获取代码搜索结果: https://github.com/search?q=cnn_learner+repo%3Afastai%2Ffastai&type=code

这个似乎在2022年出现了问题,导致出现以下错误:"请求的内容尚未被索引,请稍后再试。"Github在2022年除了一个正在进行中的封闭测试版之外,为什么没有代码搜索呢? - Jeff Axelrod
哎呀,按URL搜索似乎仍然很好用,例如在“kaicarver”的“hbd”存储库的代码中搜索“html”: https://github.com/search?q=html+repo%3Akaicarver%2Fhbd&type=code 或者在“microsoft”的“vscode”存储库的代码中搜索“monaco” https://github.com/search?q=monaco+repo%3Amicrosoft%2Fvscode&type=code - Kai Carver

4

4

访问该存储库的主页,然后在左上角的搜索框中输入您要搜索的关键词。

第一个建议的结果将被标记为“在此存储库中”。单击该结果或按Enter键.

输入图像描述

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接