リポジトリの移管って
git clone --mirror 旧リポジトリ
git remote add --mirror 新リポジトリ
git push --mirror 新リポジトリ
で移せます。
ただ、リポジトリを移すだけでは終わらなくて、移管以外でやったことを書きます。
プロジェクトの規模はこんな感じ
- webサービス(PHP&javaScript)&スマホネイティブ
- プログラマー10人以上
- 対象となるリポジトリは5つ
- 非エンジニアも同数以上いる
- SourceTreeを使用しているがclone,pull,commit,pushなど最低限の使い方
- jenkinsからのcommitを行う
- 画像の予測不能な名前に変更
- スクリプトの小型化
- 自作ライブラリをcomposerで使用(ライブラリ自身も移管対象)
大雑把な手順
- 旧リポジトリをcloneした新リポジトリを作成
- 旧リポジトリへのコミットを新リポジトリへpush、同じ状態となるようにする
- デプロイ側の設定変更(旧リポジトリを参照する箇所を新リポジトリへ)
- 各メンバーがコミットするリポジトリを変更する
- composer.json修正
- 旧リポジトリの停止
この順番で進めていき大きなトラブルもなく移管できました。
旧リポジトリをcloneした新リポジトリを作成
実作業としてはリポジトリを作るだけですが、チェックポイントを列挙するとこんな感じです
- バッチ処理用のアカウントの準備
- 公開範囲のチェック
旧リポジトリへのコミットを新リポジトリへpush、同じ状態となるようにする
今回はfetchしてからpushするshellを用意し、5分ごとに実行しました。ポーリングのため最大で5分程度のラグが発生しますがこの点は目をつぶっています。gitlabにはMirroring repositories
という設定があるのでこちらを使ってみるの良いでしょう
デプロイ側の設定変更(旧リポジトリを参照する箇所を新リポジトリへ)
一つの環境ごとにマシンを占有させてもらって変更していきます。
シェルの場合
- 秘密鍵の配置
- .ssh/configの修正
- 疎通確認
jenkinsの場合
- 認証情報の追加
- 各ジョブで参照するリポジトリ&認証情報の追加
- この時点ではスタッフは旧を使用しているため、新/旧の両方にpushする必要がある
- テストラン
各メンバーがコミットするリポジトリを変更する
- 新しいリポジトリのアカウントの用意
- 移行手順の作成
composer.json修正
内製のライブラリをcomposerでインストールしていたので、参照先を切り替えるためにcomposer.jsonを書き換えます。masterブランチだけ適用して、各機能ブランチは担当者にマージしてもらった
旧リポジトリの停止
ここまでの作業で旧リポジトリへのアクセスはなくなっているはず。
番外編:最大の罠
旧リポジトリではLFSを使用せず、履歴の中に100Mを超えるサイズのファイルがあったためgithubに移せなかった。
幸い、現在では削除されたファイルのためorphanブランチを作り履歴を捨ることになりました。
まとめ
長々と書いていますがポイントをまとめると
- 新旧並行運用で作業やデプロイが止まらないようにする
- 細かい単位で作業を進めていき、問題があった際の影響範囲を小さくする
- 1ステップごとに問題が出ないようにチェックしながら進める
文章にしてしまうと当たり前なのですが、手探りの状態だと漏れがあったりします。