このページ内容は2021年1月21日以降、再調査・再検証してません。実際に扱う際は最新の情報にアクセスしてください。

link
GitHub CLI

GitHub CLIはGitHub上での操作をCLIで実行するためのGitHub公式ツールですgithub_cli。ローカルで新規にリポジトリを作成、PRの一覧・切り替えやGitHub APIの実行などができます。

近いものでhubというCLIツールがありますが、それをGoで再実装し、GitHubで公式になったものがGitHub CLIです。また、元々hubをメンテナンスしていた方がGitHub CLIの方をメンテナンスするようになったので、hubを使ってる方も移行を考えた方が良さそうです。

link
GitHub CLIの概要

GitHub CLIは2, 3年前からありますが、よく知らない人のために、GitHub CLIで使う機会が多い (自分比) コマンドについて紹介します。より詳しい説明やその他のコマンドはgithub_cli_manualで確認できます。

リポジトリの新規作成

gh repo createコマンドを使うと、リポジトリを新規作成できます。リポジトリ名や公開範囲はどうするか、.gitignoreは作成するか、ライセンスを追加するかなどが聞かれます。意外と便利です。

1
$ gh repo create
2
? What would you like to do? [Use arrows to move, type to filter]
3
> Create a new repository on GitHub from scratch
4
Push an existing local repository to GitHub
5
? Repository name <repository_name>
6
? Repository description
7
? Visibility [Use arrows to move, type to filter]
8
> Public
9
Private
10
Internal
11
? Would you like to add a .gitignore? Yes/No
12
? Would you like to add a license? Yes/No
13
? This will create "<repository_name>" as a private repository on GitHub. Continue? Yes
14
✓ Created repository <user>/<repository_name> on GitHub
15
? Clone the new repository locally? Yes/No

リポジトリのPR一覧

gh pr listを使うとリポジトリのPR一覧を確認できます。

1
$ gh pr list
2
Showing 1 of 1 open pull request in <user_name>/<repo_name>
3
#2 <pr_title> <branch_name>
4
#3 <pr_title> <branch_name>
5
#5 <pr_title> <branch_name>
6
//}

PRの一覧を確認するだけでなく、チェックアウトしたいPR番号を指定することで、そのリポジトリにチェックアウトできます。gitでいうとgit fetch; git checkout origin/remote_branch -b remote_branchを簡単にできます。

1
$ gh pr checkout 5

pecoと組み合わせることで、PR一覧を見ながらワンライナーで切り替えできるようになります。

1
$ gh pr checkout $(gh pr list | peco | cut -f 1)
2
QUERY> IgnoreCase [1 (1/1)]
3
2 <pr_title> <branch_name> OPEN
4
3 <pr_title> <branch_name> OPEN
5
5 <pr_title> <branch_name> OPEN

GitHub API

GitHubのAPI v3 (REST API) やv4 (GraphQL) も使うことができます。例えば、リポジトリに存在するブランチ名一覧を取得したい場合は、以下のように書くことで取得できます。ここでは、--templateオプションをつけることで出力を整形し、nameごとに改行してます。このようなGitHub APIをそのまま叩くのは不便ですが、GitHub Extensionsと組み合わせることで、効果的にGitHub APIを使うことができます。

1
$ gh api graphql -f
2
query='{
3
repository(owner: "<user>", name: "<repository_name>") {
4
refs(first: 50, refPrefix:"refs/heads/") {
5
nodes {
6
name
7
}
8
}
9
}
10
}'
11
--template '{{- range .data.repository.refs.nodes -}}{{- .name | printf "%s\\n" -}}{{- end -}}'
12
13
<branch_name1>
14
<branch_name2>
link
GitHub Extension

2021年にリリースされたGitHub CLI v2.0からGitHub Extensionという機能が使えるようになりました。これはShellやバイナリコードをghの拡張コマンドに組み込める機能です。gh extension createコマンドで雛形を作成できます。作成後はgh-<コマンド名>のブランチを作成し、gh extension install <username>/<branch>でインストールできます。

例えば、gh-branchという名前で以下のようなExtensionを書くと、GitHub APIを手打ちする代わりにgh branchコマンドとして、リポジトリに存在するブランチ一覧と各ブランチの最新のコミットメッセージを表示し、インクリメンタルにブランチ切り替えができます。ちなみに、ownerやrepoなどの引数はコマンド実行時に入ります。

1
#!/bin/bash
2
set -e
3
4
remote_branch=$(gh api graphql -F owner='{owner}' -F repo='{repo}' -f query='
5
query ($owner: String!, $repo: String!) {
6
repository(owner: $owner, name: $repo) {
7
refs(first: 50, refPrefix: "refs/heads/") {
8
nodes {
9
name
10
target {
11
... on Commit {
12
history(first: 1) {
13
edges {
14
node {
15
message
16
}
17
}
18
}
19
}
20
}
21
}
22
}
23
}
24
}' --template '
25
{{- range .data.repository.refs.nodes -}}
26
{{- .name | printf "%-30s\t" -}}
27
{{- range .target.history.edges -}}
28
{{- .node.message | printf "%-50s\n" -}}
29
{{- end -}}
30
{{- end -}}
31
' | peco | cut -f 1)
32
33
git checkout origin/$remote_branch

自己紹介
はじめまして Pilefortです。
東京でエソジニアをしてます。
興味のあるスタックは、JavaScript (React, Vue), TypeScript, Rust, WebAssembly, AWS, Pulumi, Serverless Frameworkです。
このブログでは、普段の業務や趣味で気になったことをまとめたり、フロントやAWS, GitHubやTwitterで見かけた面白い記事やニュースをまとめるためのものです。少しでも何かの役に立てば幸いです。
最近の活動
技術書典13 (2022.9.10 - 2022.9.25) で本を出しました。
2022年の1月から8月ぐらいまでに登場したり、大幅なアップデートがあったWebサービスや開発ツール、ライブラリ、フレームワークを紹介した本です。
うぇぶちぇんじろぐ2023part1
XMind8ファイルをMarkdownファイルに変換するツールを作りました。
公式のxmind-sdk-jsのバージョンを下げて作ってます (最新版だと一部メソッドが削除されてるため)。
技術書典12 (2022.1.22 - 2022.1.30) で本を出しました。
2021年に登場したり、大幅なアップデートがあったWebサービスや開発ツール、ライブラリ、フレームワークを紹介した本です。
うぇぶちぇんじろぐ2022
サイトマップ
Notes
業務や趣味での気づき・メモ
Scraps
雑記。ネットで見つけた面白い記事やニュース
Snippets
記事にするまでもないけど、便利なコマンドや豆知識
Works
同人誌一覧