概要
新しいチームにJoinした際に、とりあえずGithubの該当組織のリポジトリを一括cloneしてしまいたいということがあるだろう。
そんな方法が意外と落ちてなかった、かつ、調べるのに時間がかかったため、ここに記載する
方法
手順としては
- github apiにcurlしてリポジトリ詳細情報を取得(
ssh_url
にcloneするのに必要な情報が含まれている) - 該当リポジトリにて
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したいディレクトリ直下で下記を実行。
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