BitBucketからGitHubへの移行に挑戦

技術

アプリ開発でながらくソース管理ではBitBucketにお世話になってきたのですが、GitHubへの移行に挑戦してみました。

とくにBitBucketに不満はなかったのですが、GitHub Copilotを使ってみたかったのと、VS Codeとかを使うならなにかとGitHubの方が便利なのではというところからです。

以前はGitHubでプライベートリポジトリをつかうのは有償だったのでBitBucketを使い始めたのですが、いまはGitHubも無料になっているのでとりあえずお試しで、ひとつのリポジトリをGitHubに移行してみることにしました。

でも、いざやってみるといろいろ問題にぶつかってしまった。

こむ太郎
こむ太郎

簡単にできると思ったのに。

インポートツールを使って簡単移行をしてみる

いままでGitHubにリポジトリは持っていなかったのですが、なにかのときにアカウントだけは作っていたようです。いつどうして作ったのかは覚えてないのですが。

なので早速移行開始。

GitHubにはインポートツールが用意されていて、GitHubの画面の右上のボタンからImport Repositoryを選ぶとImportの画面になります。

これでうまくいけば、これまでのCommit履歴とともに全てのブランチがGitHubに移行されるはずです。

まずは必要事項を入力します。

ここで注意ですが、下の方の設定で忘れずにPrivateを選んでおきましょう

うっかりPublicで公開しちゃっては大変。

あとは特に入力で迷うところはないと思います。

source repositoryには僕の場合はBitBucketからの移行なので、BitBucketのリポジトリのURLと認証情報を入力。

BitBucketの場合は、URLはこんな感じです。

https://bitbucket.org/アカウント名/リポジトリ名

あとはBegin ImportでOK!

のはずが・・

インポートが始まってしばらくするとメールが届いてました。

Hi comtaro!

The import to https://github.com/XXXXX/XXXXX failed. The following error occurred: A critical error occured in the Clone Source step of the git migration..

If you have any questions, please contact us at https://github.com/contact.

なんか致命的エラーが起きたっぽいです。このときのエラーの原因は分かりませんが、GitHubではファイルサイズの上限100MBという制限があるそうで、おそらくそのせいだったと思われます。

きっと普通のリポジトリならこれで移行完了するはず。成功してないので、知らんけど。

余談ですが、このメールをGmailで受信したら勝手に日本語に翻訳されて、Hi comtaro!おい、コムタロウと翻訳されてました。

こむ太郎
こむ太郎

なんか偉そうだな・・

ローカルのリポジトリからGitHubへ移行を試す

直接BitBucketからGitHubへインポートするのは失敗したので、いったんローカルのMacBookに持ってきたリポジトリからの移行を試してみました。

まずは準備として、ローカルに移行対象になるBitBucketのリポジトリをクローンしておいて、GitBucketのほうには移行先になる空のリポジトリをあらかじめ作成しておきます。

その後にMacのTerminalからGitのコマンドを叩いてGitHubにpushしてやります。

//bitBucket側の移行対象のリソースをローカルにpullしておく
git pull
//移行元と移行先で名前が被ってエラーにならないように移行元のローカルのoriginをoldにリネームしておく
git remote rename origin old
//GitHub側のoriginをローカル側にaddして登録しておく
git remote add origin https://github.com/アカウント名/リポジトリ名.git
//GitHubのmainにブランチを切り替え
git branch -M main
//GitHubにpushする
git push -u origin main
こむ太郎
こむ太郎

このコマンドはGitHubで新規にリポジトリを作成時に案内されるコマンドをベースにしたものです。案内されたコマンドのままだと、たいていはoriginの名前が被ってエラーになると思うので、名前を変更するコマンドを追加しています。

はい、ここでGitHubの認証が入るのですが、認証エラーになってしまいました。

IDとパスワードを求められるのですが、いつもGitHubにログインする際のパスワードではコマンドラインから認証できないようです。

あらかじめ、トークンを発行しておいてパスワードの代わりに入力すれば認証できますので先に作っておきましょう。

GitHubの認証用にトークンを準備する

気を取り直してトークンを作成するためまずはGitHubのメニューからDevelopper Settingsへ。

そしてPersonal Access Tokenのメニューに入って、Generate new tokenからトークンを発行する画面に行きます。下の画面ではすでに発行済みのトークンがひとつ表示されてますが気にしないでください。

トークン発行の画面に必要事項を入力してトークンを発行します。スクショには写ってないですが、下の方に発行用のボタンがありますので必要情報を入力したらGenerate!。下のスクショはトークンを発行した後の画面なので、上の方のモザイクの部分には発行されたトークンが表示されています。

Noteには適当にメモを入力して、repoの項目内のチェックをつけておけば大丈夫だと思います。

この画面を閉じてしまうと発行済みのトークンは再表示できないのでここでメモっておきましょう。

とはいってもメモを忘れてしまっても、自分が使うだけなので新たにトークンを再発行すれば特に問題はありません。

説明が前後してしまいましたが、これで発行したトークンをGitHubにpushするときの認証パスワードに入力すればGitHubにPushできるはずです。

うまくいけば、これでめでたくBitBucketからGitHubへのリポジトリ移行が完了です。
が、僕はここでもエラーで失敗しました。

remote: error: File Assets/Firebase/Plugins/x86_64/FirebaseCppApp-8_8_0.so is 120.45 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: File Assets/Firebase/Plugins/x86_64/FirebaseCppApp-10_7_0.bundle is 137.89 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.

エラーメッセージは抜粋ですが、今回はちゃんとエラーの理由がわかりました。

100MBを超えるサイズのファイルがあったのでGitHubの制限に引っかかっていたようで、Git LFSを使ってみなよ、みたいなメッセージが出てるようです。

おそらくは、最初にインポートツールを使ってBitBucketからGitHubへ直接移行しようとした時も失敗もこれが原因なんじゃないかと思ってます。

移行失敗したので対策を考えた

残念ながら僕のリポジトリではBitBicketからGitHubへの移行は失敗しました。

特に問題ないリポジトリだったら、最初の方法で移行できるんだろうと思います。

じゃあどうしようと考えましたが、案としては

移行失敗の対策案
  • あきらめて今まで通りBitBucketを使う
  • 100MB超のファイルを移行元から削除する
  • LFSを使ってみる

100MB超のファイルを削除するといっても、これらは実際に必要なファイルではあるので、ちょっと難しいです。

LFSを使うのはいろいろと懸念事項もあったので、あきらめて今まで通りBitBucketを使う案に傾きかけました。

でも冷静に考えると、そもそもGitで100MBを超えるようなファイルを管理してるってどうなのよっ、てことですよね。

そもそもGitはバイナリファイルの管理には向いてなさそうだし。

サイズ制限に引っかかったのはGoogleのFirebaseのサービス用のプラグイン関係ですが、今回のリポジトリはゲームアプリのリポジトリだったので100MBは越えないまでも画像ファイルとか音楽ファイルだとか、そこそこの大きさのバイナリのファイルがたくさん含まれてるんですよね。

なので、ローカルにリポジトリをクローンした時も、やたらとディスク(SSDですが)使うし、クローンする時間もかかるしで、GitHubに移行するかどうかに関係なく今後のために対策を考えた方が良いように思えてきました。

Gitで大きなファイルを扱う仕組みとしてLFSがあるのは知ってはいたのですが、既存のリポジトリにはすでにコミット済みの大容量サイズのファイルがあるので、いまさらLFSを使うようにしても手遅れな気がします。

とはいえ根本解決はLFSを使うしかないような気もします。

ということで、この話はGit LFSを使ってみるはなしへ続きます。今回はここまで。

コメント

タイトルとURLをコピーしました