くろみーの日報テンプレ

日常のほのぼのした記録

Github で使っていない Repository を削除する

最近Github のレポジトリが増えてきたので、このタイミングで整理してみる

Private レポジトリの制限も随分前に解除されたし、別にレポジトリの整理なんてする必要がないと言われればそうなのだが、部屋が広いからといって要らないものをたくさん置いて良いわけではないのと同様に、レポジトリも使わないレポジトリは積極的に削除した方が良いというのが私の考え

まず最初に使ったのは Github CLI

インストールするとターミナルで gh コマンドが使えるようになるのでこれで色々できる

まずは現在持っているレポジトリの総数を数えてみる

gh repo list -L 1000 | wc -l

デフォルトで30個までしかレポジトリをとってこないので、-L option をつけて十分に大きな数(1000など)を指定しないいけない

このうち、今年に入って全く更新のないレポジトリをリストアップしたかったのだがここで問題が発生した

gh repo list にはレポジトリを更新日時でソートするオプションがないのだ

またソートできたとしても、今回のように数十個単位でレポジトリを削除する場合、そのレポジトリごとに gh コマンドを実行して削除するのはめんどくさい(私が単にシェルスクリプトが苦手なだけ)

どうしようかと思っていたところ、こんな記事を見つけたので今回は R でやってみることにした

www.jumpingrivers.com

基本的にはこの記事に書かれている通り、Github の PAT (Personal Access Token) を用意して R の gh パッケージをインストールすれば良いだけなのだが、レポジトリをとってくるところは少し工夫が必要だった

元記事だと public かつ fork されたレポジトリのみを対象としているのでエンドポイントが GET /users/:owner/repos になっているのだが、private なレポジトリも対象としたい場合はそうはいかない

そこで私の方で書き換えたものがこちら

my_repos = gh("GET /user/repos", 
              visibility = "all",
              affiliation = "owner",
              before = "2022-12-01T",
              sort = "updated",
              page = 1, 
              per_page = 100)

公式のドキュメントによれば GET /user/repos にアクセスすることによって PAT の認証ユーザーのレポジトリを private なものも含めて全て持ってこれる

また before や sort のオプションも提供されているので、ここに必要な値を入れてやれば、更新日時でソートしたりフィルタリングをかけたりすることができる

ここで対象のレポジトリを抽出できたら削除する部分は一緒

purrr::map(to_delete, 
           ~gh("DELETE /repos/:owner/:repo", owner = my_username, repo = .x))

まさか Github のレポジトリを削除するときに purrr パッケージが活躍するとは思わなかった