Lo que lograrás
Combinarás varios repositorios Git existentes en un solo monorepo, preservando la historia de cada repo bajo su propio subdirectorio.
Por qué monorepo
Los setups multi-repo hacen difíciles los cambios cross-cutting.
Prerrequisitos
- Git reciente (2.30+).
git filter-repoinstalado.- Los repositorios fuente.
Paso 1: preparar cada fuente
mkdir monorepo-staging && cd monorepo-staging
git clone --no-local /path/to/web-source web-prep
cd web-prep
git filter-repo --to-subdirectory-filter packages/web
cd ..
git clone --no-local /path/to/ui-source ui-prep
cd ui-prep
git filter-repo --to-subdirectory-filter packages/ui
cd ..
git clone --no-local /path/to/cli-source cli-prep
cd cli-prep
git filter-repo --to-subdirectory-filter packages/cli
cd ..
Paso 2: crear el monorepo
git init monorepo
cd monorepo
git commit --allow-empty -m "Initial monorepo commit"
Paso 3: importar cada fuente
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
Paso 4: verificar la historia
git log --oneline
git log --follow packages/web/src/index.js
git blame packages/ui/src/Button.js
Paso 5: tooling de monorepo
# package.json
{
"private": true,
"workspaces": ["packages/*"],
"scripts": {
"build": "turbo run build",
"test": "turbo run test",
"lint": "turbo run lint"
}
}
Paso 6: CI de afectados
turbo run test --filter=...[origin/main]
npx nx affected:test --base=origin/main
Paso 7: sparse checkout
git clone --filter=blob:none --sparse <url>
cd monorepo
git sparse-checkout init --cone
git sparse-checkout set packages/web
Paso 8: archivar los repos fuente
Paso 9: comunicar
Paso 10: refactors cross-package
Trampas
- El tamaño del repositorio crece.
- CI es lento sin filtrado de afectados.
- La granularidad de permisos es más difícil.
- El primer mes tras la migración es áspero.