Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Azure DevOps Services
The initial sync can take several hours or even days to complete, depending on the size of your repository. After the initial synchronization finishes, ELM continues to perform periodic syncs for up to 21 days to capture ongoing updates. During this 21-day window, you must run the cutover to finalize the migration.
Note
All steps in this article use the Azure DevOps CLI.
To see which repositories are in each phase, run az devops migrations list and filter by the stage field. Errors surface in the migration status output so you can identify and fix issues before you continue.
Important
Concurrency limit: You can have up to 20 active migrations in progress at the same time. To start another migration, complete cutover for at least one active migration first.
Track migration status
To list all migrations for your organization:
az devops migrations list --org https://dev.azure.com/<org>
Migration stages
| Stage | Description |
|---|---|
| Queued | Migration accepted; work hasn't started yet. |
| Validation | Running pre-migration checks. |
| Synchronization | Copying and syncing repository content. |
| Cutover | Running the final sync and transitioning to GitHub. |
| ReviewForCutover | Cutover reached the scheduled time with unresolved failures and is waiting for cutover approve (or rescheduling). |
| ReadyForCutover | Approved and waiting for the next ELM job to perform the final cutover. |
| Migrated | Migration complete. GitHub is the system of record. |
Migration statuses
| Status | Meaning |
|---|---|
| Active | Migration is running. |
| Succeeded | Current phase completed successfully. |
| Completed | Migration reached the terminal Migrated stage. |
| Failed | An error occurred. You can resume after you fix the issue. |
| Suspended | Manually paused. You can resume. |
What to watch for
- Last successful sync time — confirm syncs are running on schedule.
- Sync state — identify whether the migration is progressing or stalled.
- Error conditions — ELM retries transient failures automatically. Persistent errors require investigation.
Resume after a sync error
If sync errors occur, investigate the error details and fix the underlying issue. Then, let ELM resume automatically, or run:
az devops migrations resume --org https://dev.azure.com/<org>
--repository-id <repo-guid>
Pause and resume the migration
If you need to temporarily stop a migration and restart it in the same mode:
Pause:
az devops migrations pause --org https://dev.azure.com/<org>
--repository-id <repo-guid>
Resume:
az devops migrations resume --org https://dev.azure.com/<org>
--repository-id <repo-guid>
Note
You can pause a migration for any length of time, but the 21-day cutover window still applies.
Cancel the migration
At any point during syncing, if you want to stop and delete a migration, run the following command. This action permanently deletes the migration record, and you're prompted to confirm.
az devops migrations abandon --org https://dev.azure.com/<org>
--repository-id <repo-guid>
After cutover, the Azure DevOps repository is set to read-only. If you want to resume writing to it, add --remove-read-only to restore write access. This flag only applies after cutover.
az devops migrations abandon --org https://dev.azure.com/<org>
--repository-id <repo-guid>
--remove-read-only
To skip the interactive confirmation prompt (for scripted cleanup), add --yes.
After you abandon a migration:
- Source repository: Your Azure DevOps repository is unchanged and fully writable. No cleanup is required.
- Audit trail: The migration record isn't retained, but an audit event is written to record that the migration was abandoned. For more information, see Audit.
- Starting a new migration: You can create a new migration for the same source repository, but a short cooldown applies before the new migration can start. If you want to reuse the same target GitHub repository name, first delete the existing GitHub repository. You must have Delete repository permission in GitHub to do this.