[{"data":1,"prerenderedAt":2601},["ShallowReactive",2],{"/de-de/blog/github-to-gitlab-migration-made-easy":3,"navigation-de-de":1859,"banner-de-de":2282,"footer-de-de":2289,"blog-post-authors-de-de-Fernando Diaz":2542,"blog-related-posts-de-de-github-to-gitlab-migration-made-easy":2557,"blog-share-wrapper-de-de":2581,"next-steps-de-de":2591},{"id":4,"title":5,"authors":6,"body":8,"category":1837,"date":1838,"description":1839,"extension":1840,"externalUrl":1841,"faq":1841,"featured":1842,"heroImage":1843,"meta":1844,"navigation":1376,"path":1845,"seo":1846,"slug":1850,"stem":1851,"tags":1852,"template":1857,"updatedDate":1841,"__hash__":1858},"blogPosts/de-de/blog/github-to-gitlab-migration-made-easy.md","Von GitHub zu GitLab migrieren, ohne Umwege",[7],"Fernando Diaz",{"type":9,"value":10,"toc":1817},"minimark",[11,33,42,45,81,84,89,98,101,286,291,294,348,352,365,383,417,420,440,444,451,458,462,465,469,472,516,521,570,574,577,610,614,622,759,762,787,796,800,803,834,837,841,844,847,900,904,907,1064,1075,1079,1097,1100,1145,1162,1165,1173,1182,1186,1189,1336,1350,1530,1537,1612,1618,1667,1678,1682,1685,1736,1739,1776,1779,1782,1813],[12,13,14,15,19,20,26,27,32],"p",{},"Wer einen Wechsel zu GitLab erwägt, stellt fast immer zuerst dieselbe Frage: ",[16,17,18],"em",{},"Wie aufwendig ist die Migration?"," Für die meisten ",[21,22,25],"a",{"href":23,"rel":24},"https://about.gitlab.com/de-de/topics/devsecops/",[],"DevSecOps","-Teams ist die Sorge vor der großen Umzugsarbeit die größte Hürde auf dem Weg zu einer einheitlichen, KI-nativen ",[21,28,31],{"href":29,"rel":30},"https://about.gitlab.com/de-de/platform/",[],"DevSecOps-Plattform",".",[12,34,35,36,41],{},"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 ",[21,37,40],{"href":38,"rel":39},"https://about.gitlab.com/de-de/gitlab-duo/",[],"GitLab Duo",". Unsere KI-native Assistenz wandelt GitHub-Actions-Workflows in GitLab CI/CD um.",[12,43,44],{},"Dieser Beitrag geht die Migration von Anfang bis Ende durch:",[46,47,48,65,68,71,78],"ul",{},[49,50,51,52,56,57,60,61,64],"li",{},"Welche Daten von GitHub nach GitLab migrieren und was davon ",[53,54,55],"strong",{},"automatisch",", ",[53,58,59],{},"mit Einschränkungen"," oder ",[53,62,63],{},"manuell"," läuft",[49,66,67],{},"Welche Voraussetzungen in GitLab 18.x tatsächlich nötig sind, weniger als vermutet",[49,69,70],{},"Drei Wege für den Import: Oberfläche mit OAuth, Personal Access Token und die REST-API für größere Umzüge",[49,72,73,74,77],{},"Wie sich GitHub Actions in GitLab CI/CD überführen lassen, auf dem klassischen Weg ",[16,75,76],{},"und"," zügig mit GitLab Duo",[49,79,80],{},"Aus welchen anderen Plattformen GitLab importieren kann",[12,82,83],{},"Los geht's.",[85,86,88],"h2",{"id":87},"welche-daten-migrieren-von-github-nach-gitlab","Welche Daten migrieren von GitHub nach GitLab?",[12,90,91,92,97],{},"Der ",[21,93,96],{"href":94,"rel":95},"https://docs.gitlab.com/user/project/import/github/",[],"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.",[12,99,100],{},"Die folgende Tabelle zeigt, was migriert und auf welche Weise:",[102,103,104,117],"table",{},[105,106,107],"thead",{},[108,109,110,114],"tr",{},[111,112,113],"th",{},"Daten",[111,115,116],{},"Status",[118,119,120,129,137,145,152,159,166,173,180,187,200,208,216,232,244,258,272],"tbody",{},[108,121,122,126],{},[123,124,125],"td",{},"Git-Repository, Branches, Tags und Commit-Historie",[123,127,128],{},"✅ Automatisch. Einschließlich Fork-Branches offener Pull Requests.",[108,130,131,134],{},[123,132,133],{},"Issues",[123,135,136],{},"✅ Automatisch",[108,138,139,142],{},[123,140,141],{},"Pull Requests (werden zu Merge Requests)",[123,143,144],{},"✅ Automatisch. Einschließlich Reviews, Review-Kommentaren, Vorschlägen, zugewiesenen Reviewenden und der Angabe, wer gemergt hat.",[108,146,147,150],{},[123,148,149],{},"Kommentare zu Issues und Pull Requests",[123,151,136],{},[108,153,154,157],{},[123,155,156],{},"Labels und Meilensteine",[123,158,136],{},[108,160,161,164],{},[123,162,163],{},"Inhalte der Release Notes",[123,165,136],{},[108,167,168,171],{},[123,169,170],{},"Wiki-Seiten",[123,172,136],{},[108,174,175,178],{},[123,176,177],{},"Regeln zum Branch-Schutz",[123,179,136],{},[108,181,182,185],{},[123,183,184],{},"Ereignisse zu Issues und Pull Requests",[123,186,136],{},[108,188,189,192],{},[123,190,191],{},"Mitarbeitende (Mitglieder)",[123,193,194,195,199],{},"⚠️ Mit Einschränkungen. Optional zuschaltbar (standardmäßig an). Erfordert den Scope ",[196,197,198],"code",{},"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.",[108,201,202,205],{},[123,203,204],{},"Markdown-Anhänge (in Beschreibungen, Kommentaren, Releases)",[123,206,207],{},"⚠️ 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.",[108,209,210,213],{},[123,211,212],{},"Große Kommentarmengen (ab etwa 30.000)",[123,214,215],{},"⚠️ 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.",[108,217,218,221],{},[123,219,220],{},"Git-LFS-Objekte",[123,222,223,224,227,228,231],{},"⚠️ Mit Einschränkungen. LFS muss im ",[53,225,226],{},"Zielprojekt"," aktiviert sein, ",[16,229,230],{},"bevor"," der Import läuft, sonst werden die Objekte stillschweigend übersprungen.",[108,233,234,237],{},[123,235,236],{},"GitHub-Actions-Workflows",[123,238,239,240,243],{},"🛠️ Manuell (KI-gestützt). Werden zu ",[196,241,242],{},".gitlab-ci.yml",". GitLab Duo nimmt den größten Teil davon ab.",[108,245,246,249],{},[123,247,248],{},"Secrets → CI/CD-Variablen",[123,250,251,252,257],{},"🛠️ Manuell. Secrets als ",[21,253,256],{"href":254,"rel":255},"https://docs.gitlab.com/ci/variables/",[],"CI/CD-Variablen"," neu anlegen (maskiert und geschützt markieren), bevor Pipelines laufen.",[108,259,260,263],{},[123,261,262],{},"Erforderliche Statusprüfungen",[123,264,265,266,271],{},"🛠️ Manuell. Als ",[21,267,270],{"href":268,"rel":269},"https://docs.gitlab.com/user/project/merge_requests/status_checks/",[],"externe Statusprüfungen"," neu anlegen.",[108,273,274,277],{},[123,275,276],{},"GitHub-Organisationen und -Gruppierungen",[123,278,279,280,285],{},"❌ Migriert nicht. ",[21,281,284],{"href":282,"rel":283},"https://docs.gitlab.com/user/group/",[],"Gruppen und Untergruppen"," in GitLab passend aufbauen.",[287,288,290],"h3",{"id":289},"wie-werden-die-rollen-abgebildet","Wie werden die Rollen abgebildet?",[12,292,293],{},"GitHub und GitLab benennen Rollen unterschiedlich, deshalb findet während der Migration eine Zuordnung statt. Werden Mitarbeitende importiert, gilt folgende Abbildung:",[102,295,296,306],{},[105,297,298],{},[108,299,300,303],{},[111,301,302],{},"GitHub-Rolle",[111,304,305],{},"GitLab-Rolle",[118,307,308,316,324,332,340],{},[108,309,310,313],{},[123,311,312],{},"Read",[123,314,315],{},"Guest",[108,317,318,321],{},[123,319,320],{},"Triage",[123,322,323],{},"Reporter",[108,325,326,329],{},[123,327,328],{},"Write",[123,330,331],{},"Developer",[108,333,334,337],{},[123,335,336],{},"Maintain",[123,338,339],{},"Maintainer",[108,341,342,345],{},[123,343,344],{},"Admin",[123,346,347],{},"Owner",[85,349,351],{"id":350},"voraussetzungen","Voraussetzungen",[12,353,354,355,358,359,364],{},"Die Voraussetzungen sind über die Jahre ",[16,356,357],{},"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 ",[21,360,363],{"href":361,"rel":362},"https://docs.gitlab.com/user/project/import/#user-contribution-and-membership-mapping",[],"Contribution Mapping"," (ab GitLab 17.8). Mehr dazu weiter unten.",[12,366,367,368,60,371,374,375,378,379,382],{},"Für den Import von ",[53,369,370],{},"GitHub.com",[53,372,373],{},"GitHub Enterprise Server"," nach ",[53,376,377],{},"GitLab.com"," oder auf eine ",[53,380,381],{},"GitLab-Self-Managed-Instanz"," ist nötig:",[46,384,385,391,398,410],{},[49,386,387,390],{},[53,388,389],{},"Zugriff auf das GitHub-Quellprojekt",", das importiert werden soll.",[49,392,393,394,397],{},"Die Rolle ",[53,395,396],{},"Maintainer oder Owner"," in der GitLab-Zielgruppe.",[49,399,400,403,404,409],{},[53,401,402],{},"GitHub als Importquelle aktiviert."," Auf GitLab.com ist das standardmäßig der Fall. Bei GitLab Self-Managed schaltet die Administration es unter ",[21,405,408],{"href":406,"rel":407},"https://docs.gitlab.com/administration/settings/visibility_and_access_controls/#configure-allowed-import-sources",[],"Importquellen"," frei.",[49,411,412,413,416],{},"Die GitHub-Organisation darf ",[53,414,415],{},"den Zugriff durch Drittanwendungen nicht einschränken"," (oder der Zugriff wird bei der Autorisierung eigens gewährt).",[12,418,419],{},"Dazu kommen zwei situationsabhängige Voraussetzungen:",[46,421,422,431],{},[49,423,424,427,428,430],{},[53,425,426],{},"Sollen Git-LFS-Objekte mit?"," Dann LFS im Zielprojekt aktivieren, ",[16,429,230],{}," der Import startet.",[49,432,433,436,437,439],{},[53,434,435],{},"Sollen Mitarbeitende mit?"," Dann braucht das Token den Scope ",[196,438,198],{}," und mindestens Write- oder Maintain-Zugriff auf das GitHub-Projekt.",[287,441,443],{"id":442},"passende-e-mail-adressen-sind-nicht-mehr-nötig","Passende E-Mail-Adressen sind nicht mehr nötig",[12,445,446,447,450],{},"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 ",[53,448,449],{},"Platzhalter-Konten"," für jede GitHub-Autorenschaft, -Zuweisung oder -Review ohne passendes GitLab-Konto an und bewahrt deren Beiträge.",[12,452,453,454,457],{},"Nach dem Import weist eine Person mit Owner- oder Maintainer-Rolle unter ",[53,455,456],{},"Mitglieder → Platzhalter"," jeden Platzhalter dem realen GitLab-Konto zu, das die Zuordnung dann annimmt. Migrieren lässt sich also zuerst, die Zuordnung folgt danach.",[85,459,461],{"id":460},"den-import-durchführen","Den Import durchführen",[12,463,464],{},"Für den Import gibt es drei Wege. Welcher passt, hängt von Quelle und Umfang ab.",[287,466,468],{"id":467},"weg-1-oberfläche-mit-github-oauth-empfohlen-für-gitlabcom","Weg 1: Oberfläche mit GitHub-OAuth (empfohlen für GitLab.com)",[12,470,471],{},"Für die meisten Teams der kürzeste Weg.",[473,474,475,488,495,502,509],"ol",{},[49,476,477,478,481,482,487],{},"In einer Gruppe ",[53,479,480],{},"Create project → Import project → GitHub"," wählen (oder direkt unter ",[21,483,486],{"href":484,"rel":485},"https://gitlab.com/projects/new#import_project",[],"gitlab.com/projects/new#import_project"," starten).",[49,489,490,491,494],{},"Die Schaltfläche ",[53,492,493],{},"Authenticate with GitHub"," betätigen und die OAuth-Anwendung bestätigen.",[49,496,497,498,501],{},"Bei Repositorys einer Organisation neben dem Organisationsnamen auf ",[53,499,500],{},"Grant"," klicken, um den Zugriff zu autorisieren.",[49,503,504,505,508],{},"Die Repositorys über die Reiter ",[53,506,507],{},"Owner / Collaborated / Organization"," filtern und die gewünschten auswählen. Dabei lassen sie sich umbenennen und einem GitLab-Namensraum zuordnen.",[49,510,511,512,515],{},"Die optionalen Schalter setzen (siehe Tabelle unten) und auf ",[53,513,514],{},"Import"," klicken. Der Import läuft als Hintergrundjob, man kann die Seite verlassen und später nachsehen.",[12,517,518],{},[53,519,520],{},"Optionale Schalter:",[102,522,523,536],{},[105,524,525],{},[108,526,527,530,533],{},[111,528,529],{},"Schalter",[111,531,532],{},"Voreinstellung",[111,534,535],{},"Sinnvoll, wenn",[118,537,538,549,560],{},[108,539,540,543,546],{},[123,541,542],{},"Mitarbeitende importieren",[123,544,545],{},"An",[123,547,548],{},"Projektmitglieder samt Rollenzuordnung mitkommen sollen.",[108,550,551,554,557],{},[123,552,553],{},"Markdown-Anhänge importieren",[123,555,556],{},"Aus",[123,558,559],{},"Bilder und Dateien aus Beschreibungen, Kommentaren und Releases mitsollen.",[108,561,562,565,567],{},[123,563,564],{},"Alternativen Kommentar-Import nutzen",[123,566,556],{},[123,568,569],{},"Das Projekt ab etwa 30.000 Kommentare hat und die GitHub-API-Grenzen greifen.",[287,571,573],{"id":572},"weg-2-personal-access-token-wenn-oauth-nicht-eingerichtet-ist","Weg 2: Personal Access Token (wenn OAuth nicht eingerichtet ist)",[12,575,576],{},"Ist OAuth nicht eingerichtet, erfolgt die Authentifizierung über ein Token.",[473,578,579,597,603],{},[49,580,581,582,585,586,589,590,593,594,596],{},"Unter ",[196,583,584],{},"github.com/settings/tokens/new"," ein ",[53,587,588],{},"klassisches"," Personal Access Token mit dem Scope ",[196,591,592],{},"repo"," anlegen (dazu ",[196,595,198],{},", wenn Mitarbeitende oder LFS importiert werden). Hinweis: Fine-grained Tokens werden nicht unterstützt.",[49,598,599,600,602],{},"In GitLab in einer Gruppe ",[53,601,480],{}," wählen.",[49,604,605,606,609],{},"Das Token einfügen, ",[53,607,608],{},"Authenticate"," wählen und dieselben Schritte zur Auswahl und Konfiguration durchlaufen wie beim OAuth-Weg.",[287,611,613],{"id":612},"weg-3-rest-api-massenimporte-und-skripte","Weg 3: REST-API (Massenimporte und Skripte)",[12,615,616,617,32],{},"Für viele Repositorys auf einmal, für skriptgesteuerte Umzüge oder für öffentliche Repositorys, die einem nicht gehören, eignet sich die ",[21,618,621],{"href":619,"rel":620},"https://docs.gitlab.com/api/import/",[],"Import-API",[623,624,629],"pre",{"className":625,"code":626,"language":627,"meta":628,"style":628},"language-bash shiki shiki-themes github-light","curl --request POST \\\n  --url \"https://gitlab.com/api/v4/import/github\" \\\n  --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  --header \"Content-Type: application/json\" \\\n  --data '{\n    \"personal_access_token\": \"\u003Cgithub_classic_pat>\",\n    \"repo_id\": 12345678,\n    \"target_namespace\": \"my-group\",\n    \"new_name\": \"imported-project\",\n    \"optional_stages\": {\n      \"single_endpoint_notes_import\": true,\n      \"attachments_import\": true,\n      \"collaborators_import\": true\n    }\n  }'\n","bash","",[196,630,631,651,662,680,690,699,705,711,717,723,729,735,741,747,753],{"__ignoreMap":628},[632,633,636,640,644,648],"span",{"class":634,"line":635},"line",1,[632,637,639],{"class":638},"s7eDp","curl",[632,641,643],{"class":642},"sYu0t"," --request",[632,645,647],{"class":646},"sYBdl"," POST",[632,649,650],{"class":642}," \\\n",[632,652,654,657,660],{"class":634,"line":653},2,[632,655,656],{"class":642},"  --url",[632,658,659],{"class":646}," \"https://gitlab.com/api/v4/import/github\"",[632,661,650],{"class":642},[632,663,665,668,671,675,678],{"class":634,"line":664},3,[632,666,667],{"class":642},"  --header",[632,669,670],{"class":646}," \"PRIVATE-TOKEN: ",[632,672,674],{"class":673},"sgsFI","$GITLAB_TOKEN",[632,676,677],{"class":646},"\"",[632,679,650],{"class":642},[632,681,683,685,688],{"class":634,"line":682},4,[632,684,667],{"class":642},[632,686,687],{"class":646}," \"Content-Type: application/json\"",[632,689,650],{"class":642},[632,691,693,696],{"class":634,"line":692},5,[632,694,695],{"class":642},"  --data",[632,697,698],{"class":646}," '{\n",[632,700,702],{"class":634,"line":701},6,[632,703,704],{"class":646},"    \"personal_access_token\": \"\u003Cgithub_classic_pat>\",\n",[632,706,708],{"class":634,"line":707},7,[632,709,710],{"class":646},"    \"repo_id\": 12345678,\n",[632,712,714],{"class":634,"line":713},8,[632,715,716],{"class":646},"    \"target_namespace\": \"my-group\",\n",[632,718,720],{"class":634,"line":719},9,[632,721,722],{"class":646},"    \"new_name\": \"imported-project\",\n",[632,724,726],{"class":634,"line":725},10,[632,727,728],{"class":646},"    \"optional_stages\": {\n",[632,730,732],{"class":634,"line":731},11,[632,733,734],{"class":646},"      \"single_endpoint_notes_import\": true,\n",[632,736,738],{"class":634,"line":737},12,[632,739,740],{"class":646},"      \"attachments_import\": true,\n",[632,742,744],{"class":634,"line":743},13,[632,745,746],{"class":646},"      \"collaborators_import\": true\n",[632,748,750],{"class":634,"line":749},14,[632,751,752],{"class":646},"    }\n",[632,754,756],{"class":634,"line":755},15,[632,757,758],{"class":646},"  }'\n",[12,760,761],{},"Den Fortschritt verfolgen:",[623,763,765],{"className":625,"code":764,"language":627,"meta":628,"style":628},"curl --header \"PRIVATE-TOKEN: $GITLAB_TOKEN\" \\\n  \"https://gitlab.com/api/v4/projects/\u003Cproject_id>/import\"\n",[196,766,767,782],{"__ignoreMap":628},[632,768,769,771,774,776,778,780],{"class":634,"line":635},[632,770,639],{"class":638},[632,772,773],{"class":642}," --header",[632,775,670],{"class":646},[632,777,674],{"class":673},[632,779,677],{"class":646},[632,781,650],{"class":642},[632,783,784],{"class":634,"line":653},[632,785,786],{"class":646},"  \"https://gitlab.com/api/v4/projects/\u003Cproject_id>/import\"\n",[12,788,789,790,792,793,32],{},"Dafür braucht es ein klassisches GitHub-PAT mit dem Scope ",[196,791,592],{}," und ein GitLab-PAT mit dem Scope ",[196,794,795],{},"api",[287,797,799],{"id":798},"den-import-prüfen","Den Import prüfen",[12,801,802],{},"Ist der Import durch, empfiehlt sich eine kurze Kontrolle:",[473,804,805,824,827],{},[49,806,807,808,811,812,815,816,819,820,823],{},"Das neue Projekt öffnen und das Statusbanner von ",[16,809,810],{},"scheduled"," über ",[16,813,814],{},"started"," zu ",[16,817,818],{},"finished"," verfolgen. Meldet es ",[53,821,822],{},"partially completed",", nachsehen, welche Objekte fehlgeschlagen sind.",[49,825,826],{},"Die Zahl der Branches, Tags, Commit-SHAs, Issues, Merge Requests, Labels und Meilensteine mit der Quelle vergleichen.",[49,828,829,830,833],{},"Prüfen, ob importierte Objekte das Kennzeichen ",[53,831,832],{},"Imported"," tragen.",[12,835,836],{},"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.",[85,838,840],{"id":839},"github-und-gitlab-während-einer-schrittweisen-migration-parallel-betreiben","GitHub und GitLab während einer schrittweisen Migration parallel betreiben",[12,842,843],{},"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.",[12,845,846],{},"So arbeiten beide Plattformen während der Migration nebeneinander:",[46,848,849,867,882,894],{},[49,850,851,854,855,860,861,866],{},[53,852,853],{},"Repositorys per Pull-Mirroring synchron halten."," GitLab kann ein GitHub-Repository ",[21,856,859],{"href":857,"rel":858},"https://docs.gitlab.com/user/project/repository/mirror/pull/",[],"per Pull-Mirroring"," spiegeln und neue Branches und Commits in festen Abständen übernehmen. Entwicklungsteams pushen weiter nach GitHub, während GitLab aktuell bleibt. Damit steht eine stets aktuelle, nur lesbare Kopie bereit, an der sich CI/CD und Abläufe erproben lassen, bevor jemand die gewohnte Arbeitsweise ändert. Steht der Wechsel an, lässt sich auf ",[21,862,865],{"href":863,"rel":864},"https://docs.gitlab.com/user/project/repository/mirror/push/",[],"Push-Mirroring"," umstellen, sodass Änderungen aus GitLab zurück nach GitHub fließen, solange dort noch Teams arbeiten.",[49,868,869,872,873,878,879,881],{},[53,870,871],{},"Pipelines auf GitHub-Repositorys laufen lassen."," Wer GitLab CI/CD erproben möchte, bevor der Code umzieht, verbindet über ",[21,874,877],{"href":875,"rel":876},"https://docs.gitlab.com/ci/ci_cd_for_external_repos/github_integration/",[],"CI/CD für externe Repositorys"," ein GitHub-Repository mit GitLab. Pipelines laufen dann bei jedem Push und jedem Pull Request und melden den Status nach GitHub zurück. So lässt sich die umgestellte ",[196,880,242],{}," an echten Commits prüfen, während die maßgebliche Quelle noch in GitHub liegt.",[49,883,884,887,888,893],{},[53,885,886],{},"CI/CD-Status nach GitHub zurückmelden."," Über die ",[21,889,892],{"href":890,"rel":891},"https://docs.gitlab.com/integration/github/",[],"GitHub-Integration"," schickt GitLab Pipeline- und Commit-Status an GitHub. Wer noch nicht gewechselt hat, sieht grüne Haken und Build-Ergebnisse weiterhin in der gewohnten Oberfläche.",[49,895,896,899],{},[53,897,898],{},"Team für Team, Repository für Repository umziehen."," Weil der Importer projektweise arbeitet, kann zuerst ein Team seine Repositorys mitnehmen und sich einrichten. Die nächste Gruppe folgt, sobald die Unebenheiten beseitigt sind. Noch nicht migrierte Gruppen und Untergruppen zeigen so lange weiter auf GitHub.",[85,901,903],{"id":902},"github-actions-nach-gitlab-cicd-überführen","GitHub Actions nach GitLab CI/CD überführen",[12,905,906],{},"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:",[102,908,909,919],{},[105,910,911],{},[108,912,913,916],{},[111,914,915],{},"GitHub Actions",[111,917,918],{},"GitLab CI/CD",[118,920,921,932,940,947,958,976,995,1007,1017,1029,1039,1052],{},[108,922,923,928],{},[123,924,925],{},[196,926,927],{},".github/workflows/*.yml",[123,929,930],{},[196,931,242],{},[108,933,934,937],{},[123,935,936],{},"Workflow",[123,938,939],{},"Pipeline",[108,941,942,945],{},[123,943,944],{},"Job",[123,946,944],{},[108,948,949,952],{},[123,950,951],{},"Schritt in einem Job",[123,953,954,955],{},"Zeile in ",[196,956,957],{},"script:",[108,959,960,967],{},[123,961,962,963,966],{},"Ereignisauslöser (",[196,964,965],{},"on:",")",[123,968,969,972,973],{},[196,970,971],{},"rules:"," / ",[196,974,975],{},"workflow:",[108,977,978,986],{},[123,979,980,972,983],{},[196,981,982],{},"runs-on:",[196,984,985],{},"container:",[123,987,988,991,992],{},[196,989,990],{},"image:"," und Runner-",[196,993,994],{},"tags:",[108,996,997,1000],{},[123,998,999],{},"Actions Marketplace",[123,1001,1002],{},[21,1003,1006],{"href":1004,"rel":1005},"https://docs.gitlab.com/ci/components/",[],"CI/CD-Komponenten",[108,1008,1009,1012],{},[123,1010,1011],{},"Secrets",[123,1013,1014],{},[21,1015,256],{"href":254,"rel":1016},[],[108,1018,1019,1024],{},[123,1020,1021],{},[196,1022,1023],{},"strategy.matrix",[123,1025,1026],{},[196,1027,1028],{},"parallel.matrix",[108,1030,1031,1036],{},[123,1032,1033],{},[196,1034,1035],{},"actions/checkout",[123,1037,1038],{},"eingebaut (GitLab klont selbst)",[108,1040,1041,1046],{},[123,1042,1043],{},[196,1044,1045],{},"actions/cache",[123,1047,1048,1049],{},"Schlüsselwort ",[196,1050,1051],{},"cache:",[108,1053,1054,1059],{},[123,1055,1056],{},[196,1057,1058],{},"actions/upload-artifact",[123,1060,1048,1061],{},[196,1062,1063],{},"artifacts:",[12,1065,1066,1067,1070,1071,1074],{},"Ein wichtiger Unterschied: In GitLab ",[53,1068,1069],{},"laufen Stages nacheinander und Jobs innerhalb einer Stage parallel",". Mit ",[196,1072,1073],{},"needs:"," lässt sich daraus ein ausdrücklicher gerichteter azyklischer Graph (DAG) bauen.",[287,1076,1078],{"id":1077},"zügig-gitlab-duo-die-workflows-umwandeln-lassen","Zügig: GitLab Duo die Workflows umwandeln lassen",[12,1080,1081,1082,1087,1088,1093,1094,1096],{},"Die ",[21,1083,1086],{"href":1084,"rel":1085},"https://about.gitlab.com/de-de/gitlab-duo-agent-platform/",[],"GitLab Duo Agent Platform"," enthält einen ",[21,1089,1092],{"href":1090,"rel":1091},"https://docs.gitlab.com/user/duo_agent_platform/flows/foundational_flows/convert_to_gitlab_ci/",[],"Flow \"Convert to GitLab CI/CD\"",", der GitHub-Actions-Workflows in eine ",[196,1095,242],{}," übersetzt. Statt von Grund auf neu zu schreiben, prüft man dann einen Entwurf.",[12,1098,1099],{},"GitLab Duo hilft über die gesamte Migration hinweg, nicht nur beim Umwandeln:",[46,1101,1102,1108,1114,1120,1126,1136],{},[49,1103,1104,1107],{},[53,1105,1106],{},"Planung:"," je Repository einen Migrationsplan und eine Einschätzung der Komplexität aus den Workflow-Dateien erzeugen.",[49,1109,1110,1113],{},[53,1111,1112],{},"Umwandlung:"," Der Convert-Flow schreibt Actions-Workflows nach GitLab CI/CD um und erhält dabei Matrix-Builds, Job-Abhängigkeiten, Artefakte und bedingte Regeln.",[49,1115,1116,1119],{},[53,1117,1118],{},"Dokumentation:"," READMEs, Badges und Verweise aktualisieren (etwa \"Pull Request\" zu \"Merge Request\").",[49,1121,1122,1125],{},[53,1123,1124],{},"Prüfung:"," importierte Zahlen gegenprüfen und Fehlendes sichtbar machen.",[49,1127,1128,1131,1132,1135],{},[53,1129,1130],{},"Fehlersuche:"," Der ",[53,1133,1134],{},"Flow \"Fix CI/CD pipeline\""," analysiert einen fehlgeschlagenen Job, benennt die wahrscheinliche Ursache und bereitet Änderungsvorschläge vor.",[49,1137,1138,1141,1142,1144],{},[53,1139,1140],{},"Aufräumen:"," GitLab-eigene Optimierungen vorschlagen, etwa Caching, ",[196,1143,1073],{},"-DAGs und CI/CD-Komponenten.",[12,1146,1147,1152,1153,1158,1159,1161],{},[21,1148,1151],{"href":1149,"rel":1150},"https://docs.gitlab.com/user/gitlab_duo_chat/agentic_chat/",[],"GitLab Duo Agentic Chat"," zieht Kontext aus Issues, Merge Requests und Pipelines heran und beantwortet Fragen direkt in der Plattform. ",[21,1154,1157],{"href":1155,"rel":1156},"https://docs.gitlab.com/user/project/repository/code_suggestions/",[],"Duo Code Suggestions"," unterstützen beim Bearbeiten der ",[196,1160,242],{}," in der Web-IDE.",[12,1163,1164],{},"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:",[1166,1167,1168],"blockquote",{},[12,1169,1170,1171,32],{},"Convert this GitHub Actions workflow to GitLab CI/CD. Preserve matrix builds, job dependencies, artifacts, and conditional rules. Return a valid ",[196,1172,242],{},[12,1174,1175,1176,1181],{},"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 ",[21,1177,1180],{"href":1178,"rel":1179},"https://docs.gitlab.com/ci/yaml/lint/",[],"CI-Lint-Werkzeug"," von GitLab prüfen und die Ausgabe als Entwurf zur Durchsicht behandeln, nicht als fertigen Commit.",[287,1183,1185],{"id":1184},"von-hand-ein-beispiel-im-vergleich","Von Hand: ein Beispiel im Vergleich",[12,1187,1188],{},"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:",[623,1190,1194],{"className":1191,"code":1192,"language":1193,"meta":628,"style":628},"language-yaml shiki shiki-themes github-light","name: CI\non: [push, pull_request]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with: { node-version: '18' }\n      - run: npm install\n      - run: npm test\n      - run: npm run build\n","yaml",[196,1195,1196,1208,1227,1235,1242,1252,1259,1272,1283,1302,1314,1325],{"__ignoreMap":628},[632,1197,1198,1202,1205],{"class":634,"line":635},[632,1199,1201],{"class":1200},"shJU0","name",[632,1203,1204],{"class":673},": ",[632,1206,1207],{"class":646},"CI\n",[632,1209,1210,1213,1216,1219,1221,1224],{"class":634,"line":653},[632,1211,1212],{"class":642},"on",[632,1214,1215],{"class":673},": [",[632,1217,1218],{"class":646},"push",[632,1220,56],{"class":673},[632,1222,1223],{"class":646},"pull_request",[632,1225,1226],{"class":673},"]\n",[632,1228,1229,1232],{"class":634,"line":664},[632,1230,1231],{"class":1200},"jobs",[632,1233,1234],{"class":673},":\n",[632,1236,1237,1240],{"class":634,"line":682},[632,1238,1239],{"class":1200},"  build",[632,1241,1234],{"class":673},[632,1243,1244,1247,1249],{"class":634,"line":692},[632,1245,1246],{"class":1200},"    runs-on",[632,1248,1204],{"class":673},[632,1250,1251],{"class":646},"ubuntu-latest\n",[632,1253,1254,1257],{"class":634,"line":701},[632,1255,1256],{"class":1200},"    steps",[632,1258,1234],{"class":673},[632,1260,1261,1264,1267,1269],{"class":634,"line":707},[632,1262,1263],{"class":673},"      - ",[632,1265,1266],{"class":1200},"uses",[632,1268,1204],{"class":673},[632,1270,1271],{"class":646},"actions/checkout@v4\n",[632,1273,1274,1276,1278,1280],{"class":634,"line":713},[632,1275,1263],{"class":673},[632,1277,1266],{"class":1200},[632,1279,1204],{"class":673},[632,1281,1282],{"class":646},"actions/setup-node@v4\n",[632,1284,1285,1288,1291,1294,1296,1299],{"class":634,"line":719},[632,1286,1287],{"class":1200},"        with",[632,1289,1290],{"class":673},": { ",[632,1292,1293],{"class":1200},"node-version",[632,1295,1204],{"class":673},[632,1297,1298],{"class":646},"'18'",[632,1300,1301],{"class":673}," }\n",[632,1303,1304,1306,1309,1311],{"class":634,"line":725},[632,1305,1263],{"class":673},[632,1307,1308],{"class":1200},"run",[632,1310,1204],{"class":673},[632,1312,1313],{"class":646},"npm install\n",[632,1315,1316,1318,1320,1322],{"class":634,"line":731},[632,1317,1263],{"class":673},[632,1319,1308],{"class":1200},[632,1321,1204],{"class":673},[632,1323,1324],{"class":646},"npm test\n",[632,1326,1327,1329,1331,1333],{"class":634,"line":737},[632,1328,1263],{"class":673},[632,1330,1308],{"class":1200},[632,1332,1204],{"class":673},[632,1334,1335],{"class":646},"npm run build\n",[12,1337,1338,1339,1342,1343,1346,1347,1349],{},"Und das Gegenstück in GitLab CI/CD. Der Checkout entfällt (GitLab klont selbst), aus ",[196,1340,1341],{},"runs-on"," wird ",[196,1344,1345],{},"image",", und jeder Schritt wird zu einer Zeile in ",[196,1348,957],{},":",[623,1351,1353],{"className":1191,"code":1352,"language":1193,"meta":628,"style":628},"stages: [test, build]\n\n# GitLab-maintained SAST is one line away\n# a nice upgrade to add during migration.\ninclude:\n  - template: Jobs/SAST.gitlab-ci.yml\n\ntest:\n  stage: test\n  image: node:18\n  script:\n    - npm install\n    - npm test\n\nbuild:\n  stage: build\n  image: node:18\n  script:\n    - npm install\n    - npm run build\n  artifacts:\n    paths: [dist/]\n",[196,1354,1355,1372,1378,1384,1389,1396,1409,1413,1419,1429,1439,1446,1453,1459,1463,1469,1479,1488,1495,1502,1509,1517],{"__ignoreMap":628},[632,1356,1357,1360,1362,1365,1367,1370],{"class":634,"line":635},[632,1358,1359],{"class":1200},"stages",[632,1361,1215],{"class":673},[632,1363,1364],{"class":646},"test",[632,1366,56],{"class":673},[632,1368,1369],{"class":646},"build",[632,1371,1226],{"class":673},[632,1373,1374],{"class":634,"line":653},[632,1375,1377],{"emptyLinePlaceholder":1376},true,"\n",[632,1379,1380],{"class":634,"line":664},[632,1381,1383],{"class":1382},"sAwPA","# GitLab-maintained SAST is one line away\n",[632,1385,1386],{"class":634,"line":682},[632,1387,1388],{"class":1382},"# a nice upgrade to add during migration.\n",[632,1390,1391,1394],{"class":634,"line":692},[632,1392,1393],{"class":1200},"include",[632,1395,1234],{"class":673},[632,1397,1398,1401,1404,1406],{"class":634,"line":701},[632,1399,1400],{"class":673},"  - ",[632,1402,1403],{"class":1200},"template",[632,1405,1204],{"class":673},[632,1407,1408],{"class":646},"Jobs/SAST.gitlab-ci.yml\n",[632,1410,1411],{"class":634,"line":707},[632,1412,1377],{"emptyLinePlaceholder":1376},[632,1414,1415,1417],{"class":634,"line":713},[632,1416,1364],{"class":1200},[632,1418,1234],{"class":673},[632,1420,1421,1424,1426],{"class":634,"line":719},[632,1422,1423],{"class":1200},"  stage",[632,1425,1204],{"class":673},[632,1427,1428],{"class":646},"test\n",[632,1430,1431,1434,1436],{"class":634,"line":725},[632,1432,1433],{"class":1200},"  image",[632,1435,1204],{"class":673},[632,1437,1438],{"class":646},"node:18\n",[632,1440,1441,1444],{"class":634,"line":731},[632,1442,1443],{"class":1200},"  script",[632,1445,1234],{"class":673},[632,1447,1448,1451],{"class":634,"line":737},[632,1449,1450],{"class":673},"    - ",[632,1452,1313],{"class":646},[632,1454,1455,1457],{"class":634,"line":743},[632,1456,1450],{"class":673},[632,1458,1324],{"class":646},[632,1460,1461],{"class":634,"line":749},[632,1462,1377],{"emptyLinePlaceholder":1376},[632,1464,1465,1467],{"class":634,"line":755},[632,1466,1369],{"class":1200},[632,1468,1234],{"class":673},[632,1470,1472,1474,1476],{"class":634,"line":1471},16,[632,1473,1423],{"class":1200},[632,1475,1204],{"class":673},[632,1477,1478],{"class":646},"build\n",[632,1480,1482,1484,1486],{"class":634,"line":1481},17,[632,1483,1433],{"class":1200},[632,1485,1204],{"class":673},[632,1487,1438],{"class":646},[632,1489,1491,1493],{"class":634,"line":1490},18,[632,1492,1443],{"class":1200},[632,1494,1234],{"class":673},[632,1496,1498,1500],{"class":634,"line":1497},19,[632,1499,1450],{"class":673},[632,1501,1313],{"class":646},[632,1503,1505,1507],{"class":634,"line":1504},20,[632,1506,1450],{"class":673},[632,1508,1335],{"class":646},[632,1510,1512,1515],{"class":634,"line":1511},21,[632,1513,1514],{"class":1200},"  artifacts",[632,1516,1234],{"class":673},[632,1518,1520,1523,1525,1528],{"class":634,"line":1519},22,[632,1521,1522],{"class":1200},"    paths",[632,1524,1215],{"class":673},[632,1526,1527],{"class":646},"dist/",[632,1529,1226],{"class":673},[12,1531,1532,1533,1342,1535,1349],{},"Matrix-Builds übertragen sich ebenso direkt, aus ",[196,1534,1023],{},[196,1536,1028],{},[623,1538,1540],{"className":1191,"code":1539,"language":1193,"meta":628,"style":628},"test:\n  image: node:${NODE_VERSION}\n  parallel:\n    matrix:\n      - NODE_VERSION: ['16', '18', '20']\n  script:\n    - npm install\n    - npm test\n",[196,1541,1542,1548,1557,1564,1571,1594,1600,1606],{"__ignoreMap":628},[632,1543,1544,1546],{"class":634,"line":635},[632,1545,1364],{"class":1200},[632,1547,1234],{"class":673},[632,1549,1550,1552,1554],{"class":634,"line":653},[632,1551,1433],{"class":1200},[632,1553,1204],{"class":673},[632,1555,1556],{"class":646},"node:${NODE_VERSION}\n",[632,1558,1559,1562],{"class":634,"line":664},[632,1560,1561],{"class":1200},"  parallel",[632,1563,1234],{"class":673},[632,1565,1566,1569],{"class":634,"line":682},[632,1567,1568],{"class":1200},"    matrix",[632,1570,1234],{"class":673},[632,1572,1573,1575,1578,1580,1583,1585,1587,1589,1592],{"class":634,"line":692},[632,1574,1263],{"class":673},[632,1576,1577],{"class":1200},"NODE_VERSION",[632,1579,1215],{"class":673},[632,1581,1582],{"class":646},"'16'",[632,1584,56],{"class":673},[632,1586,1298],{"class":646},[632,1588,56],{"class":673},[632,1590,1591],{"class":646},"'20'",[632,1593,1226],{"class":673},[632,1595,1596,1598],{"class":634,"line":701},[632,1597,1443],{"class":1200},[632,1599,1234],{"class":673},[632,1601,1602,1604],{"class":634,"line":707},[632,1603,1450],{"class":673},[632,1605,1313],{"class":646},[632,1607,1608,1610],{"class":634,"line":713},[632,1609,1450],{"class":673},[632,1611,1324],{"class":646},[12,1613,1614,1615,1617],{},"Und bedingte Deployments bilden sich über ",[196,1616,971],{}," ab:",[623,1619,1621],{"className":1191,"code":1620,"language":1193,"meta":628,"style":628},"deploy:\n  stage: deploy\n  script: ./deploy.sh\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\"\n",[196,1622,1623,1630,1639,1648,1655],{"__ignoreMap":628},[632,1624,1625,1628],{"class":634,"line":635},[632,1626,1627],{"class":1200},"deploy",[632,1629,1234],{"class":673},[632,1631,1632,1634,1636],{"class":634,"line":653},[632,1633,1423],{"class":1200},[632,1635,1204],{"class":673},[632,1637,1638],{"class":646},"deploy\n",[632,1640,1641,1643,1645],{"class":634,"line":664},[632,1642,1443],{"class":1200},[632,1644,1204],{"class":673},[632,1646,1647],{"class":646},"./deploy.sh\n",[632,1649,1650,1653],{"class":634,"line":682},[632,1651,1652],{"class":1200},"  rules",[632,1654,1234],{"class":673},[632,1656,1657,1659,1662,1664],{"class":634,"line":692},[632,1658,1450],{"class":673},[632,1660,1661],{"class":1200},"if",[632,1663,1204],{"class":673},[632,1665,1666],{"class":646},"$CI_COMMIT_BRANCH == \"main\"\n",[12,1668,1669,1670,1672,1673,32],{},"Sobald die ",[196,1671,242],{}," committet ist, startet GitLab die Pipeline sofort. Mehr dazu steht in der ",[21,1674,1677],{"href":1675,"rel":1676},"https://docs.gitlab.com/ci/",[],"Dokumentation zu GitLab CI/CD",[85,1679,1681],{"id":1680},"aus-welchen-anderen-plattformen-kann-gitlab-importieren","Aus welchen anderen Plattformen kann GitLab importieren?",[12,1683,1684],{},"GitHub ist nicht die einzige Quelle. Der Importer von GitLab unterstützt die Migration aus mehreren weiteren Plattformen mit einem Klick:",[46,1686,1687,1694,1701,1708,1715,1722,1729],{},[49,1688,1689],{},[21,1690,1693],{"href":1691,"rel":1692},"https://docs.gitlab.com/user/project/import/bitbucket/",[],"Bitbucket Cloud",[49,1695,1696],{},[21,1697,1700],{"href":1698,"rel":1699},"https://docs.gitlab.com/user/project/import/bitbucket_server/",[],"Bitbucket Server (Stash)",[49,1702,1703],{},[21,1704,1707],{"href":1705,"rel":1706},"https://docs.gitlab.com/user/project/import/fogbugz/",[],"FogBugz",[49,1709,1710],{},[21,1711,1714],{"href":1712,"rel":1713},"https://docs.gitlab.com/user/import/gitea/",[],"Gitea",[49,1716,1717],{},[21,1718,1721],{"href":1719,"rel":1720},"https://docs.gitlab.com/user/project/import/repo_by_url/",[],"Repository per URL",[49,1723,1724],{},[21,1725,1728],{"href":1726,"rel":1727},"https://docs.gitlab.com/user/project/import/manifest/",[],"Manifest-Datei (AOSP)",[49,1730,1731],{},[21,1732,1735],{"href":1733,"rel":1734},"https://docs.gitlab.com/user/project/import/jira/",[],"Jira (nur Issues)",[12,1737,1738],{},"Zu diesen Migrationen gibt es außerdem Dokumentation:",[46,1740,1741,1748,1755,1762,1769],{},[49,1742,1743],{},[21,1744,1747],{"href":1745,"rel":1746},"https://docs.gitlab.com/user/import/#import-from-subversion",[],"SVN",[49,1749,1750],{},[21,1751,1754],{"href":1752,"rel":1753},"https://docs.gitlab.com/user/project/import/clearcase/",[],"ClearCase",[49,1756,1757],{},[21,1758,1761],{"href":1759,"rel":1760},"https://docs.gitlab.com/user/project/import/cvs/",[],"CVS",[49,1763,1764],{},[21,1765,1768],{"href":1766,"rel":1767},"https://docs.gitlab.com/user/project/import/perforce/",[],"Perforce",[49,1770,1771],{},[21,1772,1775],{"href":1773,"rel":1774},"https://docs.gitlab.com/user/project/import/tfvc/",[],"TFVC",[1777,1778],"hr",{},[12,1780,1781],{},"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:",[46,1783,1784,1790,1796,1803,1808],{},[49,1785,1786],{},[21,1787,1789],{"href":1084,"rel":1788},[],"Kostenlose Testversion der GitLab Duo Agent Platform",[49,1791,1792],{},[21,1793,1795],{"href":94,"rel":1794},[],"Dokumentation zur Projektmigration von GitHub nach GitLab",[49,1797,1798],{},[21,1799,1802],{"href":1800,"rel":1801},"https://docs.gitlab.com/user/project/import/#available-project-importers",[],"Verfügbare Projekt-Importer",[49,1804,1805],{},[21,1806,1086],{"href":1084,"rel":1807},[],[49,1809,1810],{},[21,1811,1677],{"href":1675,"rel":1812},[],[1814,1815,1816],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":628,"searchDepth":653,"depth":653,"links":1818},[1819,1822,1825,1831,1832,1836],{"id":87,"depth":653,"text":88,"children":1820},[1821],{"id":289,"depth":664,"text":290},{"id":350,"depth":653,"text":351,"children":1823},[1824],{"id":442,"depth":664,"text":443},{"id":460,"depth":653,"text":461,"children":1826},[1827,1828,1829,1830],{"id":467,"depth":664,"text":468},{"id":572,"depth":664,"text":573},{"id":612,"depth":664,"text":613},{"id":798,"depth":664,"text":799},{"id":839,"depth":653,"text":840},{"id":902,"depth":653,"text":903,"children":1833},[1834,1835],{"id":1077,"depth":664,"text":1078},{"id":1184,"depth":664,"text":1185},{"id":1680,"depth":653,"text":1681},"devsecops","2026-08-19","Wie sich ein Umzug von GitHub zu GitLab mit dem Projekt-Importer und GitLab Duo bewerkstelligen lässt.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773856365/gsx2c0vqlswox3ldmq88.jpg",{},"/de-de/blog/github-to-gitlab-migration-made-easy",{"ogTitle":5,"ogImage":1843,"ogDescription":1839,"ogSiteName":1847,"noIndex":1842,"ogType":1848,"ogUrl":1849,"title":5,"canonicalUrls":1849,"description":1839},"https://about.gitlab.com","article","https://about.gitlab.com/de-de/blog/github-to-gitlab-migration-made-easy","github-to-gitlab-migration-made-easy","de-de/blog/github-to-gitlab-migration-made-easy",[1853,1854,25,1855,1856],"CI/CD","tutorial","DevSecOps platform","AI","BlogPost","Q0am7WEFf7mBap9O_5xaYPW4xP6sNPgPq2DuyJhwRt0",{"logo":1860,"freeTrial":1865,"sales":1870,"login":1875,"items":1880,"search":2199,"minimal":2234,"duo":2252,"switchNav":2261,"pricingDeployment":2272},{"config":1861},{"href":1862,"dataGaName":1863,"dataGaLocation":1864},"/de-de/","gitlab logo","header",{"text":1866,"config":1867},"Kostenlos testen",{"href":1868,"dataGaName":1869,"dataGaLocation":1864},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1871,"config":1872},"Demo anfordern",{"href":1873,"dataGaName":1874,"dataGaLocation":1864},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1876,"config":1877},"Anmelden",{"href":1878,"dataGaName":1879,"dataGaLocation":1864},"https://gitlab.com/users/sign_in/","sign in",[1881,1956,2044,2049,2124,2177],{"text":1882,"left":1376,"config":1883,"menu":1885},"Plattform",{"dataNavLevelOne":1884},"platform",{"type":1886,"link":1887,"columns":1891,"feature":1945},"lists",{"text":1888,"config":1889},"Die Plattform erkunden",{"href":1890,"dataGaName":1884,"dataGaLocation":1864},"/de-de/platform/",[1892,1909,1927],{"title":1893,"items":1894},"Ausführung und Workflows",[1895,1899,1904],{"text":1853,"config":1896},{"href":1897,"dataGaLocation":1864,"dataGaName":1898},"/de-de/solutions/continuous-integration/","ci/cd",{"text":1900,"config":1901},"Quellcodeverwaltung",{"href":1902,"dataGaLocation":1864,"dataGaName":1903},"/de-de/solutions/source-code-management/","source code management",{"text":1905,"config":1906},"Agile Delivery",{"href":1907,"dataGaLocation":1864,"dataGaName":1908},"/de-de/solutions/agile-delivery/","agile delivery",{"title":1910,"items":1911},"Sicherheit und Governance",[1912,1917,1922],{"text":1913,"config":1914},"Anwendungssicherheitstests",{"href":1915,"dataGaLocation":1864,"dataGaName":1916},"/de-de/solutions/application-security-testing/","application security testing",{"text":1918,"config":1919},"Governance und Compliance",{"href":1920,"dataGaLocation":1864,"dataGaName":1921},"/de-de/solutions/software-compliance/","governance and compliance",{"text":1923,"config":1924},"Lieferkettensicherheit",{"href":1925,"dataGaLocation":1864,"dataGaName":1926},"/de-de/solutions/supply-chain/","supply chain security",{"title":1928,"items":1929},"Kontext und KI",[1930,1935,1940],{"text":1931,"config":1932},"Agentische Orchestrierung",{"href":1933,"dataGaLocation":1864,"dataGaName":1934},"/de-de/gitlab-duo-agent-platform/","agentic orchestration",{"text":1936,"config":1937},"Kontextgraph",{"href":1938,"dataGaLocation":1864,"dataGaName":1939},"/de-de/gitlab-orbit/","context graph",{"text":1941,"config":1942},"Sichtbarkeit und Messung",{"href":1943,"dataGaLocation":1864,"dataGaName":1944},"/de-de/solutions/visibility-measurement/","visibility and measurement",{"config":1946,"title":1949,"text":1950,"link":1951},{"background":1947,"textColor":1948},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Warum GitLab","Eine Plattform für Schnelligkeit und Kontrolle im gesamten Software-Lebenszyklus.",{"text":1952,"config":1953},"Mehr erfahren",{"href":1954,"dataGaName":1955,"dataGaLocation":1864},"/de-de/why-gitlab/","why gitlab",{"text":1957,"left":1376,"config":1958,"menu":1960},"Lösungen",{"dataNavLevelOne":1959},"solutions",{"type":1886,"link":1961,"columns":1965,"feature":2035},{"text":1962,"config":1963},"Alle Lösungen anzeigen",{"href":1964,"dataGaName":1959,"dataGaLocation":1864},"/de-de/solutions/",[1966,1984,2002],{"title":1967,"items":1968},"Ergebnisse",[1969,1974,1979],{"text":1970,"config":1971},"DevOps-Modernisierung",{"href":1972,"dataGaLocation":1864,"dataGaName":1973},"/de-de/assessments/devops-modernization-assessment/","devops modernization",{"text":1975,"config":1976},"Sicherheitsmodernisierung",{"href":1977,"dataGaLocation":1864,"dataGaName":1978},"/de-de/assessments/security-modernization-assessment/","security modernization",{"text":1980,"config":1981},"KI-Modernisierung",{"href":1982,"dataGaLocation":1864,"dataGaName":1983},"/de-de/assessments/ai-modernization-assessment/","ai modernization",{"title":1985,"items":1986},"Nach Größe",[1987,1992,1997],{"text":1988,"config":1989},"Große Unternehmen",{"href":1990,"dataGaLocation":1864,"dataGaName":1991},"/de-de/enterprise/","enterprise",{"text":1993,"config":1994},"Kleine Unternehmen",{"href":1995,"dataGaLocation":1864,"dataGaName":1996},"/de-de/small-business/","small business",{"text":1998,"config":1999},"Start-ups",{"href":2000,"dataGaLocation":1864,"dataGaName":2001},"/de-de/solutions/startups/","startups",{"title":2003,"items":2004},"Branchen",[2005,2010,2015,2020,2025,2030],{"text":2006,"config":2007},"Finanzdienstleistungen",{"href":2008,"dataGaLocation":1864,"dataGaName":2009},"/de-de/solutions/finance/","financial services",{"text":2011,"config":2012},"Öffentlicher Sektor",{"href":2013,"dataGaLocation":1864,"dataGaName":2014},"/de-de/solutions/public-sector/","public sector",{"text":2016,"config":2017},"Telekommunikation",{"href":2018,"dataGaLocation":1864,"dataGaName":2019},"/de-de/solutions/telecommunications/","telecommunications",{"text":2021,"config":2022},"Automobilindustrie",{"href":2023,"dataGaLocation":1864,"dataGaName":2024},"/de-de/solutions/automotive/","automotive",{"text":2026,"config":2027},"Bildungswesen",{"href":2028,"dataGaLocation":1864,"dataGaName":2029},"/de-de/solutions/education/","education",{"text":2031,"config":2032},"Luft- und Raumfahrt",{"href":2033,"dataGaLocation":1864,"dataGaName":2034},"/de-de/solutions/aerospace/","aerospace",{"config":2036,"title":2037,"text":2038,"link":2039},{"background":1947,"textColor":1948},"GitLab Transcend","Mehr über unsere neusten Innovationen, die bei der letzten Transcend vorgestellt wurden.",{"text":2040,"config":2041},"Blogbeitrag lesen",{"href":2042,"dataGaName":2043,"dataGaLocation":1864},"/de-de/blog/gitlab-transcend-announcements/","gitlab transcend",{"text":2045,"config":2046},"Preise",{"href":2047,"dataGaName":2048,"dataGaLocation":1864,"dataNavLevelOne":2048},"/de-de/pricing/","pricing",{"text":2050,"config":2051,"menu":2053},"Ressourcen",{"dataNavLevelOne":2052},"resources",{"type":1886,"link":2054,"columns":2058,"feature":2115},{"text":2055,"config":2056},"Alle Ressourcen anzeigen",{"href":2057,"dataGaName":2052,"dataGaLocation":1864},"/de-de/resources/",[2059,2087],{"title":2060,"items":2061},"Entdecken",[2062,2067,2072,2077,2082],{"text":2063,"config":2064},"Dokumentation",{"href":2065,"dataGaName":2066,"dataGaLocation":1864},"https://docs.gitlab.com/","docs",{"text":2068,"config":2069},"GitLab University",{"href":2070,"dataGaName":2071,"dataGaLocation":1864},"https://university.gitlab.com/","university",{"text":2073,"config":2074},"Demo-Reihe",{"href":2075,"dataGaName":2076,"dataGaLocation":1864},"/de-de/gitlab-technical-demo-series/","demo series",{"text":2078,"config":2079},"Demo-Hub",{"href":2080,"dataGaName":2081,"dataGaLocation":1864},"/de-de/demo-hub/","demo hub",{"text":2083,"config":2084},"Dienste",{"href":2085,"dataGaName":2086,"dataGaLocation":1864},"/de-de/services/","services",{"title":2088,"items":2089},"Vernetzen",[2090,2095,2100,2105,2110],{"text":2091,"config":2092},"Blog",{"href":2093,"dataGaName":2094,"dataGaLocation":1864},"/de-de/blog/","blog",{"text":2096,"config":2097},"Community",{"href":2098,"dataGaName":2099,"dataGaLocation":1864},"/community/","community",{"text":2101,"config":2102},"Kunden",{"href":2103,"dataGaName":2104,"dataGaLocation":1864},"/de-de/customers/","customers",{"text":2106,"config":2107},"Partner",{"href":2108,"dataGaName":2109,"dataGaLocation":1864},"/de-de/partners/","partners",{"text":2111,"config":2112},"Veranstaltungen",{"href":2113,"dataGaName":2114,"dataGaLocation":1864},"/events/","events",{"config":2116,"title":2117,"text":2118,"link":2119},{"background":1947,"textColor":1948},"Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":2120,"config":2121},"Aktuelle Nachrichten",{"href":2122,"dataGaName":2123,"dataGaLocation":1864},"/de-de/whats-new/","whats new",{"text":2125,"config":2126,"menu":2128},"Unternehmen",{"dataNavLevelOne":2127},"company",{"type":1886,"columns":2129},[2130],{"items":2131},[2132,2137,2142,2147,2152,2157,2162,2167,2172],{"text":2133,"config":2134},"Über",{"href":2135,"dataGaName":2136,"dataGaLocation":1864},"/de-de/company/","about",{"text":2138,"config":2139,"footerGa":2141},"Karriere",{"href":2140,"dataGaName":1231,"dataGaLocation":1864},"/jobs/",{"dataGaName":1231},{"text":2143,"config":2144},"Presse",{"href":2145,"dataGaName":2146,"dataGaLocation":1864},"/press/","press",{"text":2148,"config":2149},"Handbuch",{"href":2150,"dataGaName":2151,"dataGaLocation":1864},"https://handbook.gitlab.com/","handbook",{"text":2153,"config":2154},"Geschäftsführung",{"href":2155,"dataGaName":2156,"dataGaLocation":1864},"/company/team/e-group/","leadership",{"text":2158,"config":2159},"Investor Relations",{"href":2160,"dataGaName":2161,"dataGaLocation":1864},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2163,"config":2164},"Trust Center",{"href":2165,"dataGaName":2166,"dataGaLocation":1864},"/de-de/security/","trust center",{"text":2168,"config":2169},"AI Transparency Center",{"href":2170,"dataGaName":2171,"dataGaLocation":1864},"/de-de/ai-transparency-center/","ai transparency center",{"text":2173,"config":2174},"Newsletter",{"href":2175,"dataGaName":2176,"dataGaLocation":1864},"/company/contact/#contact-forms","newsletter",{"text":2178,"config":2179,"menu":2180},"Kontakt",{"dataNavLevelOne":2127},{"type":1886,"columns":2181},[2182],{"items":2183},[2184,2189,2194],{"text":2185,"config":2186},"Vertrieb kontaktieren",{"href":2187,"dataGaName":2188,"dataGaLocation":1864},"/de-de/sales/","talk to sales",{"text":2190,"config":2191},"Support-Portal",{"href":2192,"dataGaName":2193,"dataGaLocation":1864},"https://support.gitlab.com/hc/en-us","support portal",{"text":2195,"config":2196},"Kundenportal",{"href":2197,"dataGaName":2198,"dataGaLocation":1864},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2200,"login":2201,"suggestions":2208},"Schließen",{"text":2202,"link":2203},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":2204,"config":2205},"gitlab.com",{"href":1878,"dataGaName":2206,"dataGaLocation":2207},"search login","search",{"text":2209,"default":2210},"Vorschläge",[2211,2213,2218,2220,2225,2230],{"text":1086,"config":2212},{"href":1933,"dataGaName":1086,"dataGaLocation":2207},{"text":2214,"config":2215},"Codevorschläge (KI)",{"href":2216,"dataGaName":2217,"dataGaLocation":2207},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1853,"config":2219},{"href":1897,"dataGaName":1853,"dataGaLocation":2207},{"text":2221,"config":2222},"GitLab auf AWS",{"href":2223,"dataGaName":2224,"dataGaLocation":2207},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":2226,"config":2227},"GitLab auf Google Cloud",{"href":2228,"dataGaName":2229,"dataGaLocation":2207},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":2231,"config":2232},"Warum GitLab?",{"href":1954,"dataGaName":2233,"dataGaLocation":2207},"Why GitLab?",{"freeTrial":2235,"mobileIcon":2239,"desktopIcon":2244,"secondaryButton":2247},{"text":1866,"config":2236},{"href":2237,"dataGaName":1869,"dataGaLocation":2238},"https://gitlab.com/-/trials/new/","nav",{"altText":2240,"config":2241},"GitLab-Symbol",{"src":2242,"dataGaName":2243,"dataGaLocation":2238},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2240,"config":2245},{"src":2246,"dataGaName":2243,"dataGaLocation":2238},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2248,"config":2249},"Erste Schritte",{"href":2250,"dataGaName":2251,"dataGaLocation":2238},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":2253,"mobileIcon":2257,"desktopIcon":2259},{"text":2254,"config":2255},"Mehr über GitLab Duo erfahren",{"href":1933,"dataGaName":2256,"dataGaLocation":2238},"gitlab duo",{"altText":2240,"config":2258},{"src":2242,"dataGaName":2243,"dataGaLocation":2238},{"altText":2240,"config":2260},{"src":2246,"dataGaName":2243,"dataGaLocation":2238},{"button":2262,"mobileIcon":2267,"desktopIcon":2269},{"text":2263,"config":2264},"/Option",{"href":2265,"dataGaName":2266,"dataGaLocation":2238},"#contact","switch",{"altText":2240,"config":2268},{"src":2242,"dataGaName":2243,"dataGaLocation":2238},{"altText":2240,"config":2270},{"src":2271,"dataGaName":2243,"dataGaLocation":2238},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2273,"mobileIcon":2278,"desktopIcon":2280},{"text":2274,"config":2275},"Zurück zur Preisübersicht",{"href":2047,"dataGaName":2276,"dataGaLocation":2238,"icon":2277},"back to pricing","GoBack",{"altText":2240,"config":2279},{"src":2242,"dataGaName":2243,"dataGaLocation":2238},{"altText":2240,"config":2281},{"src":2246,"dataGaName":2243,"dataGaLocation":2238},{"title":2283,"button":2284,"config":2287},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1952,"config":2285},{"href":1938,"dataGaName":2286,"dataGaLocation":1864},"orbit",{"layout":2288,"disabled":1842},"release",{"data":2290},{"text":2291,"source":2292,"edit":2298,"contribute":2303,"config":2308,"items":2313,"minimal":2531},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":2293,"config":2294},"Quelltext der Seite anzeigen",{"href":2295,"dataGaName":2296,"dataGaLocation":2297},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2299,"config":2300},"Diese Seite bearbeiten",{"href":2301,"dataGaName":2302,"dataGaLocation":2297},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2304,"config":2305},"Beteilige dich",{"href":2306,"dataGaName":2307,"dataGaLocation":2297},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2309,"facebook":2310,"youtube":2311,"linkedin":2312},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2314,2358,2412,2456,2498],{"title":2045,"links":2315,"subMenu":2330},[2316,2320,2325],{"text":2317,"config":2318},"Tarife anzeigen",{"href":2047,"dataGaName":2319,"dataGaLocation":2297},"view plans",{"text":2321,"config":2322},"Vorteile von Premium",{"href":2323,"dataGaName":2324,"dataGaLocation":2297},"/de-de/pricing/premium/","why premium",{"text":2326,"config":2327},"Vorteile von Ultimate",{"href":2328,"dataGaName":2329,"dataGaLocation":2297},"/de-de/pricing/ultimate/","why ultimate",[2331],{"title":2178,"links":2332},[2333,2335,2337,2339,2343,2348,2353],{"text":2185,"config":2334},{"href":2187,"dataGaName":1874,"dataGaLocation":2297},{"text":2190,"config":2336},{"href":2192,"dataGaName":2193,"dataGaLocation":2297},{"text":2195,"config":2338},{"href":2197,"dataGaName":2198,"dataGaLocation":2297},{"text":116,"config":2340},{"href":2341,"dataGaName":2342,"dataGaLocation":2297},"https://status.gitlab.com/","status",{"text":2344,"config":2345},"Nutzungsbedingungen",{"href":2346,"dataGaName":2347,"dataGaLocation":2297},"/terms/","terms of use",{"text":2349,"config":2350},"Datenschutzerklärung",{"href":2351,"dataGaName":2352,"dataGaLocation":2297},"/de-de/privacy/","privacy statement",{"text":2354,"config":2355},"Cookie-Einstellungen",{"dataGaName":2356,"dataGaLocation":2297,"id":2357,"isOneTrustButton":1376},"cookie preferences","ot-sdk-btn",{"title":1882,"links":2359,"subMenu":2371},[2360,2363,2365,2367,2369],{"text":2361,"config":2362},"Plattform entdecken",{"href":1890,"dataGaName":1884,"dataGaLocation":2297},{"text":1931,"config":2364},{"href":1933,"dataGaName":1934,"dataGaLocation":2297},{"text":1853,"config":2366},{"href":1897,"dataGaName":1898,"dataGaLocation":2297},{"text":1936,"config":2368},{"href":1938,"dataGaName":1939,"dataGaLocation":2297},{"text":1949,"config":2370},{"href":1954,"dataGaName":1955,"dataGaLocation":2297},[2372],{"title":2373,"links":2374},"Themen",[2375,2379,2384,2389,2394,2397,2402,2407],{"text":1853,"config":2376},{"href":2377,"dataGaName":2378,"dataGaLocation":2297},"/de-de/topics/ci-cd/","cicd",{"text":2380,"config":2381},"GitOps",{"href":2382,"dataGaName":2383,"dataGaLocation":2297},"/de-de/topics/gitops/","gitops",{"text":2385,"config":2386},"DevOps",{"href":2387,"dataGaName":2388,"dataGaLocation":2297},"/de-de/topics/devops/","devops",{"text":2390,"config":2391},"Versionskontrolle",{"href":2392,"dataGaName":2393,"dataGaLocation":2297},"/de-de/topics/version-control/","version control",{"text":25,"config":2395},{"href":2396,"dataGaName":1837,"dataGaLocation":2297},"/de-de/topics/devsecops/",{"text":2398,"config":2399},"Cloud-nativ",{"href":2400,"dataGaName":2401,"dataGaLocation":2297},"/de-de/topics/cloud-native/","cloud native",{"text":2403,"config":2404},"KI für das Programmieren",{"href":2405,"dataGaName":2406,"dataGaLocation":2297},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":2408,"config":2409},"Agentische KI",{"href":2410,"dataGaName":2411,"dataGaLocation":2297},"/de-de/topics/agentic-ai/","agentic ai",{"title":1957,"links":2413},[2414,2416,2418,2420,2422,2424,2426,2428,2430,2432,2435,2438,2440,2443,2447,2452],{"text":1970,"config":2415},{"href":1972,"dataGaName":1973,"dataGaLocation":2297},{"text":1975,"config":2417},{"href":1977,"dataGaName":1978,"dataGaLocation":2297},{"text":1980,"config":2419},{"href":1982,"dataGaName":1983,"dataGaLocation":2297},{"text":2006,"config":2421},{"href":2008,"dataGaName":2009,"dataGaLocation":2297},{"text":2011,"config":2423},{"href":2013,"dataGaName":2014,"dataGaLocation":2297},{"text":2016,"config":2425},{"href":2018,"dataGaName":2019,"dataGaLocation":2297},{"text":2021,"config":2427},{"href":2023,"dataGaName":2024,"dataGaLocation":2297},{"text":2026,"config":2429},{"href":2028,"dataGaName":2029,"dataGaLocation":2297},{"text":2031,"config":2431},{"href":2033,"dataGaName":2034,"dataGaLocation":2297},{"text":2433,"config":2434},"Enterprise",{"href":1990,"dataGaName":1991,"dataGaLocation":2297},{"text":2436,"config":2437},"Kleinunternehmen",{"href":1995,"dataGaName":1996,"dataGaLocation":2297},{"text":1998,"config":2439},{"href":2000,"dataGaName":2001,"dataGaLocation":2297},{"text":2380,"config":2441},{"href":2442,"dataGaName":2383,"dataGaLocation":2297},"/de-de/solutions/gitops/",{"text":2444,"config":2445},"Analyse der Softwarezusammensetzung (SCA)",{"href":1925,"dataGaName":2446,"dataGaLocation":2297},"software composition analysis",{"text":2448,"config":2449},"Wertstrommanagement",{"href":2450,"dataGaName":2451,"dataGaLocation":2297},"/de-de/solutions/value-stream-management/","value stream management",{"text":2453,"config":2454},"Alle Lösungen",{"href":1964,"dataGaName":2455,"dataGaLocation":2297},"all solutions",{"title":2050,"links":2457},[2458,2463,2468,2470,2472,2474,2476,2478,2480,2482,2485,2487,2489,2491,2494],{"text":2459,"config":2460},"Installieren",{"href":2461,"dataGaName":2462,"dataGaLocation":2297},"/de-de/install/","install",{"text":2464,"config":2465},"Kurzanleitungen",{"href":2466,"dataGaName":2467,"dataGaLocation":2297},"/de-de/get-started/","quick setup checklists",{"text":2063,"config":2469},{"href":2065,"dataGaName":2066,"dataGaLocation":2297},{"text":2068,"config":2471},{"href":2070,"dataGaName":2071,"dataGaLocation":2297},{"text":2073,"config":2473},{"href":2075,"dataGaName":2076,"dataGaLocation":2297},{"text":2078,"config":2475},{"href":2080,"dataGaName":2081,"dataGaLocation":2297},{"text":2083,"config":2477},{"href":2085,"dataGaName":2086,"dataGaLocation":2297},{"text":2091,"config":2479},{"href":2093,"dataGaName":2094,"dataGaLocation":2297},{"text":2096,"config":2481},{"href":2098,"dataGaName":2099,"dataGaLocation":2297},{"text":2483,"config":2484},"Kund(inn)en",{"href":2103,"dataGaName":2104,"dataGaLocation":2297},{"text":2106,"config":2486},{"href":2108,"dataGaName":2109,"dataGaLocation":2297},{"text":2111,"config":2488},{"href":2113,"dataGaName":2114,"dataGaLocation":2297},{"text":2173,"config":2490},{"href":2175,"dataGaName":2176,"dataGaLocation":2297},{"text":2492,"config":2493},"Neuerungen",{"href":2122,"dataGaName":2123,"dataGaLocation":2297},{"text":2495,"config":2496},"Alle Ressourcen",{"href":2057,"dataGaName":2497,"dataGaLocation":2297},"all resources",{"title":2125,"links":2499},[2500,2502,2504,2506,2508,2510,2512,2514,2516,2521,2526],{"text":2133,"config":2501},{"href":2135,"dataGaName":2127,"dataGaLocation":2297},{"text":2138,"config":2503},{"href":2140,"dataGaName":1231,"dataGaLocation":2297},{"text":2143,"config":2505},{"href":2145,"dataGaName":2146,"dataGaLocation":2297},{"text":2148,"config":2507},{"href":2150,"dataGaName":2151,"dataGaLocation":2297},{"text":2153,"config":2509},{"href":2155,"dataGaName":2156,"dataGaLocation":2297},{"text":2158,"config":2511},{"href":2160,"dataGaName":2161,"dataGaLocation":2297},{"text":2163,"config":2513},{"href":2165,"dataGaName":2166,"dataGaLocation":2297},{"text":2168,"config":2515},{"href":2170,"dataGaName":2171,"dataGaLocation":2297},{"text":2517,"config":2518},"Nachhaltigkeit",{"href":2519,"dataGaName":2520,"dataGaLocation":2297},"/sustainability/","Sustainability",{"text":2522,"config":2523},"Vielfalt, Inklusion und Zugehörigkeit",{"href":2524,"dataGaName":2525,"dataGaLocation":2297},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2527,"config":2528},"Transparenzerklärung zu moderner Sklaverei",{"href":2529,"dataGaName":2530,"dataGaLocation":2297},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2532},[2533,2536,2539],{"text":2534,"config":2535},"Terms",{"href":2346,"dataGaName":2347,"dataGaLocation":2297},{"text":2537,"config":2538},"Cookies",{"dataGaName":2356,"dataGaLocation":2297,"id":2357,"isOneTrustButton":1376},{"text":2540,"config":2541},"Datenschutz",{"href":2351,"dataGaName":2352,"dataGaLocation":2297},[2543],{"id":2544,"title":7,"body":1841,"config":2545,"content":2547,"description":1841,"extension":2551,"meta":2552,"navigation":1376,"path":2553,"seo":2554,"stem":2555,"__hash__":2556},"blogAuthors/en-us/blog/authors/fernando-diaz.yml",{"template":2546},"BlogAuthor",{"name":7,"config":2548},{"headshot":2549,"ctfId":2550},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz","yml",{},"/en-us/blog/authors/fernando-diaz",{},"en-us/blog/authors/fernando-diaz","lxRJIOydP4_yzYZvsPcuQevP9AYAKREF7i8QmmdnOWc",[2558,2566,2573],{"title":2559,"description":2560,"heroImage":2561,"category":1837,"date":2562,"authors":2563,"slug":2565,"externalUrl":1841},"GitLab für den Enterprise-Maßstab auslegen","Welche Entscheidungen tragen einen GitLab-Rollout, wenn tausende Entwickler(innen) davon abhängen? Der Leitfaden geht Deployment, Runner und Wiederherstellung durch.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772058602/epl3sinfezlzxnppxak6.png","2026-09-22",[2564],"GitLab","how-to-design-gitlab-for-enterprise-scale",{"title":2567,"description":2568,"heroImage":2569,"category":1837,"date":2570,"authors":2571,"slug":2572,"externalUrl":1841},"So lassen sich die Gesamtbetriebskosten (TCO) einer DevOps-Plattform berechnen","Budgetdruck auf die Toolchain? Ein Überblick über die Kostentreiber von DevOps-Plattformen und ihre Sparpotenziale.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1778087000/qdfsf8kz6ebfnopx9v2e.png","2026-09-11",[2564],"how-to-calculate-devops-platform-total-cost-of-ownership",{"title":2574,"description":2575,"heroImage":2576,"category":1837,"date":2577,"authors":2578,"slug":2580,"externalUrl":1841},"DevOps Monitoring: Überwachung, Observability und Best Practices im Vergleich","Daten allein machen noch kein gutes Monitoring. Entscheidend ist, die richtigen Signale früh zu erkennen, Ursachen schnell zu verstehen und daraus konkrete Maßnahmen abzuleiten. Der Beitrag zeigt, wie DevOps Monitoring und Observability zusammenspielen und wie Teams ihre Softwareauslieferung dadurch stabiler, sicherer und effizienter machen.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1789062589/f4ie4dscpaqxn5xby5fz.png","2026-09-10",[2579],"GitLab Germany Team","observability-vs-monitoring-in-devops",{"header":2582,"text":2583,"button":2587,"disclaimer":2590},"Kostenlose 30-tägige\n\nGitLab-Testversion starten\n",[2584,2585,2586],"GitLab Duo Agent Platform nutzen","Unsere fortschrittlichsten Funktionen ausprobieren","Komplexe Aufgaben mit KI automatisieren",{"text":1866,"config":2588},{"href":2589,"dataGaName":1869,"dataGaLocation":2094},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/blog/","Keine Kreditkarte erforderlich.",{"header":2592,"blurb":2593,"button":2594,"secondaryButton":2599},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2595,"config":2596},"Kostenlosen Test starten",{"href":2597,"dataGaName":1869,"dataGaLocation":2598},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":2185,"config":2600},{"href":2187,"dataGaName":1874,"dataGaLocation":2598},1790733351871]