Skip to content

Migrate from GitLab

Codebahn imports your repositories, issues, merge requests, labels, milestones, and releases from GitLab. Code and history come across cleanly. GitLab CI does not run on Codebahn, so pipelines need a rewrite (see CI workflows below).

Migrations run one repository at a time through the UI. Every repository lives inside an organization, so create one first if you have not already (see getting started).

You need:

  • A Codebahn organization to import into
  • A GitLab personal access token or project access token with the read_api scope

A personal access token is the simplest option and works on all GitLab tiers. A project access token limits access to a single project but requires GitLab Premium or Ultimate on gitlab.com.

Personal access token: avatar > Edit profile > sidebar Access > Personal access tokens. Set a name and expiration, select the read_api scope, and create the token.

Project access token (Premium/Ultimate only): project Settings > Access tokens. Set a name and expiration, select the read_api scope, assign at least Reporter role, and create the token.

Copy the token value; it is shown once.

GitLabCodebahn
Repository (code, branches, tags)Repository
IssuesIssues
Merge requestsPull requests
LabelsLabels
MilestonesMilestones
ReleasesReleases

Merge requests import as pull requests, with content, comments, and state preserved.

GitLab group membership and project permissions do not transfer. After import, invite your team and set repository access on the Codebahn side.

  1. Sign in to Codebahn
  2. Click + > Import repository > GitLab
  3. In Clone URL, paste the HTTPS URL of your repository (for example https://gitlab.com/your-group/your-project.git, from the project page under Code > Clone with HTTPS)
  4. Paste your access token in the Access token field
  5. Select what to import: issues, merge requests, labels, milestones, releases
  6. Choose your organization as the owner and confirm the repository name
  7. Click Migrate repository

This is a one-time import. Once it completes, the Codebahn repository is independent from GitLab.

Point your local clone at the new remote:

Terminal window
git remote set-url origin git@codebahn.net:your-org/your-repo.git

The two systems differ in syntax, structure, and runner model. A starting map:

GitLab CIActions
.gitlab-ci.yml.github/workflows/*.yml
stagesJobs run in parallel; use needs for ordering
scriptsteps with run
imagecontainer or runner label (runs-on)
only/except or ruleson triggers with path/branch filters
artifactsactions/upload-artifact / actions/download-artifact
cacheactions/cache
variablesenv at workflow, job, or step level

There is no automated converter. Port one pipeline at a time, starting with the simplest (tests on push), and verify each before moving on. See set up CI for a working example and CI runners for runner sizes and what is supported. Hosted runners use the labels ubuntu-latest (alias for codebahn-small), codebahn-medium, and codebahn-large.

Codebahn also reads workflows from .codebahn/workflows/, .forgejo/workflows/, and .gitea/workflows/. See workflow directories for the precedence order.

Add your SSH keys under Settings > SSH / GPG Keys, the same as on GitLab.

“Authentication failed” or 401 The token is expired or missing the read_api scope. Generate a new one.

“Not found” or 404 The token cannot see this project. For personal tokens, confirm your GitLab account has at least Reporter membership on the project. For project tokens, confirm the token was created with at least Reporter role.

Merge requests imported without comments or review threads GitLab may rate-limit the importer on large projects. If the migration fails or returns incomplete data, retry later or migrate during off-peak hours on gitlab.com.

If the migration tool does not fit your situation, clone and push by hand:

Terminal window
git clone --bare https://gitlab.com/your-group/your-project.git
cd your-project.git
git push --mirror git@codebahn.net:your-org/your-repo.git

This moves code and branches only, not issues, merge requests, or releases.

There is no bulk-import tool yet. Create your organization, then run one migration per project with the org as the owner. You can script this against the migration API instead of the UI.

No lock-in cuts both ways. Whenever you want a full copy of everything (every repository plus issues, pull requests, labels, milestones, and releases), open Org Settings > Export and download a single archive. One click, no ticket.