表題の通り、技術スタックがほぼ同じプロダクト群のリポジトリを1つのMonorepoにまとめてみたという雑な記録。
元々は以下のようなPolyrepo構造になっていた。
- product-a (repository)
- backend
- web
- product-b (repository)
- backend
- native
- web
これを以下のような構成に移行した。
- products (repository)
- apps
- product-a
- backend
- web
- product-b
- backend
- native
- web
- product-a
- apps
大まかには以下のような流れで移行する。
- 移行元のリポジトリで移行用ブランチを作成する
- 移行先のリポジトリで移行用ブランチを作成し、1.の移行用ブランチをmergeする
では実際に移行してみよう。product-aのリポジトリで以下のコマンドを実行する。
mkdir -p apps/product-a git checkout -b monorepo git mv -k * apps/product-a/ # -k is used to ignore the error that it can't move the projects directory git mv -k .* apps/product-a/ # .* to move .gitignore and other dot files
次に移行先のproductsリポジトリで以下のコマンドを実行する。
git remote add -f product-a https://github.com/<owner>/product-a.git git checkout -b import-product-a git merge product-a/monorepo --allow-unrelated-histories
これで products リポジトリの import-product-aというブランチにproduct-aリポジトリのファイルが追加されているので、pull-requestを作るなどしてこのブランチをmainブランチにマージすればOK
# on main branch git merge import-product-a
これを移行したいプロダクトの数だけ繰り返せばOKである。なお、.github/workflows などリポジトリ直下にないといけないディレクトリはMonorepoに取り込んだ後に手動でファイルを移動する必要があるので気をつけること。
というわけで私はこれで素敵なMonorepo lifeを送れるようになりました。おしまい。
