Cosa otterrai
Combinerai diversi repository Git esistenti in un singolo monorepo, preservando la storia di ogni repo sotto la propria sottodirectory.
Perche monorepo
I setup multi-repo rendono difficili i cambiamenti cross-cutting.
Prerequisiti
- Git recente (2.30+).
git filter-repoinstallato.- I repository sorgente.
Passo 1: preparare ogni sorgente
mkdir monorepo-staging && cd monorepo-staging
# Repo 1: web app
git clone --no-local /path/to/web-source web-prep
cd web-prep
git filter-repo --to-subdirectory-filter packages/web
cd ..
# Repo 2: shared UI library
git clone --no-local /path/to/ui-source ui-prep
cd ui-prep
git filter-repo --to-subdirectory-filter packages/ui
cd ..
# Repo 3: CLI tool
git clone --no-local /path/to/cli-source cli-prep
cd cli-prep
git filter-repo --to-subdirectory-filter packages/cli
cd ..
Passo 2: creare il monorepo
git init monorepo
cd monorepo
git commit --allow-empty -m "Initial monorepo commit"
Passo 3: importare ogni sorgente
git remote add web-source ../web-prep
git fetch web-source
git merge --allow-unrelated-histories web-source/main -m "Import web from web-source"
git remote remove web-source
git remote add ui-source ../ui-prep
git fetch ui-source
git merge --allow-unrelated-histories ui-source/main -m "Import ui from ui-source"
git remote remove ui-source
git remote add cli-source ../cli-prep
git fetch cli-source
git merge --allow-unrelated-histories cli-source/main -m "Import cli from cli-source"
git remote remove cli-source
Passo 4: verificare la storia
git log --oneline
git log --follow packages/web/src/index.js
git blame packages/ui/src/Button.js
Passo 5: tooling monorepo
# package.json
{
"private": true,
"workspaces": ["packages/*"],
"scripts": {
"build": "turbo run build",
"test": "turbo run test",
"lint": "turbo run lint"
}
}
Passo 6: CI affected-only
turbo run test --filter=...[origin/main]
npx nx affected:test --base=origin/main
Passo 7: sparse checkout
git clone --filter=blob:none --sparse <url>
cd monorepo
git sparse-checkout init --cone
git sparse-checkout set packages/web
Passo 8: archiviare i repo sorgente
Rendere i repo sorgente read-only.
Passo 9: comunicare
Formare il team su nuovo URL clone, comandi build, come aggiungere un nuovo package.
Passo 10: refactor cross-package
Il payoff: rinominare una funzione in packages/ui e aggiornare i suoi caller in packages/web in un singolo commit.
Insidie
- La dimensione del repository cresce.
- CI lento senza filtraggio affected-only.
- La granularita dei permessi e piu difficile.