What is a monorepo and how does Git support it?
Answer
A monorepo (monolithic repository) contains code for multiple projects, packages, or services in a single repository — as opposed to having separate repos per project (polyrepo). Examples: Google (one repo for all code), Facebook, Twitter, Microsoft. Benefits: (1) Atomic commits across projects; (2) Single place for CI/CD; (3) Easy code sharing between packages; (4) Consistent tooling and versioning; (5) Simplified dependency management. Challenges: (1) Repo becomes very large over time; (2) Build/test times increase; (3) CI must be smart about what changed; (4) Permissions (hard to restrict access per service). Git features for monorepos: sparse-checkout — only check out relevant packages; partial clone (--filter=blob:none) — download objects on demand; shallow clone (--depth=1) — faster for CI. Monorepo tools: Turborepo (caching, parallel task execution, affected package detection); Nx (dependency graph, affected builds); Lerna (Node.js packages, versioning); Bazel (Google's build system, used for large monorepos). CI optimization: run tests only for packages affected by a commit using the repo's dependency graph — don't rebuild/test everything on every commit.