GithubのOrganizationのRepositoryを一括git cloneする方法


概要

新しいチームにJoinした際に、とりあえずGithubの該当組織のリポジトリを一括cloneしてしまいたいということがあるだろう。
そんな方法が意外と落ちてなかった、かつ、調べるのに時間がかかったため、ここに記載する

方法

手順としては
1. github apiにcurlしてリポジトリ詳細情報を取得(ssh_url にcloneするのに必要な情報が含まれている)
2. 該当リポジトリにてssh_urlの情報を用いてgit clone

まともな組織であれば、organizationのリポジトリはprivateリポジトリであることがほとんどであると思うので、認証を噛ませてcurlさせなくてはならない。自身がorganizationのメンバであるならば、自身のアカウントのPersonal access tokenを用いれば認証が通るはずだ。:orgによしなに組織名を入れて欲しい。

-v をオプションに加えるのは、HTTPヘッダを取得することが目的であるからだ。

$ curl -v -H "Authorization: token PERSONAL_ACCESS_TOKEN" https://api.github.com/orgs/:org/repos
...
< Link: <https://api.github.com/organizations/100000/repos?page=2>; rel="next", <https://api.github.com/organizations/100000/repos?page=18>; rel="last"
...
[ # リポジトリの詳細情報のリスト
    { ...

とまあ、こんな感じでHTTPヘッダと共に、リポジトリの詳細情報のリストが返ってくる。もうこれでいいじゃん、と思うかもしれない。しかし、リポジトリの数が膨大である場合、このレスポンスにはpage=1相当の情報しか返ってこない。違う、そうじゃない、全部ほしいんだ!!ということで、大事になるのが、下記のHTTPヘッダの部分。

< Link: <https://api.github.com/organizations/ORGANIZATION_ID/repos?page=2>; rel="next", <https://api.github.com/organizations/ORGANIZATION_ID/repos?page=10>; rel="last"

これをみると、
「ああ、pagingされていて、page=1からpaga=10(rel="last"部分参照)までpage数があるんだな」
とわかる。
あとは、これをforで回して、順次cloneすればええやん、となる。

下記のforのloop回数は適宜書き換えてくれ。cloneしたいディレクトリ直下で下記を実行。

clone.sh
for ((i=1; i<11; i++))
do
    curl -v -H "Authorization: token PERSONAL_ACCESS_TOKEN" https://api.github.com/organizations/100000/repos\?page=$i | jq ".[].ssh_url" | xargs -n 1 git clone
done

おそらく綺麗に全部cloneされているはずだ。

以上。

参考記事

本記事を書くにあたり、下記のサイトを参考にさせていただきました。ありがとうございますm
https://developer.github.com/v3/auth/
https://mseeeen.msen.jp/github-api-get-all-repos-info/
https://tic40.hatenablog.com/entry/2018/03/26/073000