Post

GitHub 搜索高级技巧:Web UI、URL 拼接与 REST API 全指南

GitHub 搜索高级技巧:Web UI、URL 拼接与 REST API 全指南

GitHub 的搜索功能远比大多数人用到的强大。除了搜索框里敲关键词,它还支持丰富的限定符(qualifiers)、URL 参数拼接、以及 REST API 编程式搜索。本文系统梳理三种搜索方式的高级技巧,帮你快速定位代码、仓库和 Issue。


一、GitHub.com Web 搜索高级技巧

1.1 布尔运算符

运算符说明示例
AND(隐式)同时匹配machine learning
OR匹配任一python OR rust
NOT / -排除language:python NOT django
"exact phrase"精确匹配"fastapi framework"
()分组(python OR rust) stars:>1000

1.2 仓库搜索限定符

限定符说明示例
user: / org:按用户/组织user:google
language:编程语言language:python
stars:Star 数stars:>1000stars:100..500
forks:Fork 数forks:>100
topic:主题标签topic:machine-learning
size:仓库大小 (KB)size:>10000
pushed:最近推送日期pushed:>2025-01-01
created:创建日期created:2024-01-01..2025-01-01
license:许可证license:mit
archived:是否归档archived:false
mirror:是否镜像mirror:true
is:状态is:publicis:private
good-first-issues:新手友好 Issue 数good-first-issues:>5

实战组合示例:

# 找活跃维护的高质量 Python 项目 language:python stars:>500 pushed:>2025-01-01 is:public # 找某个组织下特定语言的仓库 org:microsoft language:typescript stars:>100 # 找有新手友好 Issue 的活跃项目 good-first-issues:>5 language:go pushed:>2025-06-01

1.3 代码搜索限定符

限定符说明示例
repo:指定仓库repo:facebook/react
org: / user:指定组织/用户org:google
path:文件路径path:src/components
filename:文件名filename:package.json
extension:文件扩展名extension:py
language:语言language:javascript
size:文件大小 (bytes)size:>1000
fork:是否含 forkfork:true
in:file / in:path搜索范围in:file

实战组合示例:

# 在某仓库中找特定文件 repo:torvalds/linux filename:Makefile language:C # 找所有 Docker 配置文件 filename:docker-compose.yml stars:>100 # 找特定路径下的代码 path:src/utils/ extension:ts language:typescript # 找 TODO 注释 TODO user:facebook language:javascript

1.4 Issue / PR 搜索限定符

限定符说明示例
is:issue / is:pr类型is:pr
state:状态state:openstate:closed
label:标签label:buglabel:"help wanted"
author:作者author:gaearon
assignee:指派人assignee:octocat
mentions:被 @ 的人mentions:github
commenter:评论者commenter:torvalds
involves:参与者involves:octocat
created: / updated:日期created:>2025-01-01
comments:评论数comments:>10
reactions:表情反应数reactions:>50
no:否定过滤no:labelno:assignee
draft:草稿 PRdraft:true
review:PR 审查状态review:approved

实战组合示例:

# 找 React 仓库中未分配的 bug repo:facebook/react is:issue state:open label:bug no:assignee # 找可以贡献的 Issue label:"good first issue" language:python state:open # 找高讨论度的 PR is:pr comments:>20 reactions:>10 state:open # 找某个里程碑下未关闭的 Issue milestone:"v2.0" state:open is:issue

1.5 Commit 搜索限定符

限定符说明示例
author: / committer:作者/提交者author:torvalds
merge:是否合并提交merge:true
hash:提交哈希hash:abc123
author-date: / committer-date:日期author-date:>2025-01-01
message:提交信息message:"fix bug"

1.6 2023+ 新代码搜索引擎特性

GitHub 在 2023 年推出了全新的代码搜索引擎,新增了一些强大功能:

正则表达式支持:

# 搜索类定义模式 /"class\s+\w+:/ language:python # 搜索带负责人的 TODO /TODO\s*\(.+?\)/ # 搜索 require 语句 /const\s+\w+\s*=\s*require/ language:javascript # 搜索 import 语句 /^\s*import\s+/ language:javascript

Symbol 搜索:

  • 直接搜索函数名、类名、方法名等符号
  • 使用 symbol: 限定符或在搜索结果中点击符号跳转
  • 支持 Python、JavaScript、Go、Rust 等多种语言

新代码搜索要求登录,仅索引默认分支,文件需 < 5MB 且只搜索前 500KB。


二、URL 拼接搜索技巧

GitHub 搜索的 URL 支持丰富的查询参数,可以构造、收藏和分享精确的搜索结果。

2.1 URL 基础结构

https://github.com/search?q={query}&type={type}&s={sort}&o={order}&p={page}
参数说明可选值
q搜索查询(URL 编码)任意有效查询
type搜索类型repositoriescodeissuespullrequestsdiscussionsuserswikis
s排序字段starsforkshelp-wanted-issuesupdated
o排序方向ascdesc
p页码整数

2.2 实用 URL 示例

按 Star 降序搜索 Python 高星仓库:

https://github.com/search?q=language:python+stars:>1000&type=repositories&s=stars&o=desc

搜索 React 相关开放 Issue,按最近更新排序:

https://github.com/search?q=react+is:issue+state:open&type=issues&s=updated&o=desc

在指定仓库中搜索代码:

https://github.com/search?q=TODO+repo:facebook/react&type=code

按地区搜索用户:

https://github.com/search?q=location:"San+Francisco"&type=users

2.3 特殊 GitHub URL

URL说明
github.com/exploreGitHub Explore 首页
github.com/explore/topics浏览主题
github.com/topics/{topic}按主题浏览仓库
github.com/trending趋势仓库
github.com/trending/{language}按语言查看趋势
github.com/trending/developers趋势开发者
github.com/collections精选合集

2.4 URL 编码注意事项

  • 空格编码为 +%20
  • 特殊字符如 : 编码为 %3A" 编码为 %22
  • 可以直接在仓库内搜索:github.com/{owner}/{repo}/search?q=keyword&type=code
  • GitHub 搜索栏下拉会自动保存最近搜索记录

2.5 场景:Upstream 仓库已删除,搜索其 Fork

当原仓库被删除后,可以用 fork:only 限定符只搜索 fork 类型的仓库,按 Star 降序找到最有价值的 fork:

Web URL:

https://github.com/search?q={repo_name}+fork:only&type=repositories&s=stars&o=desc

API:

curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/search/repositories?q={repo_name}+fork:only&sort=stars&order=desc" \ | jq '.items[] | {name: .full_name, stars: .stargazers_count, forked_from: .parent.full_name}'

局限性:

  • 只能按仓库名匹配,会混入同名但无关的 fork
  • 如果 fork 改名了就搜不到
  • fork:only 表示”只返回 fork 类型的仓库”,无法指定”谁的 fork”
  • 可结合 user: / org: 缩小范围,例如 fork:only user:myuser awesome-project

2.6 其他实用 URL 拼接

# 预填 Release 表单 https://github.com/{owner}/{repo}/releases/new?title=v1.0.0&tag=v1.0.0&body=Release%20notes # 直接打开 Issue 筛选视图 https://github.com/{owner}/{repo}/issues?q=is:open+is:issue+label:bug # 仓库内特定路径搜索 https://github.com/{owner}/{repo}/search?q=keyword+path:src&type=code

三、GitHub REST API 搜索高级技巧

GitHub 提供 REST API 实现编程式搜索,适合自动化脚本、数据分析和批量查询。

3.1 搜索端点一览

端点说明
GET /search/repositories搜索仓库
GET /search/code搜索代码
GET /search/issues搜索 Issue 和 PR
GET /search/users搜索用户
GET /search/topics搜索主题
GET /search/labels搜索标签(需 repo scope)
GET /search/commits搜索提交(需认证)

3.2 速率限制

认证方式限制说明
未认证10 次/分钟非常有限
PAT / OAuth Token30 次/分钟标准限制
GitHub App30 次/分钟按安装计

注意:Search API 的速率限制比 Core API(5000 次/小时)严格得多。

3.3 通用查询参数

参数说明默认值
q搜索查询(必填)-
sort排序字段best match
order排序方向desc
per_page每页条数30(最大 100)
page页码1

3.4 各端点排序选项

Repositories: starsforkshelp-wanted-issuesupdated

Issues: commentsreactionsreactions-+1interactionscreatedupdated

Users: followersrepositoriesjoined

3.5 实战 curl + jq 示例

搜索高星 Python 仓库:

curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/search/repositories?q=language:python+stars:>1000&sort=stars&order=desc&per_page=5" \ | jq '.items[] | {name, stars: .stargazers_count, description}'

搜索代码中的 TODO:

curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/search/code?q=TODO+repo:facebook/react" \ | jq '.items[] | {repo: .repository.full_name, path}'

找新手友好 Issue:

curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/search/issues?q=label:%22good+first+issue%22+language:python+state:open&sort=created&order=desc" \ | jq '.items[:10] | .[] | {title, html_url, created_at}'

高级 jq 管道——筛选近期活跃 Rust 仓库并按 Star 排序:

curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/search/repositories?q=language:rust&sort=updated&order=desc" \ | jq '[.items[] | select(.pushed_at > "2025-01-01T00:00:00Z") | {name, stars: .stargazers_count, updated: .pushed_at}] | sort_by(.stars) | reverse | .[:10]'

统计某用户仓库语言分布:

curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \ "https://api.github.com/search/repositories?q=user:torvalds&per_page=100" \ | jq '[.items[].language] | group_by(.) | map({lang: .[0], count: length}) | sort_by(.count) | reverse'

3.6 分页处理

Search API 单次查询最多返回 1000 条结果。使用 page + per_page 翻页:

# 第 1 页 curl -s "https://api.github.com/search/repositories?q=python&per_page=100&page=1" # 第 2 页 curl -s "https://api.github.com/search/repositories?q=python&per_page=100&page=2"

响应头中的 Link 字段包含翻页信息:

Link: <https://api.github.com/search/repositories?q=python&page=2>; rel="next", <https://api.github.com/search/repositories?q=python&page=10>; rel="last"

3.7 API 响应结构

{ "total_count": 12345, "incomplete_results": false, "items": [ { "id": 12345678, "name": "repo-name", "full_name": "owner/repo-name", "html_url": "https://github.com/owner/repo-name", "stargazers_count": 5000, "forks_count": 1000, "language": "Python" } ] }

如果 incomplete_results: true,说明搜索超时,建议缩小查询范围。

3.8 高级技巧

高亮匹配文本: 添加 Accept: application/vnd.github.text-match+json 请求头,响应中会包含匹配片段的高亮信息。

条件缓存: 使用 If-Modified-SinceIf-None-Match 请求头利用缓存,减少 API 调用。

GraphQL 替代方案: 对于复杂查询,GraphQL API 可以一次请求获取精确所需数据:

{ search(query: "language:python stars:>1000", type: REPOSITORY, first: 10) { repositoryCount edges { node { ... on Repository { name stargazers { totalCount } description } } } } }

四、速查表

功能Web UIURLREST APIGraphQL
查询语法完整完整(URL 编码)完整自定义
速率限制30 次/分5000 pts/hr
最大结果数~1000~10001000100/页
私有仓库登录后可见登录后可见需 Token需 Token
分页支持p= 参数page 参数after 游标

参考

官方文档

社区讨论

实战教程

工具和资源

This post is licensed under CC BY 4.0 by the author.