GitHub にはアカウントデータを取得する「エクスポート機能」がある.リポジトリ情報だけではなく,issue 情報(コメント含む)やプルリクエスト情報(コメント含む)などもエクスポートできる.2018年12月にリリースされた機能だけど実は今まで使ったことがなかった❗️さっそく試していくぅ〜
エクスポートする
手順は GitHub Blog やドキュメント(Requesting an archive of your personal account’s data - GitHub Docs)に載っている通り,Account メニューの Export account data で New export をクリックするだけ.少し待つと [GitHub] Your data export is ready to download
というタイトルのメールが届くので,そこからダウンロードできる.僕自身の環境だと「1時間程度」は待ったと思う.エクスポートデータは7日間後に自動的に削除されるし,消すこともできる.
エクスポートデータ
ダウンロードしたエクスポートデータ tar.gz
のサイズは 2.3 GB とそこそこ大きかった(参考までにリポジトリ数は 300 以上ある).tar.gz
を展開すると,以下のような構造になっていた.実際にはもーっと多くの JSON ファイルがあって,repositories_000005.json
/ issue_events_000040.json
/ pull_requests_000005.json
のように連番で続いていた.以下の例はわかりやすいように 000001.json
に限定して載せている.
なお,リポジトリ情報をザッと確認したところ,"プライベートリポジトリ" や "Fork したリポジトリ" も含まれていた❗️
$ tree -L 3 . ├── attachments/ │ └── (中略) ├── attachments_000001.json ├── audit_log.csv ├── bots_000001.json ├── issue_comments_000001.json ├── issue_events_000001.json ├── issues_000001.json ├── milestones_000001.json ├── organizations_000001.json ├── protected_branches_000001.json ├── pull_request_review_comments_000001.json ├── pull_request_review_threads_000001.json ├── pull_request_reviews_000001.json ├── pull_requests_000001.json ├── releases_000001.json ├── repositories/ │ └── kakakakakku/ │ └── (中略) ├── repositories_000001.json ├── schema.json └── users_000001.json 321 directories, 72 files
データ構造
JSON ファイルと GitHub データを見比べながらデータ構造をまとめてみた(一部間違ってるところはありそう💨).調べた感じだと GitHub ドキュメントには JSON ファイル仕様は公開されてなく,GitHub REST API レスポンスとも違う.公開されてると助かるんだけどなぁ...!あと users_*.json
を最初に見たときは謎で「誰?」という GitHub ユーザーの情報も多く含まれていたけど,GitHub Blog に「リポジトリでやり取りしたユーザー」と書いてあって,調べたら issue / プルリクエストで過去にやり取りをしていた💡
repositories_*.json
(リポジトリ情報)issues_*.json
(issue 情報)issue_comments_*.json
(issue コメント情報)issue_events_*.json
(issue イベント情報 / プルリクエストイベント情報)- ファイル名は
issue_
だけど issue のclosed
やプルリクエストのmerged
など全てのイベント情報が混ざっている
- ファイル名は
pull_requests_*.json
(プルリクエスト情報)pull_request_reviews_*.json
(プルリクエストコメント情報)- Conversation タブと書くとわかりやすそう
pull_request_review_threads_*.json
(プルリクエストレビュースレッド情報)- Files changed タブと書くとわかりやすそう
pull_request_review_comments_*.json
(プルリクエストレビューコメント情報)releases_*.json
(リリース情報)protected_branches_*.json
(保護ブランチ情報)milestones_*.json
(マイルストーン情報)attachments_*.json
(添付ファイル情報)attachments
ディレクトリに実際のファイルも含まれている
users_*.json
(ユーザー情報)organizations_*.json
(Organization 情報)bots_*.json
(Bot 情報)
JSON ファイル関係図を簡単にまとめてみた❗️
JSON ファイル例
一部の JSON ファイルを以下に載せておく.情報は多すぎるため (中略)
で適当に割愛しておく.
repositories_*.json
(リポジトリ情報)例
{ "type": "repository", "url": "https://github.com/kakakakakku/redash-hands-on", "owner": "https://github.com/kakakakakku", "name": "redash-hands-on", "description": "Redash study materials for beginners 📊", "website": "", "private": false, "has_issues": false, "has_wiki": false, "has_downloads": true, "is_archived": false, "labels": [ (中略) ], "collaborators": [ (中略) ], "created_at": "2017-11-10T10:00:04Z", "git_url": "tarball://root/repositories/kakakakakku/redash-hands-on.git", "default_branch": "master", "webhooks": [ ], "page": null, "public_keys": [ ], "repository_topics": [ (中略) ], "security_and_analysis": { (中略) }, "autolinks": [ ], "general_settings": { (中略) }, "actions_general_settings": { (中略) } }
issues_*.json
(issue 情報)例
{ "type": "issue", "url": "https://github.com/kakakakakku/hello-github-actions/issues/1", "repository": "https://github.com/kakakakakku/hello-github-actions", "user": "https://github.com/github-learning-lab[bot]", "title": "Welcome", "body": "(中略)", "assignee": null, "assignees": [ ], "milestone": null, "labels": [ ], "reactions": [ ], "closed_at": "2020-07-05T00:24:28Z", "created_at": "2020-07-05T00:00:33Z", "updated_at": "2020-07-05T00:24:28Z" }
issue_events_*.json
(issue イベント情報)例
{ "type": "issue_event", "url": "https://github.com/kakakakakku/hello-github-actions/issues/1#event-3512927578", "issue": "https://github.com/kakakakakku/hello-github-actions/issues/1", "actor": "https://github.com/github-learning-lab[bot]", "event": "closed", "created_at": "2020-07-05T00:24:28Z" }
pull_requests_*.json
(プルリクエスト情報)例
{ "type": "pull_request", "url": "https://github.com/kakakakakku/hello-github-actions/pull/2", "user": "https://github.com/kakakakakku", "repository": "https://github.com/kakakakakku/hello-github-actions", "title": "Add \"GitHub Actions\" files 🦄", "body": "", "base": { "ref": "master", "sha": "35f488312690112f305543ecff99c8cc53df4097", "user": "https://github.com/kakakakakku", "repo": "https://github.com/kakakakakku/hello-github-actions" }, "head": { "ref": "first-action", "sha": "3c84eb88d288c5b50bd205790d6c86526566230e", "user": "https://github.com/kakakakakku", "repo": "https://github.com/kakakakakku/hello-github-actions" }, "assignee": null, "assignees": [ ], "milestone": null, "labels": [ ], "reactions": [ ], "review_requests": [ ], "close_issue_references": [ ], "work_in_progress": false, "merged_at": "2020-07-05T01:21:14Z", "closed_at": "2020-07-05T01:21:14Z", "created_at": "2020-07-05T00:24:24Z", "merge_commit_sha": "2226e5e9ffe3fcc35acd21a25438884e7dae1710" },
issue_events_*.json
(プルリクエストイベント情報)例
{ "type": "issue_event", "url": "https://github.com/kakakakakku/hello-github-actions/pull/2#event-3512948739", "pull_request": "https://github.com/kakakakakku/hello-github-actions/pull/2", "actor": "https://github.com/kakakakakku", "event": "merged", "commit_id": "2226e5e9ffe3fcc35acd21a25438884e7dae1710", "created_at": "2020-07-05T01:21:14Z" }
まとめ
GitHub の「エクスポート機能」を今まで使ったことがなく試してみた❗️背景としては,前回の記事で紹介した Local-first software に関連していて,GitHub リポジトリのコード情報は git clone
で取得できるけど,issue 情報やプルリクエスト情報の「所有権」ってどうなんだろうと疑問で調べてみた.エクスポート機能は覚えておこう〜