[{"data":1,"prerenderedAt":817},["ShallowReactive",2],{"/de-de/blog/whats-new-in-git-2-49-0":3,"navigation-de-de":41,"banner-de-de":454,"footer-de-de":464,"blog-post-authors-de-de-Toon Claes":700,"blog-related-posts-de-de-whats-new-in-git-2-49-0":714,"blog-promotions-de-de":753,"next-steps-de-de":807},{"id":4,"title":5,"authorSlugs":6,"authors":8,"body":10,"category":11,"categorySlug":11,"config":12,"content":16,"date":20,"description":25,"extension":26,"externalUrl":27,"featured":14,"heroImage":17,"isFeatured":14,"meta":28,"navigation":14,"path":29,"publishedDate":20,"rawbody":30,"seo":31,"slug":13,"stem":37,"tagSlugs":38,"tags":39,"template":15,"updatedDate":19,"__hash__":40},"blogPosts/de-de/blog/whats-new-in-git-2-49-0.yml","Was gibt es Neues in Git 2.49.0?",[7],"toon-claes",[9],"Toon Claes","Das Git-Projekt hat kürzlich [Git 2.49.0](https://lore.kernel.org/git/xmqqfrjfilc8.fsf@gitster.g/)\nverö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\nDas erwartet dich:\n\n- [git-backfill(1) und die neue Pfad-API](#git-backfill(1)-and-the-new-path-walk-api)\n\n- [Einführung von zlib-ng](#introduction-of-zlib-ng)\n\n- [Weitere Iteration auf Meson](#continued-iteration-on-meson)\n\n- [Einstellung von .git/branches/ und .git/remotes/](#deprecation-of-.gitbranches%2F-and-.git%2Fremotes%2F)\n\n- [Rust-Datenbindungen für libgit](#rust-bindings-for-libgit)\n\n- [Neuer Namenshashing-Algorithmus](#new-name-hashing-algorithm)\n\n- [Promisor-Remote-Fähigkeit](#promisor-remote-capability)\n\n- [Flacher Klon mit `--revision`](#thin-clone-using---revision)\n\n## git-backfill(1) und die neue Pfad-API\n\nWenn du ein Git-Repository [mit `git-clone(1)` klonst](https://git-scm.com/docs/git-clone/de), kannst du die Option [`--filter`](https://git-scm.com/docs/git-clone/de#git-clone---filterltFilter-Spezifikationgt) übergeben. Mit dieser Option kannst du einen _partiellen Klon_ erstellen. In einem partiellen Klon sendet der Server nur eine Teilmenge der erreichbaren Objekte gemäß dem angegebenen Objektfilter. Wenn du beispielsweise einen Klon mit `--filter=blob:none` erstellst, werden keine Blobs (Dateiinhalte) vom Server abgerufen und es wird ein _blobless Klon_ erstellt.\n\nBlobless-Klone haben alle erreichbaren Commits und Verzeichnisse, aber keine Blobs. Wenn du einen Vorgang wie [`git-checkout(1)`](https://git-scm.com/docs/git-checkout) durchführst, lädt Git die fehlenden Blobs herunter, um den Vorgang abzuschließen. Bei einigen Operationen wie [`git-blame(1)`](https://git-scm.com/docs/git-blame) kann dies dazu führen, dass Objekte einzeln heruntergeladen werden, wodurch der Befehl deutlich langsamer wird.\n\nDiese Leistungseinbuße der Performance tritt auf, weil `git-blame(1)` den Commit-Verlauf durchsuchen muss, um herauszufinden, welche spezifischen Blobs benötigt werden. Dann muss es jeden fehlenden Blob einzeln beim Server anfragen.\n\nIn Git 2.49 wird der neue Unterbefehl `git-backfill(1)` eingeführt, der verwendet werden kann, um fehlende Blobs in einem partiellen Blobless-Klon herunterzuladen.\n\nIm Hintergrund nutzt der Befehl `git-backfill(1)` die neue Pfad-API, die sich davon unterscheidet, wie Git normalerweise über Commits iteriert. Anstatt die Commits einzeln durchzugehen und die mit jedem Commit verbundenen Strukturen und Blobs rekursiv zu besuchen, durchläuft die Path-walk API die Daten nach Pfaden. Für jeden Pfad fügt sie eine Liste der assoziierten Strukturobjekte zu einem Verarbeitungsstapel hinzu. Dieser Verarbeitungsstapel wird dann in der Reihenfolge „Depth-First“ verarbeitet. Anstatt also jedes Objekt im Commit `1` zu verarbeiten, bevor sie zu Commit `2` weitergeht, verarbeitet die API alle Versionen von Datei `A` in allen Commits, bevor sie zu Datei `B` weitergeht. Dieser Ansatz verbessert die Leistung in Szenarien, in denen die Gruppierung nach Pfad unerlässlich ist, erheblich.\n\nIch verdeutliche dies in diesem Beispiel, indem ich einen Blobless-Klon von [`gitlab-org/git`](https://gitlab.com/gitlab-org/git) erstelle:\n\n```shell\n$ git clone --filter=blob:none --bare --no-tags git@gitlab.com:gitlab-org/git.git\nCloning into bare repository 'git.git'...\nremote: Enumerating objects: 245904, done.\nremote: Counting objects: 100% (1736/1736), done.\nremote: Compressing objects: 100% (276/276), done.\nremote: Total 245904 (delta 1591), reused 1547 (delta 1459), pack-reused 244168 (from 1)\nReceiving objects: 100% (245904/245904), 59.35 MiB | 15.96 MiB/s, done.Resolving deltas: 100% (161482/161482), done.\n```\n\nOben verwenden wir `--bare`, um sicherzustellen, dass Git keine Blobs herunterladen muss, um den initialen Branch zu überprüfen. Wir können verifizieren, dass dieser Klon keine Blobs enthält:\n\n```sh\n$ git cat-file --batch-all-objects --batch-check='%(objecttype)' | sort | uniq -c\n  83977 commit\n  161927 tree\n```\n\nWenn du die Inhalte einer Datei im Repository anzeigen möchtest, muss Git sie herunterladen:\n\n```sh\n$ git cat-file -p HEAD:README.md\nremote: Enumerating objects: 1, done.\nremote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 1 (from 1)\nReceiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\n\n[![Build status](https://github.com/git/git/workflows/CI/badge.svg)](https://github.com/git/git/actions?query=branch%3Amaster+event%3Apush)\n\nGit - fast, scalable, distributed revision control system\n=========================================================\n\nGit is a fast, scalable, distributed revision control system with an\nunusually rich command set that provides both high-level operations\nand full access to internals.\n\n[snip]\n```\n\nWie du oben sehen kannst, kommuniziert Git zuerst mit dem Remote-Repository, um den Blob herunterzuladen, bevor er angezeigt werden kann.\n\nWenn du `git-blame(1)` für die Datei ausführen möchtest, muss es viel mehr herunterladen:\n\n```sh\n$ git blame HEAD README.md\nremote: Enumerating objects: 1, done.\nremote: Counting objects: 100% (1/1), done.\nremote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\nReceiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\nremote: Enumerating objects: 1, done.\nremote: Counting objects: 100% (1/1), done.\nremote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\nReceiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\nremote: Enumerating objects: 1, done.\nremote: Counting objects: 100% (1/1), done.\nremote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\nReceiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\nremote: Enumerating objects: 1, done.\n\n[snip]\n\ndf7375d772 README.md (Ævar Arnfjörð Bjarmason 2021-11-23 17:29:09 +0100  1) [![Build status](https://github.com/git/git/workflows/CI/badge.svg)](https://github.com/git/git/actions?query=branch%3Amaster+event%3Apush)\n5f7864663b README.md (Johannes Schindelin \t2019-01-29 06:19:32 -0800  2)\n28513c4f56 README.md (Matthieu Moy        \t2016-02-25 09:37:29 +0100  3) Git - fast, scalable, distributed revision control system\n28513c4f56 README.md (Matthieu Moy        \t2016-02-25 09:37:29 +0100  4) =========================================================\n556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  5)\n556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  6) Git is a fast, scalable, distributed revision control system with an\n556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  7) unusually rich command set that provides both high-level operations\n556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  8) and full access to internals.\n556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  9)\n\n[snip]\n```\n\nWir haben die Ausgabe abgeschnitten, aber du siehst, dass Git für jede Revision dieser Datei separat auf den Server zugreift. Das ist wirklich ineffizient. Mit `git-backfill(1)` können wir Git anweisen, alle Blobs herunterzuladen:\n\n```shell\n$ git backfill\nremote: Enumerating objects: 50711, done.\nremote: Counting objects: 100% (15438/15438), done.\nremote: Compressing objects: 100% (708/708), done.\nremote: Total 50711 (delta 15154), reused 14730 (delta 14730), pack-reused 35273 (from 1)\nReceiving objects: 100% (50711/50711), 11.62 MiB | 12.28 MiB/s, done.\nResolving deltas: 100% (49154/49154), done.\nremote: Enumerating objects: 50017, done.\nremote: Counting objects: 100% (10826/10826), done.\nremote: Compressing objects: 100% (634/634), done.\nremote: Total 50017 (delta 10580), reused 10192 (delta 10192), pack-reused 39191 (from 1)\nReceiving objects: 100% (50017/50017), 12.17 MiB | 12.33 MiB/s, done.\nResolving deltas: 100% (48301/48301), done.\nremote: Enumerating objects: 47303, done.\nremote: Counting objects: 100% (7311/7311), done.\nremote: Compressing objects: 100% (618/618), done.\nremote: Total 47303 (delta 7021), reused 6693 (delta 6693), pack-reused 39992 (from 1)\nReceiving objects: 100% (47303/47303), 40.84 MiB | 15.26 MiB/s, done.\nResolving deltas: 100% (43788/43788), done.\n```\n\nDadurch werden alle Blobs wieder aufgefüllt und der Blobless-Klon wird zu einem vollständigen Klon:\n\n```shell\n$ git cat-file --batch-all-objects --batch-check='%(objecttype)' | sort | uniq -c\n  148031 blob\n  83977 commit\n  161927 tree\n```\n\nDieses [Projekt](https://lore.kernel.org/git/pull.1820.v3.git.1738602667.gitgitgadget@gmail.com/) wurde von [Derrick Stolee](https://stolee.dev/) geleitet und mit [e565f37553](https://gitlab.com/gitlab-org/git/-/commit/e565f3755342caf1d21e22359eaf09ec11d8c0ae) zusammengeführt.\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## Einführung von zlib-ng\n\nAlle Objekte im Ordner `.git/` werden von Git mit [`zlib`](https://zlib.net/) komprimiert. `zlib` ist die Referenzimplementierung für das [RFC-1950-Format](https://datatracker.ietf.org/doc/html/rfc1950): ZLIB Compressed Data Format. `zlib` wurde 1995 entwickelt, hat eine lange Geschichte und ist unglaublich portabel, denn es unterstützt sogar viele Systeme, die älter als das Internet sind. Dank der breiten Unterstützung von Architekturen und Compilern ist es jedoch in seinen Fähigkeiten eingeschränkt.\n\nDer Fork [`zlib-ng`](https://github.com/zlib-ng/zlib-ng) wurde erstellt, um auf diese Einschränkungen einzugehen, denn `zlib-ng` ist für moderne Systeme optimiert. Dieser Fork verzichtet auf die Unterstützung von Legacy-Systemen und bietet stattdessen Patches für Intel-Optimierungen, einige Cloudflare-Optimierungen sowie mehrere kleinere Patches.\n\nDie Bibliothek `zlib-ng` selbst bietet einen Kompatibilitätslayer für `zlib`. Der Kompatibilitätslayer macht es möglich, dass `zlib-ng` ein Drop-in-Ersatz für `zlib` ist, ist jedoch nicht auf allen Linux-Distributionen verfügbar. In Git 2.49 gibt es folgende Neuerungen:\n\n- Ein Kompatibilitätslayer wurde zum Git-Projekt hinzugefügt.\n\n- Build-Optionen wurden sowohl zur Datei [`Makefile`](https://gitlab.com/gitlab-org/git/-/blob/b9d6f64393275b505937a8621a6cc4875adde8e0/Makefile#L186-187) als auch zur [Meson-Build-Datei](https://gitlab.com/gitlab-org/git/-/blob/b9d6f64393275b505937a8621a6cc4875adde8e0/meson.build#L795-811) hinzugefügt.\n\nMit diesen Ergänzungen kann man einfacher von der verbesserten Performance von `zlib-ng` profitieren.\n\nIn lokalen Benchmark konnte die Geschwindigkeit um rund 25 % gesteigert werden, wenn `zlib-ng` anstelle von `zlib` verwendet wurde. Wir sind dabei, diese Änderungen auch für GitLab.com auszurollen.\n\nWenn du von den Vorteilen von `zlib-ng` profitieren möchtest, überprüfe zuerst, ob Git auf deinem Gerät bereits `zlib-ng` verwendet, indem du `git version --build-options` ausführst:\n\n```shell\n$ git version --build-options\ngit version 2.47.1\ncpu: x86_64\nno commit associated with this build\nsizeof-long: 8\nsizeof-size_t: 8\nshell-path: /bin/sh\nlibcurl: 8.6.0\nOpenSSL: OpenSSL 3.2.2 4 Jun 2024\nzlib: 1.3.1.zlib-ng\n```\n\nWenn die letzte Zeile `zlib-ng` enthält, verwendet dein Git bereits die schnellere Variante von `zlib`. Wenn nicht, kannst du folgendermaßen vorgehen:\n\n- Bitte den/die Betreuer(in) des Git-Pakets, das du verwendest, die Unterstützung für `zlib-ng` hinzuzufügen; oder\n\n- Erstelle Git selbst aus der Quelle.\n\nDiese [Änderungen](https://gitlab.com/gitlab-org/git/-/commit/9d0e81e2ae3bd7f6d8a655be53c2396d7af3d2b0) wurden von [Patrick Steinhardt](https://gitlab.com/pks-gitlab) [eingeführt](https://lore.kernel.org/git/20250128-b4-pks-compat-drop-uncompress2-v4-0-129bc36ae8f5@pks.im/).\n\n## Weitere Iteration auf Meson\n\nIn unserem Artikel über die Git-Version 2.48 haben wir über [die Einführung des Meson-Build-Systems](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-48-0/#meson-build-system) gesprochen. [Meson](https://de.wikipedia.org/wiki/Meson_(Build-System)) ist ein Tool für die Build-Automatisierung, das vom Git-Projekt genutzt wird und irgendwann [Autoconf](https://de.wikipedia.org/wiki/GNU_Build_System#GNU_Autoconf), [CMake](https://de.wikipedia.org/wiki/CMake) und sogar [Make](https://de.wikipedia.org/wiki/Make) ersetzen könnte.\n\nIn diesem Release-Zyklus wurde weiter an der Nutzung von Meson gearbeitet und es wurden verschiedene fehlende Funktionen und Fixes zur Stabilisierung eingeführt:\n\n- Die [verbesserte Testabdeckung für CI](https://lore.kernel.org/git/20250122-b4-pks-meson-additions-v3-0-5a51eb5d3dcd@pks.im/) wurde in [72f1ddfbc9](https://gitlab.com/gitlab-org/git/-/commit/72f1ddfbc95b47c6011bb423e6947418d1d72709) zusammengeführt.\n  - [Einzelne Elemente für die Nutzung von Meson in `contrib/`](https://lore.kernel.org/git/20250219-b4-pks-meson-contrib-v2-0-1ba5d7fde0b9@pks.im/) wurden in [2a1530a953](https://gitlab.com/gitlab-org/git/-/commit/2a1530a953cc4d2ae62416db86c545c7ccb73ace) zusammengeführt.\n  - [Verschiedene Fixes und Verbesserungen für das Build-Verfahren basierend auf Meson](https://lore.kernel.org/git/20250226-b4-pks-meson-improvements-v3-0-60c77cf673ae@pks.im/) wurden in [ab09eddf60](https://gitlab.com/gitlab-org/git/-/commit/ab09eddf601501290b5c719574fbe6c02314631f) zusammengeführt.\n  - [Meson wurde auf die Erstellung von `git-subtree(1)` aufmerksam gemacht](https://lore.kernel.org/git/20250117-b4-pks-build-subtree-v1-0-03c2ed6cc42e@pks.im/), was in [3ddeb7f337](https://gitlab.com/gitlab-org/git/-/commit/3ddeb7f3373ae0e309d9df62ada24375afa456c7) zusammengeführt wurde.\n  - [Die Dokumentationsseite für die Einführung in Meson, um HTML zu erzeugen](https://lore.kernel.org/git/20241227-b4-pks-meson-docs-v2-0-f61e63edbfa1@pks.im/) wurde in [1b4e9a5f8b](https://gitlab.com/gitlab-org/git/-/commit/1b4e9a5f8b5f048972c21fe8acafe0404096f694) zusammengeführt.\n\nAll diese Bemühungen wurden von [Patrick Steinhardt](https://gitlab.com/pks-gitlab) durchgeführt.\n\n## Einstellung von .git/branches/ und .git/remotes/\n\nDu weißt wahrscheinlich, dass das Verzeichnis `.git` existiert und was es enthält. Hast du aber schon einmal von den Unterverzeichnissen `.git/branches/` und `.git/remotes/` gehört? Wie du vielleicht weißt, werden Referenzen auf Branches in `.git/refs/heads/` gespeichert. Wozu dienen also `.git/branches/` und `.git/remotes/`?\n\nBereits 2005 wurde [`.git/branches/`](https://git-scm.com/docs/git-fetch#_named_file_in_git_dirbranches) eingeführt, um Kurznamen für ein Remote zu speichern. Wenige Monate später wurden diese zu [`.git/remotes/`](https://git-scm.com/docs/git-fetch#_named_file_in_git_dirremotes) verschoben.\n\nIm Jahr [2006](https://lore.kernel.org/git/Pine.LNX.4.63.0604301520460.2646@wbgn013.biozentrum.uni-wuerzburg.de/) lernte [`git-config(1)`](https://git-scm.com/docs/git-config), [Remotes](https://git-scm.com/docs/git-config#Documentation/git-config.txt-remoteltnamegturl) zu speichern.\n\nDies wurde zur Standardmethode, um Remotes zu konfigurieren. 2011 wurden die Verzeichnisse `.git/branches/` and `.git/remotes/` als veraltet [dokumentiert](https://gitlab.com/git-scm/git/-/commit/3d3d282146e13f2d7f055ad056956fd8e5d7ed29#e615263aaf131d42be8b0d0888ebd3fec954c6c9_132_124) und nicht mehr in modernen Repositories verwendet.\n\nIm Jahr 2024 wurde das Dokument [BreakingChanges](https://git-scm.com/docs/BreakingChanges) angelegt, um grundlegende Änderungen für die nächste große Git-Version (v3.0) darzulegen. Diese Release ist zwar in nächster Zeit nicht geplant, doch in diesem Dokument werden Änderungen dokumentiert, die wahrscheinlich Teil dieser kommenden Release sind.\n\nIn [8ccc75c245](https://gitlab.com/git-scm/git/-/commit/8ccc75c2452b5814d2445d60d54266293ca48674) wurde die Verwendung der Verzeichnisse `.git/branches/` und `.git/remotes/` zu diesem Dokument hinzugefügt, wodurch sie offiziell als veraltet gelten und in Version Git 3.0 nicht mehr enthalten sein werden.\n\nVielen Dank an [Patrick Steinhardt](https://gitlab.com/pks-gitlab), der [diese Einstellung formalisiert hat](https://lore.kernel.org/git/20250122-pks-remote-branches-deprecation-v4-5-5cbf5b28afd5@pks.im/).\n\n## Rust-Datenbindungen für libgit\n\nBeim Kompilieren von Git wird die interne Bibliothek `libgit.a` erstellt. Diese Bibliothek enthält einige Kernfunktionen von Git.\n\nDiese Bibliothek ist (wie der Großteil von Git) zwar in C geschrieben, in Git 2.49 wurden jedoch Datenbindungen hinzugefügt, damit einige dieser Funktionen auch in Rust zur Verfügung stehen. Dazu wurden zwei neue Cargo-Pakete erstellt: `libgit-sys` und `libgit-rs`. Diese Pakete befinden sich im Unterverzeichnis [`contrib/`](https://gitlab.com/gitlab-org/git/-/tree/master/contrib) im Git-Quellbaum.\n\nEs ist [üblich](https://doc.rust-lang.org/cargo/reference/build-scripts.html#-sys-packages), eine Bibliothek in zwei Pakete zu unterteilen, wenn ein [Foreign Function Interface](https://en.wikipedia.org/wiki/Foreign_function_interface) verwendet wird.\n\nDas Paket `libgit-sys` bietet die reine Schnittstelle zu C-Funktionen und verknüpft zur nativen Bibliothek `libgit.a`. Das Paket `libgit-rs` bietet eine Schnittstelle zu den Funktionen in `libgit-sys` mit einem für Rust typischen Gefühl.\n\nBisher ist die Funktionalität in diesen Rust-Paketen sehr begrenzt. Es wird nur eine Schnittstelle zur Interaktion mit `git-config(1)` geboten.\n\nDiese Initiative wurde von [Josh Steadmon](https://lore.kernel.org/git/8793ff64a7f6c4c04dd03b71162a85849feda944.1738187176.git.steadmon@google.com/) geleitet und mit [a4af0b6288](https://gitlab.com/gitlab-org/git/-/commit/a4af0b6288e25eb327ae9018cee09def9e43f1cd) zusammengeführt.\n\n## Neuer Namenshashing-Algorithmus\n\nDie Git-Objektdatenbank in `.git/` speichert die meisten ihrer Daten in Paketierungsdateien. Packfiles wurden verwendet, um Objekte über Kabel zwischen dem Git-Server und dem Client zu übertragen.\n\nAlles über das Format erfährst du unter [`gitformat-pack(5)`](https://git-scm.com/docs/gitformat-pack). Ein wichtiger Aspekt der Paketierungsdateien ist die Delta-Komprimierung. Bei der Delta-Komprimierung wird nicht jedes Objekt so gespeichert, wie es ist, sondern manche Objekte werden als _delta_ einer anderen _base_ gespeichert. Anstatt also den gesamten Inhalt der Objekte zu speichern, werden die Änderungen im Vergleich zu einem anderen Objekt gespeichert.\n\nOhne auf die Details einzugehen, wie diese Deltas berechnet oder gespeichert werden, kannst du dir vorstellen, dass es wichtig ist, sehr ähnliche Dateien zu gruppieren. In v2.48 und früheren Versionen verglich Git die letzten 16 Zeichen der Pfadnamen, um festzustellen, ob Blobs ähnlich sind. Dieser Algorithmus wird Version `1` genannt.\n\nAb Git 2.49 ist Version `2` verfügbar. Dies ist eine Iteration von Version `1`, jedoch so verändert, dass die Auswirkungen des übergeordneten Verzeichnisses reduziert werden. Du kannst die Version des Namenshashing-Algorithmus, die du verwenden möchtest, mit der Option `--name-hash-version` von [`git-repack(1)`](https://git-scm.com/docs/git-repack) festlegen.\n\n[Derrick Stolee](https://stolee.dev/), der dieses Projekt vorangetrieben hat, verglich die resultierende Größe der Paketierungsdateien, nachdem er `git repack -adf --name-hash-version=\u003Cn>` ausgeführt hatte:\n\n| Repository                                          \t| Größe Version 1   | Größe Version 2 |\n|---------------------------------------------------|-----------|---------|\n| [fluentui](https://github.com/microsoft/fluentui) | 440 MB \t| 161 MB   |\n| Repository B                                        \t| 6.248 MB   | 856 MB   |\n| Repository C                                        \t| 37.278 MB  | 6.921 MB |\n| Repository D                                        \t| 131.204 MB | 7.463 MB |\n\nWeitere Details findest du im [Patch-Set](https://lore.kernel.org/git/pull.1823.v4.git.1738004554.gitgitgadget@gmail.com/), das in [aae91a86fb](https://gitlab.com/gitlab-org/git/-/commit/aae91a86fb2a71ff89a71b63ccec3a947b26ca51) zusammengeführt wurde.\n\n## Promisor-Remote-Fähigkeit\n\nEs ist bekannt, dass Git nicht gut mit großen Dateien umgehen kann. Es gibt einige Lösungen für dieses Problem wie [Git LFS](https://git-lfs.com/), die jedoch immer noch Mängel aufweisen. Einige davon sind Folgende:\n\n- Mit Git LFS muss der/die Benutzer(in) konfigurieren, welche Dateien in den LFS kommen sollen. Der Server hat keine Kontrolle darüber und muss alle Dateien bereitstellen.\n\n- Wenn eine Datei ins Repository committet wird, gibt es keine Möglichkeit, sie wieder herauszuholen, ohne den Verlauf neu zu schreiben. Das ist vor allem bei großen Dateien ärgerlich, da sie dadurch für immer dort festhängen.\n\n- Benutzer(innen) können nicht ändern, welche Dateien im Git LFS abgelegt werden sollen.\n\n- Es ist schwierig, ein Tool wie Git LFS richtig einzurichten, den Umgang damit zu erlernen und es zu nutzen.\n\nSeit einiger Zeit verfügt Git über das Konzept der Promisor Remotes. Diese Funktion kann für große Dateien genutzt werden und wurde in Git 2.49 noch einen Schritt weiterentwickelt.\n\nDie Idee hinter der neuen Promisor-Remote-Fähigkeit ist relativ einfach: Anstatt alle Objekte selbst zu senden, kann ein Git-Server dem Git-Client sagen: „Lade diese Objekte von _XYZ_ herunter.“ _XYZ_ ist der Promisor Remote.\n\nGit 2.49 ermöglicht es dem Server, die Informationen des Promisor Remote an den Client weiterzugeben. Diese Änderung ist eine Erweiterung von [`gitprotocol-v2`](https://git-scm.com/docs/gitprotocol-v2). Während der Server und der Client Daten hin und her übertragen, kann der Server Namen und URLs der Promisor Remotes senden, die er kennt.\n\nDerzeit verwendet der Client die Promisor-Remote-Infos, die er vom Server während des Klonens erhält, nicht, sodass weiterhin alle Objekte vom Remote zu dem Klon übermittelt werden, von dem aus der Vorgang initiiert wurde. Wir planen, diese Funktion weiter zu verbessern, sodass die Promisor-Remote-Info vom Server genutzt werden kann und die Funktion benutzerfreundlicher wird.\n\nDieses [Patch-Set](https://lore.kernel.org/git/20250218113204.2847463-1-christian.couder@gmail.com/) wurde von [Christian Couder](https://gitlab.com/chriscool) eingereicht und mit [2c6fd30198](https://gitlab.com/gitlab-org/git/-/commit/2c6fd30198187c928cbf927802556908c381799c) zusammengeführt.\n\n## Flacher Klon mit `--revision`\n\nDie neue Option `--revision` wurde zu [`git-clone(1)`](https://git-scm.com/docs/git-clone/de) hinzugefügt. Auf diese Weise kannst du einen flachen Klon eines Repository erstellen, der nur den Verlauf der jeweiligen Revision enthält. Die Option ist ähnlich wie `--branch`, akzeptiert aber einen ref-Namen (wie `refs/heads/main`, `refs/tags/v1.0` und `refs/merge-requests/123`) oder eine hexadezimale Commit-Objekt-ID. Der Unterschied zu `--branch` ist, dass kein Tracking-Branch erstellt und `HEAD` abgetrennt wird. Diese Option ist also nicht geeignet, wenn du wieder zu diesem Branch beitragen möchtest.\n\nDu kannst `--revision` in Kombination mit `--depth` verwenden, um einen minimalen Klon zu erstellen. Ein vorgeschlagener Anwendungsfall ist das automatisierte Testen. Wenn du ein CI-System hast, bei dem ein Branch (oder eine beliebige Referenz) ausgecheckt werden muss, um autonome Tests am Quellcode durchzuführen, brauchst du nur einen minimalen Klon.\n\nDiese [Änderung](https://gitlab.com/gitlab-org/git/-/commit/5785d9143bcb3ef19452a83bc2e870ff3d5ed95a) wurde von [Toon Claes](https://gitlab.com/toon) [vorangetrieben](https://lore.kernel.org/git/20250206-toon-clone-refs-v7-0-4622b7392202@iotcl.com/).\n\n# Mehr erfahren\n\n- [Was gibt es Neues in Git 2.48.0?](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-48-0/)\n\n- [Was gibt es Neues neu in Git 2.47.0?](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-47-0/)\n\n- [Was gibt es Neues in Git 2.46.0?](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-46-0/)","open-source",{"slug":13,"featured":14,"template":15},"whats-new-in-git-2-49-0",true,"BlogPost",{"heroImage":17,"body":10,"authors":18,"updatedDate":19,"date":20,"title":5,"tags":21,"description":25,"category":11},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png",[9],"2025-04-08","2025-03-14",[22,23,24],"community","open source","git","Erfahre mehr über die neueste Version von Git, einschließlich verbesserter Leistung dank zlib-ng, einem neuen Algorithmus zum Hashing von Namen und git-backfill(1).","yml",null,{},"/de-de/blog/whats-new-in-git-2-49-0","seo:\n  ogTitle: Was gibt es Neues in Git 2.49.0?\n  ogImage: https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png\n  ogDescription: Erfahre mehr über die neueste Version von Git, einschließlich\n    verbesserter Leistung dank zlib-ng, einem neuen Algorithmus zum Hashing von\n    Namen und git-backfill(1).\n  ogSiteName: https://about.gitlab.com\n  noIndex: false\n  ogType: article\n  ogUrl: https://about.gitlab.com/blog/whats-new-in-git-2-49-0\n  title: Was gibt es Neues in Git 2.49.0?\n  canonicalUrls: https://about.gitlab.com/blog/whats-new-in-git-2-49-0\n  description: Erfahre mehr über die neueste Version von Git, einschließlich\n    verbesserter Leistung dank zlib-ng, einem neuen Algorithmus zum Hashing von\n    Namen und git-backfill(1).\ncontent:\n  heroImage: https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png\n  body: >-\n    Das Git-Projekt hat kürzlich\n    [Git 2.49.0](https://lore.kernel.org/git/xmqqfrjfilc8.fsf@gitster.g/)\n\n    veröffentlicht. Werfen wir einen Blick auf die Highlights dieser Version,\n    die Beiträge des Git-Teams von GitLab und der gesamten Git-Community\n    enthält.\n\n\n    Das erwartet dich:\n\n\n    - [git-backfill(1) und die neue\n    Pfad-API](#git-backfill(1)-and-the-new-path-walk-api)\n\n\n    - [Einführung von zlib-ng](#introduction-of-zlib-ng)\n\n\n    - [Weitere Iteration auf Meson](#continued-iteration-on-meson)\n\n\n    - [Einstellung von .git/branches/ und\n    .git/remotes/](#deprecation-of-.gitbranches%2F-and-.git%2Fremotes%2F)\n\n\n    - [Rust-Datenbindungen für libgit](#rust-bindings-for-libgit)\n\n\n    - [Neuer Namenshashing-Algorithmus](#new-name-hashing-algorithm)\n\n\n    - [Promisor-Remote-Fähigkeit](#promisor-remote-capability)\n\n\n    - [Flacher Klon mit `--revision`](#thin-clone-using---revision)\n\n\n    ## git-backfill(1) und die neue Pfad-API\n\n\n    Wenn du ein Git-Repository [mit `git-clone(1)`\n    klonst](https://git-scm.com/docs/git-clone/de), kannst du die Option\n    [`--filter`](https://git-scm.com/docs/git-clone/de#git-clone---filterltFilter-Spezifikationgt)\n    übergeben. Mit dieser Option kannst du einen _partiellen Klon_ erstellen. In\n    einem partiellen Klon sendet der Server nur eine Teilmenge der erreichbaren\n    Objekte gemäß dem angegebenen Objektfilter. Wenn du beispielsweise einen\n    Klon mit `--filter=blob:none` erstellst, werden keine Blobs (Dateiinhalte)\n    vom Server abgerufen und es wird ein _blobless Klon_ erstellt.\n\n\n    Blobless-Klone haben alle erreichbaren Commits und Verzeichnisse, aber keine\n    Blobs. Wenn du einen Vorgang wie\n    [`git-checkout(1)`](https://git-scm.com/docs/git-checkout) durchführst, lädt\n    Git die fehlenden Blobs herunter, um den Vorgang abzuschließen. Bei einigen\n    Operationen wie [`git-blame(1)`](https://git-scm.com/docs/git-blame) kann\n    dies dazu führen, dass Objekte einzeln heruntergeladen werden, wodurch der\n    Befehl deutlich langsamer wird.\n\n\n    Diese Leistungseinbuße der Performance tritt auf, weil `git-blame(1)` den\n    Commit-Verlauf durchsuchen muss, um herauszufinden, welche spezifischen\n    Blobs benötigt werden. Dann muss es jeden fehlenden Blob einzeln beim Server\n    anfragen.\n\n\n    In Git 2.49 wird der neue Unterbefehl `git-backfill(1)` eingeführt, der\n    verwendet werden kann, um fehlende Blobs in einem partiellen Blobless-Klon\n    herunterzuladen.\n\n\n    Im Hintergrund nutzt der Befehl `git-backfill(1)` die neue Pfad-API, die\n    sich davon unterscheidet, wie Git normalerweise über Commits iteriert.\n    Anstatt die Commits einzeln durchzugehen und die mit jedem Commit\n    verbundenen Strukturen und Blobs rekursiv zu besuchen, durchläuft die\n    Path-walk API die Daten nach Pfaden. Für jeden Pfad fügt sie eine Liste der\n    assoziierten Strukturobjekte zu einem Verarbeitungsstapel hinzu. Dieser\n    Verarbeitungsstapel wird dann in der Reihenfolge „Depth-First“ verarbeitet.\n    Anstatt also jedes Objekt im Commit `1` zu verarbeiten, bevor sie zu Commit\n    `2` weitergeht, verarbeitet die API alle Versionen von Datei `A` in allen\n    Commits, bevor sie zu Datei `B` weitergeht. Dieser Ansatz verbessert die\n    Leistung in Szenarien, in denen die Gruppierung nach Pfad unerlässlich ist,\n    erheblich.\n\n\n    Ich verdeutliche dies in diesem Beispiel, indem ich einen Blobless-Klon von\n    [`gitlab-org/git`](https://gitlab.com/gitlab-org/git) erstelle:\n\n\n    ```shell\n\n    $ git clone --filter=blob:none --bare --no-tags\n    git@gitlab.com:gitlab-org/git.git\n\n    Cloning into bare repository 'git.git'...\n\n    remote: Enumerating objects: 245904, done.\n\n    remote: Counting objects: 100% (1736/1736), done.\n\n    remote: Compressing objects: 100% (276/276), done.\n\n    remote: Total 245904 (delta 1591), reused 1547 (delta 1459), pack-reused\n    244168 (from 1)\n\n    Receiving objects: 100% (245904/245904), 59.35 MiB | 15.96 MiB/s,\n    done.Resolving deltas: 100% (161482/161482), done.\n\n    ```\n\n\n    Oben verwenden wir `--bare`, um sicherzustellen, dass Git keine Blobs\n    herunterladen muss, um den initialen Branch zu überprüfen. Wir können\n    verifizieren, dass dieser Klon keine Blobs enthält:\n\n\n    ```sh\n\n    $ git cat-file --batch-all-objects --batch-check='%(objecttype)' | sort |\n    uniq -c\n      83977 commit\n      161927 tree\n    ```\n\n\n    Wenn du die Inhalte einer Datei im Repository anzeigen möchtest, muss Git\n    sie herunterladen:\n\n\n    ```sh\n\n    $ git cat-file -p HEAD:README.md\n\n    remote: Enumerating objects: 1, done.\n\n    remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 1 (from 1)\n\n    Receiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\n\n\n    [![Build\n    status](https://github.com/git/git/workflows/CI/badge.svg)](https://github.com/git/git/actions?query=branch%3Amaster+event%3Apush)\n\n\n    Git - fast, scalable, distributed revision control system\n\n    =========================================================\n\n\n    Git is a fast, scalable, distributed revision control system with an\n\n    unusually rich command set that provides both high-level operations\n\n    and full access to internals.\n\n\n    [snip]\n\n    ```\n\n\n    Wie du oben sehen kannst, kommuniziert Git zuerst mit dem Remote-Repository,\n    um den Blob herunterzuladen, bevor er angezeigt werden kann.\n\n\n    Wenn du `git-blame(1)` für die Datei ausführen möchtest, muss es viel mehr\n    herunterladen:\n\n\n    ```sh\n\n    $ git blame HEAD README.md\n\n    remote: Enumerating objects: 1, done.\n\n    remote: Counting objects: 100% (1/1), done.\n\n    remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\n\n    Receiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\n\n    remote: Enumerating objects: 1, done.\n\n    remote: Counting objects: 100% (1/1), done.\n\n    remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\n\n    Receiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\n\n    remote: Enumerating objects: 1, done.\n\n    remote: Counting objects: 100% (1/1), done.\n\n    remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)\n\n    Receiving objects: 100% (1/1), 1.64 KiB | 1.64 MiB/s, done.\n\n    remote: Enumerating objects: 1, done.\n\n\n    [snip]\n\n\n    df7375d772 README.md (Ævar Arnfjörð Bjarmason 2021-11-23 17:29:09 +0100  1)\n    [![Build\n    status](https://github.com/git/git/workflows/CI/badge.svg)](https://github.com/git/git/actions?query=branch%3Amaster+event%3Apush)\n\n    5f7864663b README.md (Johannes Schindelin \t2019-01-29 06:19:32 -0800  2)\n\n    28513c4f56 README.md (Matthieu Moy        \t2016-02-25 09:37:29 +0100  3) Git\n    - fast, scalable, distributed revision control system\n\n    28513c4f56 README.md (Matthieu Moy        \t2016-02-25 09:37:29 +0100  4)\n    =========================================================\n\n    556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  5)\n\n    556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  6) Git is\n    a fast, scalable, distributed revision control system with an\n\n    556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  7)\n    unusually rich command set that provides both high-level operations\n\n    556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  8) and\n    full access to internals.\n\n    556b6600b2 README\t(Nicolas Pitre       \t2007-01-17 13:04:39 -0500  9)\n\n\n    [snip]\n\n    ```\n\n\n    Wir haben die Ausgabe abgeschnitten, aber du siehst, dass Git für jede\n    Revision dieser Datei separat auf den Server zugreift. Das ist wirklich\n    ineffizient. Mit `git-backfill(1)` können wir Git anweisen, alle Blobs\n    herunterzuladen:\n\n\n    ```shell\n\n    $ git backfill\n\n    remote: Enumerating objects: 50711, done.\n\n    remote: Counting objects: 100% (15438/15438), done.\n\n    remote: Compressing objects: 100% (708/708), done.\n\n    remote: Total 50711 (delta 15154), reused 14730 (delta 14730), pack-reused\n    35273 (from 1)\n\n    Receiving objects: 100% (50711/50711), 11.62 MiB | 12.28 MiB/s, done.\n\n    Resolving deltas: 100% (49154/49154), done.\n\n    remote: Enumerating objects: 50017, done.\n\n    remote: Counting objects: 100% (10826/10826), done.\n\n    remote: Compressing objects: 100% (634/634), done.\n\n    remote: Total 50017 (delta 10580), reused 10192 (delta 10192), pack-reused\n    39191 (from 1)\n\n    Receiving objects: 100% (50017/50017), 12.17 MiB | 12.33 MiB/s, done.\n\n    Resolving deltas: 100% (48301/48301), done.\n\n    remote: Enumerating objects: 47303, done.\n\n    remote: Counting objects: 100% (7311/7311), done.\n\n    remote: Compressing objects: 100% (618/618), done.\n\n    remote: Total 47303 (delta 7021), reused 6693 (delta 6693), pack-reused\n    39992 (from 1)\n\n    Receiving objects: 100% (47303/47303), 40.84 MiB | 15.26 MiB/s, done.\n\n    Resolving deltas: 100% (43788/43788), done.\n\n    ```\n\n\n    Dadurch werden alle Blobs wieder aufgefüllt und der Blobless-Klon wird zu\n    einem vollständigen Klon:\n\n\n    ```shell\n\n    $ git cat-file --batch-all-objects --batch-check='%(objecttype)' | sort |\n    uniq -c\n      148031 blob\n      83977 commit\n      161927 tree\n    ```\n\n\n    Dieses\n    [Projekt](https://lore.kernel.org/git/pull.1820.v3.git.1738602667.gitgitgadget@gmail.com/)\n    wurde von [Derrick Stolee](https://stolee.dev/) geleitet und mit\n    [e565f37553](https://gitlab.com/gitlab-org/git/-/commit/e565f3755342caf1d21e22359eaf09ec11d8c0ae)\n    zusammengeführt.\n\n\n    > **Über 6,4 Mio. Builds pro Monat: So transformiert Siemens seine\n    Softwareentwicklung mit GitLab** Über 40.000 Entwickler(innen) bei Siemens\n    nutzen GitLab, um weltweit zusammenzuarbeiten und jeden Monat mehr als 6,4\n    Millionen Software-Versionen automatisch bereitzustellen. Erfahre, wie eine\n    offene DevOps-Kultur und eine zentrale Plattform die Effizienz und\n    Sicherheit steigern. [Erfolgsstory\n    lesen](https://about.gitlab.com/de-de/customers/siemens/)\n\n\n    ## Einführung von zlib-ng\n\n\n    Alle Objekte im Ordner `.git/` werden von Git mit\n    [`zlib`](https://zlib.net/) komprimiert. `zlib` ist die\n    Referenzimplementierung für das\n    [RFC-1950-Format](https://datatracker.ietf.org/doc/html/rfc1950): ZLIB\n    Compressed Data Format. `zlib` wurde 1995 entwickelt, hat eine lange\n    Geschichte und ist unglaublich portabel, denn es unterstützt sogar viele\n    Systeme, die älter als das Internet sind. Dank der breiten Unterstützung von\n    Architekturen und Compilern ist es jedoch in seinen Fähigkeiten\n    eingeschränkt.\n\n\n    Der Fork [`zlib-ng`](https://github.com/zlib-ng/zlib-ng) wurde erstellt, um\n    auf diese Einschränkungen einzugehen, denn `zlib-ng` ist für moderne Systeme\n    optimiert. Dieser Fork verzichtet auf die Unterstützung von Legacy-Systemen\n    und bietet stattdessen Patches für Intel-Optimierungen, einige\n    Cloudflare-Optimierungen sowie mehrere kleinere Patches.\n\n\n    Die Bibliothek `zlib-ng` selbst bietet einen Kompatibilitätslayer für\n    `zlib`. Der Kompatibilitätslayer macht es möglich, dass `zlib-ng` ein\n    Drop-in-Ersatz für `zlib` ist, ist jedoch nicht auf allen\n    Linux-Distributionen verfügbar. In Git 2.49 gibt es folgende Neuerungen:\n\n\n    - Ein Kompatibilitätslayer wurde zum Git-Projekt hinzugefügt.\n\n\n    - Build-Optionen wurden sowohl zur Datei\n    [`Makefile`](https://gitlab.com/gitlab-org/git/-/blob/b9d6f64393275b505937a8621a6cc4875adde8e0/Makefile#L186-187)\n    als auch zur\n    [Meson-Build-Datei](https://gitlab.com/gitlab-org/git/-/blob/b9d6f64393275b505937a8621a6cc4875adde8e0/meson.build#L795-811)\n    hinzugefügt.\n\n\n    Mit diesen Ergänzungen kann man einfacher von der verbesserten Performance\n    von `zlib-ng` profitieren.\n\n\n    In lokalen Benchmark konnte die Geschwindigkeit um rund 25 % gesteigert\n    werden, wenn `zlib-ng` anstelle von `zlib` verwendet wurde. Wir sind dabei,\n    diese Änderungen auch für GitLab.com auszurollen.\n\n\n    Wenn du von den Vorteilen von `zlib-ng` profitieren möchtest, überprüfe\n    zuerst, ob Git auf deinem Gerät bereits `zlib-ng` verwendet, indem du `git\n    version --build-options` ausführst:\n\n\n    ```shell\n\n    $ git version --build-options\n\n    git version 2.47.1\n\n    cpu: x86_64\n\n    no commit associated with this build\n\n    sizeof-long: 8\n\n    sizeof-size_t: 8\n\n    shell-path: /bin/sh\n\n    libcurl: 8.6.0\n\n    OpenSSL: OpenSSL 3.2.2 4 Jun 2024\n\n    zlib: 1.3.1.zlib-ng\n\n    ```\n\n\n    Wenn die letzte Zeile `zlib-ng` enthält, verwendet dein Git bereits die\n    schnellere Variante von `zlib`. Wenn nicht, kannst du folgendermaßen\n    vorgehen:\n\n\n    - Bitte den/die Betreuer(in) des Git-Pakets, das du verwendest, die\n    Unterstützung für `zlib-ng` hinzuzufügen; oder\n\n\n    - Erstelle Git selbst aus der Quelle.\n\n\n    Diese\n    [Änderungen](https://gitlab.com/gitlab-org/git/-/commit/9d0e81e2ae3bd7f6d8a655be53c2396d7af3d2b0)\n    wurden von [Patrick Steinhardt](https://gitlab.com/pks-gitlab)\n    [eingeführt](https://lore.kernel.org/git/20250128-b4-pks-compat-drop-uncompress2-v4-0-129bc36ae8f5@pks.im/).\n\n\n    ## Weitere Iteration auf Meson\n\n\n    In unserem Artikel über die Git-Version 2.48 haben wir über [die Einführung\n    des\n    Meson-Build-Systems](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-48-0/#meson-build-system)\n    gesprochen. [Meson](https://de.wikipedia.org/wiki/Meson_(Build-System)) ist\n    ein Tool für die Build-Automatisierung, das vom Git-Projekt genutzt wird und\n    irgendwann\n    [Autoconf](https://de.wikipedia.org/wiki/GNU_Build_System#GNU_Autoconf),\n    [CMake](https://de.wikipedia.org/wiki/CMake) und sogar\n    [Make](https://de.wikipedia.org/wiki/Make) ersetzen könnte.\n\n\n    In diesem Release-Zyklus wurde weiter an der Nutzung von Meson gearbeitet\n    und es wurden verschiedene fehlende Funktionen und Fixes zur Stabilisierung\n    eingeführt:\n\n\n    - Die [verbesserte Testabdeckung für\n    CI](https://lore.kernel.org/git/20250122-b4-pks-meson-additions-v3-0-5a51eb5d3dcd@pks.im/)\n    wurde in\n    [72f1ddfbc9](https://gitlab.com/gitlab-org/git/-/commit/72f1ddfbc95b47c6011bb423e6947418d1d72709)\n    zusammengeführt.\n      - [Einzelne Elemente für die Nutzung von Meson in `contrib/`](https://lore.kernel.org/git/20250219-b4-pks-meson-contrib-v2-0-1ba5d7fde0b9@pks.im/) wurden in [2a1530a953](https://gitlab.com/gitlab-org/git/-/commit/2a1530a953cc4d2ae62416db86c545c7ccb73ace) zusammengeführt.\n      - [Verschiedene Fixes und Verbesserungen für das Build-Verfahren basierend auf Meson](https://lore.kernel.org/git/20250226-b4-pks-meson-improvements-v3-0-60c77cf673ae@pks.im/) wurden in [ab09eddf60](https://gitlab.com/gitlab-org/git/-/commit/ab09eddf601501290b5c719574fbe6c02314631f) zusammengeführt.\n      - [Meson wurde auf die Erstellung von `git-subtree(1)` aufmerksam gemacht](https://lore.kernel.org/git/20250117-b4-pks-build-subtree-v1-0-03c2ed6cc42e@pks.im/), was in [3ddeb7f337](https://gitlab.com/gitlab-org/git/-/commit/3ddeb7f3373ae0e309d9df62ada24375afa456c7) zusammengeführt wurde.\n      - [Die Dokumentationsseite für die Einführung in Meson, um HTML zu erzeugen](https://lore.kernel.org/git/20241227-b4-pks-meson-docs-v2-0-f61e63edbfa1@pks.im/) wurde in [1b4e9a5f8b](https://gitlab.com/gitlab-org/git/-/commit/1b4e9a5f8b5f048972c21fe8acafe0404096f694) zusammengeführt.\n\n    All diese Bemühungen wurden von [Patrick\n    Steinhardt](https://gitlab.com/pks-gitlab) durchgeführt.\n\n\n    ## Einstellung von .git/branches/ und .git/remotes/\n\n\n    Du weißt wahrscheinlich, dass das Verzeichnis `.git` existiert und was es\n    enthält. Hast du aber schon einmal von den Unterverzeichnissen\n    `.git/branches/` und `.git/remotes/` gehört? Wie du vielleicht weißt, werden\n    Referenzen auf Branches in `.git/refs/heads/` gespeichert. Wozu dienen also\n    `.git/branches/` und `.git/remotes/`?\n\n\n    Bereits 2005 wurde\n    [`.git/branches/`](https://git-scm.com/docs/git-fetch#_named_file_in_git_dirbranches)\n    eingeführt, um Kurznamen für ein Remote zu speichern. Wenige Monate später\n    wurden diese zu\n    [`.git/remotes/`](https://git-scm.com/docs/git-fetch#_named_file_in_git_dirremotes)\n    verschoben.\n\n\n    Im Jahr\n    [2006](https://lore.kernel.org/git/Pine.LNX.4.63.0604301520460.2646@wbgn013.biozentrum.uni-wuerzburg.de/)\n    lernte [`git-config(1)`](https://git-scm.com/docs/git-config),\n    [Remotes](https://git-scm.com/docs/git-config#Documentation/git-config.txt-remoteltnamegturl)\n    zu speichern.\n\n\n    Dies wurde zur Standardmethode, um Remotes zu konfigurieren. 2011 wurden die\n    Verzeichnisse `.git/branches/` and `.git/remotes/` als veraltet\n    [dokumentiert](https://gitlab.com/git-scm/git/-/commit/3d3d282146e13f2d7f055ad056956fd8e5d7ed29#e615263aaf131d42be8b0d0888ebd3fec954c6c9_132_124)\n    und nicht mehr in modernen Repositories verwendet.\n\n\n    Im Jahr 2024 wurde das Dokument\n    [BreakingChanges](https://git-scm.com/docs/BreakingChanges) angelegt, um\n    grundlegende Änderungen für die nächste große Git-Version (v3.0) darzulegen.\n    Diese Release ist zwar in nächster Zeit nicht geplant, doch in diesem\n    Dokument werden Änderungen dokumentiert, die wahrscheinlich Teil dieser\n    kommenden Release sind.\n\n\n    In\n    [8ccc75c245](https://gitlab.com/git-scm/git/-/commit/8ccc75c2452b5814d2445d60d54266293ca48674)\n    wurde die Verwendung der Verzeichnisse `.git/branches/` und `.git/remotes/`\n    zu diesem Dokument hinzugefügt, wodurch sie offiziell als veraltet gelten\n    und in Version Git 3.0 nicht mehr enthalten sein werden.\n\n\n    Vielen Dank an [Patrick Steinhardt](https://gitlab.com/pks-gitlab), der\n    [diese Einstellung formalisiert\n    hat](https://lore.kernel.org/git/20250122-pks-remote-branches-deprecation-v4-5-5cbf5b28afd5@pks.im/).\n\n\n    ## Rust-Datenbindungen für libgit\n\n\n    Beim Kompilieren von Git wird die interne Bibliothek `libgit.a` erstellt.\n    Diese Bibliothek enthält einige Kernfunktionen von Git.\n\n\n    Diese Bibliothek ist (wie der Großteil von Git) zwar in C geschrieben, in\n    Git 2.49 wurden jedoch Datenbindungen hinzugefügt, damit einige dieser\n    Funktionen auch in Rust zur Verfügung stehen. Dazu wurden zwei neue\n    Cargo-Pakete erstellt: `libgit-sys` und `libgit-rs`. Diese Pakete befinden\n    sich im Unterverzeichnis\n    [`contrib/`](https://gitlab.com/gitlab-org/git/-/tree/master/contrib) im\n    Git-Quellbaum.\n\n\n    Es ist\n    [üblich](https://doc.rust-lang.org/cargo/reference/build-scripts.html#-sys-packages),\n    eine Bibliothek in zwei Pakete zu unterteilen, wenn ein [Foreign Function\n    Interface](https://en.wikipedia.org/wiki/Foreign_function_interface)\n    verwendet wird.\n\n\n    Das Paket `libgit-sys` bietet die reine Schnittstelle zu C-Funktionen und\n    verknüpft zur nativen Bibliothek `libgit.a`. Das Paket `libgit-rs` bietet\n    eine Schnittstelle zu den Funktionen in `libgit-sys` mit einem für Rust\n    typischen Gefühl.\n\n\n    Bisher ist die Funktionalität in diesen Rust-Paketen sehr begrenzt. Es wird\n    nur eine Schnittstelle zur Interaktion mit `git-config(1)` geboten.\n\n\n    Diese Initiative wurde von [Josh\n    Steadmon](https://lore.kernel.org/git/8793ff64a7f6c4c04dd03b71162a85849feda944.1738187176.git.steadmon@google.com/)\n    geleitet und mit\n    [a4af0b6288](https://gitlab.com/gitlab-org/git/-/commit/a4af0b6288e25eb327ae9018cee09def9e43f1cd)\n    zusammengeführt.\n\n\n    ## Neuer Namenshashing-Algorithmus\n\n\n    Die Git-Objektdatenbank in `.git/` speichert die meisten ihrer Daten in\n    Paketierungsdateien. Packfiles wurden verwendet, um Objekte über Kabel\n    zwischen dem Git-Server und dem Client zu übertragen.\n\n\n    Alles über das Format erfährst du unter\n    [`gitformat-pack(5)`](https://git-scm.com/docs/gitformat-pack). Ein\n    wichtiger Aspekt der Paketierungsdateien ist die Delta-Komprimierung. Bei\n    der Delta-Komprimierung wird nicht jedes Objekt so gespeichert, wie es ist,\n    sondern manche Objekte werden als _delta_ einer anderen _base_ gespeichert.\n    Anstatt also den gesamten Inhalt der Objekte zu speichern, werden die\n    Änderungen im Vergleich zu einem anderen Objekt gespeichert.\n\n\n    Ohne auf die Details einzugehen, wie diese Deltas berechnet oder gespeichert\n    werden, kannst du dir vorstellen, dass es wichtig ist, sehr ähnliche Dateien\n    zu gruppieren. In v2.48 und früheren Versionen verglich Git die letzten\n    16 Zeichen der Pfadnamen, um festzustellen, ob Blobs ähnlich sind. Dieser\n    Algorithmus wird Version `1` genannt.\n\n\n    Ab Git 2.49 ist Version `2` verfügbar. Dies ist eine Iteration von Version\n    `1`, jedoch so verändert, dass die Auswirkungen des übergeordneten\n    Verzeichnisses reduziert werden. Du kannst die Version des\n    Namenshashing-Algorithmus, die du verwenden möchtest, mit der Option\n    `--name-hash-version` von\n    [`git-repack(1)`](https://git-scm.com/docs/git-repack) festlegen.\n\n\n    [Derrick Stolee](https://stolee.dev/), der dieses Projekt vorangetrieben\n    hat, verglich die resultierende Größe der Paketierungsdateien, nachdem er\n    `git repack -adf --name-hash-version=\u003Cn>` ausgeführt hatte:\n\n\n    | Repository                                          \t| Größe Version 1   |\n    Größe Version 2 |\n\n    |---------------------------------------------------|-----------|---------|\n\n    | [fluentui](https://github.com/microsoft/fluentui) | 440 MB \t| 161 MB   |\n\n    | Repository B                                        \t| 6.248 MB   |\n    856 MB   |\n\n    | Repository C                                        \t| 37.278 MB  |\n    6.921 MB |\n\n    | Repository D                                        \t| 131.204 MB |\n    7.463 MB |\n\n\n    Weitere Details findest du im\n    [Patch-Set](https://lore.kernel.org/git/pull.1823.v4.git.1738004554.gitgitgadget@gmail.com/),\n    das in\n    [aae91a86fb](https://gitlab.com/gitlab-org/git/-/commit/aae91a86fb2a71ff89a71b63ccec3a947b26ca51)\n    zusammengeführt wurde.\n\n\n    ## Promisor-Remote-Fähigkeit\n\n\n    Es ist bekannt, dass Git nicht gut mit großen Dateien umgehen kann. Es gibt\n    einige Lösungen für dieses Problem wie [Git LFS](https://git-lfs.com/), die\n    jedoch immer noch Mängel aufweisen. Einige davon sind Folgende:\n\n\n    - Mit Git LFS muss der/die Benutzer(in) konfigurieren, welche Dateien in den\n    LFS kommen sollen. Der Server hat keine Kontrolle darüber und muss alle\n    Dateien bereitstellen.\n\n\n    - Wenn eine Datei ins Repository committet wird, gibt es keine Möglichkeit,\n    sie wieder herauszuholen, ohne den Verlauf neu zu schreiben. Das ist vor\n    allem bei großen Dateien ärgerlich, da sie dadurch für immer dort\n    festhängen.\n\n\n    - Benutzer(innen) können nicht ändern, welche Dateien im Git LFS abgelegt\n    werden sollen.\n\n\n    - Es ist schwierig, ein Tool wie Git LFS richtig einzurichten, den Umgang\n    damit zu erlernen und es zu nutzen.\n\n\n    Seit einiger Zeit verfügt Git über das Konzept der Promisor Remotes. Diese\n    Funktion kann für große Dateien genutzt werden und wurde in Git 2.49 noch\n    einen Schritt weiterentwickelt.\n\n\n    Die Idee hinter der neuen Promisor-Remote-Fähigkeit ist relativ einfach:\n    Anstatt alle Objekte selbst zu senden, kann ein Git-Server dem Git-Client\n    sagen: „Lade diese Objekte von _XYZ_ herunter.“ _XYZ_ ist der Promisor\n    Remote.\n\n\n    Git 2.49 ermöglicht es dem Server, die Informationen des Promisor Remote an\n    den Client weiterzugeben. Diese Änderung ist eine Erweiterung von\n    [`gitprotocol-v2`](https://git-scm.com/docs/gitprotocol-v2). Während der\n    Server und der Client Daten hin und her übertragen, kann der Server Namen\n    und URLs der Promisor Remotes senden, die er kennt.\n\n\n    Derzeit verwendet der Client die Promisor-Remote-Infos, die er vom Server\n    während des Klonens erhält, nicht, sodass weiterhin alle Objekte vom Remote\n    zu dem Klon übermittelt werden, von dem aus der Vorgang initiiert wurde. Wir\n    planen, diese Funktion weiter zu verbessern, sodass die Promisor-Remote-Info\n    vom Server genutzt werden kann und die Funktion benutzerfreundlicher wird.\n\n\n    Dieses\n    [Patch-Set](https://lore.kernel.org/git/20250218113204.2847463-1-christian.couder@gmail.com/)\n    wurde von [Christian Couder](https://gitlab.com/chriscool) eingereicht und\n    mit\n    [2c6fd30198](https://gitlab.com/gitlab-org/git/-/commit/2c6fd30198187c928cbf927802556908c381799c)\n    zusammengeführt.\n\n\n    ## Flacher Klon mit `--revision`\n\n\n    Die neue Option `--revision` wurde zu\n    [`git-clone(1)`](https://git-scm.com/docs/git-clone/de) hinzugefügt. Auf\n    diese Weise kannst du einen flachen Klon eines Repository erstellen, der nur\n    den Verlauf der jeweiligen Revision enthält. Die Option ist ähnlich wie\n    `--branch`, akzeptiert aber einen ref-Namen (wie `refs/heads/main`,\n    `refs/tags/v1.0` und `refs/merge-requests/123`) oder eine hexadezimale\n    Commit-Objekt-ID. Der Unterschied zu `--branch` ist, dass kein\n    Tracking-Branch erstellt und `HEAD` abgetrennt wird. Diese Option ist also\n    nicht geeignet, wenn du wieder zu diesem Branch beitragen möchtest.\n\n\n    Du kannst `--revision` in Kombination mit `--depth` verwenden, um einen\n    minimalen Klon zu erstellen. Ein vorgeschlagener Anwendungsfall ist das\n    automatisierte Testen. Wenn du ein CI-System hast, bei dem ein Branch (oder\n    eine beliebige Referenz) ausgecheckt werden muss, um autonome Tests am\n    Quellcode durchzuführen, brauchst du nur einen minimalen Klon.\n\n\n    Diese\n    [Änderung](https://gitlab.com/gitlab-org/git/-/commit/5785d9143bcb3ef19452a83bc2e870ff3d5ed95a)\n    wurde von [Toon Claes](https://gitlab.com/toon)\n    [vorangetrieben](https://lore.kernel.org/git/20250206-toon-clone-refs-v7-0-4622b7392202@iotcl.com/).\n\n\n    # Mehr erfahren\n\n\n    - [Was gibt es Neues in\n    Git 2.48.0?](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-48-0/)\n\n\n    - [Was gibt es Neues neu in\n    Git 2.47.0?](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-47-0/)\n\n\n    - [Was gibt es Neues in\n    Git 2.46.0?](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-46-0/)\n  authors:\n    - Toon Claes\n  updatedDate: 2025-04-08\n  date: 2025-03-14\n  title: Was gibt es Neues in Git 2.49.0?\n  tags:\n    - community\n    - open source\n    - git\n  description: Erfahre mehr über die neueste Version von Git, einschließlich\n    verbesserter Leistung dank zlib-ng, einem neuen Algorithmus zum Hashing von\n    Namen und git-backfill(1).\n  category: open-source\nconfig:\n  slug: whats-new-in-git-2-49-0\n  featured: true\n  template: BlogPost\n",{"ogTitle":32,"ogImage":17,"ogDescription":25,"ogSiteName":33,"noIndex":34,"ogType":35,"ogUrl":36,"title":32,"canonicalUrls":36,"description":25},"Was gibt es Neues in Git 2.49.0?","https://about.gitlab.com",false,"article","https://about.gitlab.com/blog/whats-new-in-git-2-49-0","de-de/blog/whats-new-in-git-2-49-0",[22,11,24],[22,23,24],"EI46bnxHweylhY_YiG9KnGzB9TPJ5U5Z6ipp7eQkFD0",{"data":42},{"logo":43,"freeTrial":48,"sales":53,"login":58,"items":63,"search":372,"minimal":406,"duo":424,"switchNav":433,"pricingDeployment":444},{"config":44},{"href":45,"dataGaName":46,"dataGaLocation":47},"/de-de/","gitlab logo","header",{"text":49,"config":50},"Kostenlose Testversion anfordern",{"href":51,"dataGaName":52,"dataGaLocation":47},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":54,"config":55},"Vertrieb kontaktieren",{"href":56,"dataGaName":57,"dataGaLocation":47},"/de-de/sales/","sales",{"text":59,"config":60},"Anmelden",{"href":61,"dataGaName":62,"dataGaLocation":47},"https://gitlab.com/users/sign_in/","sign in",[64,91,188,193,293,353],{"text":65,"config":66,"cards":68},"Plattform",{"dataNavLevelOne":67},"platform",[69,75,83],{"title":65,"description":70,"link":71},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":72,"config":73},"Die Plattform erkunden",{"href":74,"dataGaName":67,"dataGaLocation":47},"/de-de/platform/",{"title":76,"description":77,"link":78},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":79,"config":80},"Lerne GitLab Duo kennen",{"href":81,"dataGaName":82,"dataGaLocation":47},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":84,"description":85,"link":86},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":87,"config":88},"Mehr erfahren",{"href":89,"dataGaName":90,"dataGaLocation":47},"/de-de/why-gitlab/","why gitlab",{"text":92,"left":14,"config":93,"link":95,"lists":99,"footer":170},"Produkt",{"dataNavLevelOne":94},"solutions",{"text":96,"config":97},"Alle Lösungen anzeigen",{"href":98,"dataGaName":94,"dataGaLocation":47},"/de-de/solutions/",[100,125,148],{"title":101,"description":102,"link":103,"items":108},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":104},{"icon":105,"href":106,"dataGaName":107,"dataGaLocation":47},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[109,113,116,121],{"text":110,"config":111},"CI/CD",{"href":112,"dataGaLocation":47,"dataGaName":110},"/de-de/solutions/continuous-integration/",{"text":76,"config":114},{"href":81,"dataGaLocation":47,"dataGaName":115},"gitlab duo agent platform - product menu",{"text":117,"config":118},"Quellcodeverwaltung",{"href":119,"dataGaLocation":47,"dataGaName":120},"/de-de/solutions/source-code-management/","Source Code Management",{"text":122,"config":123},"Automatische Softwarebereitstellung",{"href":106,"dataGaLocation":47,"dataGaName":124},"Automated software delivery",{"title":126,"description":127,"link":128,"items":133},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":129},{"href":130,"dataGaName":131,"dataGaLocation":47,"icon":132},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[134,138,143],{"text":135,"config":136},"Anwendungssicherheitstests",{"href":130,"dataGaName":137,"dataGaLocation":47},"Application security testing",{"text":139,"config":140},"Schutz der Software-Lieferkette",{"href":141,"dataGaLocation":47,"dataGaName":142},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":144,"config":145},"Software-Compliance",{"href":146,"dataGaName":147,"dataGaLocation":47},"/de-de/solutions/software-compliance/","software compliance",{"title":149,"link":150,"items":155},"Auswertung",{"config":151},{"icon":152,"href":153,"dataGaName":154,"dataGaLocation":47},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[156,160,165],{"text":157,"config":158},"Sichtbarkeit und Auswertung",{"href":153,"dataGaLocation":47,"dataGaName":159},"Visibility and Measurement",{"text":161,"config":162},"Wertstrommanagement",{"href":163,"dataGaLocation":47,"dataGaName":164},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":166,"config":167},"Analysen und Einblicke",{"href":168,"dataGaLocation":47,"dataGaName":169},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":171,"items":172},"GitLab für",[173,178,183],{"text":174,"config":175},"Enterprise",{"href":176,"dataGaLocation":47,"dataGaName":177},"/de-de/enterprise/","enterprise",{"text":179,"config":180},"Kleinunternehmen",{"href":181,"dataGaLocation":47,"dataGaName":182},"/de-de/small-business/","small business",{"text":184,"config":185},"Öffentlicher Sektor",{"href":186,"dataGaLocation":47,"dataGaName":187},"/de-de/solutions/public-sector/","public sector",{"text":189,"config":190},"Preise",{"href":191,"dataGaName":192,"dataGaLocation":47,"dataNavLevelOne":192},"/de-de/pricing/","pricing",{"text":194,"config":195,"link":197,"lists":201,"feature":280},"Ressourcen",{"dataNavLevelOne":196},"resources",{"text":198,"config":199},"Alle Ressourcen anzeigen",{"href":200,"dataGaName":196,"dataGaLocation":47},"/de-de/resources/",[202,235,253],{"title":203,"items":204},"Erste Schritte",[205,210,215,220,225,230],{"text":206,"config":207},"Installieren",{"href":208,"dataGaName":209,"dataGaLocation":47},"/de-de/install/","install",{"text":211,"config":212},"Kurzanleitungen",{"href":213,"dataGaName":214,"dataGaLocation":47},"/de-de/get-started/","quick setup checklists",{"text":216,"config":217},"Lernen",{"href":218,"dataGaLocation":47,"dataGaName":219},"https://university.gitlab.com/","learn",{"text":221,"config":222},"Produktdokumentation",{"href":223,"dataGaName":224,"dataGaLocation":47},"https://docs.gitlab.com/","product documentation",{"text":226,"config":227},"Best-Practice-Videos",{"href":228,"dataGaName":229,"dataGaLocation":47},"/de-de/getting-started-videos/","best practice videos",{"text":231,"config":232},"Integrationen",{"href":233,"dataGaName":234,"dataGaLocation":47},"/de-de/integrations/","integrations",{"title":236,"items":237},"Entdecken",[238,243,248],{"text":239,"config":240},"Kundenerfolge",{"href":241,"dataGaName":242,"dataGaLocation":47},"/de-de/customers/","customer success stories",{"text":244,"config":245},"Blog",{"href":246,"dataGaName":247,"dataGaLocation":47},"/de-de/blog/","blog",{"text":249,"config":250},"Remote",{"href":251,"dataGaName":252,"dataGaLocation":47},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":254,"items":255},"Vernetzen",[256,261,265,270,275],{"text":257,"config":258},"GitLab Services",{"href":259,"dataGaName":260,"dataGaLocation":47},"/de-de/services/","services",{"text":262,"config":263},"Community",{"href":264,"dataGaName":22,"dataGaLocation":47},"/community/",{"text":266,"config":267},"Forum",{"href":268,"dataGaName":269,"dataGaLocation":47},"https://forum.gitlab.com/","forum",{"text":271,"config":272},"Veranstaltungen",{"href":273,"dataGaName":274,"dataGaLocation":47},"/events/","events",{"text":276,"config":277},"Partner",{"href":278,"dataGaName":279,"dataGaLocation":47},"/de-de/partners/","partners",{"background":281,"textColor":282,"text":283,"image":284,"link":288},"#2f2a6b","#fff","Perspektiven für die Softwareentwicklung der Zukunft",{"altText":285,"config":286},"The Source Promo-Karte",{"src":287},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":289,"config":290},"Aktuelles",{"href":291,"dataGaName":292,"dataGaLocation":47},"/de-de/the-source/","the source",{"text":294,"config":295,"lists":297},"Unternehmen",{"dataNavLevelOne":296},"company",[298],{"items":299},[300,305,311,313,318,323,328,333,338,343,348],{"text":301,"config":302},"Über",{"href":303,"dataGaName":304,"dataGaLocation":47},"/de-de/company/","about",{"text":306,"config":307,"footerGa":310},"Karriere",{"href":308,"dataGaName":309,"dataGaLocation":47},"/jobs/","jobs",{"dataGaName":309},{"text":271,"config":312},{"href":273,"dataGaName":274,"dataGaLocation":47},{"text":314,"config":315},"Geschäftsführung",{"href":316,"dataGaName":317,"dataGaLocation":47},"/company/team/e-group/","leadership",{"text":319,"config":320},"Team",{"href":321,"dataGaName":322,"dataGaLocation":47},"/company/team/","team",{"text":324,"config":325},"Handbuch",{"href":326,"dataGaName":327,"dataGaLocation":47},"https://handbook.gitlab.com/","handbook",{"text":329,"config":330},"Investor Relations",{"href":331,"dataGaName":332,"dataGaLocation":47},"https://ir.gitlab.com/","investor relations",{"text":334,"config":335},"Trust Center",{"href":336,"dataGaName":337,"dataGaLocation":47},"/de-de/security/","trust center",{"text":339,"config":340},"AI Transparency Center",{"href":341,"dataGaName":342,"dataGaLocation":47},"/de-de/ai-transparency-center/","ai transparency center",{"text":344,"config":345},"Newsletter",{"href":346,"dataGaName":347,"dataGaLocation":47},"/company/contact/#contact-forms","newsletter",{"text":349,"config":350},"Presse",{"href":351,"dataGaName":352,"dataGaLocation":47},"/press/","press",{"text":354,"config":355,"lists":356},"Kontakt",{"dataNavLevelOne":296},[357],{"items":358},[359,362,367],{"text":54,"config":360},{"href":56,"dataGaName":361,"dataGaLocation":47},"talk to sales",{"text":363,"config":364},"Support-Portal",{"href":365,"dataGaName":366,"dataGaLocation":47},"https://support.gitlab.com","support portal",{"text":368,"config":369},"Kundenportal",{"href":370,"dataGaName":371,"dataGaLocation":47},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":373,"login":374,"suggestions":381},"Schließen",{"text":375,"link":376},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":377,"config":378},"gitlab.com",{"href":61,"dataGaName":379,"dataGaLocation":380},"search login","search",{"text":382,"default":383},"Vorschläge",[384,386,391,393,398,403],{"text":76,"config":385},{"href":81,"dataGaName":76,"dataGaLocation":380},{"text":387,"config":388},"Codevorschläge (KI)",{"href":389,"dataGaName":390,"dataGaLocation":380},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":110,"config":392},{"href":112,"dataGaName":110,"dataGaLocation":380},{"text":394,"config":395},"GitLab auf AWS",{"href":396,"dataGaName":397,"dataGaLocation":380},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":399,"config":400},"GitLab auf Google Cloud",{"href":401,"dataGaName":402,"dataGaLocation":380},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":84,"config":404},{"href":89,"dataGaName":405,"dataGaLocation":380},"Why GitLab?",{"freeTrial":407,"mobileIcon":412,"desktopIcon":417,"secondaryButton":420},{"text":408,"config":409},"Kostenlos testen",{"href":410,"dataGaName":52,"dataGaLocation":411},"https://gitlab.com/-/trials/new/","nav",{"altText":413,"config":414},"GitLab-Symbol",{"src":415,"dataGaName":416,"dataGaLocation":411},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":413,"config":418},{"src":419,"dataGaName":416,"dataGaLocation":411},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":203,"config":421},{"href":422,"dataGaName":423,"dataGaLocation":411},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":425,"mobileIcon":429,"desktopIcon":431},{"text":426,"config":427},"Mehr über GitLab Duo erfahren",{"href":81,"dataGaName":428,"dataGaLocation":411},"gitlab duo",{"altText":413,"config":430},{"src":415,"dataGaName":416,"dataGaLocation":411},{"altText":413,"config":432},{"src":419,"dataGaName":416,"dataGaLocation":411},{"button":434,"mobileIcon":439,"desktopIcon":441},{"text":435,"config":436},"/Option",{"href":437,"dataGaName":438,"dataGaLocation":411},"#contact","switch",{"altText":413,"config":440},{"src":415,"dataGaName":416,"dataGaLocation":411},{"altText":413,"config":442},{"src":443,"dataGaName":416,"dataGaLocation":411},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":445,"mobileIcon":450,"desktopIcon":452},{"text":446,"config":447},"Zurück zur Preisübersicht",{"href":191,"dataGaName":448,"dataGaLocation":411,"icon":449},"back to pricing","GoBack",{"altText":413,"config":451},{"src":415,"dataGaName":416,"dataGaLocation":411},{"altText":413,"config":453},{"src":419,"dataGaName":416,"dataGaLocation":411},{"title":455,"button":456,"config":461},"Sieh dir an, wie agentische KI die Softwarebereitstellung transformiert",{"text":457,"config":458},"GitLab Transcend jetzt ansehen",{"href":459,"dataGaName":460,"dataGaLocation":47},"/de-de/events/transcend/virtual/","transcend event",{"layout":462,"icon":463,"disabled":14},"release","AiStar",{"data":465},{"text":466,"source":467,"edit":473,"contribute":478,"config":483,"items":488,"minimal":691},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":468,"config":469},"Quelltext der Seite anzeigen",{"href":470,"dataGaName":471,"dataGaLocation":472},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":474,"config":475},"Diese Seite bearbeiten",{"href":476,"dataGaName":477,"dataGaLocation":472},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":479,"config":480},"Beteilige dich",{"href":481,"dataGaName":482,"dataGaLocation":472},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":484,"facebook":485,"youtube":486,"linkedin":487},"https://x.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[489,534,587,629,656],{"title":189,"links":490,"subMenu":505},[491,495,500],{"text":492,"config":493},"Tarife anzeigen",{"href":191,"dataGaName":494,"dataGaLocation":472},"view plans",{"text":496,"config":497},"Vorteile von Premium",{"href":498,"dataGaName":499,"dataGaLocation":472},"/de-de/pricing/premium/","why premium",{"text":501,"config":502},"Vorteile von Ultimate",{"href":503,"dataGaName":504,"dataGaLocation":472},"/de-de/pricing/ultimate/","why ultimate",[506],{"title":354,"links":507},[508,510,512,514,519,524,529],{"text":54,"config":509},{"href":56,"dataGaName":57,"dataGaLocation":472},{"text":363,"config":511},{"href":365,"dataGaName":366,"dataGaLocation":472},{"text":368,"config":513},{"href":370,"dataGaName":371,"dataGaLocation":472},{"text":515,"config":516},"Status",{"href":517,"dataGaName":518,"dataGaLocation":472},"https://status.gitlab.com/","status",{"text":520,"config":521},"Nutzungsbedingungen",{"href":522,"dataGaName":523,"dataGaLocation":472},"/terms/","terms of use",{"text":525,"config":526},"Datenschutzerklärung",{"href":527,"dataGaName":528,"dataGaLocation":472},"/de-de/privacy/","privacy statement",{"text":530,"config":531},"Cookie-Einstellungen",{"dataGaName":532,"dataGaLocation":472,"id":533,"isOneTrustButton":14},"cookie preferences","ot-sdk-btn",{"title":92,"links":535,"subMenu":544},[536,540],{"text":537,"config":538},"DevSecOps-Plattform",{"href":74,"dataGaName":539,"dataGaLocation":472},"devsecops platform",{"text":541,"config":542},"KI-unterstützte Entwicklung",{"href":81,"dataGaName":543,"dataGaLocation":472},"ai-assisted development",[545],{"title":546,"links":547},"Themen",[548,552,557,562,567,572,577,582],{"text":110,"config":549},{"href":550,"dataGaName":551,"dataGaLocation":472},"/de-de/topics/ci-cd/","cicd",{"text":553,"config":554},"GitOps",{"href":555,"dataGaName":556,"dataGaLocation":472},"/de-de/topics/gitops/","gitops",{"text":558,"config":559},"DevOps",{"href":560,"dataGaName":561,"dataGaLocation":472},"/de-de/topics/devops/","devops",{"text":563,"config":564},"Versionskontrolle",{"href":565,"dataGaName":566,"dataGaLocation":472},"/de-de/topics/version-control/","version control",{"text":568,"config":569},"DevSecOps",{"href":570,"dataGaName":571,"dataGaLocation":472},"/de-de/topics/devsecops/","devsecops",{"text":573,"config":574},"Cloud-nativ",{"href":575,"dataGaName":576,"dataGaLocation":472},"/de-de/topics/cloud-native/","cloud native",{"text":578,"config":579},"KI für das Programmieren",{"href":580,"dataGaName":581,"dataGaLocation":472},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":583,"config":584},"Agentische KI",{"href":585,"dataGaName":586,"dataGaLocation":472},"/de-de/topics/agentic-ai/","agentic ai",{"title":588,"links":589},"Lösungen",[590,593,595,600,604,607,610,613,615,617,619,624],{"text":135,"config":591},{"href":130,"dataGaName":592,"dataGaLocation":472},"Application Security Testing",{"text":122,"config":594},{"href":106,"dataGaName":107,"dataGaLocation":472},{"text":596,"config":597},"Agile Entwicklung",{"href":598,"dataGaName":599,"dataGaLocation":472},"/de-de/solutions/agile-delivery/","agile delivery",{"text":601,"config":602},"SCM",{"href":119,"dataGaName":603,"dataGaLocation":472},"source code management",{"text":110,"config":605},{"href":112,"dataGaName":606,"dataGaLocation":472},"continuous integration & delivery",{"text":161,"config":608},{"href":163,"dataGaName":609,"dataGaLocation":472},"value stream management",{"text":553,"config":611},{"href":612,"dataGaName":556,"dataGaLocation":472},"/de-de/solutions/gitops/",{"text":174,"config":614},{"href":176,"dataGaName":177,"dataGaLocation":472},{"text":179,"config":616},{"href":181,"dataGaName":182,"dataGaLocation":472},{"text":184,"config":618},{"href":186,"dataGaName":187,"dataGaLocation":472},{"text":620,"config":621},"Bildungswesen",{"href":622,"dataGaName":623,"dataGaLocation":472},"/de-de/solutions/education/","education",{"text":625,"config":626},"Finanzdienstleistungen",{"href":627,"dataGaName":628,"dataGaLocation":472},"/de-de/solutions/finance/","financial services",{"title":194,"links":630},[631,633,635,637,640,642,644,646,648,650,652,654],{"text":206,"config":632},{"href":208,"dataGaName":209,"dataGaLocation":472},{"text":211,"config":634},{"href":213,"dataGaName":214,"dataGaLocation":472},{"text":216,"config":636},{"href":218,"dataGaName":219,"dataGaLocation":472},{"text":221,"config":638},{"href":223,"dataGaName":639,"dataGaLocation":472},"docs",{"text":244,"config":641},{"href":246,"dataGaName":247,"dataGaLocation":472},{"text":239,"config":643},{"href":241,"dataGaName":242,"dataGaLocation":472},{"text":249,"config":645},{"href":251,"dataGaName":252,"dataGaLocation":472},{"text":257,"config":647},{"href":259,"dataGaName":260,"dataGaLocation":472},{"text":262,"config":649},{"href":264,"dataGaName":22,"dataGaLocation":472},{"text":266,"config":651},{"href":268,"dataGaName":269,"dataGaLocation":472},{"text":271,"config":653},{"href":273,"dataGaName":274,"dataGaLocation":472},{"text":276,"config":655},{"href":278,"dataGaName":279,"dataGaLocation":472},{"title":294,"links":657},[658,660,662,664,666,668,670,675,680,682,684,686],{"text":301,"config":659},{"href":303,"dataGaName":296,"dataGaLocation":472},{"text":306,"config":661},{"href":308,"dataGaName":309,"dataGaLocation":472},{"text":314,"config":663},{"href":316,"dataGaName":317,"dataGaLocation":472},{"text":319,"config":665},{"href":321,"dataGaName":322,"dataGaLocation":472},{"text":324,"config":667},{"href":326,"dataGaName":327,"dataGaLocation":472},{"text":329,"config":669},{"href":331,"dataGaName":332,"dataGaLocation":472},{"text":671,"config":672},"Nachhaltigkeit",{"href":673,"dataGaName":674,"dataGaLocation":472},"/sustainability/","Sustainability",{"text":676,"config":677},"Vielfalt, Inklusion und Zugehörigkeit",{"href":678,"dataGaName":679,"dataGaLocation":472},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":334,"config":681},{"href":336,"dataGaName":337,"dataGaLocation":472},{"text":344,"config":683},{"href":346,"dataGaName":347,"dataGaLocation":472},{"text":349,"config":685},{"href":351,"dataGaName":352,"dataGaLocation":472},{"text":687,"config":688},"Transparenzerklärung zu moderner Sklaverei",{"href":689,"dataGaName":690,"dataGaLocation":472},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":692},[693,695,698],{"text":520,"config":694},{"href":522,"dataGaName":523,"dataGaLocation":472},{"text":696,"config":697},"Cookies",{"dataGaName":532,"dataGaLocation":472,"id":533,"isOneTrustButton":14},{"text":525,"config":699},{"href":527,"dataGaName":528,"dataGaLocation":472},[701],{"id":702,"title":9,"body":27,"config":703,"content":705,"description":27,"extension":26,"meta":709,"navigation":14,"path":710,"seo":711,"stem":712,"__hash__":713},"blogAuthors/en-us/blog/authors/toon-claes.yml",{"template":704},"BlogAuthor",{"name":9,"config":706},{"headshot":707,"ctfId":708},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663082/Blog/Author%20Headshots/toon_claes_headshot.png","toon",{},"/en-us/blog/authors/toon-claes",{},"en-us/blog/authors/toon-claes","guXJXoqO1anz4H932Namk7kqyZsO1xyVQr6stBL4o18",[715,728,740],{"content":716,"config":726},{"title":717,"description":718,"authors":719,"heroImage":721,"date":722,"body":723,"category":11,"tags":724},"GitLab AI Hackathon 2026: Hier sind die Gewinner und ihre Projekte","Fast 7.000 Entwickler(innen) haben über 600 KI-Agenten und Flows auf GitLab Duo Agent Platform gebaut. Erfahre, wer gewonnen hat und was sie entwickelt haben.",[720],"Nick Veenhof","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22","KI schreibt Code. Das wird inzwischen erwartet. Aber Planung, Security,\nCompliance und Deployments? Diese Lücken bleiben. Ich leite\nContributor-Programme seit Jahren. Ich habe noch nie erlebt, dass eine\nCommunity so auf eine Technologie reagiert.\n\nDeshalb haben wir [GitLab Duo Agent Platform](https://about.gitlab.com/de-de/gitlab-duo-agent-platform/)\ngeöffnet und Entwickler(innen) weltweit eingeladen, KI-Agenten zu bauen, die Teams\ndabei helfen, sichere Software schneller zu liefern. Keine Chatbots, die\nFragen beantworten – sondern Agenten, die in Workflows einspringen, auf\nEreignisse reagieren und in deinem Auftrag handeln. Der GitLab AI Hackathon\nlief vom 9. Februar bis zum 25. März 2026 auf Devpost. Google Cloud und\nAnthropic waren Co-Sponsoren.\n\nAls mein Team diesen Hackathon mit Google Cloud und Anthropic plante, bat\nich die Juroren, vier Dinge zu bewerten: technische Umsetzung, Design,\npotenzielle Wirkung und Ideenqualität. Wir hatten auf starke Beteiligung\ngehofft. Was wir bekamen, hat uns alle überrascht. Neunzehn Juroren\nverbrachten 18 Tage damit, jeden Beitrag zu prüfen. Google Cloud und\nAnthropic stellten Juroren, Preise und Cloud-Zugang bereit. Die Community\nbaute Hunderte von Agenten und Flows – weil sie diese Probleme lösen wollten.\n\nFast 7.000 Entwickler(innen) nahmen teil. Sie bauten in wenigen Wochen über 600\nAgenten und Flows. Die Preise über alle Kategorien summierten sich auf\n65.000 US-Dollar – bereitgestellt von GitLab, Google Cloud und Anthropic.\n\nWer schon einmal erlebt hat, wie ein erfahrener Engineer das Unternehmen\nverlässt und die Hälfte des Team-Wissens mitnimmt, weiß, warum das\nGewinnerprojekt so eingeschlagen hat.\n\nLies weiter und erfahre, was die Community gebaut hat.\n\n\n## Gesamtsieger: LORE\n\n[LORE](https://devpost.com/software/lore-living-organizational-record-engine),\ndie Living Organizational Record Engine, nutzt acht Agenten mit einem Router,\nder jede Frage an den richtigen Agenten weiterleitet, Logik zur Vermeidung\nzirkulärer Schleifen im Wissensgraphen, ein visuelles Dashboard und\nCarbon-Tracking. Das Kommandozeilen-Werkzeug kommt mit 43 Tests – ja, 43\nTests in einem Hackathon-Projekt.\n\nLORE löst ein reales Problem: das Wissen, das in den Köpfen von Engineers\nlebt und mit ihnen geht, wenn sie das Unternehmen verlassen. In meiner\nErfahrung ist ein Hackathon-Projekt mit 43 Tests eine Seltenheit. So viele\nTests in einem Hackathon-Projekt sagen etwas über das Team dahinter aus.\n\nJurorin April Guo (Anthropic) schrieb: „Das fühlt sich wie ein Produkt an,\nnicht wie ein Hackathon-Projekt.\"\n\n\n### Google Cloud-Gewinner\n\n[Gitdefender](https://devpost.com/software/gitdefender) gewann den Google\nCloud Grand Prize. Es arbeitet innerhalb von Code-Review-Workflows, findet\nund behebt Sicherheitsprobleme. Es erkennt den Fehler, schreibt den Fix und\nöffnet den Code-Review. Kein Mensch muss eingreifen.\n\n[Aegis](https://devpost.com/software/aegis-2m1oq0) gewann den Google Cloud\nRunner Up. Es liefert KI-gestützte Erklärungen für jede Entscheidung, die\nes trifft – auf Google Cloud gehostet und bereit für den Produktionseinsatz.\n\n\n### Anthropic-Gewinner\n\n[GraphDev](https://devpost.com/software/graphdev) gewann den Anthropic Grand\nPrize. Es kartiert Code-Verbindungen und zeigt, wie sich Systeme im Laufe\nder Zeit verändern. Juror Aboobacker MK (GitLab) merkte an, es sei „synchron\nmit unserer Arbeit am GitLab Knowledge Graph.\" Juror Ayush Billore (GitLab)\nschrieb: „Demo und UX haben mich begeistert – extrem nützlich, um zu\nverstehen, wie das System sich entwickelt hat und was von Änderungen\nbetroffen ist.\" Man sieht die vollständige Auswirkung einer Änderung, bevor\nman sie vornimmt.\n\n[DocSync](https://devpost.com/software/pipeheal) gewann den Anthropic Runner\nUp. Es nutzt drei Agenten: Detector, Writer und Reviewer. Ist DocSync vom\nFix überzeugt, öffnet es einen Code-Review. Ist es das nicht, erstellt es\nein Issue für eine manuelle Prüfung.\n\n\n## Kategorie-Gewinner\n\n### Technisch beeindruckendste Lösung\n\nDatenbank-Migrationen brechen Dinge.\n[Time-Traveler](https://devpost.com/software/time-traveler-w3cxp0) erstellt\neine sichere Kopie des Produktions-Setups, führt die Migration gegen diese\nKopie durch und meldet das Ergebnis. Es betreibt fünf Agenten, die über eine\nBridge verbunden sind – mit echtem Google Cloud-Deployment, echten\nPostgreSQL-Migrationen und echten Daten.\n\n### Wirkungsvollste Lösung\n\n[RedAgent](https://devpost.com/software/redagent) prüft KI-generierte\nSecurity-Reports und schließt die Vertrauenslücke zwischen KI-Findings und\nEntwickleraktion. Wer KI für Security Scanning einsetzt, kennt dieses\nProblem. Ich habe Teams erlebt, die KI-Findings ignorierten, weil sie sie\nnicht verifizieren konnten. RedAgent gibt Teams eine Möglichkeit, KI-Output\nzu prüfen, bevor er Entwickler(innen) erreicht.\n\n### Einfachste Bedienung\n\n[Launch Control](https://devpost.com/software/launch-control-bgp8az) liefert\nausgefeilte UX und solide Infrastruktur – und schnitt auch beim Thema\nNachhaltigkeit gut ab.\n\n\n## Das Nachhaltigkeitssignal\n\nFünf Projekte gewannen Preise oder Boni für ökologische Wirkung.\nSoftware-Auslieferung hat einen Carbon-Fußabdruck durch CI/CD-Pipelines –\nund nun verarbeiten auch LLMs Rechenleistung im großen Maßstab. Wir haben\ndie Green Agent-Kategorie ins Leben gerufen, um Entwickler(innen) herauszufordern,\ndiesen Fußabdruck zu messen und zu reduzieren. Stacy Cline und Kim Buncle\naus GitLabs Nachhaltigkeitsteam halfen bei der Beurteilung der\nGreen Agent-Kategorie.\n\n### Green Agent-Preis\n\n[GreenPipe](https://devpost.com/software/greenpipe) scannt CI/CD-Pipelines\nauf Umweltwirkung und erstellt Carbon-Footprint-Berichte. Juroren Kim Buncle\nund Rajesh Agadi (Google) unterstützten das Projekt.\n\n### Sustainable Design-Bonus\n\nSustainable Design-Boni wurden an Projekte vergeben, die außergewöhnliche\nNachhaltigkeitspraktiken in ihrem Design zeigten – von\nModell-Optimierungstechniken bis hin zu energieeffizienten\nArchitekturentscheidungen.\n\n* [BugFlow](https://devpost.com/software/bugflow-ai-regression-detective-ci-optimizer)\n  verwandelte einen Bug-Report in 10 Fixes in 20 Minuten.\n* [DELTA Cyber Reasoning](https://devpost.com/software/delta-cyber-reasoning-system)\n  ist automatisiertes Fuzz-Testing für Security.\n* [CarbonLint](https://devpost.com/software/carbonlint) wandte Code-Analyse\n  auf den Energieverbrauch an.\n* [TFGuardian](https://devpost.com/software/tfguardian) enthält unter anderem\n  einen Carbon-Footprint-Analyser.\n\nHerzlichen Glückwunsch an alle Gewinner des Sustainable Design-Bonus!\n\nJuror Jens-Joris Decorte (TechWolf) zitierte das Ergebnis: Die Kosten sanken\nvon 556 auf 18 US-Dollar pro Monat – ein Carbon-Rückgang von 96 % (das sind\n538 US-Dollar monatliche Einsparung mit einem Nachhaltigkeitslabel).\n\n\n## Sechs Projekte wurden lobend erwähnt\n\nSechs Projekte erhielten Ehrenmeldungen:\n\n- [SecurityMonkey](https://devpost.com/software/securitymonkey) injiziert\n  bekannte Schwachstellen in einen Test-Branch und bewertet, wie gut die\n  Security-Scanner sie erkennen.\n- [stregent](https://devpost.com/software/stregent) überwacht CI/CD-Pipelines\n  und lässt Entwickler(innen) Fixes aus WhatsApp heraus untersuchen und mergen –\n  ohne einen Laptop zu öffnen.\n- [Compliance Sentinel](https://devpost.com/software/compliance-sentinel-autonomous-devsecops-governance)\n  bewertet jeden Merge Request auf Compliance-Risiko und blockiert den Merge\n  bei kritischen Verstößen.\n- [Carbon Tracker](https://devpost.com/software/carbon-tracker-ij25kf)\n  berechnet den Carbon-Fußabdruck jedes CI/CD-Pipeline-Jobs und veröffentlicht\n  Optimierungstipps im Merge Request.\n- [RepoWarden](https://devpost.com/software/docuguard) ist die erste Living\n  Specification Engine – ein KI-System, das festhält, warum Code geschrieben\n  wurde, nicht nur was er tut.\n- [MR Compliance Auditor](https://devpost.com/software/mr-compliance-auditor)\n  sammelt Nachweise über Merge Requests, ordnet sie SOC-2-Kontrollen zu und\n  streamt Compliance-Scores auf ein Live-Dashboard.\n\nMein liebstes Zitat aus dem Judging stammte von Luca Chun Lun Lit (Anthropic),\nder stregents Mobile-First-Ansatz beschrieb: „Im Wesentlichen vom Handy aus\nprogrammieren zu können ist das nächste Level in der Engineering-Erfahrung.\"\n\n> Entdecke die über 600 Einreichungen in der\n> [Projektgalerie](https://gitlab.devpost.com/project-gallery).\n\n\n## Was als Nächstes kommt\n\nJeder Agent in diesem Hackathon arbeitete innerhalb eines einzelnen Projekts.\nDie Ergebnisse waren trotzdem beeindruckend. Einige Teilnehmer betrieben einen\nlokalen Wissensgraphen parallel zu ihren Agenten, um Code-Beziehungen und\nAbhängigkeiten im Repo sichtbar zu machen. LORE erfasst Projekthistorie.\nGitdefender findet Schwachstellen. Agenten mit reichhaltigerem lokalem Kontext\nzu kombinieren hilft Contributors bereits heute, schärfere Werkzeuge zu bauen.\nDer nächste Hackathon baut darauf auf. Melde dich auf\n[contributors.gitlab.com](https://contributors.gitlab.com/) an, um als Erster\nzu erfahren, wann Details bekannt gegeben werden.\n\n\n## Loslegen\n\nEin besonderer Dank gilt Lee Tickett (GitLab) und Mattias Michaux (GitLab)\nfür die Orchestrierung der Orchestratoren und Innovatoren hinter diesem\nHackathon!\n\nDanke an alle, die ein Projekt eingereicht haben. Fast 7.000 von euch haben\ngezeigt, was GitLab Duo Agent Platform kann, wenn eine Community beschließt\nzu bauen. Ich bin stolz auf das, was ihr hier gebaut habt – und ich kann es\nkaum erwarten zu sehen, was ihr als Nächstes baut.\n\nBaue deinen eigenen Agenten auf\n[GitLab Duo Agent Platform](https://docs.gitlab.com/user/duo_agent_platform/).\nEntdecke Community-gebaute Agenten im\n[AI Catalog](https://docs.gitlab.com/user/duo_agent_platform/ai_catalog/).\nDu orchestrierst. KI beschleunigt.\n",[725,22],"AI/ML",{"featured":34,"template":15,"slug":727},"gitlab-ai-hackathon-2026-meet-the-winners",{"content":729,"config":738},{"title":730,"description":731,"authors":732,"heroImage":734,"date":735,"category":11,"tags":736,"body":737},"Was ist neu in Git 2.54.0?","Erfahre mehr über die Beiträge zu diesem Release, darunter neue Repository-Wartung, ein neuer Befehl zur Bearbeitung der Commit-Historie, ein Ersatz für git-sizer(1) und mehr.",[733],"Patrick Steinhardt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776711651/sj7xxyyuimlarswbyft5.png","2026-04-20",[23,24,22],"Das Git-Projekt hat kürzlich [Git 2.54.0](https://lore.kernel.org/git/xmqqa4uxsjrs.fsf@gitster.g/T/#u) veröffentlicht. Werfen wir einen Blick auf einige bemerkenswerte Highlights dieses Releases, das Beiträge des Git-Teams bei GitLab enthält.\n\n\n## Pluggable Object Databases\n\n\nGit bietet bereits die Möglichkeit, Referenzen entweder mit dem \"files\"-Backend oder dem [\"reftable\"-Backend](https://about.gitlab.com/de-de/blog/a-beginners-guide-to-the-git-reftable-format/) zu speichern. Dies wird durch geeignete Abstraktionen in Git ermöglicht, die verschiedene Backends zulassen.\n\n\nReferenzen sind aber nur einer der beiden wichtigen Datentypen, die in Repositories gespeichert werden – der andere sind Objekte. Objekte werden in der Object Database gespeichert, und jede Object Database wiederum besteht aus mehreren Objektquellen, aus denen Objekte gelesen oder in die geschrieben werden kann. Jede Objektquelle speichert einzelne Objekte entweder als sogenannte \"Loose\"-Objekte oder komprimiert mehrere Objekte in ein \"Packfile\" im Verzeichnis `.git/objects`.\n\n\nBisher hatten diese Quellen jedoch keine echte Abstraktionsschicht, sodass das Speicherformat für Objekte komplett in Git fest verdrahtet war. Das ändert sich nun endlich mit Pluggable Object Databases! Das Konzept ist unkompliziert und ähnlich wie bei Referenzen: Statt fest verdrahteter Codepfade für die Objektspeicherung wird eine Abstraktionsschicht eingeführt, die verschiedene Backends für die Objektspeicherung ermöglicht.\n\n\nObwohl die Idee einfach ist, ist die Umsetzung komplex, da es überall in Git fest verdrahtete Annahmen über die verwendeten Speicherformate gibt. Die Arbeit an diesem Thema begann bereits mit Git 2.48, das im Januar 2025 veröffentlicht wurde. Der anfängliche Fokus lag darauf, objektbezogene Subsysteme eigenständig zu machen und geeignete Subsysteme für die bestehenden Backends in Git zu erstellen.\n\n\nMit Git 2.54 wurde nun ein Meilenstein erreicht: Das Object-Database-Backend ist jetzt pluggable. Noch wird nicht die gesamte Funktionalität von Git abgedeckt, aber die Einführung eines alternativen Backends, das eine sinnvolle Teilmenge der Operationen verarbeitet, ist jetzt ein realistisches Unterfangen.\n\n\nDerzeit funktionieren nur lokale Workflows wie das Erstellen von Commits, das Anzeigen von Commit-Graphen oder das Durchführen von Merges mit einer solchen alternativen Implementierung. Ausgenommen ist insbesondere alles, was mit einem Remote interagiert, zum Beispiel beim Fetchen oder Pushen von Änderungen. Dennoch ist dies das Ergebnis von fast zwei Jahren Arbeit über fast 400 Commits, die Upstream gemergt wurden, und die Arbeit daran wird natürlich fortgesetzt.\n\n\nWarum ist das relevant? Die Idee ist, dass es praktikabel wird, neue Speicherformate in Git einzuführen. Beispiele könnten sein:\n\n- Ein Speicherformat, das große Binärdateien effizienter speichern kann als es Packfiles heute tun\n\n- Ein Speicherformat, das speziell auf GitLab zugeschnitten ist, um Repositories noch effizienter bereitstellen zu können\n\n\nDies ist ein groß angelegtes Vorhaben, das die Zukunft von Git und GitLab maßgeblich prägen dürfte.\n\n\n*Dieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab) geleitet.*\n\n\n## Einfachere Bearbeitung der Commit-Historie\n\n\nIn vielen Softwareentwicklungsprojekten ist es gängige Praxis, nicht nur den Code zu verfeinern, sondern auch die Commit-Historie zu bereinigen, damit sie leicht überprüfbar ist. Das Ergebnis ist eine Reihe kleiner, atomarer Commits, die jeweils eine Sache tun, mit einer guten Commit-Nachricht, die die Intention des Commits sowie spezifische Nuancen beschreibt.\n\n\nNatürlich entstehen diese atomaren Commits meist nicht einfach von selbst während des Entwicklungsprozesses. Stattdessen gewinnt die Person, die die Änderungen erstellt, durch Iteration ein besseres Verständnis dafür, und die Art und Weise, die Commits aufzuteilen, wird mit der Zeit klarer. Darüber hinaus kann der anschließende Review-Prozess zu Feedback führen, das Änderungen an den erstellten Commits erfordert.\n\n\nDie Konsequenz dieses Prozesses ist, dass die Commit-Historie im Laufe der Entwicklung viele Male umgeschrieben werden muss. Historisch hat Git dafür [interaktive Rebases](https://git-scm.com/docs/git-rebase#_interactive_mode) vorgesehen. Diese interaktiven Rebases sind ein extrem leistungsfähiges Werkzeug: Sie ermöglichen es, Commits umzuordnen, Commit-Nachrichten umzuschreiben, mehrere Commits zusammenzufassen oder beliebige Bearbeitungen an jedem Commit vorzunehmen.\n\n\nAllerdings sind sie auch etwas kryptisch und schwer zu verstehen. Man muss den Basis-Commit für den Rebase bestimmen, verstehen, wie ein etwas obskures \"Instruction Sheet\" zu bearbeiten ist, und sich mit dem zustandsbehafteten Rebase-Prozess auskennen. Zum Beispiel wird beim Rebase eines Topic-Branch ein Instruction Sheet wie das folgende angezeigt:\n\n\n```shell\npick b60623f382 # t: detect errors outside of test cases # empty\npick b80cb55882 # t: prepare `test_match_signal ()` calls for `set -e`\npick 5ffe397f30 # t: prepare `test_must_fail ()` for `set -e`\npick 5e9b0cf5e1 # t: prepare `stop_git_daemon ()` for `set -e`\npick 299561e7a2 # t: prepare `git config --unset` calls for `set -e`\npick ed0e7ca2b5 # t: detect errors outside of test cases\n```\n\n\nInteraktive Rebases sind also zwar leistungsfähig, aber auch ziemlich einschüchternd für durchschnittliche Nutzende.\n\n\nDas muss aber nicht so sein. Tools wie [Jujutsu](https://www.jj-vcs.dev/latest/) bieten Interfaces, die im Vergleich zu Git deutlich einfacher zu benutzen sind – zum Beispiel kann man einfach `jj split` ausführen, um einen Commit in zwei aufzuteilen. Bei Git mit interaktiven Rebases erfordert dieser Anwendungsfall viele verschiedene Schritte mit verwirrenden Befehlszeilenargumenten.\n\n\nInspiriert von Jujutsu wurde daher ein neuer Befehl git-history(1) in Git eingeführt, der die Grundlage für eine bessere Bearbeitung der Historie bildet. Derzeit hat dieser Befehl zwei Unterbefehle:\n\n\n- `git history reword` ermöglicht das einfache Umschreiben einer Commit-Nachricht. Man gibt den Commit an, dessen Nachricht umformuliert werden soll, Git fragt nach der neuen Commit-Nachricht, und das war's.\n\n- `git history split` ermöglicht das Aufteilen eines Commits in zwei, inspiriert von `jj split`. Man gibt einen Commit an, Git fragt, welche Änderungen in welchen Commit aufgenommen werden sollen und nach den beiden Commit-Nachrichten, und dann ist man fertig.\n\n\nDas ist natürlich erst der Anfang, und im Laufe der Zeit sollen weitere Unterbefehle hinzukommen. Zum Beispiel:\n\n\n- `git history fixup` um gestagete Änderungen automatisch in einen bestimmten Commit einzufügen\n\n- `git history drop` um einen Commit zu entfernen\n\n- `git history reorder` um die Reihenfolge von Commits zu ändern\n\n- `git history squash` um eine Reihe von Commits zusammenzufassen\n\n\nAber das ist noch nicht alles! Zusätzlich zur einfachen Bearbeitung der Historie kann dieser neue Befehl auch automatisch alle lokalen Branches rebasen, die den bearbeiteten Commit zuvor enthielten. Das bedeutet, man kann sogar einen Commit bearbeiten, der nicht auf dem aktuellen Branch liegt, und alle Branches, die den Commit enthalten, werden umgeschrieben.\n\n\nEs mag zunächst überraschend erscheinen, dass Git automatisch abhängige Branches rebast, da dies eine deutliche Abweichung von der Funktionsweise von git-rebase(1) darstellt. Dies ist aber Teil eines größeren Vorhabens, um bessere Unterstützung für Stacked Diffs in Git zu bringen – eine Methode, eine Reihe mehrerer abhängiger Branches zu erstellen, die unabhängig voneinander überprüft werden können, aber gemeinsam auf ein größeres Ziel hinarbeiten.\n\n\n*Dieses Projekt wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab) mit Unterstützung von [Elijah Newren](https://github.com/newren) geleitet.*\n\n\n## Ein nativer Ersatz für git-sizer(1)\n\n\nDie Größe eines Git-Repositorys ist ein wichtiger Faktor, der bestimmt, wie gut Git und GitLab damit umgehen können. Aber die Größe allein ist nicht der einzige Faktor, da die Performance eines Repositorys letztlich eine Kombination aus mehreren verschiedenen Dimensionen ist:\n\n\n- Die Tiefe der Commit-Historie\n\n- Die Struktur des Verzeichnisbaums\n\n- Die Größe der im Repository gespeicherten Dateien\n\n- Die Anzahl der Referenzen\n\n\nDas sind nur einige der Dimensionen, die berücksichtigt werden müssen, wenn man vorhersagen will, ob Git ein Repository gut verarbeiten kann.\n\n\nObwohl klar ist, dass die reine Repository-Größe nicht ausreicht, bietet Git selbst keine Tools, die einen einfachen Überblick über diese Metriken geben. Stattdessen ist man auf Drittanbieter-Tools wie [git-sizer(1)](https://github.com/github/git-sizer) angewiesen, um diese Lücke zu füllen. Dieses Tool leistet hervorragende Arbeit bei der Darstellung dieser Informationen, ist aber kein Bestandteil von Git und muss daher separat installiert werden.\n\n\nObservability von Repository-Interna ist bei GitLab entscheidend, daher wurde in [Git 2.52 ein neuer `git repo structure`-Befehl eingeführt](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-52-0/#new-subcommand-for-git-repo1-to-display-repository-metrics), um Repository-Metriken anzuzeigen, der in Git 2.53 erweitert wurde, um [inflated und Disk-Sizes für Objekte nach Typ anzuzeigen](https://about.gitlab.com/blog/whats-new-in-git-2-53-0/#more-data-collected-in-git-repo-structure).\n\n\nIn Git 2.54 wird dieser Befehl weiter ausgebaut, sodass nicht nur die Gesamtgröße angezeigt wird, sondern auch die größten Objekte nach Typ:\n\n\n```shell\n$ git clone https://gitlab.com/git-scm/git.git\n$ cd git\n$ git repo structure\nCounting objects: 410445, done.\n| Repository structure      | Value       |\n| ------------------------- | ----------- |\n| * References              |             |\n|   * Count                 |    1.01 k   |\n|     * Branches            |       1     |\n|     * Tags                |    1.00 k   |\n|     * Remotes             |       9     |\n|     * Others              |       0     |\n|                           |             |\n| * Reachable objects       |             |\n|   * Count                 |  410.45 k   |\n|     * Commits             |   83.99 k   |\n|     * Trees               |  164.46 k   |\n|     * Blobs               |  161.00 k   |\n|     * Tags                |    1.00 k   |\n|   * Inflated size         |    7.46 GiB |\n|     * Commits             |   57.53 MiB |\n|     * Trees               |    2.33 GiB |\n|     * Blobs               |    5.07 GiB |\n|     * Tags                |  737.48 KiB |\n|   * Disk size             |  181.37 MiB |\n|     * Commits             |   33.11 MiB |\n|     * Trees               |   40.58 MiB |\n|     * Blobs               |  107.11 MiB |\n|     * Tags                |  582.67 KiB |\n|                           |             |\n| * Largest objects         |             |\n|   * Commits               |             |\n|     * Maximum size    [1] |   17.23 KiB |\n|     * Maximum parents [2] |      10     |\n|   * Trees                 |             |\n|     * Maximum size    [3] |   58.85 KiB |\n|     * Maximum entries [4] |    1.18 k   |\n|   * Blobs                 |             |\n|     * Maximum size    [5] | 1019.51 KiB |\n|   * Tags                  |             |\n|     * Maximum size    [6] |    7.13 KiB |\n\n[1] f6ecb603ff8af608a417d7724727d6bc3a9dbfdf\n[2] 16d7601e176cd53f3c2f02367698d06b85e08879\n[3] 203ee97047731b9fd3ad220faa607b6677861a0d\n[4] 203ee97047731b9fd3ad220faa607b6677861a0d\n[5] aa96f8bc361fd84a1459440f1e7de02ab0dc3543\n[6] 07e38db6a5a03690034d27104401f6c8ea40f1fc\n```\n\n\nMit diesen Informationen ist die Funktionsparität mit git-sizer(1) nahezu erreicht. Ganz fertig ist die Arbeit aber noch nicht – geplant sind weitere Features wie:\n\n\n- Severity Levels wie sie in git-sizer(1) existieren\n\n- Graphen, die die Verteilung der Objektgrößen visualisieren\n\n- Die Möglichkeit, Objekte zu scannen, die über eine Teilmenge von Referenzen erreichbar sind\n\n\n*Dieses Projekt wurde von [Justin Tobler](https://gitlab.com/justintobler) geleitet.*\n\n\n## Neue Infrastruktur für Repository-Wartung\n\n\nBeim Schreiben von Daten in ein Git-Repository entstehen in der Regel weitere Loose-Objekte. Ohne Verwaltung führt dies zu einer großen Anzahl separater Dateien im Verzeichnis `.git/objects/`, was mehrere Operationen verlangsamt, die auf viele Objekte gleichzeitig zugreifen wollen. Git packt diese Objekte daher regelmäßig in \"Packfiles\", um eine gute Performance sicherzustellen.\n\n\nDas ist aber nicht die einzige Datenstruktur, die im Laufe der Zeit ineffizient werden kann: Das Aktualisieren von Referenzen kann Loose-Referenzen erzeugen, Reflogs müssen getrimmt, Worktrees können veralten, und Caches wie Commit-Graphen müssen regelmäßig aktualisiert werden.\n\n\nAll diese Aufgaben wurden historisch von [git-gc(1)](https://git-scm.com/docs/git-gc) verwaltet. Dieses Tool hat jedoch eine monolithische Architektur, in der es im Grunde alle erforderlichen Aufgaben sequenziell ausführt. Diese Grundlage ist schwer erweiterbar und bietet wenig Flexibilität, wenn die Wartung leicht angepasst werden soll.\n\n\nDas Git-Projekt führte in Git 2.29 das neue Tool [git-maintenance(1)](https://git-scm.com/docs/git-maintenance) ein. Im Gegensatz zu git-gc(1) ist git-maintenance(1) nicht monolithisch, sondern um Tasks herum strukturiert. Diese Tasks sind frei konfigurierbar, sodass kontrolliert werden kann, welche Tasks ausgeführt werden, was eine deutlich feinere Kontrolle über die Repository-Wartung ermöglicht.\n\n\nSchließlich wurde Git standardmäßig auf git-maintenance(1) umgestellt. Zu Beginn war allerdings der einzige standardmäßig aktivierte Task der git-gc(1)-Task, der – wie der Name vermuten lässt – einfach `git gc` ausführt. Um die Wartung manuell mit dem neuen Befehl auszuführen, kann `git maintenance run` aufgerufen werden, aber Git führt dies auch automatisch nach verschiedenen anderen Befehlen aus.\n\n\nIn den letzten Releases wurden alle einzelnen Tasks implementiert, die von git-gc(1) unterstützt werden, auch in git-maintenance(1), um Funktionsparität zwischen den beiden Tools sicherzustellen.\n\n\nDarüber hinaus wurde ein neuer Task implementiert, der Gits moderne Architektur für das Repacking von Objekten mit [Geometric Compaction](https://git-scm.com/docs/git-repack#Documentation/git-repack.txt---geometricfactor) nutzt. Geometric Compaction eignet sich deutlich besser für große Monorepos, und mit den Arbeiten zur Kompatibilität mit Partial Clones, [die in Git 2.53 eingeflossen sind](https://about.gitlab.com/de-de/blog/whats-new-in-git-2-53-0/#geometric-repacking-support-with-promisor-remotes), stellen sie jetzt einen vollständigen Ersatz für die bisherige Repacking-Strategie in Git dar.\n\n\nMit Git 2.54 wurde nun ein weiterer bedeutender Meilenstein erreicht: Statt der bisherigen git-gc(1)-basierten Strategie wird jetzt standardmäßig Geometric Repacking mit feingranularen individuellen Wartungs-Tasks verwendet! Neben der höheren Effizienz für große Monorepos stellt dies auch eine einfachere Grundlage für zukünftige Weiterentwicklungen sicher.\n\n\n*Die git-maintenance(1)-Infrastruktur wurde ursprünglich von [Derrick Stolee](https://github.com/derrickstolee) implementiert, und Geometric Maintenance wurde von [Taylor Blau](https://github.com/ttaylorr) eingeführt. Die Arbeit zur Einführung der neuen feingranularen Tasks und die Migration zur neuen Wartungsstrategie wurde von [Patrick Steinhardt](https://gitlab.com/pks-gitlab) geleitet.*\n\n\n## Weiterlesen\n\n\nDieser Artikel hat nur einige der Beiträge hervorgehoben, die von GitLab und der breiteren Git-Community zu diesem aktuellen Release geleistet wurden. Weitere Informationen dazu finden sich in der [offiziellen Release-Ankündigung](https://lore.kernel.org/git/xmqqa4uxsjrs.fsf@gitster.g/T/#u) des Git-Projekts. Außerdem lohnt sich ein Blick in die [früheren Git-Release-Blogposts](https://about.gitlab.com/blog/tags/git/), um weitere vergangene Highlights der Beiträge von GitLab-Teammitgliedern zu sehen.\n",{"slug":739,"featured":34,"template":15},"whats-new-in-git-2-54-0",{"content":741,"config":751},{"title":742,"description":743,"authors":744,"heroImage":746,"date":747,"body":748,"category":11,"tags":749,"updatedDate":747},"Kubernetes: Container-Orchestrierung verstehen und einsetzen","Kubernetes (K8s) für containerisierte Anwendungen: Dieser Artikel erklärt Architektur, Vorteile, Grenzen und den Einsatz mit GitLab.",[745],"GitLab Team","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660215/Blog/Hero%20Images/kubernetes-container-orchestration-solution.jpg","2026-03-02","Kubernetes automatisiert die Bereitstellung und Verwaltung\ncontainerisierter Anwendungen in großem Maßstab. Mit der Zeit ist\nKubernetes zu einem zentralen Werkzeug für die Anwendungsentwicklung\ngeworden – etwa in den Bereichen\n[Microservices](https://about.gitlab.com/de-de/topics/microservices/),\nWebanwendungen und Datenbanken. Leistungsfähigkeit und Skalierbarkeit\nmachen K8s heute zum anerkannten Standard im Container-Management.\n\nDieser Artikel bietet einen umfassenden Einstieg in Kubernetes.\n\n## Was ist Kubernetes?\n\nKubernetes ist ein Open-Source-System zur effizienten Orchestrierung von\nContainern einer Softwareanwendung. Containerisierung ist ein weit\nverbreiteter Ansatz in der Anwendungsentwicklung – besonders im Bereich\nder digitalen Transformation und der Cloud.\n\nZur Erinnerung: **Containerisierung ist eine Methode der\nAnwendungsentwicklung, bei der die Komponenten einer Anwendung in\nstandardisierte, geräte- und betriebssystemunabhängige Einheiten –\nsogenannte Container – zusammengefasst werden.** Durch die Isolierung von\nAnwendungen von ihrer Umgebung erleichtert diese Technologie die\nBereitstellung und Portabilität und reduziert Kompatibilitätsprobleme.\n\nHier kommt Kubernetes ins Spiel. Container ermöglichen zwar die Aufteilung\nvon Anwendungen in kleinere, eigenständige Module, die leichter\nbereitzustellen sind. Damit Container jedoch innerhalb einer Anwendung\nzusammenarbeiten können, ist ein übergeordnetes Verwaltungssystem\nerforderlich. Genau das leistet Kubernetes: Die Plattform steuert, wo und\nwie Container ausgeführt werden, und ermöglicht so die Orchestrierung und\nPlanung containerisierter Anwendungen in großem Maßstab.\n\n> Weitere [GitLab-Artikel zu Kubernetes](https://about.gitlab.com/de-de/blog/tags/kubernetes/).\n\n## Wie funktioniert eine Kubernetes-Architektur?\n\nUm die Kubernetes-Architektur zu verstehen, sind einige grundlegende\nKonzepte wichtig – allen voran das des Clusters, der die umfassendste\nEinheit innerhalb der Architektur darstellt. Ein Kubernetes-Cluster ist\ndie Gesamtheit der virtuellen oder physischen Maschinen, auf denen eine\ncontainerisierte Anwendung betrieben wird.\n\n![Komponenten von\nKubernetes](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749673941/Blog/Content%20Images/components-of-kubernetes.png)\n\nQuelle:\n[Kubernetes](https://kubernetes.io/docs/concepts/overview/components/).\n\nEin Cluster besteht aus verschiedenen Elementen:\n- Node: Eine Arbeitseinheit im Kubernetes-Cluster – eine virtuelle oder\nphysische Maschine, die Aufgaben im Auftrag der Anwendung übernimmt.\n- Pod: Der kleinste bereitstellbare Baustein in Kubernetes. Ein Pod ist\neine Gruppe von Containern, die gemeinsam auf demselben Node ausgeführt\nwerden. Container innerhalb eines Pods teilen dasselbe Netzwerk und\nkommunizieren über localhost miteinander.\n- Service: Ein Kubernetes-Service macht einen Pod für das Netzwerk oder\nandere Pods zugänglich und bietet einen stabilen, klar definierten\nZugangspunkt zu den in Pods gehosteten Anwendungen.\n- Volume: Eine Ordnerabstraktion, die Probleme beim Teilen und Abrufen\nvon Dateien innerhalb eines Containers löst.\n- Namespace: Ein Namespace ermöglicht die Gruppierung und Isolierung von\nRessourcen zu einem virtuellen Cluster.\n\nDie Kubernetes-Architektur basiert auf zwei Knotentypen: dem Master Node\nund den Worker Nodes. Der Master Node ist für die übergeordnete Verwaltung\ndes Kubernetes-Clusters und die Kommunikation mit den Worker Nodes\nzuständig. Zu seinen zentralen Komponenten zählt die API als\nKommunikationszentrum zwischen Nutzenden und Cluster. Das\n[etcd](https://kubernetes.io/docs/concepts/overview/components/#etcd)\nist die Key-Value-Datenbank, in der Konfigurationen, Systemzustand und\nObjekt-Metadaten gespeichert werden. Der Controller Manager koordiniert\nHintergrundoperationen wie die Pod-Replikation, der Scheduler platziert\nPods auf Nodes entsprechend der verfügbaren Ressourcen.\n\nWorker Nodes hingegen sind die Maschinen, auf denen die in den Pods\nenthaltenen Anwendungen ausgeführt und verwaltet werden. Das\n[kubelet](https://kubernetes.io/docs/concepts/overview/components/#kubelet)\nist der Agent, der auf jedem Node läuft und mit dem Master kommuniziert,\num Befehle zu empfangen und den Status der Pods zu übermitteln. Der\nNetzwerk-Proxy\n[kube-proxy](https://kubernetes.io/docs/concepts/overview/components/)\npflegt die Netzwerkregeln auf den Nodes und ermöglicht so den Zugriff auf\nServices von außerhalb des Kubernetes-Clusters. Die Container-Runtime\nschließlich ist die Software, die für die Ausführung und Verwaltung der\nContainer innerhalb der Pods verantwortlich ist.\n\n### Die Rolle von Docker\n\nBei allen Komponenten eines K8s-Clusters ist die Wahl der Runtime innerhalb\nder Worker Nodes von Bedeutung. Verschiedene Softwarelösungen stehen dafür\nzur Verfügung, etwa CRI-O – Docker ist jedoch das am häufigsten eingesetzte\nWerkzeug.\n\n### Was ist der Unterschied zwischen Docker und Kubernetes?\n\nDocker ist eine Open-Source-Lösung, die speziell auf Container-Ebene\neingesetzt wird. Sie ermöglicht die Paketierung von Containern in einem\nstandardisierten und schlanken Format, was ihre Portabilität in\nverschiedenen Umgebungen erhöht. Docker ist damit ein ergänzendes Werkzeug\nzu K8s: Es vereinfacht die Verwaltung der Container selbst, während\nKubernetes deren Integration und Kommunikation innerhalb der Anwendung\nerleichtert.\n\n## Welche Vorteile bietet Kubernetes?\n\nSeit dem Start durch Google im Jahr 2014 und der ersten stabilen Version\nim Juli 2015 hat sich Kubernetes als Referenz im Bereich der\nContainer-Orchestrierung etabliert – insbesondere für\nMicroservice-orientierte Architekturen. Diese Verbreitung ist vor allem\nauf die Leistungsfähigkeit von K8s in der Container-Orchestrierung\nzurückzuführen.\n\nDie Vorteile von Kubernetes im Überblick:\n- Automatisierung: Kubernetes erleichtert die Automatisierung von Aufgaben\nrund um Bereitstellung, Skalierung und Aktualisierung containerisierter\nAnwendungen.\n- Flexibilität: Die Software passt sich an unterschiedliche\nContainer-Technologien sowie verschiedene Hardware-Architekturen und\nBetriebssysteme an.\n- Skalierbarkeit: K8s ermöglicht die Bereitstellung und Verwaltung\ntausender Container – unabhängig von deren Status: laufend, pausiert oder\ngestoppt.\n- Migration: Anwendungen lassen sich zu Kubernetes migrieren, ohne den\nQuellcode ändern zu müssen.\n- Multi-Cluster-Unterstützung: Kubernetes verwaltet zentral mehrere\nContainer-Cluster, die über verschiedene Infrastrukturen verteilt sind.\n- Update-Management: Die Software unterstützt Rolling-Update-Deployments,\num Anwendungen ohne Serviceunterbrechung zu aktualisieren.\n\n## Ein robustes und skalierbares Ökosystem\n\nKubernetes zeichnet sich durch die Fähigkeit aus, Container effizient und\nzuverlässig zu verwalten und dabei unabhängig von Cloud-Infrastrukturanbietern\nzu bleiben. Die modulare Architektur passt sich den spezifischen\nAnforderungen jedes Unternehmens an und unterstützt ein breites Spektrum\nan Anwendungen und Diensten – von Webservices über Datenverarbeitung bis\nhin zu mobilen Anwendungen.\n\nKubernetes profitiert dabei von einem umfangreichen und aktiven\nOpen-Source-Ökosystem. Verwaltet von der Cloud Native Computing Foundation\n([CNCF](https://www.cncf.io/)), wird K8s von tausenden Entwicklerinnen\nund Entwicklern weltweit unterstützt, die kontinuierlich zur\nWeiterentwicklung des Projekts und seiner Funktionen beitragen.\n\n## Was sind die Grenzen von Kubernetes?\n\nDie Stärken von Kubernetes machen es für viele Entwicklungsteams im\nCloud-nativen Bereich zur soliden Grundlage. Dennoch lohnt es sich,\neinige Einschränkungen zu benennen. Kubernetes erfordert fundierte\ntechnische Kenntnisse sowie die Einarbeitung in neue Entwicklungskonzepte\nund -methoden. Die Konfiguration kann zu Beginn eines Projekts komplex\nsein – ist dabei aber entscheidend, insbesondere für die Absicherung der\nPlattform. Ein erfahrenes Entwicklungsteam mit K8s-Kenntnissen ist daher\nein wesentlicher Vorteil.\n\nEine weitere Herausforderung ist die Implementierung und Wartung einer\nK8s-Architektur, die Zeit und Ressourcen erfordert – vor allem für die\nAktualisierung der verschiedenen Komponenten und Softwareteile. Dabei\nstellt sich auch die Frage nach möglichem Oversizing: Bei kleineren\nAnwendungen oder Projekten ohne besondere Skalierungsanforderungen kann\neine einfachere Architektur ausreichend und wirtschaftlicher sein.\n\n## Kubernetes im Unternehmenseinsatz\n\nZehntausende Unternehmen haben eine Kubernetes-Architektur für ihre\ndigitale Transformation übernommen. K8s wird von Organisationen aller\nGrößen genutzt – von Startups bis zu multinationalen Konzernen.\n\nEin Beispiel für eine erfolgreiche Integration ist Haven Technologies.\nDas Unternehmen hat seine SaaS-Dienste zu K8s migriert. Dabei setzt es\nauf eine Kubernetes-Strategie mit der GitLab-DevSecOps-Plattform –\nmit messbaren Verbesserungen bei Effizienz, Sicherheit und\nEntwicklungsgeschwindigkeit. Weitere Details in der\n[Kundenreferenz](https://about.gitlab.com/customers/haven-technologies/).\n\n## Kubernetes, Git und GitLab\n\nKubernetes, Git und GitLab sind zentrale Bausteine der DevOps-Landschaft.\nKubernetes bietet hohe Flexibilität bei der Bereitstellung und Verwaltung\nder verschiedenen Anwendungskomponenten. GitLab – aufgebaut auf Git und\ndessen nativer Versionskontrolle – ermöglicht eine präzise Nachverfolgung\nvon Quellcode und Änderungen und stellt eine umfassende Werkzeugsammlung\nfür den gesamten Software-Entwicklungslebenszyklus bereit.\n\nDiese Kombination schafft gemeinsam mit einem\n[GitOps-Ansatz](https://about.gitlab.com/de-de/topics/gitops/), der die\nAutomatisierung moderner Cloud-Infrastrukturen zum Ziel hat, eine agile\nUmgebung für Anwendungsentwicklung und -bereitstellung. Alle\n[GitLab-Lösungen für den Einsatz mit Kubernetes](https://about.gitlab.com/de-de/solutions/kubernetes/)\nim Überblick.\n\n## Kubernetes FAQ\n\n### Welche Alternativen zu K8s gibt es?\n\nEs gibt verschiedene Alternativen zu Kubernetes, darunter Docker Swarm\nund Marathon. Kubernetes gilt jedoch als die ausgereifteste und am\nweitesten verbreitete Lösung auf dem Markt. Die große Nutzerbasis,\numfangreiche Dokumentation und eine aktive Community machen K8s zur\nsoliden Wahl für alle, die ein Container-Orchestrierungssystem einsetzen\nmöchten.\n\n### Was ist ein Kubernetes-Cluster?\n\nEin Kubernetes-Cluster besteht aus einem Master Node und mehreren Worker\nNodes. Der Master Node koordiniert die Aufgaben im Cluster, während die\nWorker Nodes diese Orchestrierungsaufgaben ausführen und die Container\nhosten. K8s-Cluster sind hoch skalierbar – Nodes lassen sich hinzufügen\noder entfernen, um die Clusterressourcen an die Anforderungen der Anwendung\nanzupassen.\n\n### Wie startet man mit Kubernetes?\n\nZunächst ist die Installation der Kubernetes-Software in einer kompatiblen\nUmgebung (Linux, macOS oder Windows) erforderlich. Kubernetes lässt sich\nsowohl in einer klassischen Hosting-Umgebung als auch in der Cloud\ninstallieren – etwa auf Google Kubernetes Engine oder Amazon EKS. Nach\ndem Download und der Installation von der offiziellen Website folgt die\nErstkonfiguration zur Verbindung von Master und Worker Nodes. Danach ist\ndie erste Anwendung mit Kubernetes einsatzbereit.\n\n### Warum Kubernetes wählen?\n\nKubernetes bietet hohe Flexibilität und vollständige Portabilität zwischen\nverschiedenen Cloud-Plattformen oder On-Premises-Infrastrukturen. Durch\ndie Automatisierung von Orchestrierungsaufgaben lassen sich Ressourcen\noptimieren und Betriebskosten senken. Das Kubernetes-Ökosystem ist\numfangreich und wird von einer großen Open-Source-Community\nkontinuierlich weiterentwickelt.\n\n## Mehr erfahren\n\n- [Logs über das GitLab Dashboard für Kubernetes streamen](https://about.gitlab.com/blog/how-to-stream-logs-through-the-gitlab-dashboard-for-kubernetes/)\n- [Kubernetes-Überblick: Cluster-Daten im Frontend verwalten](https://about.gitlab.com/blog/kubernetes-overview-operate-cluster-data-on-the-frontend/)\n- [Cloud-Account-Management für Kubernetes-Zugriff vereinfachen](https://about.gitlab.com/blog/simplify-your-cloud-account-management-for-kubernetes-access/)\n",[750,23],"kubernetes",{"slug":752,"featured":34,"template":15},"kubernetes-the-container-orchestration-solution",{"promotions":754},[755,769,781,793],{"id":756,"categories":757,"header":759,"text":760,"button":761,"image":766},"ai-modernization",[758],"ai-ml","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":762,"config":763},"Get your AI maturity score",{"href":764,"dataGaName":765,"dataGaLocation":247},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":767},{"src":768},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":770,"categories":771,"header":773,"text":760,"button":774,"image":778},"devops-modernization",[772,571],"product","Are you just managing tools or shipping innovation?",{"text":775,"config":776},"Get your DevOps maturity score",{"href":777,"dataGaName":765,"dataGaLocation":247},"/assessments/devops-modernization-assessment/",{"config":779},{"src":780},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":782,"categories":783,"header":785,"text":760,"button":786,"image":790},"security-modernization",[784],"security","Are you trading speed for security?",{"text":787,"config":788},"Get your security maturity score",{"href":789,"dataGaName":765,"dataGaLocation":247},"/assessments/security-modernization-assessment/",{"config":791},{"src":792},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":794,"paths":795,"header":798,"text":799,"button":800,"image":805},"github-azure-migration",[796,797],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":801,"config":802},"See how GitLab compares to GitHub",{"href":803,"dataGaName":804,"dataGaLocation":247},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":806},{"src":780},{"header":808,"blurb":809,"button":810,"secondaryButton":815},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":811,"config":812},"Kostenlosen Test starten",{"href":813,"dataGaName":52,"dataGaLocation":814},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":54,"config":816},{"href":56,"dataGaName":57,"dataGaLocation":814},1777493572552]