Edit

4. Monitor the migration

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.

Next step