• 作成:

GitHub CLIを使ってforkとPRを行う時に、gh repo set-defaultを自動実行する設定方法

問題

だいぶ前からのGitHub CLI | Take GitHub to the command lineで、 gh repo forkした後gh pr createすると、以下のようなエラーが出てくるようになってしまいました。

X No default remote repository has been set for this directory.

please run `gh repo set-default` to select a default remote repository.

Release GitHub CLI 2.21.0 · cli/cliでの変更ですね。

私はちょっとした修正をPRとして投げることが多いので、ストレスになります。

サクっとforkしてPRをgh pr create --assignee @me --webで生成して、 web画面で再確認したいのに、これはかなり鬱陶しいと前から思っていました。

調べた限りGitHub CLI自身のオプションでこれを避ける方法は見つかりませんでした。

解決策

gh repo set-defaultのワンコマンド化

まずはgh repo set-defaultをインタラクティブな動作なしに済ませられるようにしました。

gh repo set-defaultには当然引数を渡せてリポジトリを設定することも出来ますが、 owner/repoの形式で渡す必要があるため、 cloneしてくると毎回違う引数を設定する必要があります。これを自動的にupstreamのリポジトリを設定するようにしたいですね。

これはシェルスクリプトで比較的容易に達成出来ます。

#!/bin/zsh
set -eu

# `gh repo set-default`で`upstream`の設定をインタラクティブに行うのが面倒なのでスクリプトで行えるようにします。

# `upstream`のURLを取得します。
upstream_url=$(git remote get-url upstream)

# `https://github.com/`の部分を削除して、`owner/repo`形式の文字列を得ます。
upstream_repo=$(echo $upstream_url|sed -e 's/https:\/\/github.com\///' -e 's/\.git$//')

# 得られた`owner/repo`を引数として`gh repo set-default`コマンドを実行します。
gh repo set-default $upstream_repo

git remote get-urlなんてコマンドは知りませんでした。

これを~/.zsh.d/bin/gh-repo-set-default-upstreamに保存しておきます。

fork時に行うようにしました

gh repo forkした時に自動で実行されるようにaliasを設定してそれを使うようにしました。

clone側に設定するのも考えましたが、単にソースコード見たくてcloneして、後から間違いとかを見つけてforkしたいとかのシナリオを考えて、 fork側に紐付けることにします。

alias gk='gh repo fork && gh-repo-set-default-upstream'

gfは既に使用されていたためgkにします。

とりあえずこれで一回問題解決としておきます

色々とインタラクティブな部分は残ってたり、エラー処理をちゃんと行えている気がしないのが心残りですが、一回解決としておきます。