Skip to main content
Server & DevOpsAugust 6, 20268 min read

GitHub Now Migrates GitLab Repositories in One Command

GitHub Enterprise Importer now handles GitLab migrations self-service, no consulting engagement needed. Repositories, issues, merge requests and releases move with one CLI extension. Here is what comes across, what you rebuild, and how to size the work.

What Changed

On August 3, 2026, GitHub moved GitLab migrations out of preview. GitHub Enterprise Importer and its gh gl2gh CLI extension are now generally available for self-service use. Until now a GitLab migration went through an Expert Services engagement, so this is the difference between a consulting project and a command you run yourself.

General availability is the useful part of the announcement. It means the feature carries a support commitment and a proper deprecation process, so you can put a migration on a calendar with a date and a budget behind it. A public preview offers neither, which is worth remembering next to stacked pull requests, released a few days earlier and explicitly subject to change.

Sources supported are gitlab.com and any currently maintained, non end-of-life version of GitLab Self-Managed. Older versions are, in GitHub's wording, untested and unevaluated.

The mechanics are straightforward. For each repository the extension exports the GitLab project to a .tar.gz archive, stages it on the machine running the command, uploads it to blob storage GitHub can read, then imports it into the destination organization while translating GitLab entities into their GitHub equivalents. Storage is either GitHub-owned with --use-github-storage or your own S3 or Azure Blob account.

What Moves

The list is genuinely broad, and this is the part the announcement leads with:

  • Git source with full commit history, plus the repository wiki
  • Commit comments
  • Issues and issue comments, including issue state and milestone events
  • Merge requests converted into pull requests, carrying comments, reviewers and approvers, state events, milestones, timeline events and emoji reactions
  • Releases and release assets
  • Uploads and attachments
  • Project members, imported as mannequins you reclaim afterwards

Two conversions are lossy in ways worth knowing before someone notices in a review. Threaded discussions become flat comments with the original thread as context. And merge request comments only become proper review comments when diff data is present in the export, otherwise they land as ordinary issue comments. The export carries only the latest diff, so review history against older revisions does not survive as review history.

Pipelines Are a Separate Piece of Work

The documentation is refreshingly direct about this, in the list of data that is not migrated:

CI/CD pipelines and pipeline schedules (.gitlab-ci.yml has no automatic GitHub Actions equivalent)

Pipelines do not come across. Not the definitions, not the schedules, and per the same list, not the CI/CD variables, job traces, artifacts, child pipeline history or pipeline triggers, since GitLab leaves several of those out of the export entirely. Webhooks are in the same group.

This is good to know early rather than late, because it changes the shape of the plan. The repositories move quickly. The pipelines are a translation project with its own scope, and it is much easier to run it in parallel, on a branch, before the code moves, than to start it afterwards. Teams that budget the Actions work as the main line item rather than as a follow-up task tend to have calm migrations.

The rest of the list is shorter and mostly quick to rebuild:

  • Git LFS objects. The pointer files travel with the history, so the repository looks complete and is not. The binaries have to be pushed separately afterwards.
  • Repository policies, including merge trains, pipeline gates, required approvals, topics, avatars and mirroring. Your branch protection posture is re-created by hand.
  • Group settings and group membership. Structure and access are rebuilt on the other side.
  • Snippets, issue boards, time tracking and design management data.
  • Vulnerability reports.

One Requirement to Check First

Worth confirming before anything else, because it is a yes or no rather than a workaround:

Migrations from GitLab to GitHub Enterprise Server are not supported.

The destination has to be GitHub Enterprise Cloud, on github.com or ghe.com. Self-hosted to self-hosted is not a supported path today.

For most teams that is fine, since GitHub Enterprise Cloud is where they were heading anyway. It is the one thing to check early if you run GitLab Self-Managed for a reason someone wrote into a policy, such as data residency or an air gap, because those same reasons usually point away from a cloud destination. Sixty seconds of checking saves planning a migration this tool cannot perform.

Size the Job Before You Quote It

The documentation is unusually direct about what drives the clock, and it is not what most people estimate on:

Migration timing is largely based on the number of merge requests in a repository. If you want to migrate 1,000 repositories, and each repository has 100 merge requests on average, your migration will likely be very quick. If you want to migrate only 100 repositories, but the repositories each have 75,000 merge requests on average, the migration will take much longer.

Repository count is the number most people estimate on, and merge request count is the one that sets the clock. There is a command that gives you it, connecting to the GitLab API and writing groups.csv and projects.csv with per-project merge request counts:

gh gl2gh inventory-report --gitlab-server-url https://gitlab.example.com

Run that before you commit to a window. The hard ceilings to check against while you are there:

LimitValue
Single Git commit2 GiB
Single push2 GiB
Git reference name255 bytes
Single file after migration100 MiB (400 MiB during)
Repository archive40 GiB (itself still public preview)

The 255 byte reference limit is the one worth checking by hand, since non-ASCII characters such as emoji in a branch name consume more than one byte each.

When It Makes Sense

If you have been putting off a move to GitHub because the migration looked like a project, that objection is largely gone. The path is supported, self-service and free of a consulting engagement, and the history that makes code review useful comes with it. Plan the Actions work as its own piece and the rest is straightforward.

If the motivation is cost rather than tooling, price GitHub Enterprise Cloud first. Forge moves made to save money can end up costing more in migration effort than the licence they replace, and that is worth knowing before rather than after.

We plan and run forge migrations and build the CI/CD pipelines on the other side, as part of DevOps as a service. If you want a realistic estimate of what your .gitlab-ci.yml becomes in GitHub Actions before you commit to a timeline, get in touch.

Sources: GitHub Changelog, August 3 2026, Understand migrations from GitLab to GitHub, Plan your migration from GitLab to GitHub, Follow-up tasks

Talk to the engineer who will own your stack.

No account managers, no offshore handoff. Senior DevOps, direct. Tell us what you are dealing with and you get a straight answer.

Related News

Server & DevOps

GitHub Ships Stacked Pull Requests and One Limitation Decides Whether Your Team Can Actually Use Them

On July 30, 2026 GitHub put stacked pull requests into public preview: an ordered chain of dependent PRs where each layer targets the one below, reviewed separately and merged bottom up, with the branches above rebasing themselves as lower ones land. It is the workflow Graphite built a business on, now native and free. The catch is in the docs rather than the announcement, and it rules the feature out for a whole class of work: all branches must live in the same repository, so cross-fork stacks are not supported at all.

Server & DevOps

OpenAI Is Deleting GPT-5 and o3 in December and the Teams That Pinned Their Models Break First

OpenAI notified developers on June 11, 2026 that six GPT-5 and o3 model snapshots leave the first-party API on December 11, 2026. Teams that pinned an exact dated snapshot ID, OpenAI's own recommended production practice, break loudly on that date, while floating aliases keep working but silently change behavior.

Server & DevOps

Helm 3 Is Going End of Life and Helm 4 Will Quietly Break the Flags Your Pipeline Depends On

Helm 4 went GA on November 12, 2025 at KubeCon North America, and the Helm project has set firm Helm 3 end-of-life dates: the final limited release lands September 9, 2026, and security patches run only through February 2027. The catch is that Helm 4 changes the command-line surface your CI/CD depends on, with two genuinely breaking changes plus a set of flag renames, so the migration touches automation, not just interactive use.