モチベーション

GitHubにホストされているOSSにPRを出す時にforkしてからローカルにcloneするが、ブラウザのforkボタンを使ってforkすると時間がかかることが多くストレスに感じていた。

そのためCLI上でforkとcloneを行うスクリプトを書いた。

これまでの手順は以下のような手順が必要だった。

  1. ブラウザでforkボタンを押す
  2. forkの完了を待つ
  3. ブラウザに表示されるcloneコマンドをコピー(gh repo clone owner/repoみたいなやつ)
  4. ターミナルでコマンドを実行してforkしたリポジトリをcloneする

これを以下のステップでできるようにした。

  1. リポジトリのURLまたはOWNER/REPO形式の文字列をコピー
  2. コマンドに1. で取得した文字列を渡して実行

つくったスクリプト

以下を.zshrcなどに追加すると使えるようになる。aliasの部分はお好みで。1

function git-fork-clone() {
    # 入力からowner/repoを取り出す。owner/repoのような形式でもURLでもOK
    REPO=$(echo $1 | sed -E 's@.+github.com/([^/]+)/([^/]+).*@\1/\2@')
    echo "🐙 ${REPO} will be forked and cloned.\\n"
    # -- 以降のオプションはgit cloneに渡される
    # See: https://cli.github.com/manual/gh_repo_fork
    gh repo fork ${REPO} --default-branch-only --clone=true -- --filter=blob:none
}
alias gf=git-fork-clone

前提

ghコマンドがインストールされていること。

使い方

$ git-fork-clone https://github.com/cli/cli

上記を実行すると以下のような出力が表示され、リポジトリのforkとcloneが行われる。

🐙 cli/cli will be forked and cloned.

✓ Created fork kyu08/cli
Cloning into 'cli'...
remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (31/31), done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 31 (delta 0), reused 10 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (31/31), 20.41 KiB | 10.20 MiB/s, done.
From github.com:cli/cli
 * [new branch]      main       -> upstream/main
 * [new tag]         v1.0.1     -> v1.0.1
✓ Cloned fork

以下のような形式でも動く。

  • git-fork-clone https://github.com/cli/cli/pulls
  • git-fork-clone cli/cli

まとめ

また人類のOSS貢献力を加速させてしまいました。


  1. 完全に余談だがスクリプトのREPO=...の部分は https://www.tutorialspoint.com/execute_bash_online.php を使って出先で書いた。スマホでもシェルスクリプトが書けて便利。 ↩︎