GitHubを操作するCLI「gh – The GitHub CLI tool」(Beta)を試す

はじめに

GitHubが「GitHub CLI」をベータ版として公開しました。

リポジトリはgh - The GitHub CLI toolです。 githubの紹介記事は、こちらです。

本ツールはGitHub公式であるのに対して、hubという非公式ツールがあります。 私は普段からhubを利用しており、hub createhub create -phub browseをよく利用しています。

本記事では、GitHubの公式ツールghでどのような操作が可能か試してみました。

注意: Beta版なので、今後大きく仕様が変わる可能性があります。また本記事は、gh version 0.5.5 (2020-02-13)を利用しています。

インストール

インストール方法詳細ページ

Mac場合

$ brew install github/gh/gh

認証設定

何らかのコマンドを実行すると認証を求められます。

$ gh issue list
Notice: authentication required
Press Enter to open github.com in your browser...

[Enter]を押下で、ブラウザが起動し、認可画面に遷移します

緑色のAuthorize githubを押下し、認証完了です。

ghコマンドのオプション

現在第1引数に以下のコマンドが利用可能です。

  • gh help
  • gh issue
  • gh pr

gh prgh issueについて見ていきます。

gh pr

gh pr create

プルリクエストを作成するオプション。gh pr create [flags]で実行します。

flagsオプションの詳細は、下記の通りです。(詳細は、gh pr create --help参照。以後同様。)

flags 機能
-B, --base string コードをマージするブランチを指定
-b, --body string プルリクエストの内容を指定します。それ以外は対話型で設定します
-d, --draft ドラフトプルリクエストを作成します
-t, --title string タイトルを指定します。 それ以外は対話型で設定します
-w, --web Webブラウザーを開いてプルリクエストを作成します

オプション未指定で試す(gh pr create)

プルリクエストの内容を記述するエディターを設定します。

ghは利用するエディタを環境変数で認識し、$GITHUB_EDITOR$EDITOR$VISUALの順で評価します。参考

私の環境では、$VISUALnanoが設定されていたため、neovimを設定しました。

export VISUAL='nvim' # vim等

ブランチを適当に切って、コミット後コマンド(gh pr create)を実行します

タイトルを入れると、プルリクエストの内容の入力が求められます。(e)でnvimを起動します

neovimが起動します。プルリクエストの内容を書きます。 (このとき、プルリクテンプレートがあると反映されることを確認しています)

wqで抜けると、Preview in browserSubmitCancelかを選択出来ます。今回は、Preview in browserを実行してみます。

ブラウザが起動し、neovimで入力した内容が反映されています。

オプション指定で試す

以下のシナリオを想定して実行してみます

設定項目
マージ先ブランチ master
プルリクエスト draft
タイトル リファクタリング
プルリクエストの内容 hoge
$ gh pr create -B master -d -b 'hoge' -t 'リファクタリング'

Creating pull request for gh-test into master in shuntaka9576/dotfiles

https://github.com/shuntaka9576/dotfiles/pull/41

期待通り、draftプルリクエストが作成されました!

gh pr list

リポジトリ内のプルリクエストの一覧表示およびフィルタリングするオプション。gh pr list [flags]で実行します。

flagsオプションの詳細は、下記の通りです。

flags 機能
-a, --assignee string アサインでフィルタ
-l, --label strings ラベルでフィルタ
-L, --limit int CLI上の取得上限を設定(デフォルト30件)
-s, --state string 状態(open|closed|merged|all)でフィルタ可能(デフォルト open)

プルリクエストのナンバー タイトル branch名の情報が表示されます。open(緑) merged(ピンク) close(赤)で表現されており、分かりやすいですね。

gh pr status

プルリクエストのステータスを表示するオプション。gh pr status [flags]で実行します。

Global Flagsの除くflagsオプションは現在存在しません。

自分のカレントブランチに関するPRと、自分が作成したPR(open)レビュー依頼されているPRの情報が確認できます。

$ gh pr status

Relevant pull requests in shuntaka9576/dotfiles

Current branch
  #41  リファクタリング [gh-test]

Created by you
  #41  リファクタリング [gh-test]
  #40  Refactoring [refactoring]

Requesting a code review from you
  You have no pull requests to review

gh pr view

引数で指定されたプルリクエストをブラウザで表示するオプション。gh pr view [{<number> | <url> | <branch>}] [flags]で実行します。

flagsオプションの詳細は、下記の通りです。

flags 機能
-p, --preview issue内容のプレビューを表示する

プレビューと聞いたら、fzfですね。 リポジトリ配下で、下記のコマンドを実行します。(fzf-tmuxになっていますが、fzfでも可能です)

$ gh pr list| fzf-tmux --prompt "pr preview>" --preview "echo {} | awk '{print \$1}' | xargs gh pr view -p" | xargs gh pr view

左側にプルリクエストのリスト、右側にプルリクエストの内容が表示出来ます。曖昧検索選択後、自動的にブラウザが立ち上がり、対象のプルリクエストを確認出来ます。

gh pr checkout

対象のプルリクエストのbranchにcheckoutするオプション。gh pr checkout {<number> | <url> | <branch>} [flags]で実行します。 Global Flagsの除くflagsオプションは現在存在しません。

~/dotfiles [master]
$ gh pr checkout 41 # PRの番号を指定
Switched to branch 'gh-test'
Your branch is up to date with 'origin/gh-test'.
Already up to date.

~/dotfiles [gh-test] # 指定したPRのブランチにcheckout
$

コードレビュー時に、ブランチ名をコピーしてgit checkout ブランチ名する手間が省けて良さそうですね。

gh issue

gh issue create

issueを作成するオプション。gh issue create [flags]で実行します。

flags 機能
-b, --body string issue内容を指定します。それ以外は対話型で設定します
-t, --title string issueタイトルを指定します。 それ以外は対話型で設定します
-w, --web Webブラウザーを開いてプルリクエストを作成します

要領は、gh pr createと同様です。

gh issue list

issueを表示するオプション。git issue list [flags]で実行します。

flagsオプションの詳細は、下記の通りです。

flags 機能
-a, --assignee string アサインでフィルタ
-l, --label strings ラベルをフィルタ
-L, --limit int CLI上の取得上限を設定(デフォルト30件)
-s, --state string 状態(open|closed|all)でフィルタ可能

下記ような検索をする場合、コマンドは、gh issue list -l bug -L 20 -s allとなります。

設定値
ラベル bug
取得上限 20
状態 全て

aws-cdkで実行した結果は下記の通り。 openしているissueが緑でcloseしているissueが赤で表現されています。

gh issue status

プルリクエストのステータスを表示するオプション。gh issue status [flags]で実行出来ます。

Global Flagsの除くflagsオプションは現在存在しません。

自分がアサインされたissue,メンションされたissue,作成したissueの情報が確認できます。

$ gh issue status

Relevant issues in shuntaka9576/dotfiles

Issues assigned to you
  There are no issues assigned to you

Issues mentioning you
  There are no issues mentioning you

Issues opened by you
  #36 powerline作成 about 6 months ago
  #34 マルチバイト文字列使用時に、tmuxのstatus-windowが... about 6 months ago

gh issue view

issueをブラウザで表示するオプション。git issue view {<number> | <url> | <branch>} [flgas]で実行します。

flagsオプションの詳細は、下記の通りです。

flags 機能
-p, --preview issue内容のプレビューを表示する

先ほどと同様に、fzfを組み合わせると便利そうです。

$ gh issue list| fzf-tmux --prompt "issue preview>" --preview "echo {} | awk '{print \$1}' | xargs gh issue view -p" | xargs gh issue view

左側にissueリスト、右側にissue内容が表示出来ます。曖昧検索選択後、自動的にブラウザが立ち上がり、対象のissueを確認出来ます。

最後に

本記事は、ghの機能を試してみました。beta版でありながら十分に実用的だと感じました。 今後様々なオプションが増えることが期待出来るので、注目していきたいです。