公開日: 2023年10月5日

GitHub CLI で GitHub をコマンドラインから操る

fork して放置していたリポジトリを更新する方法をネットで調べていたところ、GitHub CLI なる便利そうなものを見つけました。ふつうは GitHub にサインインして行うさまざまな操作をコマンドラインから実行できるそうです。今回はとりあえず fork 関連と SSH 公開鍵関連について調べて記事にしました。

その他にもいろいろなことができるようですので、詳しくは下記リンク先のマニュアルを参照してください。

インストール

FreeBSD では ports/packages に収録されています。

# pkg install -y gh

Windows で Git for Windows を使う場合は、git-bash.exe か git-cmd.exe のどちらかから GitHub CLI を使うことになりますが、git-bash.exe のほうは Mintty でプロンプトを表示するのに問題があるようです。よって本稿では git-cmd.exe を使って説明します。git-cmd.exe を起動し、winget を利用してインストールします。

> winget install --id GitHub.cli

ちなみにアップグレードするときは次のようにします。

> winget upgrade --id GitHub.cli

また、認証時にウェブブラウザが必要になるので、インストールされていなければしておきます。

認証の手続き

GitHub CLI を利用するには、最初に認証を行う必要があります (もしかしたら最初だけではないかも…そのへんはよくわかりません)。

GitHub CLI のすべての機能は gh コマンドから実行します。その下にいくつかのサブコマンドが用意されています。認証を行うコマンドはgh auth loginです。

% gh auth login

実行すると対話式にいくつか質問されるので、順に答えていきます。

? What account do you want to log into?  [Use arrows to move, type to filter]
> GitHub.com
  GitHub Enterprise Server

GitHub.com と GitHub Enterprise Server のうちアカウントがあるほうを上下キーで選択します。

? What is your preferred protocol for Git operations?  [Use arrows to move, type to filter]
  HTTPS
> SSH

Git を操作する際のプロトコルを HTTPS と SSH のどちらかから選択します。ふだん GitHub を利用するほうを選択します。

? Upload your SSH public key to your GitHub account?  [Use arrows to move, type to filter]
  /home/mijinco/.ssh/id_ed25519_bb.pub
  /home/mijinco/.ssh/id_ed25519_gh.pub
> Skip

上の質問で SSH を選択した場合、SSH の公開鍵ファイルをアップロードします。公開鍵の作成方法は「Git 第2回: ローカルリポジトリを GitHub や Bitbucket に上げよう」の記事を参照してください。すでに公開鍵を登録してある場合は Skip でも OK です。

? How would you like to authenticate GitHub CLI?  [Use arrows to move, type to filter]
> Login with a web browser
  Paste an authentication token

! First copy your one-time code: DEAD-BEEF
Press Enter to open github.com in your browser...

GitHub CLI の認証を行う方法を選択します。今回はウェブブラウザを使って行います。表示されている 16 進数 8 桁のワンタイムコード (上の例では DEAD-BEEF) を覚えておくかメモっておいて Enter キーを押します。

ウェブブラウザが起動して GitHub のサイトに飛ぶのでサインインします。すると図 1 のように Device Activation の画面に遷移します。先ほどメモっておいたワンタイムコードを入力し、あとは図 2、3 のように画面の指示にしたがって進め、ブラウザを閉じましょう。

図 1
図 1
図 2
図 2
図 3
図 3

「Authentication complete.」と表示されれば成功です。

✓ Authentication complete.
- gh config set -h github.com git_protocol ssh
✓ Configured git protocol
✓ Logged in as mijinco0

fork する

既存のリポジトリから fork するにはgh repo fork <fork 元のリポジトリ>を実行します。例えば awesomeWM/awesome を fork するには次のようにします。このときついでに clone も行うか訊かれるので、都合のいいほうを回答しましょう。

% gh repo fork awesomeWM/awesome
✓ Created fork mijinco0/awesome
? Would you like to clone the fork? Yes
Cloning into 'awesome'...
...
✓ Cloned fork
% ls
awesome/

fork したリポジトリを fork 元と同期させる

上のようにして fork してきたリポジトリに fork 元の最新状態を反映させるためには次のようにします。

% gh repo sync mijinco0/awesome --branch master
✓ Synced the "mijinco0:master" branch from "awesomeWM:master"

fork 元のリポジトリを指定することもできます。次のコマンドは上と同じ結果になります。

% gh repo sync mijinco0/awesome --branch master --source awesomeWM/awesome
✓ Synced the "mijinco0:master" branch from "awesomeWM:master"

登録済みの SSH 公開鍵を表示する

GitHub に登録済みの SSH 公開鍵を表示するにはgh ssh-key listを実行します…ということで実際にやってみたら警告が表示されました。

% gh ssh-key list
warning:  HTTP 404: Not Found (https://api.github.com/user/keys?per_page=100)
This API operation needs the "admin:public_key" scope. To request it, run:  gh auth refresh -h github.com -s admin:public_key
warning:  HTTP 404: Not Found (https://api.github.com/user/ssh_signing_keys?per_page=100)
This API operation needs the "admin:ssh_signing_key" scope. To request it, run:  gh auth refresh -h github.com -s admin:ssh_signing_key

GitHub CLI での操作には権限が必要なものがあり、そういった操作を行う際には認証しなおす必要がある、ということでしょうか?言われたとおりにリフレッシュしてみます。

% gh auth refresh -h github.com -s admin:public_key
% gh auth refresh -h github.com -s admin:ssh_signing_key

ここでも初回の認証手続きと同様にブラウザが起動し、Device Activation が必要でした。これが済んだら ssh-key サブコマンドも使えるようになります。

% gh ssh-key list
TITLE                    ID        KEY                    ...
OSHIRUKO/Win10           11111111  ssh-ed25519 AAA...Eeh  ...
OSHIRUKO_VM/FreeBSD13.2  22222222  ssh-ed25519 AAA...7c5  ...

※ ID 欄は架空の数値に書き換えています。また誌面の都合上、 左端を端折っています。

SSH 公開鍵を登録する

GitHub に SSH 公開鍵を登録するコマンドは次のとおりです。

gh ssh-key add <公開鍵ファイル名> --title <公開鍵のタイトル>

公開鍵ファイルの作成方法については「Git 第2回: ローカルリポジトリを GitHub や Bitbucket に上げよう」の記事を参照してください。例えば id_ed25519.pub という公開鍵ファイルを Test for GitHub CLI というタイトルで登録するには次のようにします。

% gh ssh-key add ~/.ssh/id_ed25519.pub --title "Test for GitHub CLI"
✓ Public key added to your account

登録できたか確認します。

% gh ssh-key list
TITLE                    ID        KEY                    ...
OSHIRUKO/Win10           11111111  ssh-ed25519 AAA...Eeh  ...
OSHIRUKO_VM/FreeBSD13.2  22222222  ssh-ed25519 AAA...7c5  ...
Test for GitHub CLI      33333333  ssh-ed25519 AAA...2wc  ...

SSH 公開鍵を削除する

次は削除です。

gh ssh-key delete <公開鍵の ID>

公開鍵の ID は 10 進数 8 桁の数値で、gh ssh-key listコマンドの出力のID 欄に表示されます。先ほどテスト用に登録した公開鍵の ID は 33333333 です。これを削除してみましょう。削除する際、確認のために鍵のタイトルを入力する必要があります。

% gh ssh-key delete 33333333
? Type Test for GitHub CLI to confirm deletion: Test for GitHub CLI
✓ SSH key "Test for GitHub CLI" (33333333) deleted from your account

または-yオプションを付けると問答無用で削除されます。

% gh ssh-key delete 33333333 -y
✓ SSH key "Test for GitHub CLI" (33333333) deleted from your account

削除できたか確認します。

% gh ssh-key list
TITLE                    ID        KEY                    ...
OSHIRUKO/Win10           11111111  ssh-ed25519 AAA...Eeh  ...
OSHIRUKO_VM/FreeBSD13.2  22222222  ssh-ed25519 AAA...7c5  ...

今回はここまでです。その他の使い方については GitHub CLI のマニュアルやgh --helpを参照してください。