Install GitHub CLI (gh) and the GEI extension (gh-gei).
Confirm the following:
repo).Note: GitHub docs note that public mode may not be available in some managed-user enterprise setups.
You will need to use two tokens:
EIS-ITS)utoronto-its)Your gh auth status should show scopes such as admin:org, repo, and workflow, which is the right shape of scopes for gei usage. If you are missing workflow on either token, regenerate it with that scope.
export GH_SOURCE_PAT="ghp_sourcePersonalAccessToken"
export GH_TARGET_PAT="ghp_targetPersonalAccessToken"
gh using each token (and understand “active account”)gh auth login stores credentials in the keyring.gei commands use the PAT environment variables for source/target operations, but your active CLI session still matters for some calls, especially role-granting.echo "$GH_SOURCE_PAT" | gh auth login --with-token
echo "$GH_TARGET_PAT" | gh auth login --with-token
Then verify:
gh auth status
Both accounts should be listed, with one set to Active account: true.
utoronto-its)If the person running migrations is not an organization owner, an organization owner must grant them the migrator role.
Granting the Migrator role is performed by an Organization owner, or someone permitted by organization policy. If you run the command as a non-owner, it will fail.
To receive permissions for a Migrator role, please submit a ticket to the AI Kitchen.
gh gei grant-migrator-role \
--github-org "utoronto-its" \
--actor "[GitHub Username]" \
--actor-type "USER"
This is the documented command shape: org + actor + type, where type is USER or TEAM.
Note: You may need to be granted the migrator role in both source and target organizations for migrations between GitHub products, depending on how your organization is set up. GitHub’s troubleshooting guidance explicitly calls out ensuring owner/migrator access on both sides.
Repos migrate as private by default. Use --target-repo-visibility public to keep it public.
gh gei migrate-repo \
--github-source-org "EIS-ITS" \
--source-repo "vss-cli" \
--github-target-org "utoronto-its" \
--target-repo "vss-cli" \
--target-repo-visibility "public"
Typical output should be:
PENDING_VALIDATIONIN_PROGRESS (repeats while it runs)SUCCEEDED when completeThat is normal progress output for gei.
Exact migrated artifacts can vary by repo content and settings, but this is the standard verification step for gei migrations.
Your run ended with:
State: SUCCEEDED1 warning encounteredgh gei download-logsGitHub documents log download using gh gei download-logs for migrations where the source is a GitHub product.
gh gei download-logs \
--github-target-org "utoronto-its" \
--target-repo "vss-cli" \
--migration-log-file "vss-cli-migration.log"
Then open vss-cli-migration.log and search for:
WARNINGSKIPPEDNOT_MIGRATEDThis will tell you exactly what the single warning was and whether you need to take any follow-up action.
--target-repo-visibility public works, but public repos may be restricted in certain enterprise configurations.