Preserving Git Histories when Migrating other Projects to your Nx Workspace

The nature of a monorepo is to swallow up standalone projects as your organization buys into the benefits of a monorepo workflow.

As your monorepo consumes other projects though, it's important to ensure that git history for those projects is preserved inside of our Nx Workspace.

Git has some helpful tools for this, and we'll walk through some of the common pitfalls and gotchas of this task!

Merging in a standalone project

To merge in another project, we'll essentially use the standard git merge command, but with a few lesser known options/caveats.

If your standalone project was not an Nx workspace, it's likely that your migration work will also entail moving directories to match a typical Nx Workspace structure. You can find more information in the Manual migration page, but when migrating an existing project, you'll want to ensure that you use git mv when moving a file or directory to ensure that file history from the old standalone repo is not lost!

In order to avoid merge conflicts later, it's best to first do the folder reorganization in the standalone project repo. For example, assuming you want the standalone app to end up at apps/my-standalone-app in the monorepo and your main branch is called master:

cd my-standalone-app

git fetch

git checkout -b monorepo-migration origin/master

mkdir -p apps/my-standalone-app

git ls-files | sed 's!/.*!!'| uniq | xargs -i git mv {} apps/my-standalone-app

git commit -m "Move files in preparation for monorepo migration"

git push -u

Next, in your monorepo, we'll add a remote repository url for where the standalone app is located:

git remote add my-standalone-app <repository url>

git fetch my-standalone-app

Then we'll run

git merge my-standalone-app/monorepo-migration --allow-unrelated-histories

Note that without the --allow-unrelated-histories option, the command would fail with the message: fatal: refusing to merge unrelated histories.