[{"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":467,"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,"",{"ogTitle":9,"schema":10,"ogImage":11,"ogDescription":12,"ogSiteName":13,"noIndex":6,"ogType":14,"ogUrl":15,"title":9,"canonicalUrls":15,"description":12},"Was ist neu in Git 2.45.0?","\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      }","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659507/Blog/Hero%20Images/AdobeStock_623844718.jpg","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://about.gitlab.com","article","https://about.gitlab.com/blog/whats-new-in-git-2-45-0",{"title":9,"description":12,"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\n\n2.45.0](https://lore.kernel.org/git/xmqq8r0ww0sj.fsf@gitster.g/ \"Git Version\n\n2.45.0\") veröffentlicht. Werfen wir einen Blick auf die Highlights dieser\n\nVersion, die Beiträge des Git-Teams von GitLab und der gesamten\n\nGit-Community enthält.\n\n\n\n## Reftables: Ein neues Backend zum Speichern von Referenzen\n\n\n\nJedes Git-Repository muss zwei grundlegende Datenstrukturen erfassen:\n\n\n\n- Den Objektgraphen, der die Daten deiner Dateien, die Verzeichnisstruktur,\n\nCommit-Nachrichten und Tags speichert.\n\n\n- Referenzen, die auf diesen Objektgraphen verweisen, um bestimmte Objekte\n\nmit einem leichter verständlichen Namen zu verknüpfen. Ein Branch ist zum\n\nBeispiel eine Referenz, deren Name mit dem Präfix `refs/heads/` beginnt.\n\n\n> **Über 6,4 Mio. Builds pro Monat: So transformiert Siemens seine Softwareentwicklung mit GitLab** Über 40.000 Entwickler(innen) bei Siemens nutzen GitLab, um weltweit zusammenzuarbeiten und jeden Monat mehr als 6,4 Millionen Software-Versionen automatisch bereitzustellen. Erfahre, wie eine offene DevOps-Kultur und eine zentrale Plattform die Effizienz und Sicherheit steigern. [Erfolgsstory lesen](https://about.gitlab.com/de-de/customers/siemens/)\n\n\nDas Format, in dem Referenzen in einem Repository auf der Festplatte\n\ngespeichert werden, ist seit der Einführung von Git weitgehend unverändert\n\ngeblieben und wird als „files“-Format bezeichnet. Jedes Mal, wenn du eine\n\nReferenz erstellst, legt Git eine sogenannte „lose Referenz“ an. Das ist\n\neine einfache Datei in deinem Git-Repository, deren Pfad mit dem Namen der\n\nReferenz übereinstimmt. Zum Beispiel:\n\n\n\n```shell\n\n\n$ git init .\n\n\nInitialized empty Git repository in /tmp/repo/.git/\n\n\n\n# Das Updaten einer Referenz veranlasst Git dazu, eine “lose Referenz”\n\n\n# zu erstellen. Diese lose Referenz ist eine einfache Datei, welche die\n\n\n# Objekt-ID des Commits enthält.\n\n\n$ git commit --allow-empty --message \"Initial commit\"\n\n\n[main (root-commit) c70f266] Initial commit\n\n\n$ cat .git/refs/heads/main\n\n\nc70f26689975782739ef9666af079535b12b5946\n\n\n\n# Wenn man eine zweite Referenz erstellt, wird diese als zweite lose\n\n\n# Referenz gespeichert.\n\n\n$ git branch feature\n\n\n$ cat .git/refs/heads/feature\n\n\nc70f26689975782739ef9666af079535b12b5946\n\n\n$ tree .git/refs\n\n\n.git/refs/\n\n\n├── heads\n\n\n│   ├── feature\n\n\n│   └── main\n\n\n└── tags\n\n\n\n3 directories, 2 files\n\n\n```\n\n\nVon Zeit zu Zeit packt Git diese Referenzen in ein „gepacktes“ Dateiformat,\n\ndamit es effizienter wird, Referenzen nachzuschlagen. Zum Beispiel:\n\n\n\n```shell\n\n\n# Wenn man Referenzen packt, erstellt Git eine “packed-refs” Datei.\n\n\n# Diese Datei enthält die sortierte Liste von vorher losen Referenzen.\n\n\n# Die losen Referenzen existieren nicht mehr.\n\n\n$ git pack-refs --all\n\n\n$ cat .git/refs/heads/main\n\n\ncat: .git/refs/heads/main: No such file or directory\n\n\n$ cat .git/packed-refs\n\n\n# pack-refs with: peeled fully-peeled sorted\n\n\nc70f26689975782739ef9666af079535b12b5946 refs/heads/feature\n\n\nc70f26689975782739ef9666af079535b12b5946 refs/heads/main\n\n\n```\n\n\nDieses Format ist zwar ziemlich simpel, hat aber Einschränkungen:\n\n\n\n- In großen Mono-Repos mit vielen Referenzen stießen wir auf Probleme mit\n\nder Skalierbarkeit. Das Löschen von Referenzen ist besonders ineffizient, da\n\ndie gesamte „packed-refs“-Datei neu geschrieben werden muss, um die\n\ngelöschte Referenz zu entfernen. In unseren größten Repositorys kann dies\n\ndazu führen, dass bei jedem Löschen einer Referenz mehrere Gigabyte an Daten\n\nneu geschrieben werden müssen.\n\n\n- Da mehrere Dateien gelesen werden müssen, um alle Referenzen des Repos zu\n\nermitteln, ist dies atomar nicht möglich. Sobald andere Prozesse existieren,\n\ndie in das Repo schreiben wollen, kann es dadurch zu Inkonsistenzen kommen.\n\n\n- Es ist unmöglich, atomar mehrere Referenzen gleichzeitig zu schreiben,\n\nweil dafür mehrere Dateien erstellt oder aktualisiert werden müssen.\n\n\n- Das Packen von Referenzen lässt sich nicht gut skalieren, weil die gesamte\n\n„packed-refs“-Datei neu geschrieben werden muss.\n\n\n- Da lose Referenzen den Dateisystempfad als Namen verwenden, unterliegen\n\nsie dem dateisystemspezifischen Verhalten. So können z. B. Dateisysteme, die\n\nGroß- und Kleinschreibung nicht unterscheiden, keine Referenzen speichern,\n\nbei denen nur die Groß- und Kleinschreibung unterschiedlich ist.\n\n\n\nUm diese Probleme zu lösen, wurde mit Git v2.45.0 ein neues\n\n„reftable“-Backend eingeführt, das ein neues Binärformat zum Speichern von\n\nReferenzen verwendet. Dieses neue Backend wird schon sehr lange entwickelt:\n\nes wurde ursprünglich von [Shawn\n\nPearce](https://sfconservancy.org/blog/2018/jan/30/shawn-pearce/ \"Shawn\n\nPearce\") im Juli 2017 vorgeschlagen und zunächst in\n\n[JGit](https://www.eclipse.org/jgit/ \"JGit\") implementiert. Das\n\n[Gerrit-Projekt](https://www.gerritcodereview.com/ \"Gerrit Projekt\") nutzt\n\nes bereits ausgiebig. Im Jahr 2021 hat [Han-Wen\n\nNienhuys](https://hanwen.home.xs4all.nl/ \"Han-Wen Nienhuys\") die Bibliothek\n\nin Git hochgeladen, die es ermöglicht, das reftable-Format zu lesen und zu\n\nschreiben.\n\n\n\nDas neue „reftable“-Backend, das wir in Git v2.45.0 hochgeladen haben,\n\nbringt nun endlich die reftable-Bibliothek und Git zusammen, so dass du das\n\nneue Format als Speicher-Backend in deinen Git-Repositorys verwenden kannst.\n\n\n\nWenn du mindestens Git v2.45.0 verwendest, kannst du neue Repositorys mit\n\ndem „reftable“-Format erstellen, indem du den Schalter\n\n`--ref-format=reftable` entweder an `git-init(1)` oder an `git-clone(1)`\n\nübergibst. Zum Beispiel:\n\n\n\n```shell\n\n\n$ git init --ref-format=reftable .\n\n\nInitialized empty Git repository in /tmp/repo/.git/\n\n\n$ git rev-parse --show-ref-format\n\n\nreftable\n\n\n$ find -type f .git/reftable/\n\n\n.git/reftable/0x000000000001-0x000000000001-01b5e47d.ref\n\n\n.git/reftable/tables.list\n\n\n\n$ git commit --allow-empty --message \"Initial commit\"\n\n\n$ find -type f .git/reftable/\n\n\n.git/reftable/0x000000000001-0x000000000001-01b5e47d.ref\n\n\n.git/reftable/0x000000000002-0x000000000002-87006b81.ref\n\n\n.git/reftable/tables.list\n\n\n```\n\n\nWie du siehst, werden die Referenzen jetzt im Verzeichnis `.git/reftable`\n\nstatt in `.git/refs` gespeichert. Die Referenzen und die Reflogs werden in\n\n„tables“ gespeichert. Das sind die Dateien, die auf `.ref` enden. Die Datei\n\n`tables.list` enthält die Liste aller derzeit aktiven Tabellen. Die\n\ntechnischen Details rund um die Funktionsweise werden wir in einem separaten\n\nBlogbeitrag erklären. Bleib dran!\n\n\n\nDas „reftable“-Backend ist als vollwertiger Ersatz für das „files“-Backend\n\ngedacht. Aus der Sicht der Benutzer(innen) sollte also alles gleich\n\nfunktionieren.\n\n\n\nDieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab\n\n\"Patrick Steinhardt\") geleitet. Dank gebührt auch Shawn Pearce, dem Erfinder\n\ndes Formats, und Han-Wen Nienhuys, dem Autor der reftable-Bibliothek.\n\n\n\n## Bessere Tools für Referenzen \n\n\n\nDas Format „reftable“ löst zwar viele der Probleme, die wir haben, es bringt\n\nallerdings auch einige neue Probleme mit sich. Eines der wichtigsten\n\nProbleme ist die Zugänglichkeit der darin enthaltenen Daten.\n\n\n\nMit dem „files“-Backend kannst du im schlimmsten Fall deine normalen\n\nUnix-Tools verwenden, um den Zustand der Referenzen zu überprüfen. Sowohl\n\ndie „gepackten“ als auch die „losen“ Referenzen enthalten menschenlesbare\n\nDaten, die man leicht verstehen kann. Das ist beim „reftable“-Format anders,\n\nda es sich um ein Binärformat handelt. Daher muss Git alle notwendigen Tools\n\nbereitstellen, um Daten aus dem neuen „reftable“-Format zu extrahieren.\n\n\n\n### Auflisten aller Referenzen\n\n\n\nDas erste Problem bestand darin, dass es im Grunde unmöglich ist, alle\n\nReferenzen zu ermitteln, die ein Repository kennt. Das ist zunächst etwas\n\nrätselhaft: Du kannst über Git Referenzen erstellen und ändern, aber es kann\n\nnicht alle Referenzen auflisten, die es kennt?\n\n\n\nWährend es problemlos alle „normalen“ Referenzen auflisten kann, die mit dem\n\nPräfix `refs/` beginnen, verwendet Git auch sogenannte Pseudo-Referenzen.\n\nDiese Dateien befinden sich direkt im Stammverzeichnis des\n\nGit-Verzeichnisses und wären zum Beispiel Dateien wie `.git/MERGE_HEAD`. Das\n\nProblem dabei ist, dass diese Pseudo-Referenzen neben anderen Dateien\n\nliegen, die Git speichert, wie z. B. `.git/config`.\n\n\n\nWährend einige Pseudo-Referenzen bekannt und daher leicht zu identifizieren\n\nsind, gibt es theoretisch keine Grenzen dafür, welche Referenzen Git\n\nschreiben kann. Nichts hält dich davon ab, eine Referenz mit dem Namen\n\n„foobar“ zu erstellen.\n\n\n\nZum Beispiel:\n\n\n\n```shell\n\n\n$ git update-ref foobar HEAD\n\n\n$ cat .git/foobar\n\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d\n\n\n```\n\n\nDas Problem des „files“-Backends ist, dass es Referenzen nur aufzählen kann,\n\nindem es Verzeichnisse durchsucht. Um herauszufinden, dass es sich bei\n\n`.git/foobar` tatsächlich um eine Referenz handelt, müsste Git die Datei\n\nöffnen und prüfen, ob sie wie eine Referenz formatiert ist oder nicht.\n\n\n\nDas „reftable“-Backend hingegen kennt sämtliche Referenzen, die es enthält:\n\nSie sind in seinen Datenstrukturen kodiert, so dass es lediglich diese\n\nReferenzen dekodieren und zurückgeben muss. Aufgrund der Einschränkungen des\n\n„files“-Backends gibt es jedoch kein Tool, mit dem du alle vorhandenen\n\nReferenzen ermitteln kannst.\n\n\n\nUm dieses Problem zu lösen, haben wir `git-for-each-ref(1)` mit dem neuen\n\nFlag `--include-root-refs` ausgestattet, das auch alle Referenzen auflistet,\n\ndie im Stammverzeichnis der Referenznamen-Hierarchie existieren. Zum\n\nBeispiel:\n\n\n\n```shell\n\n\n$ git for-each-ref --include-root-refs\n\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    HEAD\n\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    MERGE_HEAD\n\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    refs/heads/main\n\n\n```\n\n\nFür das „files“-Backend wird dieses neue Flag nach dem Best-Effort-Prinzip\n\nbehandelt, d.h. es werden alle Referenzen aufgenommen, die mit einem\n\nbekannten Pseudo-Referenznamen übereinstimmen. Für das „reftable“-Backend\n\nkönnen wir einfach alle bekannten Referenzen auflisten.\n\n\n\nDieses Projekt wurde von [Karthik Nayak](https://gitlab.com/knayakgl\n\n\"Karthik Nayak\") geleitet.\n\n\n\n### Auflisten aller reflogs\n\n\n\nJedes Mal, wenn du einen Branch aktualisierst, zeichnet Git diese\n\nBranch-Aktualisierung standardmäßig in einem sogenannten reflog auf. Dieses\n\nreflog ermöglicht es dir, Änderungen an diesem Branch rückgängig zu machen,\n\nfalls du eine unbeabsichtigte Änderung vorgenommen hast, und kann daher sehr\n\nhilfreich sein.\n\n\n\nMit dem „files“-Backend werden diese Protokolle in deinem\n\n`.git/logs`-Verzeichnis gespeichert:\n\n\n\n```shell\n\n\n$ find -type f .git/logs/\n\n\n.git/logs/HEAD\n\n\n.git/logs/refs/heads/main\n\n\n```\n\n\nTatsächlich ist die Auflistung der Dateien in diesem Verzeichnis die einzige\n\nMöglichkeit, um herauszufinden, welche Referenzen überhaupt ein reflog\n\nhaben. Dies ist ein Problem für das „reftable“-Backend, das diese Logs\n\nzusammen mit den Referenzen speichert. Folglich gibt es keine Möglichkeit\n\nmehr, herauszufinden, welche reflogs im Repository überhaupt existieren,\n\nwenn du das „reftable“ Format verwendest.\n\n\n\nDies ist jedoch nicht wirklich die Schuld des „reftable“-Formats, sondern\n\neine Lücke in den von Git bereitgestellten Tools. Um diese Lücke zu\n\nschließen, haben wir einen neuen Unterbefehl `list` für `git-reflog(1)`\n\neingeführt, mit dem du alle vorhandenen reflogs auflisten kannst:\n\n\n\n```shell\n\n\n$ git reflog list\n\n\nHEAD\n\n\nrefs/heads/main\n\n\n```\n\n\nDieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab\n\n\"Patrick Steinhardt\") geleitet.\n\n\n\n### Effizienteres Packen von Referenzen\n\n\n\nUm effizient zu bleiben, müssen Git-Repositorys regelmäßig gewartet werden.\n\nNormalerweise wird diese Wartung durch verschiedene Git-Befehle ausgelöst,\n\ndie Daten in die Git-Repositorys schreiben, indem sie den Befehl `git\n\nmaintenance run --auto` ausführen. Dieser Befehl optimiert nur die\n\nDatenstrukturen, die tatsächlich optimiert werden müssen, damit Git keine\n\nComputeressourcen verschwendet.\n\n\n\nEine Datenstruktur, die von der Git-Wartung optimiert wird, ist die\n\nReferenzdatenbank, die mit dem Befehl `git pack-refs --all` optimiert wird.\n\nFür das „files“-Backend bedeutet dies, dass alle Referenzen in die\n\n„packed-refs“-Datei gepackt und die losen Referenzen gelöscht werden,\n\nwährend für das „reftable“-Backend alle Tabellen in einer einzigen Tabelle\n\nzusammengefasst werden.\n\n\n\nIm Hinblick auf das „files“-Backend können wir nicht viel besser vorgehen.\n\nDa die gesamte „packed-refs“-Datei ohnehin neu geschrieben werden muss, ist\n\nes sinnvoll, alle losen Referenzen zu packen.\n\n\n\nFür das „reftable“-Backend ist dies jedoch suboptimal, da sich das\n\n„reftable“-Backend selbst optimiert. Jedes Mal, wenn Git eine neue Tabelle\n\nan das „reftable“-Backend anhängt, führt es eine automatische Komprimierung\n\ndurch und führt die Tabellen nach Bedarf zusammen. Deshalb sollte sich die\n\nReferenzdatenbank immer in einem gut optimierten Zustand befinden, sodass\n\ndas Zusammenführen aller Tabellen vergebliche Mühe wäre.\n\n\n\nIn Git v2.45.0 haben wir daher einen neuen Modus `git pack-refs --auto`\n\neingeführt, der das Referenz-Backend auffordert, nach Bedarf zu optimieren.\n\nWährend das „files“-Backend auch bei gesetztem `--auto`-Flag weiterhin\n\ngleich funktioniert, verwendet das „reftable“-Backend die gleichen\n\nHeuristiken, die es bereits für seine automatische Komprimierung verwendet.\n\nIn der Praxis sollte dies in den meisten Fällen kein Problem darstellen.\n\n\n\nAußerdem wurde `git maintenance run --auto` so angepasst, dass das Flag\n\n`--auto` an `git-pack-refs(1)` übergeben wird, um diesen neuen Modus\n\nstandardmäßig zu verwenden.\n\n\n\nDieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab\n\n\"Patrick Steinhardt\") geleitet. \n\n\n\n## Weiterlesen\n\n\n\nIn diesem Blogbeitrag ging es vor allem um das neue „reftable“-Backend, das\n\nes uns ermöglicht, in großen Repositorys mit vielen Referenzen besser zu\n\nskalieren, sowie um die zugehörigen Tools, die wir parallel dazu eingeführt\n\nhaben, damit es gut funktioniert. Natürlich hat die Git-Community mit dieser\n\nVersion auch verschiedene Leistungsverbesserungen, Fehlerbehebungen und\n\nkleinere Funktionen eingeführt. Diese kannst du in der [offiziellen\n\nVersionsankündigung](https://lore.kernel.org/git/xmqq8r0ww0sj.fsf@gitster.g/\n\n\"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","/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,154,159],{"text":150,"config":151},"Application Security Testing",{"href":152,"dataGaName":153,"dataGaLocation":43},"/solutions/application-security-testing/","Application security testing",{"text":155,"config":156},"Schutz der Software-Lieferkette",{"href":157,"dataGaLocation":43,"dataGaName":158},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":160,"config":161},"Software Compliance",{"href":162,"dataGaName":160,"dataGaLocation":43},"/solutions/software-compliance/",{"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},"/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},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.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},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":434,"config":439},{"src":440,"dataGaName":437,"dataGaLocation":432},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.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":462,"_id":464,"_type":29,"_source":31,"_file":465,"_stem":466,"_extension":34},"/shared/de-de/banner","GitLab Duo Agent Platform ist jetzt in öffentlicher Beta!",{"text":458,"config":459},"Beta testen",{"href":460,"dataGaName":461,"dataGaLocation":43},"/de-de/gitlab-duo/agent-platform/","duo banner",{"layout":463},"release","content:shared:de-de:banner.yml","shared/de-de/banner.yml","shared/de-de/banner",{"_path":468,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"data":469,"_id":672,"_type":29,"title":673,"_source":31,"_file":674,"_stem":675,"_extension":34},"/shared/de-de/main-footer",{"text":470,"source":471,"edit":477,"contribute":482,"config":487,"items":492,"minimal":664},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":472,"config":473},"Quelltext der Seite anzeigen",{"href":474,"dataGaName":475,"dataGaLocation":476},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":478,"config":479},"Diese Seite bearbeiten",{"href":480,"dataGaName":481,"dataGaLocation":476},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":483,"config":484},"Beteilige dich",{"href":485,"dataGaName":486,"dataGaLocation":476},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":488,"facebook":489,"youtube":490,"linkedin":491},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[493,516,571,600,634],{"title":61,"links":494,"subMenu":499},[495],{"text":496,"config":497},"DevSecOps-Plattform",{"href":70,"dataGaName":498,"dataGaLocation":476},"devsecops platform",[500],{"title":204,"links":501},[502,506,511],{"text":503,"config":504},"Tarife anzeigen",{"href":206,"dataGaName":505,"dataGaLocation":476},"view plans",{"text":507,"config":508},"Vorteile von Premium",{"href":509,"dataGaName":510,"dataGaLocation":476},"/de-de/pricing/premium/","why premium",{"text":512,"config":513},"Vorteile von Ultimate",{"href":514,"dataGaName":515,"dataGaLocation":476},"/de-de/pricing/ultimate/","why ultimate",{"title":517,"links":518},"Lösungen",[519,524,527,529,534,539,543,546,549,554,556,558,561,566],{"text":520,"config":521},"Digitale Transformation",{"href":522,"dataGaName":523,"dataGaLocation":476},"/de-de/topics/digital-transformation/","digital transformation",{"text":525,"config":526},"Sicherheit und Compliance",{"href":152,"dataGaName":153,"dataGaLocation":476},{"text":137,"config":528},{"href":120,"dataGaName":121,"dataGaLocation":476},{"text":530,"config":531},"Agile Entwicklung",{"href":532,"dataGaName":533,"dataGaLocation":476},"/de-de/solutions/agile-delivery/","agile delivery",{"text":535,"config":536},"Cloud-Transformation",{"href":537,"dataGaName":538,"dataGaLocation":476},"/de-de/topics/cloud-native/","cloud transformation",{"text":540,"config":541},"SCM",{"href":134,"dataGaName":542,"dataGaLocation":476},"source code management",{"text":124,"config":544},{"href":126,"dataGaName":545,"dataGaLocation":476},"continuous integration & delivery",{"text":176,"config":547},{"href":178,"dataGaName":548,"dataGaLocation":476},"value stream management",{"text":550,"config":551},"GitOps",{"href":552,"dataGaName":553,"dataGaLocation":476},"/de-de/solutions/gitops/","gitops",{"text":189,"config":555},{"href":191,"dataGaName":192,"dataGaLocation":476},{"text":194,"config":557},{"href":196,"dataGaName":197,"dataGaLocation":476},{"text":559,"config":560},"Öffentlicher Sektor",{"href":201,"dataGaName":202,"dataGaLocation":476},{"text":562,"config":563},"Bildungswesen",{"href":564,"dataGaName":565,"dataGaLocation":476},"/de-de/solutions/education/","education",{"text":567,"config":568},"Finanzdienstleistungen",{"href":569,"dataGaName":570,"dataGaLocation":476},"/de-de/solutions/finance/","financial services",{"title":209,"links":572},[573,575,577,579,582,584,586,588,590,592,594,596,598],{"text":221,"config":574},{"href":223,"dataGaName":224,"dataGaLocation":476},{"text":226,"config":576},{"href":228,"dataGaName":229,"dataGaLocation":476},{"text":231,"config":578},{"href":233,"dataGaName":234,"dataGaLocation":476},{"text":236,"config":580},{"href":238,"dataGaName":581,"dataGaLocation":476},"docs",{"text":259,"config":583},{"href":261,"dataGaName":5,"dataGaLocation":476},{"text":254,"config":585},{"href":256,"dataGaName":257,"dataGaLocation":476},{"text":263,"config":587},{"href":265,"dataGaName":266,"dataGaLocation":476},{"text":276,"config":589},{"href":278,"dataGaName":279,"dataGaLocation":476},{"text":268,"config":591},{"href":270,"dataGaName":271,"dataGaLocation":476},{"text":281,"config":593},{"href":283,"dataGaName":24,"dataGaLocation":476},{"text":285,"config":595},{"href":287,"dataGaName":288,"dataGaLocation":476},{"text":290,"config":597},{"href":292,"dataGaName":293,"dataGaLocation":476},{"text":295,"config":599},{"href":297,"dataGaName":298,"dataGaLocation":476},{"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":476},{"text":325,"config":605},{"href":327,"dataGaName":328,"dataGaLocation":476},{"text":333,"config":607},{"href":335,"dataGaName":336,"dataGaLocation":476},{"text":338,"config":609},{"href":340,"dataGaName":341,"dataGaLocation":476},{"text":343,"config":611},{"href":345,"dataGaName":346,"dataGaLocation":476},{"text":348,"config":613},{"href":350,"dataGaName":351,"dataGaLocation":476},{"text":615,"config":616},"Sustainability",{"href":617,"dataGaName":615,"dataGaLocation":476},"/sustainability/",{"text":619,"config":620},"Vielfalt, Inklusion und Zugehörigkeit",{"href":621,"dataGaName":622,"dataGaLocation":476},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":353,"config":624},{"href":355,"dataGaName":356,"dataGaLocation":476},{"text":363,"config":626},{"href":365,"dataGaName":366,"dataGaLocation":476},{"text":368,"config":628},{"href":370,"dataGaName":371,"dataGaLocation":476},{"text":630,"config":631},"Transparenzerklärung zu moderner Sklaverei",{"href":632,"dataGaName":633,"dataGaLocation":476},"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":476},{"text":382,"config":641},{"href":384,"dataGaName":385,"dataGaLocation":476},{"text":387,"config":643},{"href":389,"dataGaName":390,"dataGaLocation":476},{"text":645,"config":646},"Status",{"href":647,"dataGaName":648,"dataGaLocation":476},"https://status.gitlab.com/","status",{"text":650,"config":651},"Nutzungsbedingungen",{"href":652,"dataGaName":653,"dataGaLocation":476},"/terms/","terms of use",{"text":655,"config":656},"Datenschutzerklärung",{"href":657,"dataGaName":658,"dataGaLocation":476},"/de-de/privacy/","privacy statement",{"text":660,"config":661},"Cookie-Einstellungen",{"dataGaName":662,"dataGaLocation":476,"id":663,"isOneTrustButton":106},"cookie preferences","ot-sdk-btn",{"items":665},[666,668,670],{"text":650,"config":667},{"href":652,"dataGaName":653,"dataGaLocation":476},{"text":655,"config":669},{"href":657,"dataGaName":658,"dataGaLocation":476},{"text":660,"config":671},{"dataGaName":662,"dataGaLocation":476,"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",1759347819147]