肥大化したGitリポジトリを別のGitサーバへ移管する
生涯学習事業部、小川です。
部内で個別管理していたGitサーバから、社内共有のGitサーバへ移行した際の手順について記載します。
試行錯誤で建てながら運用していたGit環境だったため、Git内の歴史も整理されておらず肥大化したGitリポジトリがありました。
社内共通管理できる場所ができたということで、移行の準備に取り掛かったのでした。
一番簡単そう、という理由により移行方法1で実験したところ、特に問題なしという結果が出ましたのでいざ実践。
移行方法1:ミラーで簡単に移行する。
gitコマンドのリモートリポジトリの履歴などをすべてクローンするmirrorオプションを使用し、クローンしたリポジトリを同じくmirrorオプションpushをかける。
$ git clone --mirror <移行元URL> $ cd <ミラーでできた.gitフォルダ> $ git push --mirror <移行先URL>
当然、Gitの歴史が古いためpushに時間がかかるだろうと思っていましたが、予想を超えて一時間以上かかってしまい、燦然と輝くこの文字に阻まれました…。
fatal: The remote end hung up unexpectedly
理由は単純で、移行元のリポジトリが肥大化しすぎていて「どうにもならないよ~」ということでした。
「httpsがだめならsshで!」と試すもあえなく惨敗…。
タグやブランチの記録を残したいので最新版のみの移行はできないと調べに調べ見つけたのが移行方法2でした。
移行方法2:元リポジトリをリモート設定し、新たに移行先の空リポジトリを指定して総プッシュをかける。
gitには複数のリモートリポジトリを設定できるため、そちらを利用して同期を取ることによって移行する。
※プルリクエスト情報は移行できません。
# 移行元マスターを取得
新しいgitをつくり、リモートを移行元としてデータを取得。
$ mkdir /var/www/dir_mirror $ git init $ git remote add origin <移行元URL> $ git pull origin master
# タグをダウンロードする
$ git tag $ git ls-remote --tags $ git pull --tags $ git tag
# ブランチ情報を取得
取得したいブランチをすべてcheckoutしたあとに念のため、ブランチをマスターに戻しています。
$ git fetch $ git branch -a $ git checkout developer $ git checkout master
# リモートを設定
移行先にあたる空リポジトリがあるリモートをrepo_toとして指定。
$ git remote -v $ git remote add repo_to <移行先URL> $ git remote -v
# pushのテスト
repo_toへpushできるかを試験。
$ git push --dry-run repo_to --all $ git push --dry-run repo_to --tags
# push実施
試験が成功したらリポジトリの内容とタグをリモート先にpush。
$ git push repo_to --all $ git push repo_to --tags
「あの待っていた時間はなんだったのか」というくらいにサクッと移行ができました。
そこまでGitリポジトリが大きくなければ移行手順1で十分かと思います。
無事に移行できたところで、以上です。
参考:https://git-scm.com/docs/