[{"data":1,"prerenderedAt":704},["ShallowReactive",2],{"/de-de/blog/whats-new-in-git-2-45-0/":3,"navigation-de-de":35,"banner-de-de":454,"footer-de-de":466,"Patrick Steinhardt":676,"next-steps-de-de":689},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":25,"_id":28,"_type":29,"title":30,"_source":31,"_file":32,"_stem":33,"_extension":34},"/de-de/blog/whats-new-in-git-2-45-0","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Was ist neu in Git 2.45.0?","Hier sind einige Highlights der Beiträge des Git-Teams von GitLab und der breiteren Git-Community zur neuesten Git-Version, darunter reftables und bessere Tools für Referenzen.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659507/Blog/Hero%20Images/AdobeStock_623844718.jpg","https://about.gitlab.com/blog/whats-new-in-git-2-45-0","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Was ist neu in Git 2.45.0?\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Patrick Steinhardt\"}],\n        \"datePublished\": \"2024-04-30\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22},[18],"Patrick Steinhardt","2024-04-30","Das Git-Projekt hat kürzlich [Git-Version 2.45.0](https://lore.kernel.org/git/xmqq8r0ww0sj.fsf@gitster.g/ \"Git Version 2.45.0\") veröffentlicht. Werfen wir einen Blick auf die Highlights dieser Version, die Beiträge des Git-Teams von GitLab und der gesamten Git-Community enthält.\n\n## Reftables: Ein neues Backend zum Speichern von Referenzen\n\nJedes Git-Repository muss zwei grundlegende Datenstrukturen erfassen:\n\n- Den Objektgraphen, der die Daten deiner Dateien, die Verzeichnisstruktur, Commit-Nachrichten und Tags speichert.\n- Referenzen, die auf diesen Objektgraphen verweisen, um bestimmte Objekte mit einem leichter verständlichen Namen zu verknüpfen. Ein Branch ist zum Beispiel eine Referenz, deren Name mit dem Präfix `refs/heads/` beginnt.\n\nDas Format, in dem Referenzen in einem Repository auf der Festplatte gespeichert werden, ist seit der Einführung von Git weitgehend unverändert geblieben und wird als „files“-Format bezeichnet. Jedes Mal, wenn du eine Referenz erstellst, legt Git eine sogenannte „lose Referenz“ an. Das ist eine einfache Datei in deinem Git-Repository, deren Pfad mit dem Namen der Referenz übereinstimmt. Zum Beispiel:\n\n```shell\n$ git init .\nInitialized empty Git repository in /tmp/repo/.git/\n\n# Das Updaten einer Referenz veranlasst Git dazu, eine “lose Referenz”\n# zu erstellen. Diese lose Referenz ist eine einfache Datei, welche die\n# Objekt-ID des Commits enthält.\n$ git commit --allow-empty --message \"Initial commit\"\n[main (root-commit) c70f266] Initial commit\n$ cat .git/refs/heads/main\nc70f26689975782739ef9666af079535b12b5946\n\n# Wenn man eine zweite Referenz erstellt, wird diese als zweite lose\n# Referenz gespeichert.\n$ git branch feature\n$ cat .git/refs/heads/feature\nc70f26689975782739ef9666af079535b12b5946\n$ tree .git/refs\n.git/refs/\n├── heads\n│   ├── feature\n│   └── main\n└── tags\n\n3 directories, 2 files\n```\nVon Zeit zu Zeit packt Git diese Referenzen in ein „gepacktes“ Dateiformat, damit es effizienter wird, Referenzen nachzuschlagen. Zum Beispiel:\n\n```shell\n# Wenn man Referenzen packt, erstellt Git eine “packed-refs” Datei.\n# Diese Datei enthält die sortierte Liste von vorher losen Referenzen.\n# Die losen Referenzen existieren nicht mehr.\n$ git pack-refs --all\n$ cat .git/refs/heads/main\ncat: .git/refs/heads/main: No such file or directory\n$ cat .git/packed-refs\n# pack-refs with: peeled fully-peeled sorted\nc70f26689975782739ef9666af079535b12b5946 refs/heads/feature\nc70f26689975782739ef9666af079535b12b5946 refs/heads/main\n```\nDieses Format ist zwar ziemlich simpel, hat aber Einschränkungen:\n\n- In großen Mono-Repos mit vielen Referenzen stießen wir auf Probleme mit der Skalierbarkeit. Das Löschen von Referenzen ist besonders ineffizient, da die gesamte „packed-refs“-Datei neu geschrieben werden muss, um die gelöschte Referenz zu entfernen. In unseren größten Repositorys kann dies dazu führen, dass bei jedem Löschen einer Referenz mehrere Gigabyte an Daten neu geschrieben werden müssen.\n- Da mehrere Dateien gelesen werden müssen, um alle Referenzen des Repos zu ermitteln, ist dies atomar nicht möglich. Sobald andere Prozesse existieren, die in das Repo schreiben wollen, kann es dadurch zu Inkonsistenzen kommen.\n- Es ist unmöglich, atomar mehrere Referenzen gleichzeitig zu schreiben, weil dafür mehrere Dateien erstellt oder aktualisiert werden müssen.\n- Das Packen von Referenzen lässt sich nicht gut skalieren, weil die gesamte „packed-refs“-Datei neu geschrieben werden muss.\n- Da lose Referenzen den Dateisystempfad als Namen verwenden, unterliegen sie dem dateisystemspezifischen Verhalten. So können z. B. Dateisysteme, die Groß- und Kleinschreibung nicht unterscheiden, keine Referenzen speichern, bei denen nur die Groß- und Kleinschreibung unterschiedlich ist.\n\nUm diese Probleme zu lösen, wurde mit Git v2.45.0 ein neues „reftable“-Backend eingeführt, das ein neues Binärformat zum Speichern von Referenzen verwendet. Dieses neue Backend wird schon sehr lange entwickelt: es wurde ursprünglich von [Shawn Pearce](https://sfconservancy.org/blog/2018/jan/30/shawn-pearce/ \"Shawn Pearce\") im Juli 2017 vorgeschlagen und zunächst in [JGit](https://www.eclipse.org/jgit/ \"JGit\") implementiert. Das [Gerrit-Projekt](https://www.gerritcodereview.com/ \"Gerrit Projekt\") nutzt es bereits ausgiebig. Im Jahr 2021 hat [Han-Wen Nienhuys](https://hanwen.home.xs4all.nl/ \"Han-Wen Nienhuys\") die Bibliothek in Git hochgeladen, die es ermöglicht, das reftable-Format zu lesen und zu schreiben.\n\nDas neue „reftable“-Backend, das wir in Git v2.45.0 hochgeladen haben, bringt nun endlich die reftable-Bibliothek und Git zusammen, so dass du das neue Format als Speicher-Backend in deinen Git-Repositorys verwenden kannst.\n\nWenn du mindestens Git v2.45.0 verwendest, kannst du neue Repositorys mit dem „reftable“-Format erstellen, indem du den Schalter `--ref-format=reftable` entweder an `git-init(1)` oder an `git-clone(1)` übergibst. Zum Beispiel:\n\n```shell\n$ git init --ref-format=reftable .\nInitialized empty Git repository in /tmp/repo/.git/\n$ git rev-parse --show-ref-format\nreftable\n$ find -type f .git/reftable/\n.git/reftable/0x000000000001-0x000000000001-01b5e47d.ref\n.git/reftable/tables.list\n\n$ git commit --allow-empty --message \"Initial commit\"\n$ find -type f .git/reftable/\n.git/reftable/0x000000000001-0x000000000001-01b5e47d.ref\n.git/reftable/0x000000000002-0x000000000002-87006b81.ref\n.git/reftable/tables.list\n```\nWie du siehst, werden die Referenzen jetzt im Verzeichnis `.git/reftable` statt in `.git/refs` gespeichert. Die Referenzen und die Reflogs werden in „tables“ gespeichert. Das sind die Dateien, die auf `.ref` enden. Die Datei `tables.list` enthält die Liste aller derzeit aktiven Tabellen. Die technischen Details rund um die Funktionsweise werden wir in einem separaten Blogbeitrag erklären. Bleib dran!\n\nDas „reftable“-Backend ist als vollwertiger Ersatz für das „files“-Backend gedacht. Aus der Sicht der Benutzer(innen) sollte also alles gleich funktionieren.\n\nDieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab \"Patrick Steinhardt\") geleitet. Dank gebührt auch Shawn Pearce, dem Erfinder des Formats, und Han-Wen Nienhuys, dem Autor der reftable-Bibliothek.\n\n## Bessere Tools für Referenzen \n\nDas Format „reftable“ löst zwar viele der Probleme, die wir haben, es bringt allerdings auch einige neue Probleme mit sich. Eines der wichtigsten Probleme ist die Zugänglichkeit der darin enthaltenen Daten.\n\nMit dem „files“-Backend kannst du im schlimmsten Fall deine normalen Unix-Tools verwenden, um den Zustand der Referenzen zu überprüfen. Sowohl die „gepackten“ als auch die „losen“ Referenzen enthalten menschenlesbare Daten, die man leicht verstehen kann. Das ist beim „reftable“-Format anders, da es sich um ein Binärformat handelt. Daher muss Git alle notwendigen Tools bereitstellen, um Daten aus dem neuen „reftable“-Format zu extrahieren.\n\n### Auflisten aller Referenzen\n\nDas erste Problem bestand darin, dass es im Grunde unmöglich ist, alle Referenzen zu ermitteln, die ein Repository kennt. Das ist zunächst etwas rätselhaft: Du kannst über Git Referenzen erstellen und ändern, aber es kann nicht alle Referenzen auflisten, die es kennt?\n\nWährend es problemlos alle „normalen“ Referenzen auflisten kann, die mit dem Präfix `refs/` beginnen, verwendet Git auch sogenannte Pseudo-Referenzen. Diese Dateien befinden sich direkt im Stammverzeichnis des Git-Verzeichnisses und wären zum Beispiel Dateien wie `.git/MERGE_HEAD`. Das Problem dabei ist, dass diese Pseudo-Referenzen neben anderen Dateien liegen, die Git speichert, wie z. B. `.git/config`.\n\nWährend einige Pseudo-Referenzen bekannt und daher leicht zu identifizieren sind, gibt es theoretisch keine Grenzen dafür, welche Referenzen Git schreiben kann. Nichts hält dich davon ab, eine Referenz mit dem Namen „foobar“ zu erstellen.\n\nZum Beispiel:\n\n```shell\n$ git update-ref foobar HEAD\n$ cat .git/foobar\nf32633d4d7da32ccc3827e90ecdc10570927c77d\n```\nDas Problem des „files“-Backends ist, dass es Referenzen nur aufzählen kann, indem es Verzeichnisse durchsucht. Um herauszufinden, dass es sich bei `.git/foobar` tatsächlich um eine Referenz handelt, müsste Git die Datei öffnen und prüfen, ob sie wie eine Referenz formatiert ist oder nicht.\n\nDas „reftable“-Backend hingegen kennt sämtliche Referenzen, die es enthält: Sie sind in seinen Datenstrukturen kodiert, so dass es lediglich diese Referenzen dekodieren und zurückgeben muss. Aufgrund der Einschränkungen des „files“-Backends gibt es jedoch kein Tool, mit dem du alle vorhandenen Referenzen ermitteln kannst.\n\nUm dieses Problem zu lösen, haben wir `git-for-each-ref(1)` mit dem neuen Flag `--include-root-refs` ausgestattet, das auch alle Referenzen auflistet, die im Stammverzeichnis der Referenznamen-Hierarchie existieren. Zum Beispiel:\n\n```shell\n$ git for-each-ref --include-root-refs\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    HEAD\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    MERGE_HEAD\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    refs/heads/main\n```\nFür das „files“-Backend wird dieses neue Flag nach dem Best-Effort-Prinzip behandelt, d.h. es werden alle Referenzen aufgenommen, die mit einem bekannten Pseudo-Referenznamen übereinstimmen. Für das „reftable“-Backend können wir einfach alle bekannten Referenzen auflisten.\n\nDieses Projekt wurde von [Karthik Nayak](https://gitlab.com/knayakgl \"Karthik Nayak\") geleitet.\n\n### Auflisten aller reflogs\n\nJedes Mal, wenn du einen Branch aktualisierst, zeichnet Git diese Branch-Aktualisierung standardmäßig in einem sogenannten reflog auf. Dieses reflog ermöglicht es dir, Änderungen an diesem Branch rückgängig zu machen, falls du eine unbeabsichtigte Änderung vorgenommen hast, und kann daher sehr hilfreich sein.\n\nMit dem „files“-Backend werden diese Protokolle in deinem `.git/logs`-Verzeichnis gespeichert:\n\n```shell\n$ find -type f .git/logs/\n.git/logs/HEAD\n.git/logs/refs/heads/main\n```\nTatsächlich ist die Auflistung der Dateien in diesem Verzeichnis die einzige Möglichkeit, um herauszufinden, welche Referenzen überhaupt ein reflog haben. Dies ist ein Problem für das „reftable“-Backend, das diese Logs zusammen mit den Referenzen speichert. Folglich gibt es keine Möglichkeit mehr, herauszufinden, welche reflogs im Repository überhaupt existieren, wenn du das „reftable“ Format verwendest.\n\nDies ist jedoch nicht wirklich die Schuld des „reftable“-Formats, sondern eine Lücke in den von Git bereitgestellten Tools. Um diese Lücke zu schließen, haben wir einen neuen Unterbefehl `list` für `git-reflog(1)` eingeführt, mit dem du alle vorhandenen reflogs auflisten kannst:\n\n```shell\n$ git reflog list\nHEAD\nrefs/heads/main\n```\nDieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab \"Patrick Steinhardt\") geleitet.\n\n### Effizienteres Packen von Referenzen\n\nUm effizient zu bleiben, müssen Git-Repositorys regelmäßig gewartet werden. Normalerweise wird diese Wartung durch verschiedene Git-Befehle ausgelöst, die Daten in die Git-Repositorys schreiben, indem sie den Befehl `git maintenance run --auto` ausführen. Dieser Befehl optimiert nur die Datenstrukturen, die tatsächlich optimiert werden müssen, damit Git keine Computeressourcen verschwendet.\n\nEine Datenstruktur, die von der Git-Wartung optimiert wird, ist die Referenzdatenbank, die mit dem Befehl `git pack-refs --all` optimiert wird. Für das „files“-Backend bedeutet dies, dass alle Referenzen in die „packed-refs“-Datei gepackt und die losen Referenzen gelöscht werden, während für das „reftable“-Backend alle Tabellen in einer einzigen Tabelle zusammengefasst werden.\n\nIm Hinblick auf das „files“-Backend können wir nicht viel besser vorgehen. Da die gesamte „packed-refs“-Datei ohnehin neu geschrieben werden muss, ist es sinnvoll, alle losen Referenzen zu packen.\n\nFür das „reftable“-Backend ist dies jedoch suboptimal, da sich das „reftable“-Backend selbst optimiert. Jedes Mal, wenn Git eine neue Tabelle an das „reftable“-Backend anhängt, führt es eine automatische Komprimierung durch und führt die Tabellen nach Bedarf zusammen. Deshalb sollte sich die Referenzdatenbank immer in einem gut optimierten Zustand befinden, sodass das Zusammenführen aller Tabellen vergebliche Mühe wäre.\n\nIn Git v2.45.0 haben wir daher einen neuen Modus `git pack-refs --auto` eingeführt, der das Referenz-Backend auffordert, nach Bedarf zu optimieren. Während das „files“-Backend auch bei gesetztem `--auto`-Flag weiterhin gleich funktioniert, verwendet das „reftable“-Backend die gleichen Heuristiken, die es bereits für seine automatische Komprimierung verwendet. In der Praxis sollte dies in den meisten Fällen kein Problem darstellen.\n\nAußerdem wurde `git maintenance run --auto` so angepasst, dass das Flag `--auto` an `git-pack-refs(1)` übergeben wird, um diesen neuen Modus standardmäßig zu verwenden.\n\nDieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab \"Patrick Steinhardt\") geleitet. \n\n## Weiterlesen\n\nIn diesem Blogbeitrag ging es vor allem um das neue „reftable“-Backend, das es uns ermöglicht, in großen Repositorys mit vielen Referenzen besser zu skalieren, sowie um die zugehörigen Tools, die wir parallel dazu eingeführt haben, damit es gut funktioniert. Natürlich hat die Git-Community mit dieser Version auch verschiedene Leistungsverbesserungen, Fehlerbehebungen und kleinere Funktionen eingeführt. Diese kannst du in der [offiziellen Versionsankündigung](https://lore.kernel.org/git/xmqq8r0ww0sj.fsf@gitster.g/ \"offiziellen Versionsankündigung\") des Git-Projekts nachlesen.\n","open-source",[23,24],"git","community",{"slug":26,"featured":6,"template":27},"whats-new-in-git-2-45-0","BlogPost","content:de-de:blog:whats-new-in-git-2-45-0.yml","yaml","Whats New In Git 2 45 0","content","de-de/blog/whats-new-in-git-2-45-0.yml","de-de/blog/whats-new-in-git-2-45-0","yml",{"_path":36,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"data":38,"_id":450,"_type":29,"title":451,"_source":31,"_file":452,"_stem":453,"_extension":34},"/shared/de-de/main-navigation","de-de",{"logo":39,"freeTrial":44,"sales":49,"login":54,"items":59,"search":391,"minimal":427,"duo":441},{"config":40},{"href":41,"dataGaName":42,"dataGaLocation":43},"/de-de/","gitlab logo","header",{"text":45,"config":46},"Kostenlose Testversion anfordern",{"href":47,"dataGaName":48,"dataGaLocation":43},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":50,"config":51},"Vertrieb kontaktieren",{"href":52,"dataGaName":53,"dataGaLocation":43},"/de-de/sales/","sales",{"text":55,"config":56},"Anmelden",{"href":57,"dataGaName":58,"dataGaLocation":43},"https://gitlab.com/users/sign_in/","sign in",[60,104,203,208,312,372],{"text":61,"config":62,"cards":64,"footer":87},"Plattform",{"dataNavLevelOne":63},"platform",[65,71,79],{"title":61,"description":66,"link":67},"Die umfassendste KI-basierte DevSecOps-Plattform",{"text":68,"config":69},"Erkunde unsere Plattform",{"href":70,"dataGaName":63,"dataGaLocation":43},"/de-de/platform/",{"title":72,"description":73,"link":74},"GitLab Duo (KI)","Entwickle Software schneller mit KI in jeder Phase der Entwicklung",{"text":75,"config":76},"Lerne GitLab Duo kennen",{"href":77,"dataGaName":78,"dataGaLocation":43},"/de-de/gitlab-duo/","gitlab duo ai",{"title":80,"description":81,"link":82},"Gründe, die für GitLab sprechen","10 Gründe, warum Unternehmen sich für GitLab entscheiden",{"text":83,"config":84},"Mehr erfahren",{"href":85,"dataGaName":86,"dataGaLocation":43},"/de-de/why-gitlab/","why gitlab",{"title":88,"items":89},"Erste Schritte mit",[90,95,100],{"text":91,"config":92},"Platform Engineering",{"href":93,"dataGaName":94,"dataGaLocation":43},"/de-de/solutions/platform-engineering/","platform engineering",{"text":96,"config":97},"Entwicklererfahrung",{"href":98,"dataGaName":99,"dataGaLocation":43},"/de-de/developer-experience/","Developer experience",{"text":101,"config":102},"MLOps",{"href":103,"dataGaName":101,"dataGaLocation":43},"/de-de/topics/devops/the-role-of-ai-in-devops/",{"text":105,"left":106,"config":107,"link":109,"lists":113,"footer":185},"Produkt",true,{"dataNavLevelOne":108},"solutions",{"text":110,"config":111},"Alle Lösungen anzeigen",{"href":112,"dataGaName":108,"dataGaLocation":43},"/de-de/solutions/",[114,140,163],{"title":115,"description":116,"link":117,"items":122},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":118},{"icon":119,"href":120,"dataGaName":121,"dataGaLocation":43},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[123,127,131,136],{"text":124,"config":125},"CI/CD",{"href":126,"dataGaLocation":43,"dataGaName":124},"/de-de/solutions/continuous-integration/",{"text":128,"config":129},"KI-unterstützte Entwicklung",{"href":77,"dataGaLocation":43,"dataGaName":130},"AI assisted development",{"text":132,"config":133},"Quellcodeverwaltung",{"href":134,"dataGaLocation":43,"dataGaName":135},"/de-de/solutions/source-code-management/","Source Code Management",{"text":137,"config":138},"Automatisierte Softwarebereitstellung",{"href":120,"dataGaLocation":43,"dataGaName":139},"Automated software delivery",{"title":141,"description":142,"link":143,"items":148},"Sicherheit","Entwickle schneller, ohne die Sicherheit zu gefährden",{"config":144},{"href":145,"dataGaName":146,"dataGaLocation":43,"icon":147},"/de-de/solutions/security-compliance/","security and compliance","ShieldCheckLight",[149,153,158],{"text":150,"config":151},"Sicherheit und Compliance",{"href":145,"dataGaLocation":43,"dataGaName":152},"Security & Compliance",{"text":154,"config":155},"Schutz der Software-Lieferkette",{"href":156,"dataGaLocation":43,"dataGaName":157},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":159,"config":160},"Compliance und Governance",{"href":161,"dataGaLocation":43,"dataGaName":162},"/de-de/solutions/continuous-software-compliance/","Compliance and governance",{"title":164,"link":165,"items":170},"Bewertung",{"config":166},{"icon":167,"href":168,"dataGaName":169,"dataGaLocation":43},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[171,175,180],{"text":172,"config":173},"Sichtbarkeit und Bewertung",{"href":168,"dataGaLocation":43,"dataGaName":174},"Visibility and Measurement",{"text":176,"config":177},"Wertstrommanagement",{"href":178,"dataGaLocation":43,"dataGaName":179},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":181,"config":182},"Analysen und Einblicke",{"href":183,"dataGaLocation":43,"dataGaName":184},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":186,"items":187},"GitLab für",[188,193,198],{"text":189,"config":190},"Enterprise",{"href":191,"dataGaLocation":43,"dataGaName":192},"/de-de/enterprise/","enterprise",{"text":194,"config":195},"Kleinunternehmen",{"href":196,"dataGaLocation":43,"dataGaName":197},"/de-de/small-business/","small business",{"text":199,"config":200},"den öffentlichen Sektor",{"href":201,"dataGaLocation":43,"dataGaName":202},"/de-de/solutions/public-sector/","public sector",{"text":204,"config":205},"Preise",{"href":206,"dataGaName":207,"dataGaLocation":43,"dataNavLevelOne":207},"/de-de/pricing/","pricing",{"text":209,"config":210,"link":212,"lists":216,"feature":299},"Ressourcen",{"dataNavLevelOne":211},"resources",{"text":213,"config":214},"Alle Ressourcen anzeigen",{"href":215,"dataGaName":211,"dataGaLocation":43},"/de-de/resources/",[217,250,272],{"title":218,"items":219},"Erste Schritte",[220,225,230,235,240,245],{"text":221,"config":222},"Installieren",{"href":223,"dataGaName":224,"dataGaLocation":43},"/de-de/install/","install",{"text":226,"config":227},"Kurzanleitungen",{"href":228,"dataGaName":229,"dataGaLocation":43},"/de-de/get-started/","quick setup checklists",{"text":231,"config":232},"Lernen",{"href":233,"dataGaLocation":43,"dataGaName":234},"https://university.gitlab.com/","learn",{"text":236,"config":237},"Produktdokumentation",{"href":238,"dataGaName":239,"dataGaLocation":43},"https://docs.gitlab.com/","product documentation",{"text":241,"config":242},"Best-Practice-Videos",{"href":243,"dataGaName":244,"dataGaLocation":43},"/de-de/getting-started-videos/","best practice videos",{"text":246,"config":247},"Integrationen",{"href":248,"dataGaName":249,"dataGaLocation":43},"/de-de/integrations/","integrations",{"title":251,"items":252},"Entdecken",[253,258,262,267],{"text":254,"config":255},"Kundenerfolge",{"href":256,"dataGaName":257,"dataGaLocation":43},"/de-de/customers/","customer success stories",{"text":259,"config":260},"Blog",{"href":261,"dataGaName":5,"dataGaLocation":43},"/de-de/blog/",{"text":263,"config":264},"Remote",{"href":265,"dataGaName":266,"dataGaLocation":43},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":268,"config":269},"TeamOps",{"href":270,"dataGaName":271,"dataGaLocation":43},"/de-de/teamops/","teamops",{"title":273,"items":274},"Vernetzen",[275,280,284,289,294],{"text":276,"config":277},"GitLab-Services",{"href":278,"dataGaName":279,"dataGaLocation":43},"/de-de/services/","services",{"text":281,"config":282},"Community",{"href":283,"dataGaName":24,"dataGaLocation":43},"/community/",{"text":285,"config":286},"Forum",{"href":287,"dataGaName":288,"dataGaLocation":43},"https://forum.gitlab.com/","forum",{"text":290,"config":291},"Veranstaltungen",{"href":292,"dataGaName":293,"dataGaLocation":43},"/events/","events",{"text":295,"config":296},"Partner",{"href":297,"dataGaName":298,"dataGaLocation":43},"/de-de/partners/","partners",{"backgroundColor":300,"textColor":301,"text":302,"image":303,"link":307},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":304,"config":305},"the source promo card",{"src":306},"/images/navigation/the-source-promo-card.svg",{"text":308,"config":309},"Lies die News",{"href":310,"dataGaName":311,"dataGaLocation":43},"/de-de/the-source/","the source",{"text":313,"config":314,"lists":316},"Unternehmen",{"dataNavLevelOne":315},"company",[317],{"items":318},[319,324,330,332,337,342,347,352,357,362,367],{"text":320,"config":321},"Über",{"href":322,"dataGaName":323,"dataGaLocation":43},"/de-de/company/","about",{"text":325,"config":326,"footerGa":329},"Karriere",{"href":327,"dataGaName":328,"dataGaLocation":43},"/jobs/","jobs",{"dataGaName":328},{"text":290,"config":331},{"href":292,"dataGaName":293,"dataGaLocation":43},{"text":333,"config":334},"Geschäftsführung",{"href":335,"dataGaName":336,"dataGaLocation":43},"/company/team/e-group/","leadership",{"text":338,"config":339},"Team",{"href":340,"dataGaName":341,"dataGaLocation":43},"/company/team/","team",{"text":343,"config":344},"Handbuch",{"href":345,"dataGaName":346,"dataGaLocation":43},"https://handbook.gitlab.com/","handbook",{"text":348,"config":349},"Investor Relations",{"href":350,"dataGaName":351,"dataGaLocation":43},"https://ir.gitlab.com/","investor relations",{"text":353,"config":354},"Trust Center",{"href":355,"dataGaName":356,"dataGaLocation":43},"/de-de/security/","trust center",{"text":358,"config":359},"AI Transparency Center",{"href":360,"dataGaName":361,"dataGaLocation":43},"/de-de/ai-transparency-center/","ai transparency center",{"text":363,"config":364},"Newsletter",{"href":365,"dataGaName":366,"dataGaLocation":43},"/company/contact/","newsletter",{"text":368,"config":369},"Presse",{"href":370,"dataGaName":371,"dataGaLocation":43},"/press/","press",{"text":373,"config":374,"lists":375},"Kontakt",{"dataNavLevelOne":315},[376],{"items":377},[378,381,386],{"text":50,"config":379},{"href":52,"dataGaName":380,"dataGaLocation":43},"talk to sales",{"text":382,"config":383},"Support",{"href":384,"dataGaName":385,"dataGaLocation":43},"/support/","get help",{"text":387,"config":388},"Kundenportal",{"href":389,"dataGaName":390,"dataGaLocation":43},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":392,"login":393,"suggestions":400},"Schließen",{"text":394,"link":395},"Um Repositories und Projekte zu durchsuchen, melde dich an bei",{"text":396,"config":397},"gitlab.com",{"href":57,"dataGaName":398,"dataGaLocation":399},"search login","search",{"text":401,"default":402},"Vorschläge",[403,406,411,413,418,423],{"text":72,"config":404},{"href":77,"dataGaName":405,"dataGaLocation":399},"GitLab Duo (AI)",{"text":407,"config":408},"Code Suggestions (KI)",{"href":409,"dataGaName":410,"dataGaLocation":399},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":124,"config":412},{"href":126,"dataGaName":124,"dataGaLocation":399},{"text":414,"config":415},"GitLab auf AWS",{"href":416,"dataGaName":417,"dataGaLocation":399},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":419,"config":420},"GitLab auf Google Cloud",{"href":421,"dataGaName":422,"dataGaLocation":399},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":424,"config":425},"Warum GitLab?",{"href":85,"dataGaName":426,"dataGaLocation":399},"Why GitLab?",{"freeTrial":428,"mobileIcon":433,"desktopIcon":438},{"text":429,"config":430},"Kostenlos testen",{"href":431,"dataGaName":48,"dataGaLocation":432},"https://gitlab.com/-/trials/new/","nav",{"altText":434,"config":435},"GitLab-Symbol",{"src":436,"dataGaName":437,"dataGaLocation":432},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":434,"config":439},{"src":440,"dataGaName":437,"dataGaLocation":432},"/images/brand/gitlab-logo-type.svg",{"freeTrial":442,"mobileIcon":446,"desktopIcon":448},{"text":443,"config":444},"Erfahre mehr über GitLab Duo",{"href":77,"dataGaName":445,"dataGaLocation":432},"gitlab duo",{"altText":434,"config":447},{"src":436,"dataGaName":437,"dataGaLocation":432},{"altText":434,"config":449},{"src":440,"dataGaName":437,"dataGaLocation":432},"content:shared:de-de:main-navigation.yml","Main Navigation","shared/de-de/main-navigation.yml","shared/de-de/main-navigation",{"_path":455,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"title":456,"button":457,"config":461,"_id":463,"_type":29,"_source":31,"_file":464,"_stem":465,"_extension":34},"/shared/de-de/banner","GitLab Duo Agent Platform ist jetzt in öffentlicher Beta!",{"text":83,"config":458},{"href":459,"dataGaName":460,"dataGaLocation":43},"/de-de/gitlab-duo/agent-platform/","duo banner",{"layout":462},"release","content:shared:de-de:banner.yml","shared/de-de/banner.yml","shared/de-de/banner",{"_path":467,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"data":468,"_id":672,"_type":29,"title":673,"_source":31,"_file":674,"_stem":675,"_extension":34},"/shared/de-de/main-footer",{"text":469,"source":470,"edit":476,"contribute":481,"config":486,"items":491,"minimal":664},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":471,"config":472},"Quelltext der Seite anzeigen",{"href":473,"dataGaName":474,"dataGaLocation":475},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":477,"config":478},"Diese Seite bearbeiten",{"href":479,"dataGaName":480,"dataGaLocation":475},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":482,"config":483},"Beteilige dich",{"href":484,"dataGaName":485,"dataGaLocation":475},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":487,"facebook":488,"youtube":489,"linkedin":490},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[492,515,570,600,634],{"title":61,"links":493,"subMenu":498},[494],{"text":495,"config":496},"DevSecOps-Plattform",{"href":70,"dataGaName":497,"dataGaLocation":475},"devsecops platform",[499],{"title":204,"links":500},[501,505,510],{"text":502,"config":503},"Tarife anzeigen",{"href":206,"dataGaName":504,"dataGaLocation":475},"view plans",{"text":506,"config":507},"Vorteile von Premium",{"href":508,"dataGaName":509,"dataGaLocation":475},"/de-de/pricing/premium/","why premium",{"text":511,"config":512},"Vorteile von Ultimate",{"href":513,"dataGaName":514,"dataGaLocation":475},"/de-de/pricing/ultimate/","why ultimate",{"title":516,"links":517},"Lösungen",[518,523,526,528,533,538,542,545,548,553,555,557,560,565],{"text":519,"config":520},"Digitale Transformation",{"href":521,"dataGaName":522,"dataGaLocation":475},"/de-de/topics/digital-transformation/","digital transformation",{"text":150,"config":524},{"href":145,"dataGaName":525,"dataGaLocation":475},"security & compliance",{"text":137,"config":527},{"href":120,"dataGaName":121,"dataGaLocation":475},{"text":529,"config":530},"Agile Entwicklung",{"href":531,"dataGaName":532,"dataGaLocation":475},"/de-de/solutions/agile-delivery/","agile delivery",{"text":534,"config":535},"Cloud-Transformation",{"href":536,"dataGaName":537,"dataGaLocation":475},"/de-de/topics/cloud-native/","cloud transformation",{"text":539,"config":540},"SCM",{"href":134,"dataGaName":541,"dataGaLocation":475},"source code management",{"text":124,"config":543},{"href":126,"dataGaName":544,"dataGaLocation":475},"continuous integration & delivery",{"text":176,"config":546},{"href":178,"dataGaName":547,"dataGaLocation":475},"value stream management",{"text":549,"config":550},"GitOps",{"href":551,"dataGaName":552,"dataGaLocation":475},"/de-de/solutions/gitops/","gitops",{"text":189,"config":554},{"href":191,"dataGaName":192,"dataGaLocation":475},{"text":194,"config":556},{"href":196,"dataGaName":197,"dataGaLocation":475},{"text":558,"config":559},"Öffentlicher Sektor",{"href":201,"dataGaName":202,"dataGaLocation":475},{"text":561,"config":562},"Bildungswesen",{"href":563,"dataGaName":564,"dataGaLocation":475},"/de-de/solutions/education/","education",{"text":566,"config":567},"Finanzdienstleistungen",{"href":568,"dataGaName":569,"dataGaLocation":475},"/de-de/solutions/finance/","financial services",{"title":209,"links":571},[572,574,576,578,581,583,586,588,590,592,594,596,598],{"text":221,"config":573},{"href":223,"dataGaName":224,"dataGaLocation":475},{"text":226,"config":575},{"href":228,"dataGaName":229,"dataGaLocation":475},{"text":231,"config":577},{"href":233,"dataGaName":234,"dataGaLocation":475},{"text":236,"config":579},{"href":238,"dataGaName":580,"dataGaLocation":475},"docs",{"text":259,"config":582},{"href":261,"dataGaName":5,"dataGaLocation":475},{"text":254,"config":584},{"href":585,"dataGaName":257,"dataGaLocation":475},"/customers/",{"text":263,"config":587},{"href":265,"dataGaName":266,"dataGaLocation":475},{"text":276,"config":589},{"href":278,"dataGaName":279,"dataGaLocation":475},{"text":268,"config":591},{"href":270,"dataGaName":271,"dataGaLocation":475},{"text":281,"config":593},{"href":283,"dataGaName":24,"dataGaLocation":475},{"text":285,"config":595},{"href":287,"dataGaName":288,"dataGaLocation":475},{"text":290,"config":597},{"href":292,"dataGaName":293,"dataGaLocation":475},{"text":295,"config":599},{"href":297,"dataGaName":298,"dataGaLocation":475},{"title":313,"links":601},[602,604,606,608,610,612,614,618,623,625,627,629],{"text":320,"config":603},{"href":322,"dataGaName":315,"dataGaLocation":475},{"text":325,"config":605},{"href":327,"dataGaName":328,"dataGaLocation":475},{"text":333,"config":607},{"href":335,"dataGaName":336,"dataGaLocation":475},{"text":338,"config":609},{"href":340,"dataGaName":341,"dataGaLocation":475},{"text":343,"config":611},{"href":345,"dataGaName":346,"dataGaLocation":475},{"text":348,"config":613},{"href":350,"dataGaName":351,"dataGaLocation":475},{"text":615,"config":616},"Sustainability",{"href":617,"dataGaName":615,"dataGaLocation":475},"/sustainability/",{"text":619,"config":620},"Vielfalt, Inklusion und Zugehörigkeit",{"href":621,"dataGaName":622,"dataGaLocation":475},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":353,"config":624},{"href":355,"dataGaName":356,"dataGaLocation":475},{"text":363,"config":626},{"href":365,"dataGaName":366,"dataGaLocation":475},{"text":368,"config":628},{"href":370,"dataGaName":371,"dataGaLocation":475},{"text":630,"config":631},"Transparenzerklärung zu moderner Sklaverei",{"href":632,"dataGaName":633,"dataGaLocation":475},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":635,"links":636},"Nimm Kontakt auf",[637,640,642,644,649,654,659],{"text":638,"config":639},"Sprich mit einem Experten/einer Expertin",{"href":52,"dataGaName":53,"dataGaLocation":475},{"text":382,"config":641},{"href":384,"dataGaName":385,"dataGaLocation":475},{"text":387,"config":643},{"href":389,"dataGaName":390,"dataGaLocation":475},{"text":645,"config":646},"Status",{"href":647,"dataGaName":648,"dataGaLocation":475},"https://status.gitlab.com/","status",{"text":650,"config":651},"Nutzungsbedingungen",{"href":652,"dataGaName":653,"dataGaLocation":475},"/terms/","terms of use",{"text":655,"config":656},"Datenschutzerklärung",{"href":657,"dataGaName":658,"dataGaLocation":475},"/de-de/privacy/","privacy statement",{"text":660,"config":661},"Cookie-Einstellungen",{"dataGaName":662,"dataGaLocation":475,"id":663,"isOneTrustButton":106},"cookie preferences","ot-sdk-btn",{"items":665},[666,668,670],{"text":650,"config":667},{"href":652,"dataGaName":653,"dataGaLocation":475},{"text":655,"config":669},{"href":657,"dataGaName":658,"dataGaLocation":475},{"text":660,"config":671},{"dataGaName":662,"dataGaLocation":475,"id":663,"isOneTrustButton":106},"content:shared:de-de:main-footer.yml","Main Footer","shared/de-de/main-footer.yml","shared/de-de/main-footer",[677],{"_path":678,"_dir":679,"_draft":6,"_partial":6,"_locale":7,"content":680,"config":684,"_id":686,"_type":29,"title":18,"_source":31,"_file":687,"_stem":688,"_extension":34},"/en-us/blog/authors/patrick-steinhardt","authors",{"name":18,"config":681},{"headshot":682,"ctfId":683},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661952/Blog/Author%20Headshots/pks-gitlab-headshot.png","pksgitlab",{"template":685},"BlogAuthor","content:en-us:blog:authors:patrick-steinhardt.yml","en-us/blog/authors/patrick-steinhardt.yml","en-us/blog/authors/patrick-steinhardt",{"_path":690,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"header":691,"eyebrow":692,"blurb":693,"button":694,"secondaryButton":698,"_id":700,"_type":29,"title":701,"_source":31,"_file":702,"_stem":703,"_extension":34},"/shared/de-de/next-steps","Stelle jetzt bessere Software schneller bereit","Mehr als 50 % der Fortune-100-Unternehmen vertrauen GitLab","Erlebe, was dein Team mit der intelligenten\n\n\nDevSecOps-Plattform erreichen kann.\n",{"text":45,"config":695},{"href":696,"dataGaName":48,"dataGaLocation":697},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":50,"config":699},{"href":52,"dataGaName":53,"dataGaLocation":697},"content:shared:de-de:next-steps.yml","Next Steps","shared/de-de/next-steps.yml","shared/de-de/next-steps",1753475283455]