The Problem
Our projects start with 2–3 repositories and quickly grow to 5–10 or more. There are several developers working on modules, front-end or backend services and you may not be responsible or aware of what’s going on in the other repositories, but you still need everything up-to-date on your laptop to run and test the whole architecture.
Our solution
We initially looked into “monorepo” tools like Lerna, but we found them to be overly complex and storing everything in “packages” didn’t feel right. The one problem we wanted to solve is keeping a few folders updated. The first thing we did was to create a “root level” repository, we either call that “hq” or the same name as the organisation/product we want to build. This repo we clone locally and add a .gitignore:
/*!bin/!README.md
This ignores all contents in that repo except bin
and README.md
. Afterwards
we clone all related repositories for that project into the root folder.
The interesting part happens in bin/:
The script loops through every folder and first prints the name of the folder.
This is important to see when an error happens on git pull. Afterwards, we check
out package-lock.json
because this it the most common cause for a git pull
to fail. --prune
also removes all stale branches that you might have locally,
keeping things clean and tidy. And last, we run npm install
to update the
packages.
In the Makefile, just add those lines:
git pull./bin/update.sh
and you can run everything with make update
. The whole process can take a
minute or two, but it’s great to keep all repos of a project updated.
It happened a few times that we forgot to checkout the master branch after
committing a pull request and the repo would never be updated with the update
script, so here is a little addition to quickly check if all repos are using the
master
branch:
Again, this is most useful in the Makefile:
branches:./bin/branches.sh
Enjoy this developer experience and let us know what you think! You can reach out on Twitter or start a discussion on GitHub.