前置知识: Git

gh search 搜索命令速查手册

4 min入门

问题驱动讲解 gh search:从"怎么快速找到想要的仓库、代码、Issue、PR、提交"等真实问题切入,涵盖 repos/code/issues/prs/commits 五类搜索与常用过滤选项,配以错误对策。

开篇:把 gh search 想成图书馆检索系统

图书馆很大,书架成千上万。直接逛,你永远找不到想要的书。但图书馆有一套检索系统:想找书,按”书名+作者+分类”查;想找某篇期刊文章,按关键词查;想找某位作者的全部著作,按作者查。检索系统的价值就是:在浩如烟海的资料里,几秒钟锁定目标。

GitHub 上有上亿个仓库、几十亿行代码。gh search 就是 GitHub 的”图书馆检索系统”:不用打开网页、不用一个个仓库翻,直接在终端里用一条命令,从全站范围内筛出你想要的仓库、代码、Issue、PR 甚至提交记录。

本文采用”问题驱动”写法:你想解决什么,就跳到对应小节找答案。


原理先讲清:搜索的两大要素

2.1 搜索范围(要搜什么)

gh search 下有 5 个子命令,对应 5 种”馆藏”:

子命令搜索范围典型问题
gh search repos仓库“想找某语言的开源项目”
gh search code代码内容“想找某段代码怎么写的”
gh search issuesIssue“有没有人报过这个 bug”
gh search prs拉取请求“这个功能有没有人提过 PR”
gh search commits提交记录“某段逻辑是什么时候改的”

2.2 搜索语法(怎么搜得更准)

GitHub 搜索由”关键词 + 限定符(qualifier)“组成。限定符就是 xx:值 形式的过滤条件,例如 label:bug、author:octocat、stars:>1000。gh search 支持两种写法:

  • 用参数旗标:gh search repos --language=go --stars=">1000"(每个限定符对应一个旗标,更易读);
  • 直接写语法:gh search issues label:bug author:monalisa state:open(与网页端搜索框一致,灵活但需记语法)。

两者可以混用。建议新手先用旗标,熟悉后再用语法。


问题 1:“我想找某个开源仓库/项目”

这是最常用的搜索:找库、找项目模板、找学习资料。

# 按关键词搜仓库(多个词之间是"与"关系)
gh search repos "react ui"

# 按编程语言过滤
gh search repos --language=typescript

# 按 star 数过滤(数字写法带引号)
gh search repos --stars=">1000" --language=go

# 按主题(topic)过滤,比如找"低代码"主题的项目
gh search repos --topic=low-code --limit 10

# 限定组织与可见性
gh search repos --owner=microsoft --visibility=public

# 找"适合新手入门"的项目(good first issue 数量 >= 10)
gh search repos --language=go --good-first-issues=">=10"

# 排除已归档仓库
gh search repos --archived=false

# 只搜仓库名(不匹配描述/README)
gh search repos --match=name "chatgpt"

# 按 star 数排序
gh search repos react --sort=stars --order=desc

gh search repos 典型输出:

NAME                 DESCRIPTION                            STARS  UPDATED
facebook/react       The library for web and native...      229k   2h ago
vercel/next.js       The React Framework                     130k   1h ago

问题 2:“我想找某段代码/某个 API 用法”

抄作业(参考优秀代码)是学习利器。gh search code 能搜全站公开仓库的代码内容。

# 搜索同时包含 useState 和 useEffect 的代码
gh search code "useState useEffect"

# 限定在某仓库内搜索
gh search code "TODO" --repo=owner/repo

# 限定文件名搜索(例如找所有 settings.py)
gh search code "DEBUG" --filename="*.py"

# 限定组织与语言
gh search code "config" --org=myorg --language=go

注意:代码搜索默认只覆盖公开仓库,且需要登录才能使用;私有仓库的代码需要额外权限。


问题 3:“这个 bug/功能有没有人提过 Issue?”

写代码遇到报错,先搜 GitHub——大概率有人踩过坑,还能看到解决方案。

# 搜 open 状态、带 bug 标签的 issue
gh search issues "memory leak" --state=open --label=bug

# 搜分配给自己的 open issue(@me 表示"当前登录用户")
gh search issues --assignee=@me --state=open

# 限定在某仓库搜
gh search issues --repo=owner/repo "crash"

# 搜自己创建的 issue
gh search issues --author=@me

# 同时搜索 issue 与 PR(--include-prs)
gh search issues --include-prs --owner=cli

# 找"没人认领、适合新手"的 issue(无 assignee + 有标签)
gh search issues --no-assignee --label="good first issue"

# 找评论数多的热门 issue
gh search issues --comments=">50"

# 找没有 bug 标签的 issue(排除语法,注意前面的 --)
gh search issues -- "-label:bug"

gh search issues 典型输出:

NUMBER  TITLE                    STATE  LABELS         UPDATED
#4521   Fix memory leak in X     open   bug           2d ago
#4498   Crash on startup         open   bug, priority 5h ago

问题 4:“这个功能有没有人提过 PR?”

# 搜自己已合并的 PR
gh search prs --merged --author=@me

# 搜需要自己审查的 PR(很实用)
gh search prs --review-requested=@me --open

# 搜某仓库的已合并 PR
gh search prs --repo=owner/repo --merged

# 搜未合并、带 review 标签的 PR
gh search prs --reviewed-by=@me --state=open

# 搜被标记为 draft(草稿)的 PR
gh search prs --draft --repo=owner/repo

问题 5:“某段代码是什么时候引入的?”

# 按提交信息搜索
gh search commits "fix memory leak" --repo=owner/repo

# 按作者搜索提交
gh search commits --author=zhangsan

# 限定组织范围
gh search commits "bump version" --org=myorg

通用技巧:让结果更可控

5.1 控制输出

# 限制条数(默认 30)
gh search repos react --limit 50

# 按 star 数升序
gh search repos react --sort=stars --order=asc

# 输出 JSON 供脚本处理
gh search repos react --json fullName,stargazersCount

# 配合 jq 只取名字
gh search repos react --json fullName --jq '.[].fullName'

# 在浏览器中打开搜索结果页面
gh search repos react --web

5.2 排除限定符(重点技巧)

网页端支持 -label:bug 这样的”排除”语法,但终端里 - 开头的字符串会被 shell 当成参数。解决方法是加一个 -- 分隔符,告诉 shell”后面是查询串,不是参数”:

# Unix 系(bash/zsh/macOS)用法
gh search issues -- "-label:bug"

# PowerShell 用法(需要 --% 停止解析)
gh --% search issues -- "-label:bug"

通用技巧:读懂搜索结果与常用字段

--json 输出的字段取决于搜索类型,掌握常用字段可让脚本化处理事半功倍:

搜索类型常用 JSON 字段说明
reposfullName、description、stargazersCount、language、isArchived仓库全名、描述、star 数、语言、是否归档
issuesnumber、title、state、labels、assignees、isPullRequest编号、标题、状态、标签、指派者、是否为 PR
prsnumber、title、state、isDraft、mergeable编号、标题、状态、是否为草稿、是否可合并
coderepository、path、name所在仓库、文件路径、文件名
commitssha、message、author、date提交哈希、提交信息、作者、日期

结合 --jq 可以拼出任意格式:

# 输出"仓库名: 描述"格式
gh search repos "react" --json fullName,description --jq '.[] | "\(.fullName): \(.description)"'

# 只看 star 数前 5 的仓库全名
gh search repos --language=python --sort=stars --limit 5 --json fullName --jq '.[].fullName'

提示:所有 gh search 子命令都支持 --json 与 --jq,想了解某类搜索的全部字段,可在任意仓库执行 gh search repos --json <Tab> 或查看官方手册对应页面。


常见错误与对策

新手常见错误报错/现象原因解决办法
排除语法直接写 -label:bug报 unknown flag: -label减号被 shell 当成参数查询前加 --:gh search issues -- "-label:bug"
数字条件不加引号stars:>1000 报错或行为怪异> 被 shell 重定向加引号:--stars=">1000"
未登录就搜代码code search requires authentication代码搜索必须登录先 gh auth login
搜索词含空格被拆开结果对不上多个词被视为”与”关系想搜短语加引号:gh search repos "vim plugin"
用 —repo 但值写错结果为空仓库名格式错误用 owner/repo 完整格式
搜私有仓库代码结果为空默认只搜公开仓库确认有权限且在设置中开启代码搜索授权
分不清 issues 与 prs结果混入另一类gh search issues 默认不含 PR需要同时搜加 --include-prs;只搜 PR 用 gh search prs

一句话记忆

gh search 是 GitHub 的”检索台”:找库用 repos,找代码用 code,找讨论用 issues/prs,找历史用 commits;记住”关键词 + 限定符 + -- 排除 + --json 输出”四板斧,检索又快又准。