oinume journal

Scratchpad of what I learned

複数のプロダクトのリポジトリをMonorepoに移行する

表題の通り、技術スタックがほぼ同じプロダクト群のリポジトリを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

大まかには以下のような流れで移行する。

  1. 移行元のリポジトリで移行用ブランチを作成する
  2. 移行先のリポジトリで移行用ブランチを作成し、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を送れるようになりました。おしまい。