LoginSignup
3
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-01

概要

新しいチームに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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1