Bitbucketのリポジトリをバックアップする


Bitbucket の API でリポジトリの情報集めてバックアップします。

主な目的は Mercurial 廃止に伴うリポジトリ削除への対応ですが、Git リポジトリにも対応しています。

※ 当初、Mercurial 廃止は2020年5月31日が期限でしたが、情勢を鑑みて1カ月延期されました。

この記事ではリポジトリ移行の話題は扱いません。以下の記事などを参考にしてください。

API

Bitbucket のリポジトリなどの情報は API で取得できます。

以下の記事を参考にしました。

スクリプト

Python で情報収集用のスクリプトを書きました。

プライベートリポジトリの情報を取得するためユーザー名とパスワードを書き換えてください。

3行目
authinfo = "USER:PASS"

スクリプトを実行すると API でリポジトリとスニペットの情報を集めます。複数ページに分割された情報を 1 ファイルにまとめます。(整形済)

  • repositories.json
  • snippets.json

issues や pullrequests などの情報は、リポジトリごとにディレクトリを作って保存します。(未整形)

  • 例: repositories/xxx/issues.json

リポジトリやスニペットのクローンは自動では行いません。出力されたクローン用のシェルスクリプトを実行してください。

  • repositories-clone.sh
  • snippets-clone.sh

仕様

アクセスにはウェイトを入れています。

19行目
    time.sleep(1)

保存した JSON は cache ディレクトリに入れて、再度実行した時はそちらを参照します。再取得したいときは削除してください。

cache 内の JSON は送られたままの形で保存します。改行が入っていないため、読むときは整形すると良いでしょう。

整形の例
python -m json.tool cache/repositories-1.json

links に記載された情報のうち、API を参照しているものを取得します。

        "links": {
            "watchers": {
                "href": "https://api.bitbucket.org/2.0/(略)"
            },
            "branches": {
                "href": "https://api.bitbucket.org/2.0/(略)"
            },
            "tags": {
                "href": "https://api.bitbucket.org/2.0/(略)"
            },
            "commits": {
                "href": "https://api.bitbucket.org/2.0/(略)"
            },
            (略)
        },

参考

json.tool のソースコードは、ライブラリの機能を使ってシンプルなコマンドを作る例として参考になります。