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.
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: Each enterprise can have up to 30 active migrations in progress at once, including a maximum of 20 initial migrations. To free capacity for another migration, complete the cutover for an existing migration.
Track migration status
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 use one of the following methods.
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:
To pause the migration, run:
az devops migrations pause --org https://dev.azure.com/<org>
--repository-id <repo-guid>
To resume the migration, run:
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, you can stop and delete a migration. This action permanently deletes the migration record.
Run the following command. 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.