Da Anonimo (non verificato) , 29 Aprile 2026

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-repo installato.
  • 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.