ちなみに

火曜日の空は僕を押しつぶした。

Organizationのリポジトリをまとめてcloneする

生きているとGitHubのOrganizationのリポジトリをまとめてcloneしたくなることってありますよね。僕はあります。

1つずつちまちまcloneするのは大変だし、数が多いと物理的に難しい場合もあります。 しかし、近年では ghqgh のような便利なツールが揃っているの簡単に実現できます。

gh api を使うとGitHubREST API を簡単に叩けるので以下のようにしてリポジトリの一覧を取得します。 1度の取得で100リポジトリが上限なので数が多い場合はページングする必要があります。

gh api /orgs/{org}/repos

シェルスクリプトは得意ではないので、Rubyで雑なスクリプトを書いて対応してみました。jq も使っているのでこちらも用意しておきましょう。

gist.github.com

これでリポジトリの一覧が取得できたので、これを ghq に渡してcloneしていきます。 --parallel オプションをつけると並列して取得してくれるのでまとめて取得するときには付与すると良さそうです。 数が多いと時間がかかりすぎるのとディスク容量を大量に消費してしまうので --shallow もつけています。 必要に応じて各リポジトリfetch すると良いです。 またすでに clone しているリポジトリがあったときのことを考えて --update も付与しています。

詳しい使い方は ghq-book の get の章 が分かりやすいです。 ghqに詳しくなりたい人は ghq-book を買いましょう。

最終的に以下のような感じで目的を達成できました。

$ ruby collect_repositories.rb <ORG_NAME> | ghq get --update --shallow --parallel

他にも特定のユーザーのリポジトリ一覧とかにも応用出来るかと思います。(API Reference)