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).
Before you start
Section titled “Before you start”You need:
- A Codebahn organization to import into
- A GitLab personal access token or project access token with the
read_apiscope
Create a GitLab access token
Section titled “Create a GitLab access token”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.
What gets imported
Section titled “What gets imported”| GitLab | Codebahn |
|---|---|
| Repository (code, branches, tags) | Repository |
| Issues | Issues |
| Merge requests | Pull requests |
| Labels | Labels |
| Milestones | Milestones |
| Releases | Releases |
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.
Import a repository
Section titled “Import a repository”- Sign in to Codebahn
- Click + > Import repository > GitLab
- 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) - Paste your access token in the Access token field
- Select what to import: issues, merge requests, labels, milestones, releases
- Choose your organization as the owner and confirm the repository name
- 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:
git remote set-url origin git@codebahn.net:your-org/your-repo.gitCI workflows
Section titled “CI workflows”The two systems differ in syntax, structure, and runner model. A starting map:
| GitLab CI | Actions |
|---|---|
.gitlab-ci.yml | .github/workflows/*.yml |
stages | Jobs run in parallel; use needs for ordering |
script | steps with run |
image | container or runner label (runs-on) |
only/except or rules | on triggers with path/branch filters |
artifacts | actions/upload-artifact / actions/download-artifact |
cache | actions/cache |
variables | env 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.
SSH keys
Section titled “SSH keys”Add your SSH keys under Settings > SSH / GPG Keys, the same as on GitLab.
Troubleshooting
Section titled “Troubleshooting”“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.
Fallback: manual push
Section titled “Fallback: manual push”If the migration tool does not fit your situation, clone and push by hand:
git clone --bare https://gitlab.com/your-group/your-project.gitcd your-project.gitgit push --mirror git@codebahn.net:your-org/your-repo.gitThis moves code and branches only, not issues, merge requests, or releases.
Migrating a group
Section titled “Migrating a group”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.
Leaving later
Section titled “Leaving later”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.