Veröffentlicht am: 19. August 2026
12 Minuten Lesezeit
Wie sich ein Umzug von GitHub zu GitLab mit dem Projekt-Importer und GitLab Duo bewerkstelligen lässt.

Wer einen Wechsel zu GitLab erwägt, stellt fast immer zuerst dieselbe Frage: Wie aufwendig ist die Migration? Für die meisten DevSecOps-Teams ist die Sorge vor der großen Umzugsarbeit die größte Hürde auf dem Weg zu einer einheitlichen, KI-nativen DevSecOps-Plattform.
Der Umzug nach GitLab ist einfacher als je zuvor. Der eingebaute Importer holt den weitaus größten Teil der Projektdaten automatisch und im Hintergrund herüber. Und die Übersetzung der CI/CD-Pipeline, bislang der eine Teil, der Handarbeit verlangte, übernimmt inzwischen weitgehend GitLab Duo. Unsere KI-native Assistenz wandelt GitHub-Actions-Workflows in GitLab CI/CD um.
Dieser Beitrag geht die Migration von Anfang bis Ende durch:
Los geht's.
Der eingebaute GitHub-Importer von GitLab wird direkt aus der Projektanlage heraus aufgerufen und läuft als Hintergrundjob. Ein Import lässt sich also anstoßen und dann sich selbst überlassen. Die meisten Projektdaten kommen automatisch mit. Ein kleinerer Teil ist optional zuschaltbar oder hat Einschränkungen, die man vorher kennen sollte.
Die folgende Tabelle zeigt, was migriert und auf welche Weise:
| Daten | Status |
|---|---|
| Git-Repository, Branches, Tags und Commit-Historie | ✅ Automatisch. Einschließlich Fork-Branches offener Pull Requests. |
| Issues | ✅ Automatisch |
| Pull Requests (werden zu Merge Requests) | ✅ Automatisch. Einschließlich Reviews, Review-Kommentaren, Vorschlägen, zugewiesenen Reviewenden und der Angabe, wer gemergt hat. |
| Kommentare zu Issues und Pull Requests | ✅ Automatisch |
| Labels und Meilensteine | ✅ Automatisch |
| Inhalte der Release Notes | ✅ Automatisch |
| Wiki-Seiten | ✅ Automatisch |
| Regeln zum Branch-Schutz | ✅ Automatisch |
| Ereignisse zu Issues und Pull Requests | ✅ Automatisch |
| Mitarbeitende (Mitglieder) | ⚠️ Mit Einschränkungen. Optional zuschaltbar (standardmäßig an). Erfordert den Scope read:org. GitHub-Rollen werden auf GitLab-Rollen abgebildet (siehe unten). Eigene Rollen aus GitHub Enterprise Cloud werden nicht unterstützt und manuell ergänzt. |
| Markdown-Anhänge (in Beschreibungen, Kommentaren, Releases) | ⚠️ Mit Einschränkungen. Optional zuschaltbar. Anhänge aus privaten Repositorys von vor Mai 2023 lassen sich nicht importieren (eine Beschränkung von GitHub). GitHub Enterprise Server importiert nur Bilder und Videos. |
| Große Kommentarmengen (ab etwa 30.000) | ⚠️ Mit Einschränkungen. Den alternativen Kommentar-Import einschalten, um die API-Grenzen von GitHub pro Issue zu umgehen. Kommentare von vor 2017 können als eigene Threads ankommen. |
| Git-LFS-Objekte | ⚠️ Mit Einschränkungen. LFS muss im Zielprojekt aktiviert sein, bevor der Import läuft, sonst werden die Objekte stillschweigend übersprungen. |
| GitHub-Actions-Workflows | 🛠️ Manuell (KI-gestützt). Werden zu .gitlab-ci.yml. GitLab Duo nimmt den größten Teil davon ab. |
| Secrets → CI/CD-Variablen | 🛠️ Manuell. Secrets als CI/CD-Variablen neu anlegen (maskiert und geschützt markieren), bevor Pipelines laufen. |
| Erforderliche Statusprüfungen | 🛠️ Manuell. Als externe Statusprüfungen neu anlegen. |
| GitHub-Organisationen und -Gruppierungen | ❌ Migriert nicht. Gruppen und Untergruppen in GitLab passend aufbauen. |
GitHub und GitLab benennen Rollen unterschiedlich, deshalb findet während der Migration eine Zuordnung statt. Werden Mitarbeitende importiert, gilt folgende Abbildung:
| GitHub-Rolle | GitLab-Rolle |
|---|---|
| Read | Guest |
| Triage | Reporter |
| Write | Developer |
| Maintain | Maintainer |
| Admin | Owner |
Die Voraussetzungen sind über die Jahre einfacher geworden. Insbesondere braucht nicht mehr jede GitHub-Autorenschaft eine passende öffentliche E-Mail-Adresse in GitLab. Die Zuordnung von Beiträgen übernimmt GitLab inzwischen automatisch über das Contribution Mapping (ab GitLab 17.8). Mehr dazu weiter unten.
Für den Import von GitHub.com oder GitHub Enterprise Server nach GitLab.com oder auf eine GitLab-Self-Managed-Instanz ist nötig:
Dazu kommen zwei situationsabhängige Voraussetzungen:
read:org und mindestens Write- oder Maintain-Zugriff auf das GitHub-Projekt.Früher wanderte die Beitragshistorie nur dann sauber mit, wenn die öffentliche E-Mail-Adresse jeder GitHub-Person mit ihrer GitLab-Adresse übereinstimmte. Heute legt GitLab Platzhalter-Konten für jede GitHub-Autorenschaft, -Zuweisung oder -Review ohne passendes GitLab-Konto an und bewahrt deren Beiträge.
Nach dem Import weist eine Person mit Owner- oder Maintainer-Rolle unter Mitglieder → Platzhalter jeden Platzhalter dem realen GitLab-Konto zu, das die Zuordnung dann annimmt. Migrieren lässt sich also zuerst, die Zuordnung folgt danach.
Für den Import gibt es drei Wege. Welcher passt, hängt von Quelle und Umfang ab.
Für die meisten Teams der kürzeste Weg.
Optionale Schalter:
| Schalter | Voreinstellung | Sinnvoll, wenn |
|---|---|---|
| Mitarbeitende importieren | An | Projektmitglieder samt Rollenzuordnung mitkommen sollen. |
| Markdown-Anhänge importieren | Aus | Bilder und Dateien aus Beschreibungen, Kommentaren und Releases mitsollen. |
| Alternativen Kommentar-Import nutzen | Aus | Das Projekt ab etwa 30.000 Kommentare hat und die GitHub-API-Grenzen greifen. |
Ist OAuth nicht eingerichtet, erfolgt die Authentifizierung über ein Token.
github.com/settings/tokens/new ein klassisches Personal Access Token mit dem Scope repo anlegen (dazu read:org, wenn Mitarbeitende oder LFS importiert werden). Hinweis: Fine-grained Tokens werden nicht unterstützt.Für viele Repositorys auf einmal, für skriptgesteuerte Umzüge oder für öffentliche Repositorys, die einem nicht gehören, eignet sich die Import-API.
curl --request POST \
--url "https://gitlab.com/api/v4/import/github" \
--header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"personal_access_token": "<github_classic_pat>",
"repo_id": 12345678,
"target_namespace": "my-group",
"new_name": "imported-project",
"optional_stages": {
"single_endpoint_notes_import": true,
"attachments_import": true,
"collaborators_import": true
}
}'
Den Fortschritt verfolgen:
curl --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"https://gitlab.com/api/v4/projects/<project_id>/import"
Dafür braucht es ein klassisches GitHub-PAT mit dem Scope repo und ein GitLab-PAT mit dem Scope api.
Ist der Import durch, empfiehlt sich eine kurze Kontrolle:
Ein erneuter Import legt eine frische Kopie an, in ein bestehendes Projekt lässt sich nicht importieren. Sieht etwas nicht richtig aus, hilft also löschen und neu laufen lassen.
Eine Migration muss kein harter Schnitt sein. Die meisten Teams ziehen nach und nach um: GitHub bleibt in Betrieb, während GitLab aufgebaut wird, die Pipelines geprüft werden und ein Team nach dem anderen wechselt. GitLab ist darauf ausgelegt, in dieser Übergangszeit neben GitHub zu bestehen, sodass sich GitLab schrittweise einführen lässt, statt über Nacht umzuschalten.
So arbeiten beide Plattformen während der Migration nebeneinander:
.gitlab-ci.yml an echten Commits prüfen, während die maßgebliche Quelle noch in GitHub liegt.CI/CD ist der Teil der Migration, der nicht automatisch läuft. Er ist zugleich die Gelegenheit, die Pipelines zu modernisieren. Viele Kernkonzepte lassen sich sauber übertragen:
| GitHub Actions | GitLab CI/CD |
|---|---|
.github/workflows/*.yml | .gitlab-ci.yml |
| Workflow | Pipeline |
| Job | Job |
| Schritt in einem Job | Zeile in script: |
Ereignisauslöser (on:) | rules: / workflow: |
runs-on: / container: | image: und Runner-tags: |
| Actions Marketplace | CI/CD-Komponenten |
| Secrets | CI/CD-Variablen |
strategy.matrix | parallel.matrix |
actions/checkout | eingebaut (GitLab klont selbst) |
actions/cache | Schlüsselwort cache: |
actions/upload-artifact | Schlüsselwort artifacts: |
Ein wichtiger Unterschied: In GitLab laufen Stages nacheinander und Jobs innerhalb einer Stage parallel. Mit needs: lässt sich daraus ein ausdrücklicher gerichteter azyklischer Graph (DAG) bauen.
Die GitLab Duo Agent Platform enthält einen Flow "Convert to GitLab CI/CD", der GitHub-Actions-Workflows in eine .gitlab-ci.yml übersetzt. Statt von Grund auf neu zu schreiben, prüft man dann einen Entwurf.
GitLab Duo hilft über die gesamte Migration hinweg, nicht nur beim Umwandeln:
needs:-DAGs und CI/CD-Komponenten.GitLab Duo Agentic Chat zieht Kontext aus Issues, Merge Requests und Pipelines heran und beantwortet Fragen direkt in der Plattform. Duo Code Suggestions unterstützen beim Bearbeiten der .gitlab-ci.yml in der Web-IDE.
Steht GitLab Duo in der eigenen Umgebung nicht zur Verfügung, gelingen dieselben Umwandlungen auch mit einem Frontier-Modell und einem strukturierten Prompt. Ein Prompt, der verlässliche Ergebnisse liefert:
Convert this GitHub Actions workflow to GitLab CI/CD. Preserve matrix builds, job dependencies, artifacts, and conditional rules. Return a valid
.gitlab-ci.yml.
Ein paar Leitplanken für den Einsatz jeder KI-Assistenz bei der Migration: niemals Secrets, Tokens oder interne Hostnamen einfügen, erzeugtes YAML immer mit dem CI-Lint-Werkzeug von GitLab prüfen und die Ausgabe als Entwurf zur Durchsicht behandeln, nicht als fertigen Commit.
Ob GitLab Duo den Code entwirft oder er von Hand entsteht, es hilft, die Übertragung einmal zu sehen. Hier ein typischer GitHub-Actions-Workflow zum Bauen und Testen:
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '18' }
- run: npm install
- run: npm test
- run: npm run build
Und das Gegenstück in GitLab CI/CD. Der Checkout entfällt (GitLab klont selbst), aus runs-on wird image, und jeder Schritt wird zu einer Zeile in script::
stages: [test, build]
# GitLab-maintained SAST is one line away
# a nice upgrade to add during migration.
include:
- template: Jobs/SAST.gitlab-ci.yml
test:
stage: test
image: node:18
script:
- npm install
- npm test
build:
stage: build
image: node:18
script:
- npm install
- npm run build
artifacts:
paths: [dist/]
Matrix-Builds übertragen sich ebenso direkt, aus strategy.matrix wird parallel.matrix:
test:
image: node:${NODE_VERSION}
parallel:
matrix:
- NODE_VERSION: ['16', '18', '20']
script:
- npm install
- npm test
Und bedingte Deployments bilden sich über rules: ab:
deploy:
stage: deploy
script: ./deploy.sh
rules:
- if: $CI_COMMIT_BRANCH == "main"
Sobald die .gitlab-ci.yml committet ist, startet GitLab die Pipeline sofort. Mehr dazu steht in der Dokumentation zu GitLab CI/CD.
GitHub ist nicht die einzige Quelle. Der Importer von GitLab unterstützt die Migration aus mehreren weiteren Plattformen mit einem Klick:
Zu diesen Migrationen gibt es außerdem Dokumentation:
Danke fürs Lesen. Eine Migration muss nicht der beängstigende Teil beim Wechsel auf eine neue Plattform sein. GitLab holt die Daten automatisch herüber, GitLab Duo übernimmt die CI/CD-Umwandlung, und der Fokus bleibt auf dem Ausliefern. Mehr dazu über die folgenden Verweise:
Start your free
30-day GitLab trial
No credit card required.
Hat dir dieser Blogbeitrag gefallen? Hast du Fragen oder Feedback? Erstelle ein neues Diskussionsthema im GitLab-Community-Forum und lass andere an deinen Eindrücken teilhaben.
Feedback teilenBeginne noch heute, schneller zu entwickeln
Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.