In a nutshell
EMU ↔ non-EMU is not a setting. It is a migration to a new enterprise, done with GEI.
GHES → GHE.com: move the repos that can't stop with ELM (live migration), and the rest with GEI.
Migration paths at a glance 📖 Docs
The four cases are the columns. Press + to open the aspect you need.
What isn’t possible 📖 Docs
None of these shortcuts work, whatever the case.
| ❌ Not possible | ✅ Do this instead |
|---|---|
| Switch an enterprise between EMU and non-EMU in place | Create a new enterprise and migrate with GEI |
| ”Transfer organization” into or out of an EMU enterprise | GEI migrate-org |
Use ghe-migrator to reach the cloud (GHES → GHES only) | GEI or ELM |
| Use ELM to reach GitHub.com (no data residency) | GEI (ELM only targets GHE.com) |
| Move GHE.com → GitHub.com with official tools | GitHub Expert Services |
| Push a repo over GEI’s limits through GEI as is | Push Git history only, Expert Services, or ELM from GHES |
GHES → GHE.com: ELM vs GEI 📖 Docs
You can use both in the same migration. Pick per repo.
| ELM | GEI | |
|---|---|---|
| ⏱️ Downtime | Cutover only (minutes) | Repo frozen while it migrates |
| 🎯 Best for | Large monorepos, critical repos that can’t stop | Typical repos that can take a short freeze |
| 🔀 Concurrency | 10 per GHES instance, 20 per target | Higher than ELM |
| 🗂️ Git LFS | Migrated | Not migrated (push afterwards) |
| 🧩 GHES version | Supported 3.17+ patches | 3.4.1+ |
| 💾 Staging storage | Not needed | Blob storage (GHES 3.8+) |
| 🌐 Target | GHE.com only | GitHub.com / GHE.com |
⚠️ Avoid force pushes during the migration (ELM can’t reconcile the rewritten history). Public repos can’t exist on GHE.com, so make them private or internal first.
Switching EMU type: step by step 📖 Docs
Non-EMU → EMU and EMU → non-EMU follow the same flow.
- 🏢 Create a new enterprise (a trial works). An existing enterprise can’t be converted
- 🔐 Prepare identities: for EMU, SAML / OIDC and SCIM from the IdP; for non-EMU, each user’s personal account
- 🏷️ Decide org names: org names are unique across github.com. Use a new name on the target, or rename the source to free the name
- 🧪 Dry run, then production: test GEI
migrate-org, then run production with work frozen. Add “Repository migrations” to the ruleset bypass list - 👤 Bring users back: reclaim mannequins and sync team members. Users recreate PATs / SSH keys
- 💳 Switch billing: once migrated, work with GitHub Sales to retire the old enterprise