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
にします。
とりあえずこれで一回問題解決としておきます
色々とインタラクティブな部分は残ってたり、エラー処理をちゃんと行えている気がしないのが心残りですが、一回解決としておきます。