Terrarium

白紙から描きなおすには ちょうどいいかもしれない

シェルスクリプトを使ってGitHubの特定のOrganizationの持つリポジトリを全てCloneしたい

表題の通りです.あるOrganizationのリポジトリを全部バックアップする必要があったため,それをシェルスクリプトでやってみようという話です.

TL;DR

curl -u [USERNAME] -s https://api.github.com/orgs/[ORGANIZATION]/repos | grep "ssh_url" | sed -e 's/\".*\".*\"\(.*\)\".*/\1/' | xargs -L1 git clone

調査

シェルスクリプトはあまり触れたことがなかったので,やり方を調べる必要がありました.以下は自分向けのメモとして冗長に上記コマンドにたどり着くまでの経緯を書きます.

1. Organizationの全リポジトリの取得方法

やりたいことを英単語でつらつら書いて検索すると似たような事例が出てきました.

Clone all repos from a GitHub organization · GitHub

どうやらcurlを使って特定のAPIにアクセスすれば取得できそうです.このページではRubyを使って書いていますが今回はシェルスクリプトのみでやりたいので,前半のみ参考にします.

2. リポジトリのURLの取得

curlAPIにアクセスするとOrganizationの持つリポジトリの情報が色々取得できますが,ここからCloneのためのURLを抽出する必要があります.ざっと中身を見ていくとssh_urlを使えばCloneできそうです.というわけでgrep "ssh_url"を使って特定の行のみ取り出せました.

次はこの行からURLの部分のみを抽出したいのですが,そのためにはsedを使えば良さげです.マッチさせたい部分を括弧でくくるとできるらしいので,2つ目のダブルクォーテーションに囲まれた文字列を取り出します.すなわち"[文字列]"[文字列]"([取り出したい文字列])"[文字列]ということです.すごく適当ですが…マッチした部分はその順番を用いて\1で取り出せるので,sed -e s/[正規表現]/\1/と書くことによってURLのみを取り出すことができました.

(ちなみに括弧もエスケープする必要があること,\1の後にもバックスラッシュが必要であるというところで一瞬つまずきました…)

stackoverflow.com

stackoverflow.com

3. clone

これまでで取得したURLについて,それぞれgit cloneを走らせます.そのためにはxargsを使えそうですので,使い方を調べるとxargs git cloneでできると思ったのですが,too many argumentsと怒られました.入力に使う行数を指定する必要があったようです(当たり前だ…)xargs -L1 git cloneで実行できました.

まとめ

記事執筆も含めこれまでおおよそ40分くらい.書き終わった後でほぼ同じStackOverflowのページを見つけました…

stackoverflow.com