kakakakakku blog

Weekly Tech Blog: Keep on Learning!

GitHub の「エクスポート機能」でデータをバックアップする

GitHub にはアカウントデータを取得する「エクスポート機能」がある.リポジトリ情報だけではなく,issue 情報(コメント含む)やプルリクエスト情報(コメント含む)などもエクスポートできる.2018年12月にリリースされた機能だけど実は今まで使ったことがなかった❗️さっそく試していくぅ〜

github.blog

エクスポートする

手順は GitHub Blog やドキュメント(Requesting an archive of your personal account’s data - GitHub Docs)に載っている通り,Account メニューの Export account dataNew 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 情報やプルリクエスト情報の「所有権」ってどうなんだろうと疑問で調べてみた.エクスポート機能は覚えておこう〜

kakakakakku.hatenablog.com