GitHub CLI 之 gh 命令
摘要
- 本文写 GitHub 官方命令行
gh的安装、登录,以及仓库、Pull Request、Issue、Release 和 Actions 的日常用法。本文按gh2.102.0 来写。 - Git 本身的安装和提交、分支、推送见 Git安装和常用命令(最新)。命令速查见 Git常用命令(快查手册)。
- GitHub CLI 手册,cli/cli 仓库。
gh 是什么
-
开 Pull Request、发 Release、看 Actions 发生在 GitHub 上。
git管本地提交和分支,到不了这些对象。gh把它们收成仓库目录里的命令,也可以放进脚本,不用每次打开网页。 -
gh调用 GitHub 的 HTTP API,用来登录、建仓库、开 Pull Request、看 Actions。工作区里的git commit、git push、git pull仍由git完成。 -
在一个已经关联 GitHub 远程的目录里执行时,
gh从origin读出OWNER/REPO。不在仓库目录里时,用-R OWNER/REPO,或设置环境变量GH_REPO。 -
子命令的参数以本机
gh <命令> --help为准。gh help列出全部命令。
安装
macOS
-
Homebrew 安装
gh这个 formula。装完用gh version确认,输出里应有2.102.0这一行。
1 | brew install gh |
Linux
-
Fedora、CentOS、RHEL 使用 GitHub 提供的 rpm 仓库。
dnf install gh装的是仓库里当前的包,装完仍用gh version核对是不是 2.102.0。
1 | sudo dnf install -y 'dnf-command(config-manager)' |
登录
-
默认走浏览器。令牌写入系统凭据库。找不到凭据库时,退回到
~/.config/gh/hosts.yml明文文件。gh auth status会打印实际存放位置。
1 | # 交互式登录。git 协议选 https 或 ssh |
-
经典 personal access token 从标准输入读入。最小范围是
repo、read:org、gist。细粒度 token 范围窄,交互命令容易在别的仓库上报权限错误,脚本里改用环境变量GH_TOKEN。
1 | gh auth login --with-token < mytoken.txt |
-
GH_TOKEN优先于gh auth login存下来的凭据。gh auth status显示已登录,只说明凭据库里有账号。当前 shell 如果设置了环境变量GH_TOKEN,这次请求用的是这个令牌。
1 | # 只对当前 shell 生效。关掉终端后消失 |
-
GitHub Enterprise Server 换主机名,令牌用
GH_ENTERPRISE_TOKEN。
1 | gh auth login --hostname enterprise.example.com |
-
让
git走 HTTPS 时使用gh保存的凭据。这一步改的是 Git 配置,不是只改当前进程。
1 | gh auth setup-git |
-
多账号用
gh auth switch切换当前主机上的活动账号。gh auth logout删掉该主机上保存的登录状态。
gh auth status 能通过,不代表紧接着的 gh api 或 gh pr create 一定用的是同一个账号。先看当前环境里有没有 GH_TOKEN。
仓库
-
仓库参数写成
OWNER/REPO,或完整的https://github.com/OWNER/REPO。省略OWNER/时,用当前登录用户的名字。
| 命令 | 作用 |
|---|---|
gh repo create |
在 GitHub 上新建仓库 |
gh repo clone |
克隆。参数写在 -- 后面才传给 git clone |
gh repo list |
列出某个用户或组织的仓库 |
gh repo view |
看仓库说明。--web 用浏览器打开 |
gh repo fork |
派生一份到自己的账号 |
gh repo sync |
把上游提交同步到当前检出或指定分支 |
gh repo set-default |
当前目录对应多个远程时,指定默认的 OWNER/REPO |
1 | # 在当前目录对应的本地仓库之外,新建一个公开仓库并克隆下来 |
-
克隆的是 fork 时,
gh会再加一个名为upstream的远程,指向父仓库,并把父仓库设为这个目录的默认仓库。只要origin时加上--no-upstream。
1 | gh repo clone my-fork --no-upstream |
Pull Request
-
编号、Pull Request 的 URL,或头分支名都可以当作参数。
gh pr checkout的短别名是gh co。
| 命令 | 作用 |
|---|---|
gh pr create |
创建。成功后把 URL 打到标准输出 |
gh pr list |
列出当前仓库的 Pull Request |
gh pr status |
看和自己有关的 Pull Request |
gh pr view |
查看。--web 打开浏览器 |
gh pr diff |
看改动 |
gh pr checkout |
把该 Pull Request 的头分支检出到本地 |
gh pr checks |
看这一次的 CI 状态 |
gh pr comment |
加评论 |
gh pr review |
提交评审 |
gh pr merge |
合并 |
gh pr ready |
把草稿标成可以评审 |
gh pr close |
关闭,不合并 |
-
当前分支还没推到远程时,
gh pr create会询问推到哪里,并可以顺手 fork。标题和正文不写就会继续问。--fill用已有 commit 填这两项。同时写了--title或--body时,以这两个参数为准。 -
--dry-run打印将要创建的内容,不真正创建 Pull Request。它仍可能把分支推到远程。
1 | # 推送当前分支并创建。--base 是要合入的分支,省略时用仓库默认分支 |
-
合并方式要和仓库允许的方式一致。仓库只开了 squash 时,
--merge会被拒绝。
1 | # 合并后删除本地和远程的头分支 |
-
有仓库管理员权限、又要绕过分支保护时用
--admin。
Issue
| 命令 | 作用 |
|---|---|
gh issue create |
新建。不给 --title 时会询问 |
gh issue list |
列出 |
gh issue view |
查看。参数是编号或 issue URL |
gh issue comment |
加评论 |
gh issue close |
关闭 |
gh issue reopen |
重新打开 |
1 | gh issue create --title "登录页在空密码时没有提示" --label bug --assignee @me |
Release
-
gh release create的第一个参数是 tag。--target不写时用仓库默认分支。tag 在远程还不存在时,GitHub 会按这个 target 创建。只要远程已有的 tag 时,加上--verify-tag,不存在就中止。
1 | # 标题和说明由 GitHub 按提交记录生成,并附上本地的 dist 目录里的文件 |
| 命令 | 作用 |
|---|---|
gh release list |
列出 |
gh release view |
查看某一个 tag |
gh release download |
下载该 release 的附件 |
gh release upload |
往已有 release 追加附件 |
gh release delete |
删除 release。加上 --cleanup-tag 同时删掉这个 tag。--yes 跳过确认 |
1 | gh release download v1.0.0 --dir ./downloads |
Actions
-
gh run list默认最多取 20 条。gh auth status能通过,只说明账号有效。工作流没开、或 token 没有actions读权限时,列表仍会是空的或报 403。
1 | # 只要失败的、由 main 触发的运行 |
-
工作流文件本身用
gh workflow list和gh workflow view看。重新跑用gh run rerun,取消用gh run cancel。
直接调 API
-
gh api在已登录的前提下请求 GitHub REST。路径里的{owner}、{repo}、{branch}用当前仓库补上。只加了-f或-F、又没写--method时,方法会改成POST。
1 | # 只读。jq 表达式从 JSON 里取出标题 |
-
GraphQL 的端点名是
graphql。除query以外的-f会变成 GraphQL 变量。
配置
-
配置目录默认是
~/.config/gh。GH_CONFIG_DIR可以改到别处,改的是以后每次gh读取的位置。
1 | # 克隆和推送默认走 ssh。取值还有 https |
-
脚本里不要让命令停下来提问时,把
prompt设成disabled,或设置环境变量GH_PROMPT_DISABLED。前者写进配置文件,后者只影响当前进程。
| 变量 | 作用 |
|---|---|
GH_TOKEN |
访问 github.com 或 ghe.com 子域时使用的令牌,优先于已保存的登录 |
GH_ENTERPRISE_TOKEN |
GitHub Enterprise Server 的令牌 |
GH_HOST |
命令里推断不出主机名时用这个主机 |
GH_REPO |
形如 OWNER/REPO。当前目录不是目标仓库时用它 |
GH_DEBUG |
设成任意非空值时,把调试信息打到标准错误。设成 api 时再打印 HTTP 细节 |
卸载
-
先退出登录,再卸包。只卸包时,
~/.config/gh里的主机配置还在,下次装回会继续用。
1 | gh auth logout --hostname github.com |
-
确认命令已经不在
PATH里:
1 | command -v gh |
-
没有输出就说明可执行文件已经删掉。还要清掉登录配置时,再删
$HOME/.config/gh。