生きているとGitHubのOrganizationのリポジトリをまとめてcloneしたくなることってありますよね。僕はあります。
1つずつちまちまcloneするのは大変だし、数が多いと物理的に難しい場合もあります。 しかし、近年では ghqや gh のような便利なツールが揃っているの簡単に実現できます。
gh api を使うとGitHubの REST API を簡単に叩けるので以下のようにしてリポジトリの一覧を取得します。 1度の取得で100リポジトリが上限なので数が多い場合はページングする必要があります。
gh api /orgs/{org}/repos
シェルスクリプトは得意ではないので、Rubyで雑なスクリプトを書いて対応してみました。jq も使っているのでこちらも用意しておきましょう。
これでリポジトリの一覧が取得できたので、これを 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)