Import and migrate projects (FREE)

If you want to bring existing projects to GitLab or copy GitLab projects to a different location, you can:

  • Import projects from external systems using one of the available importers.
  • Migrate GitLab projects:
    • Between two GitLab self-managed instances.
    • Between a self-managed instance and in both directions.
    • In the same GitLab instance.


  • At least the Maintainer role on the destination group to import to. Using the Developer role for this purpose was deprecated in GitLab 15.8 and will be removed in GitLab 16.0.

For any type of source and target, you can migrate GitLab projects:

  • When migrating groups by direct transfer, which allows you to migrate all projects in a group simultaneously. Migrating projects by direct transfer is in Beta. The feature is not ready for production use.
  • Using file exports. With this method you can migrate projects one by one. No network connection between instances is required.

If you only need to migrate Git repositories, you can import each project by URL. However, you can't import issues and merge requests this way. To retain metadata like issues and merge requests, either:

Keep in mind the limitations of migrating using file exports. When migrating from self-managed to, user associations (such as comment author) are changed to the user who is importing the projects.


Only import projects from sources you trust. If you import a project from an untrusted source, an attacker could steal your sensitive data. For example, an imported project with a malicious .gitlab-ci.yml file could allow an attacker to exfiltrate group CI/CD variables.

GitLab self-managed administrators can reduce their attack surface by disabling import sources they don't need:

  1. On the top bar, select Main menu > Admin.
  2. On the left sidebar, select Settings > General.
  3. Expand Visibility and access controls.
  4. Scroll to Import sources.
  5. Clear checkboxes for importers that are not required.

Available project importers

You can import projects from:

You can also import any Git repository through HTTP from the New Project page. If the repository is too large, the import can timeout.

You can then connect your external repository to get CI/CD benefits.

Import from Subversion

GitLab can not automatically migrate Subversion repositories to Git. Converting Subversion repositories to Git can be difficult, but several tools exist including:

  • git svn, for very small and basic repositories.
  • reposurgeon, for larger and more complex repositories.

Migrate using the API

To migrate all data from self-managed to, you can leverage the API. Migrate the assets in this order:

  1. Groups
  2. Projects
  3. Project variables

You must still migrate your Container Registry over a series of Docker pulls and pushes. Re-run any CI pipelines to retrieve any build artifacts.

Migrate between two self-managed GitLab instances

To migrate from an existing self-managed GitLab instance to a new self-managed GitLab instance, you should back up the existing instance and restore it on the new instance. For example, you could use this method to migrate a self-managed instance from an old server to a new server.

The backups produced don't depend on the operating system running GitLab. You can therefore use the restore method to switch between different operating system distributions or versions, as long as the same GitLab version is available for installation.

Administrators can use the Users API to migrate users.

View project import history

You can view all project imports created by you. This list includes the following:

  • Paths of source projects if projects were imported from external systems, or import method if GitLab projects were migrated.
  • Paths of destination projects.
  • Start date of each import.
  • Status of each import.
  • Error details if any errors occurred.

To view project import history:

  1. Sign in to GitLab.
  2. On the top bar, select Create new... ({plus-square}).
  3. Select New project/repository.
  4. Select Import project.
  5. In the upper-right corner, select History.
  6. If there are any errors for a particular import, you can see them by selecting Details.

The history also includes projects created from built-in or custom templates. GitLab uses import repository by URL to create a new project from a template.

LFS authentication

When importing a project that contains LFS objects, if the project has an .lfsconfig file with a URL host (lfs.url) different from the repository URL host, LFS files are not downloaded.

Project aliases (PREMIUM SELF)

Introduced in GitLab 12.1.

GitLab repositories are usually accessed with a namespace and a project name. When migrating frequently accessed repositories to GitLab, however, you can use project aliases to access those repositories with the original name. Accessing repositories through a project alias reduces the risk associated with migrating such repositories.

This feature is only available on Git over SSH. Also, only GitLab administrators can create project aliases, and they can only do so through the API. For more information, see the Project Aliases API documentation.

After an administrator creates an alias for a project, you can use the alias to clone the repository. For example, if an administrator creates the alias gitlab for the project, you can clone the project with git clone instead of git clone

Automate group and project import (PREMIUM)

The GitLab Professional Services team uses Congregate to orchestrate user, group, and project import API calls. With Congregate, you can migrate data to GitLab from:

  • Other GitLab instances
  • GitHub Enterprise
  • Bitbucket Server
  • Bitbucket Data Center

For more information, see:

For support, customers must enter into a paid engagement with GitLab Professional Services.


Imported repository is missing branches

If an imported repository does not contain all branches of the source repository:

  1. Set the environment variable IMPORT_DEBUG=true.
  2. Retry the import with a different group, subgroup, or project name.
  3. If some branches are still missing, inspect importer.log (for example, with jq).