[{"data":1,"prerenderedAt":2243},["ShallowReactive",2],{"/de-de/blog/whats-new-in-git-2-52-0":3,"navigation-de-de":1437,"banner-de-de":1868,"footer-de-de":1876,"blog-post-authors-de-de-Christian Couder|Toon Claes|Patrick Steinhardt":2117,"blog-related-posts-de-de-whats-new-in-git-2-52-0":2156,"blog-promotions-de-de":2179,"next-steps-de-de":2233},{"id":4,"title":5,"authors":6,"body":10,"category":1417,"date":1418,"description":1419,"extension":1420,"externalUrl":1421,"faq":1421,"featured":1422,"heroImage":1423,"meta":1424,"navigation":271,"path":1425,"seo":1426,"slug":1429,"stem":1430,"tags":1431,"template":1435,"updatedDate":1421,"__hash__":1436},"blogPosts/de-de/blog/whats-new-in-git-2-52-0.md","Was ist neu in Git 2.52.0?",[7,8,9],"Christian Couder","Toon Claes","Patrick Steinhardt",{"type":11,"value":12,"toc":1405},"minimark",[13,30,33,38,41,245,252,255,311,314,357,360,370,373,380,554,557,577,587,610,614,631,646,668,671,674,682,699,702,733,736,746,753,763,767,770,777,796,802,811,817,823,850,853,856,864,868,877,880,1150,1153,1162,1166,1169,1174,1186,1199,1203,1210,1227,1299,1311,1315,1342,1362,1374,1378,1385,1388,1401],[14,15,16,17,23,24,29],"p",{},"Das Git-Projekt hat kürzlich ",[18,19,22],"a",{"href":20,"rel":21},"https://lore.kernel.org/git/xmqqh5usmvsd.fsf@gitster.g/",[],"Git 2.52"," veröffentlicht. Nach einem relativ kurzen 8-Wochen-",[18,25,28],{"href":26,"rel":27},"https://about.gitlab.com/de-de/blog/what-s-new-in-git-2-51-0/",[],"Release-Zyklus für 2.51",", aufgrund des Sommers auf der Nordhalbkugel, ist dieses Release wieder beim üblichen 12-Wochen-Zyklus.",[14,31,32],{},"Schauen wir uns einige Highlights an, darunter Beiträge vom GitLab Git-Team und der weiteren Git-Community.",[34,35,37],"h2",{"id":36},"neuer-git-last-modified1-befehl","Neuer git-last-modified(1)-Befehl",[14,39,40],{},"Viele Git-Forges wie GitLab zeigen Dateien in einer Tree-Ansicht wie dieser an:",[42,43,44,60],"table",{},[45,46,47],"thead",{},[48,49,50,54,57],"tr",{},[51,52,53],"th",{},"Name",[51,55,56],{},"Last commit",[51,58,59],{},"Last update",[61,62,63,75,86,97,108,117,128,143,153,162,172,183,194,205,216,227],"tbody",{},[48,64,65,69,72],{},[66,67,68],"td",{},"README.md",[66,70,71],{},"README: *.txt -> *.adoc fixes",[66,73,74],{},"4 months ago",[48,76,77,80,83],{},[66,78,79],{},"RelNotes",[66,81,82],{},"Start 2.51 cycle, the first batch",[66,84,85],{},"4 weeks ago",[48,87,88,91,94],{},[66,89,90],{},"SECURITY.md",[66,92,93],{},"SECURITY: describe how to report vulnerabilities",[66,95,96],{},"4 years",[48,98,99,102,105],{},[66,100,101],{},"abspath.c",[66,103,104],{},"abspath: move related functions to abspath",[66,106,107],{},"2 years",[48,109,110,113,115],{},[66,111,112],{},"abspath.h",[66,114,104],{},[66,116,107],{},[48,118,119,122,125],{},[66,120,121],{},"aclocal.m4",[66,123,124],{},"configure: use AC_LANG_PROGRAM consistently",[66,126,127],{},"15 years ago",[48,129,130,133,140],{},[66,131,132],{},"add-patch.c",[66,134,135,136],{},"pager: stop using ",[137,138,139],"code",{},"the_repository",[66,141,142],{},"7 months ago",[48,144,145,148,151],{},[66,146,147],{},"advice.c",[66,149,150],{},"advice: allow disabling default branch name advice",[66,152,74],{},[48,154,155,158,160],{},[66,156,157],{},"advice.h",[66,159,150],{},[66,161,74],{},[48,163,164,167,170],{},[66,165,166],{},"alias.h",[66,168,169],{},"rebase -m: fix serialization of strategy options",[66,171,107],{},[48,173,174,177,180],{},[66,175,176],{},"alloc.h",[66,178,179],{},"git-compat-util: move alloc macros to git-compat-util.h",[66,181,182],{},"2 years ago",[48,184,185,188,191],{},[66,186,187],{},"apply.c",[66,189,190],{},"apply: only write intents to add for new files",[66,192,193],{},"8 days ago",[48,195,196,199,202],{},[66,197,198],{},"archive.c",[66,200,201],{},"Merge branch 'ps/parse-options-integers'",[66,203,204],{},"3 months ago",[48,206,207,210,213],{},[66,208,209],{},"archive.h",[66,211,212],{},"archive.h: remove unnecessary include",[66,214,215],{},"1 year",[48,217,218,221,224],{},[66,219,220],{},"attr.h",[66,222,223],{},"fuzz: port fuzz-parse-attr-line from OSS-Fuzz",[66,225,226],{},"9 months ago",[48,228,229,232,243],{},[66,230,231],{},"banned.h",[66,233,234,235,238,239,242],{},"banned.h: mark ",[137,236,237],{},"strtok()"," and ",[137,240,241],{},"strtok_r()"," as banned",[66,244,107],{},[14,246,247,250],{},[248,249],"br",{},[248,251],{},[14,253,254],{},"Neben den Dateien selbst zeigen wir auch an, welcher Commit jede jeweilige Datei zuletzt geändert hat. Diese Information lässt sich einfach aus Git extrahieren, indem du folgenden Befehl ausführst:",[256,257,262],"pre",{"className":258,"code":259,"language":260,"meta":261,"style":261},"language-shell shiki shiki-themes github-light","\n$ git log --max-count=1 HEAD -- \u003Cfilename>\n\n","shell","",[137,263,264,273],{"__ignoreMap":261},[265,266,269],"span",{"class":267,"line":268},"line",1,[265,270,272],{"emptyLinePlaceholder":271},true,"\n",[265,274,276,280,284,287,291,294,297,301,304,308],{"class":267,"line":275},2,[265,277,279],{"class":278},"s7eDp","$",[265,281,283],{"class":282},"sYBdl"," git",[265,285,286],{"class":282}," log",[265,288,290],{"class":289},"sYu0t"," --max-count=1",[265,292,293],{"class":282}," HEAD",[265,295,296],{"class":289}," --",[265,298,300],{"class":299},"sD7c4"," \u003C",[265,302,303],{"class":282},"filenam",[265,305,307],{"class":306},"sgsFI","e",[265,309,310],{"class":299},">\n",[14,312,313],{},"Obwohl schön und einfach, hat das einen erheblichen Haken: Git hat keine Möglichkeit, diese Information für jede dieser Dateien in einem einzigen Befehl zu extrahieren. Um also den letzten Commit für alle Dateien im Tree zu erhalten, müssten wir diesen Befehl für jede Datei separat ausführen. Das führt zu einer Befehlspipeline ähnlich der folgenden:",[256,315,317],{"className":258,"code":316,"language":260,"meta":261,"style":261},"\n$ git ls-tree HEAD --name-only | xargs --max-args=1 git log --max-count=1 HEAD --\n\n",[137,318,319,323],{"__ignoreMap":261},[265,320,321],{"class":267,"line":268},[265,322,272],{"emptyLinePlaceholder":271},[265,324,325,327,329,332,334,337,340,343,346,348,350,352,354],{"class":267,"line":275},[265,326,279],{"class":278},[265,328,283],{"class":282},[265,330,331],{"class":282}," ls-tree",[265,333,293],{"class":282},[265,335,336],{"class":289}," --name-only",[265,338,339],{"class":299}," |",[265,341,342],{"class":278}," xargs",[265,344,345],{"class":289}," --max-args=1",[265,347,283],{"class":282},[265,349,286],{"class":282},[265,351,290],{"class":289},[265,353,293],{"class":282},[265,355,356],{"class":289}," --\n",[14,358,359],{},"Natürlich ist das nicht sehr effizient:",[361,362,363,367],"ul",{},[364,365,366],"li",{},"Wir müssen für jede Datei einen neuen Git-Befehl starten.",[364,368,369],{},"Git muss die History für jede Datei separat durchlaufen.",[14,371,372],{},"Als Konsequenz ist diese gesamte Operation ziemlich kostspielig und erzeugt erhebliche Last für GitLab.",[14,374,375,376,379],{},"Um diese Probleme zu beheben, wurde ein neuer Git-Subcommand ",[137,377,378],{},"git-last-modified(1)"," eingeführt. Dieser Befehl gibt den Commit für jede Datei eines gegebenen Commits zurück:",[256,381,383],{"className":258,"code":382,"language":260,"meta":261,"style":261},"\n$ git last-modified HEAD\n\n\ne56f6dcd7b4c90192018e848d0810f091d092913        add-patch.c\n373ad8917beb99dc643b6e7f5c117a294384a57e        advice.h\ne9330ae4b820147c98e723399e9438c8bee60a80        advice.c\n5e2feb5ca692c5c4d39b11e1ffa056911dd7dfd3        alloc.h\n954d33a9757fcfab723a824116902f1eb16e05f7        RelNotes\n4ce0caa7cc27d50ee1bedf1dff03f13be4c54c1f        apply.c\n5d215a7b3eb0a9a69c0cb9aa43dcae956a0aa03e        archive.c\nc50fbb2dd225e7e82abba4380423ae105089f4d7        README.md\n72686d4e5e9a7236b9716368d86fae5bf1ae6156        attr.h\nc2c4138c07ca4d5ffc41ace0bfda0f189d3e262e        archive.h\n5d1344b4973c8ea4904005f3bb51a47334ebb370        abspath.c\n5d1344b4973c8ea4904005f3bb51a47334ebb370        abspath.h\n60ff56f50372c1498718938ef504e744fe011ffb        banned.h\n4960e5c7bdd399e791353bc6c551f09298746f61        alias.h\n2e99b1e383d2da56c81d7ab7dd849e9dab5b7bf0        SECURITY.md\n1e58dba142c673c59fbb9d10aeecf62217d4fc9c        aclocal.m4\n\n",[137,384,385,389,401,406,411,420,429,438,447,456,465,474,483,492,501,510,518,527,536,545],{"__ignoreMap":261},[265,386,387],{"class":267,"line":268},[265,388,272],{"emptyLinePlaceholder":271},[265,390,391,393,395,398],{"class":267,"line":275},[265,392,279],{"class":278},[265,394,283],{"class":282},[265,396,397],{"class":282}," last-modified",[265,399,400],{"class":282}," HEAD\n",[265,402,404],{"class":267,"line":403},3,[265,405,272],{"emptyLinePlaceholder":271},[265,407,409],{"class":267,"line":408},4,[265,410,272],{"emptyLinePlaceholder":271},[265,412,414,417],{"class":267,"line":413},5,[265,415,416],{"class":278},"e56f6dcd7b4c90192018e848d0810f091d092913",[265,418,419],{"class":282},"        add-patch.c\n",[265,421,423,426],{"class":267,"line":422},6,[265,424,425],{"class":278},"373ad8917beb99dc643b6e7f5c117a294384a57e",[265,427,428],{"class":282},"        advice.h\n",[265,430,432,435],{"class":267,"line":431},7,[265,433,434],{"class":278},"e9330ae4b820147c98e723399e9438c8bee60a80",[265,436,437],{"class":282},"        advice.c\n",[265,439,441,444],{"class":267,"line":440},8,[265,442,443],{"class":278},"5e2feb5ca692c5c4d39b11e1ffa056911dd7dfd3",[265,445,446],{"class":282},"        alloc.h\n",[265,448,450,453],{"class":267,"line":449},9,[265,451,452],{"class":278},"954d33a9757fcfab723a824116902f1eb16e05f7",[265,454,455],{"class":282},"        RelNotes\n",[265,457,459,462],{"class":267,"line":458},10,[265,460,461],{"class":278},"4ce0caa7cc27d50ee1bedf1dff03f13be4c54c1f",[265,463,464],{"class":282},"        apply.c\n",[265,466,468,471],{"class":267,"line":467},11,[265,469,470],{"class":278},"5d215a7b3eb0a9a69c0cb9aa43dcae956a0aa03e",[265,472,473],{"class":282},"        archive.c\n",[265,475,477,480],{"class":267,"line":476},12,[265,478,479],{"class":278},"c50fbb2dd225e7e82abba4380423ae105089f4d7",[265,481,482],{"class":282},"        README.md\n",[265,484,486,489],{"class":267,"line":485},13,[265,487,488],{"class":278},"72686d4e5e9a7236b9716368d86fae5bf1ae6156",[265,490,491],{"class":282},"        attr.h\n",[265,493,495,498],{"class":267,"line":494},14,[265,496,497],{"class":278},"c2c4138c07ca4d5ffc41ace0bfda0f189d3e262e",[265,499,500],{"class":282},"        archive.h\n",[265,502,504,507],{"class":267,"line":503},15,[265,505,506],{"class":278},"5d1344b4973c8ea4904005f3bb51a47334ebb370",[265,508,509],{"class":282},"        abspath.c\n",[265,511,513,515],{"class":267,"line":512},16,[265,514,506],{"class":278},[265,516,517],{"class":282},"        abspath.h\n",[265,519,521,524],{"class":267,"line":520},17,[265,522,523],{"class":278},"60ff56f50372c1498718938ef504e744fe011ffb",[265,525,526],{"class":282},"        banned.h\n",[265,528,530,533],{"class":267,"line":529},18,[265,531,532],{"class":278},"4960e5c7bdd399e791353bc6c551f09298746f61",[265,534,535],{"class":282},"        alias.h\n",[265,537,539,542],{"class":267,"line":538},19,[265,540,541],{"class":278},"2e99b1e383d2da56c81d7ab7dd849e9dab5b7bf0",[265,543,544],{"class":282},"        SECURITY.md\n",[265,546,548,551],{"class":267,"line":547},20,[265,549,550],{"class":278},"1e58dba142c673c59fbb9d10aeecf62217d4fc9c",[265,552,553],{"class":282},"        aclocal.m4\n",[14,555,556],{},"Der Vorteil davon ist offensichtlich, dass wir jetzt nur noch einen einzigen Git-Prozess ausführen müssen, um all diese Informationen abzuleiten. Aber noch wichtiger ist, dass wir die History nur einmal für alle Dateien zusammen durchlaufen müssen, anstatt sie mehrmals durchlaufen zu müssen. Dies wird wie folgt erreicht:",[558,559,560,563,574],"ol",{},[364,561,562],{},"Beginne damit, die History vom angegebenen Commit aus zu durchlaufen.",[364,564,565,566],{},"Für jeden Commit:",[558,567,568,571],{},[364,569,570],{},"Wenn er keinen der Pfade ändert, an denen wir interessiert sind, fahren wir mit dem nächsten Commit fort.",[364,572,573],{},"Wenn er es tut, geben wir die Commit-ID zusammen mit dem Pfad aus. Außerdem entfernen wir den Pfad aus der Menge der interessanten Pfade.",[364,575,576],{},"Wenn die Liste der interessanten Pfade leer wird, stoppen wir.",[14,578,579,580,582,583,586],{},"Gitaly wurde bereits angepasst, um den neuen Befehl zu verwenden, aber die Logik ist noch hinter einem Feature-Flag geschützt. Vorläufige Tests haben gezeigt, dass ",[137,581,378],{}," in den meisten Situationen mindestens doppelt so schnell ist wie die Verwendung von ",[137,584,585],{},"git log --max-count=1",".",[14,588,589],{},[590,591,592,593,598,599,604,605,609],"em",{},"Diese Änderungen wurden ",[18,594,597],{"href":595,"rel":596},"https://github.com/ttaylorr/git/tree/tb/blame-tree",[],"ursprünglich geschrieben"," von mehreren Entwicklern von GitHub und wurden ",[18,600,603],{"href":601,"rel":602},"https://lore.kernel.org/git/20250805093358.1791633-1-toon@iotcl.com/",[],"upstream"," in Git von ",[18,606,8],{"href":607,"rel":608},"https://gitlab.com/toon",[]," integriert.",[34,611,613],{"id":612},"signatur-bezogene-verbesserungen-für-git-fast-export1-und-git-fast-import1","Signatur-bezogene Verbesserungen für git-fast-export(1) und git-fast-import(1)",[14,615,616,617,620,621,624,625,630],{},"Die Befehle ",[137,618,619],{},"git-fast-export(1)"," und ",[137,622,623],{},"git-fast-import(1)"," sind dafür konzipiert, hauptsächlich von Interoperabilitäts- oder History-Rewriting-Tools verwendet zu werden. Das Ziel von Interoperabilitäts-Tools ist es, Git problemlos mit anderer Software interagieren zu lassen, normalerweise einem anderen Versionskontrollsystem, das Daten in einem anderen Format als Git speichert. Zum Beispiel ist ",[18,626,629],{"href":627,"rel":628},"https://github.com/frej/fast-export",[],"hg-fast-export.sh"," ein „Mercurial-zu-Git-Konverter, der git-fast-import verwendet.\"",[14,632,633,634,639,640,645],{},"Alternativ lassen History-Rewriting-Tools Benutzer – normalerweise Admins – Änderungen an der History ihrer Repositories vornehmen, die Versionskontrollsysteme nicht zulassen. Zum Beispiel sagt ",[18,635,638],{"href":636,"rel":637},"http://www.catb.org/esr/reposurgeon/",[],"reposurgeon"," in seiner ",[18,641,644],{"href":642,"rel":643},"https://gitlab.com/esr/reposurgeon/-/blob/master/repository-editing.adoc?ref_type=heads#introduction",[],"Einführung",", dass sein Zweck ist, „riskante Operationen zu ermöglichen, die Versionskontrollsysteme dich nicht durchführen lassen wollen, wie zum Beispiel (a) Bearbeitung vergangener Kommentare und Metadaten, (b) Entfernung von Commits, (c) Zusammenführung und Aufteilung von Commits, (d) Entfernung von Dateien und Subtrees aus der Repo-History, (e) Zusammenführung oder Verknüpfung von zwei oder mehr Repos und (f) Aufteilung eines Repos in zwei durch Durchtrennung einer Parent-Child-Verbindung, wobei die Branch-Struktur beider Child-Repos erhalten bleibt.\"",[14,647,648,649,654,655,657,658,660,661,663,664,667],{},"Innerhalb von GitLab verwenden wir ",[18,650,653],{"href":651,"rel":652},"https://github.com/newren/git-filter-repo",[],"git-filter-repo",", um Admins einige riskante Operationen an ihren Git-Repositories durchführen zu lassen. Leider haben bis Git 2.50 (veröffentlicht im letzten Juni) sowohl ",[137,656,619],{}," als auch ",[137,659,623],{}," kryptografische Commit-Signaturen überhaupt nicht behandelt. Obwohl ",[137,662,619],{}," also eine Option ",[137,665,666],{},"--signed-tags=\u003Cmode>"," hatte, die es Benutzern ermöglicht zu ändern, wie kryptografische Tag-Signaturen behandelt werden, wurden Commit-Signaturen einfach ignoriert.",[14,669,670],{},"Kryptografische Signaturen sind sehr fragil, weil sie auf den exakten Commit- oder Tag-Daten basieren, die signiert wurden. Wenn sich die signierten Daten oder irgendetwas von ihrer vorhergehenden History ändert, wird die kryptografische Signatur ungültig. Dies ist eine fragile, aber notwendige Anforderung, um diese Signaturen nützlich zu machen.",[14,672,673],{},"Aber im Kontext des Neuschreibens der History ist das ein Problem:",[361,675,676,679],{},[364,677,678],{},"Wir möchten vielleicht kryptografische Signaturen sowohl für Commits als auch für Tags behalten, die nach dem Neuschreiben noch gültig sind (z.B. weil sich die History, die zu ihnen führt, nicht geändert hat).",[364,680,681],{},"Wir möchten vielleicht neue kryptografische Signaturen für Commits und Tags erstellen, bei denen die vorherige Signatur ungültig geworden ist.",[14,683,684,685,687,688,690,691,694,695,698],{},"Weder ",[137,686,623],{}," noch ",[137,689,619],{}," erlauben diese Anwendungsfälle jedoch, was einschränkt, was Tools wie ",[18,692,653],{"href":651,"rel":693},[]," oder ",[18,696,638],{"href":636,"rel":697},[]," erreichen können.",[14,700,701],{},"Wir haben einige erhebliche Fortschritte gemacht:",[361,703,704,717,723],{},[364,705,706,707,710,711,713,714,716],{},"In Git 2.50 haben wir eine Option ",[137,708,709],{},"--signed-commits=\u003Cmode>"," zu ",[137,712,619],{}," hinzugefügt, um Commit-Signaturen zu exportieren, und Unterstützung in ",[137,715,623],{},", um sie zu importieren.",[364,718,719,720,722],{},"In Git 2.51 haben wir das Format verbessert, das zum Exportieren und Importieren von Commit-Signaturen verwendet wird, und wir haben es für ",[137,721,623],{}," möglich gemacht, sowohl eine Signatur zu importieren, die auf der SHA-1-Objekt-ID des Commits gemacht wurde, als auch eine, die auf seiner SHA-256-Objekt-ID gemacht wurde.",[364,724,725,726,620,728,710,730,732],{},"In Git 2.52 haben wir die Optionen ",[137,727,709],{},[137,729,666],{},[137,731,623],{}," hinzugefügt, sodass der Benutzer Kontrolle darüber hat, wie signierte Daten zum Zeitpunkt des Imports behandelt werden.",[14,734,735],{},"Es gibt noch mehr zu tun. Wir müssen die Fähigkeit hinzufügen:",[361,737,738,743],{},[364,739,740,741,586],{},"Nur die Commit-Signaturen beizubehalten, die noch gültig sind, zu ",[137,742,623],{},[364,744,745],{},"Daten neu zu signieren, bei denen die Signatur ungültig wurde.",[14,747,748,749,752],{},"Wir arbeiten bereits an diesen nächsten Schritten, und erwarten, dass dies in Git 2.53 landet. Sobald das erledigt ist, werden Tools wie ",[137,750,751],{},"git-filter-repo(1)"," endlich beginnen, kryptografische Signaturen eleganter zu handhaben. Wir werden dich in unserem nächsten Git-Release-Blogpost auf dem Laufenden halten.",[14,754,755],{},[590,756,757,758,762],{},"Dieses Projekt wurde von ",[18,759,7],{"href":760,"rel":761},"https://gitlab.com/chriscool",[]," geleitet.",[34,764,766],{"id":765},"neue-und-verbesserte-git-maintenance1-strategien","Neue und verbesserte git-maintenance(1)-Strategien",[14,768,769],{},"Git-Repositories benötigen regelmäßige Wartung, um sicherzustellen, dass sie gut funktionieren. Diese Wartung führt eine Reihe verschiedener Aufgaben aus: Referenzen werden optimiert, Objekte werden komprimiert und veraltete Daten werden bereinigt.",[14,771,772,773,776],{},"Bis Git 2.28 wurden diese Wartungsaufgaben von ",[137,774,775],{},"git-gc(1)"," durchgeführt. Das Problem mit diesem Befehl war, dass er nicht mit Blick auf Anpassbarkeit entwickelt wurde: Während bestimmte Parameter konfiguriert werden können, ist es nicht möglich zu kontrollieren, welche Teile eines Repositorys optimiert werden sollen. Das bedeutet, dass es möglicherweise nicht für alle Anwendungsfälle gut geeignet ist. Noch wichtiger ist, dass es sehr schwer wurde, darüber zu iterieren, wie genau Git Repository-Wartung durchführt.",[14,778,779,780,785,786,789,790,792,793,795],{},"Um dieses Problem zu beheben und uns wieder iterieren zu lassen, hat ",[18,781,784],{"href":782,"rel":783},"https://github.com/derrickstolee",[],"Derrick Stolee"," ",[137,787,788],{},"git-maintenance(1)"," eingeführt. Im Gegensatz zu ",[137,791,775],{}," ist es mit Blick auf Anpassbarkeit entwickelt und ermöglicht es dem Benutzer zu konfigurieren, welche Aufgaben speziell in einem bestimmten Repository ausgeführt werden sollen. Dieses neue Tool wurde in Git 2.29 zum Standard für Gits automatisierte Wartung gemacht, aber standardmäßig verwendet es immer noch ",[137,794,775],{},", um die Wartung durchzuführen.",[14,797,798,799,801],{},"Während diese Standard-Wartungsstrategie in kleinen oder sogar mittelgroßen Repositories gut funktioniert, ist sie im Kontext großer Monorepos problematisch. Der größte limitierende Faktor ist, wie ",[137,800,775],{}," Objekte neu packt: Immer wenn es mehr als 50 Packfiles gibt, wird das Tool alle zusammen in ein einziges Packfile zusammenführen. Diese Operation ist ziemlich CPU-intensiv und verursacht viele I/O-Operationen, sodass diese Operation für große Monorepos leicht viele Minuten oder sogar Stunden dauern kann.",[14,803,804,805,810],{},"Git weiß bereits, wie diese Repacks durch „geometrisches Repacking\" minimiert werden können. Die Idee ist einfach: Die Packfiles, die im Repository existieren, müssen einer geometrischen Progression folgen, bei der jedes Packfile mindestens doppelt so viele Objekte enthalten muss wie das nächstkleinere. Dies ermöglicht es Git, die Anzahl der erforderlichen Repacks zu amortisieren und gleichzeitig sicherzustellen, dass es insgesamt nur eine relativ kleine Anzahl von Packfiles gibt. Dieser Modus wurde von ",[18,806,809],{"href":807,"rel":808},"https://github.com/ttaylorr",[],"Taylor Blau"," in Git 2.32 eingeführt, aber er wurde nicht als Teil der automatisierten Wartung eingebunden.",[14,812,813,814,816],{},"Alle Teile existieren, um die Repository-Wartung für große Monorepos viel skalierbarer zu machen: Wir haben das flexible ",[137,815,788],{},"-Tool, das erweitert werden kann, um eine neue Wartungsstrategie zu haben, und wir haben einen besseren Weg, Objekte neu zu packen. Alles, was getan werden muss, ist, diese beiden zu kombinieren.",[14,818,819,820,822],{},"Und genau das haben wir mit Git 2.52 getan! Wir haben eine neue „geometrische\" Wartungsstrategie eingeführt, die du in deinen Git-Repositories konfigurieren kannst. Diese Strategie ist als vollständiger Ersatz für die alte Strategie basierend auf ",[137,821,775],{}," gedacht. Hier ist der Config-Code, den du benötigst:",[256,824,826],{"className":258,"code":825,"language":260,"meta":261,"style":261},"\n$ git config set maintenance.strategy geometric\n\n",[137,827,828,832],{"__ignoreMap":261},[265,829,830],{"class":267,"line":268},[265,831,272],{"emptyLinePlaceholder":271},[265,833,834,836,838,841,844,847],{"class":267,"line":275},[265,835,279],{"class":278},[265,837,283],{"class":282},[265,839,840],{"class":282}," config",[265,842,843],{"class":282}," set",[265,845,846],{"class":282}," maintenance.strategy",[265,848,849],{"class":282}," geometric\n",[14,851,852],{},"Ab jetzt verwendet Git geometrisches Repacking verwenden, um deine Objekte zu optimieren. Das sollte zu weniger Churn führen und gleichzeitig sicherstellen, dass deine Objekte in einem besser optimierten Zustand sind, besonders in großen Monorepos.",[14,854,855],{},"In Git 2.53 wollen wir dies zur Standard-Strategie machen. Also bleib dran!",[14,857,858],{},[590,859,757,860,762],{},[18,861,9],{"href":862,"rel":863},"https://gitlab.com/pks-gitlab",[],[34,865,867],{"id":866},"neuer-subcommand-für-git-repo1-zur-anzeige-von-repository-metriken","Neuer Subcommand für git-repo(1) zur Anzeige von Repository-Metriken",[14,869,870,871,876],{},"Die Performance von Git-Operationen in einem Repository hängt oft von bestimmten Eigenschaften seiner zugrunde liegenden Struktur ab. Bei GitLab hosten wir einige extrem große Repositories, und Einblicke in die allgemeine Struktur eines Repositorys sind entscheidend, um die Performance zu verstehen. Während es möglich ist, verschiedene Git-Befehle und andere Tools zusammenzusetzen, um bestimmte Repository-Metriken zu ermitteln, fehlt Git eine Möglichkeit, Informationen über die Form/Struktur eines Repositorys über einen einzigen Befehl zu liefern. Dies hat zur Entwicklung anderer externer Tools geführt, wie ",[18,872,875],{"href":873,"rel":874},"https://github.com/github/git-sizer",[],"git-sizer(1)",", um diese Lücke zu füllen.",[14,878,879],{},"Mit dem Release von Git 2.52 wurde ein neuer „structure\"-Subcommand zu git-repo(1) hinzugefügt mit dem Ziel, Informationen über die Struktur eines Repositorys zu liefern. Derzeit zeigt er Informationen über die Anzahl der Referenzen und Objekte im Repository in der folgenden Form an:",[256,881,883],{"className":258,"code":882,"language":260,"meta":261,"style":261},"\n$ git repo structure\n\n\n| Repository structure | Value  |\n| -------------------- | ------ |\n| * References         |        |\n|   * Count            |   1772 |\n|     * Branches       |      3 |\n|     * Tags           |   1025 |\n|     * Remotes        |    744 |\n|     * Others         |      0 |\n|                      |        |\n| * Reachable objects  |        |\n|   * Count            | 418958 |\n|     * Commits        |  87468 |\n|     * Trees          | 168866 |\n|     * Blobs          | 161632 |\n|     * Tags           |    992 |\n\n",[137,884,885,889,901,905,909,928,943,959,977,995,1012,1029,1045,1054,1071,1086,1102,1119,1135],{"__ignoreMap":261},[265,886,887],{"class":267,"line":268},[265,888,272],{"emptyLinePlaceholder":271},[265,890,891,893,895,898],{"class":267,"line":275},[265,892,279],{"class":278},[265,894,283],{"class":282},[265,896,897],{"class":282}," repo",[265,899,900],{"class":282}," structure\n",[265,902,903],{"class":267,"line":403},[265,904,272],{"emptyLinePlaceholder":271},[265,906,907],{"class":267,"line":408},[265,908,272],{"emptyLinePlaceholder":271},[265,910,911,914,917,920,922,925],{"class":267,"line":413},[265,912,913],{"class":299},"|",[265,915,916],{"class":278}," Repository",[265,918,919],{"class":282}," structure",[265,921,339],{"class":299},[265,923,924],{"class":278}," Value",[265,926,927],{"class":299},"  |\n",[265,929,930,932,935,937,940],{"class":267,"line":422},[265,931,913],{"class":299},[265,933,934],{"class":278}," --------------------",[265,936,339],{"class":299},[265,938,939],{"class":278}," ------",[265,941,942],{"class":299}," |\n",[265,944,945,947,950,953,956],{"class":267,"line":431},[265,946,913],{"class":299},[265,948,949],{"class":278}," *",[265,951,952],{"class":282}," References",[265,954,955],{"class":299},"         |",[265,957,958],{"class":299},"        |\n",[265,960,961,963,966,969,972,975],{"class":267,"line":440},[265,962,913],{"class":299},[265,964,965],{"class":278},"   *",[265,967,968],{"class":282}," Count",[265,970,971],{"class":299},"            |",[265,973,974],{"class":278},"   1772",[265,976,942],{"class":299},[265,978,979,981,984,987,990,993],{"class":267,"line":449},[265,980,913],{"class":299},[265,982,983],{"class":278},"     *",[265,985,986],{"class":282}," Branches",[265,988,989],{"class":299},"       |",[265,991,992],{"class":278},"      3",[265,994,942],{"class":299},[265,996,997,999,1001,1004,1007,1010],{"class":267,"line":458},[265,998,913],{"class":299},[265,1000,983],{"class":278},[265,1002,1003],{"class":282}," Tags",[265,1005,1006],{"class":299},"           |",[265,1008,1009],{"class":278},"   1025",[265,1011,942],{"class":299},[265,1013,1014,1016,1018,1021,1024,1027],{"class":267,"line":467},[265,1015,913],{"class":299},[265,1017,983],{"class":278},[265,1019,1020],{"class":282}," Remotes",[265,1022,1023],{"class":299},"        |",[265,1025,1026],{"class":278},"    744",[265,1028,942],{"class":299},[265,1030,1031,1033,1035,1038,1040,1043],{"class":267,"line":476},[265,1032,913],{"class":299},[265,1034,983],{"class":278},[265,1036,1037],{"class":282}," Others",[265,1039,955],{"class":299},[265,1041,1042],{"class":278},"      0",[265,1044,942],{"class":299},[265,1046,1047,1049,1052],{"class":267,"line":485},[265,1048,913],{"class":299},[265,1050,1051],{"class":299},"                      |",[265,1053,958],{"class":299},[265,1055,1056,1058,1060,1063,1066,1069],{"class":267,"line":494},[265,1057,913],{"class":299},[265,1059,949],{"class":278},[265,1061,1062],{"class":282}," Reachable",[265,1064,1065],{"class":282}," objects",[265,1067,1068],{"class":299},"  |",[265,1070,958],{"class":299},[265,1072,1073,1075,1077,1079,1081,1084],{"class":267,"line":503},[265,1074,913],{"class":299},[265,1076,965],{"class":278},[265,1078,968],{"class":282},[265,1080,971],{"class":299},[265,1082,1083],{"class":278}," 418958",[265,1085,942],{"class":299},[265,1087,1088,1090,1092,1095,1097,1100],{"class":267,"line":512},[265,1089,913],{"class":299},[265,1091,983],{"class":278},[265,1093,1094],{"class":282}," Commits",[265,1096,1023],{"class":299},[265,1098,1099],{"class":278},"  87468",[265,1101,942],{"class":299},[265,1103,1104,1106,1108,1111,1114,1117],{"class":267,"line":520},[265,1105,913],{"class":299},[265,1107,983],{"class":278},[265,1109,1110],{"class":282}," Trees",[265,1112,1113],{"class":299},"          |",[265,1115,1116],{"class":278}," 168866",[265,1118,942],{"class":299},[265,1120,1121,1123,1125,1128,1130,1133],{"class":267,"line":529},[265,1122,913],{"class":299},[265,1124,983],{"class":278},[265,1126,1127],{"class":282}," Blobs",[265,1129,1113],{"class":299},[265,1131,1132],{"class":278}," 161632",[265,1134,942],{"class":299},[265,1136,1137,1139,1141,1143,1145,1148],{"class":267,"line":538},[265,1138,913],{"class":299},[265,1140,983],{"class":278},[265,1142,1003],{"class":282},[265,1144,1006],{"class":299},[265,1146,1147],{"class":278},"    992",[265,1149,942],{"class":299},[14,1151,1152],{},"In zukünftigen Releases hoffen wir, dies zu erweitern und andere interessante Datenpunkte bereitzustellen, wie die größten Objekte im Repository.",[14,1154,1155],{},[590,1156,757,1157,762],{},[18,1158,1161],{"href":1159,"rel":1160},"https://gitlab.com/justintobler",[],"Justin Tobler",[34,1163,1165],{"id":1164},"verbesserungen-im-zusammenhang-mit-dem-google-summer-of-code-2025","Verbesserungen im Zusammenhang mit dem Google Summer of Code 2025",[14,1167,1168],{},"Wir hatten drei erfolgreiche Projekte mit dem Google Summer of Code.",[1170,1171,1173],"h3",{"id":1172},"refactoring-zur-reduzierung-von-gits-globalem-status","Refactoring zur Reduzierung von Gits globalem Status",[14,1175,1176,1177,1182,1183,1185],{},"Git enthält mehrere globale Variablen, die in der gesamten Codebasis verwendet werden. Dies erhöht die Komplexität des Codes und verringert die Wartbarkeit. Als Teil dieses Projekts hat ",[18,1178,1181],{"href":1179,"rel":1180},"https://ayu-ch.github.io/",[],"Ayush Chandekar"," daran gearbeitet, die Verwendung der globalen Variable ",[137,1184,139],{}," durch eine Reihe von Patches zu reduzieren.",[14,1187,1188],{},[590,1189,1190,1191,620,1194,586],{},"Das Projekt wurde betreut von ",[18,1192,7],{"href":760,"rel":1193},[],[18,1195,1198],{"href":1196,"rel":1197},"https://in.linkedin.com/in/ghanshyam-thakkar",[],"Ghanshyam Thakkar",[1170,1200,1202],{"id":1201},"maschinenlesbares-repository-informations-abfrage-tool","Maschinenlesbares Repository-Informations-Abfrage-Tool",[14,1204,1205,1206,1209],{},"Git fehlt ein zentraler Weg, um Repository-Informationen abzurufen, was Benutzer zwingt, sie aus verschiedenen Befehlen zusammenzusetzen. Während ",[137,1207,1208],{},"git-rev-parse(1)"," zum De-facto-Tool für den Zugriff auf viele dieser Informationen geworden ist, liegt dies außerhalb seines Hauptzwecks.",[14,1211,1212,1213,1218,1219,1222,1223,1226],{},"Als Teil dieses Projekts hat ",[18,1214,1217],{"href":1215,"rel":1216},"https://lucasoshiro.github.io/en/",[],"Lucas Oshiro"," einen neuen Befehl eingeführt, ",[137,1220,1221],{},"git-repo(1)",", der alle Repository-Level-Informationen beherbergen wird. Benutzer können jetzt ",[137,1224,1225],{},"git repo info"," verwenden, um Repository-Informationen zu erhalten:",[256,1228,1230],{"className":258,"code":1229,"language":260,"meta":261,"style":261},"\n$ git repo info layout.bare layout.shallow object.format references.format\n\nlayout.bare=false\nlayout.shallow=false\nobject.format=sha1\nreferences.format=reftable\n\n",[137,1231,1232,1236,1259,1263,1274,1283,1291],{"__ignoreMap":261},[265,1233,1234],{"class":267,"line":268},[265,1235,272],{"emptyLinePlaceholder":271},[265,1237,1238,1240,1242,1244,1247,1250,1253,1256],{"class":267,"line":275},[265,1239,279],{"class":278},[265,1241,283],{"class":282},[265,1243,897],{"class":282},[265,1245,1246],{"class":282}," info",[265,1248,1249],{"class":282}," layout.bare",[265,1251,1252],{"class":282}," layout.shallow",[265,1254,1255],{"class":282}," object.format",[265,1257,1258],{"class":282}," references.format\n",[265,1260,1261],{"class":267,"line":403},[265,1262,272],{"emptyLinePlaceholder":271},[265,1264,1265,1268,1271],{"class":267,"line":408},[265,1266,1267],{"class":278},"layout.bare",[265,1269,1270],{"class":282},"=",[265,1272,1273],{"class":289},"false\n",[265,1275,1276,1279,1281],{"class":267,"line":413},[265,1277,1278],{"class":278},"layout.shallow",[265,1280,1270],{"class":282},[265,1282,1273],{"class":289},[265,1284,1285,1288],{"class":267,"line":422},[265,1286,1287],{"class":278},"object.format",[265,1289,1290],{"class":282},"=sha1\n",[265,1292,1293,1296],{"class":267,"line":431},[265,1294,1295],{"class":278},"references.format",[265,1297,1298],{"class":282},"=reftable\n",[14,1300,1301],{},[590,1302,1190,1303,620,1306,586],{},[18,1304,9],{"href":862,"rel":1305},[],[18,1307,1310],{"href":1308,"rel":1309},"https://gitlab.com/knayakgl",[],"Karthik Nayak",[1170,1312,1314],{"id":1313},"konsolidierung-ref-bezogener-funktionalität-in-git-refs","Konsolidierung ref-bezogener Funktionalität in git-refs",[14,1316,1317,1318,1321,1322,1321,1325,620,1328,1331,1332,1335,1336,1341],{},"Git bietet mehrere Befehle zur Verwaltung von Referenzen, nämlich ",[137,1319,1320],{},"git-for-each-ref(1)",", ",[137,1323,1324],{},"git show-ref(1)",[137,1326,1327],{},"git-update-ref(1)",[137,1329,1330],{},"git-pack-refs(1)",". Das macht sie schwerer zu entdecken und erzeugt sich überschneidende Funktionalität. Um dies anzugehen, haben wir den Befehl ",[137,1333,1334],{},"git-refs(1)"," eingeführt, um diese Operationen unter einer einzigen Schnittstelle zu konsolidieren. Als Teil dieses Projekts hat ",[18,1337,1340],{"href":1338,"rel":1339},"https://inosmeet.github.io/",[],"Meet Soni"," den Befehl durch Hinzufügen der folgenden Subcommands erweitert:",[361,1343,1344,1350,1356],{},[364,1345,1346,1349],{},[137,1347,1348],{},"git refs optimize"," zur Optimierung des Reference-Backends",[364,1351,1352,1355],{},[137,1353,1354],{},"git refs list"," zum Auflisten aller Referenzen",[364,1357,1358,1361],{},[137,1359,1360],{},"git refs exists"," zur Überprüfung der Existenz einer Referenz",[14,1363,1364],{},[590,1365,1190,1366,620,1369,586],{},[18,1367,9],{"href":862,"rel":1368},[],[18,1370,1373],{"href":1371,"rel":1372},"https://luolibrary.com/",[],"shejialuo",[34,1375,1377],{"id":1376},"was-kommt-als-nächstes","Was kommt als Nächstes?",[14,1379,1380,1381,1384],{},"Bereit, diese Verbesserungen zu erleben? Aktualisiere auf Git 2.52.0 und fang an, ",[137,1382,1383],{},"git last-modified"," zu verwenden.",[14,1386,1387],{},"Bei GitLab werden wir natürlich sicherstellen, dass all diese Verbesserungen schließlich in einer GitLab-Instanz in deiner Nähe landen!",[14,1389,1390,1391,1395,1396,586],{},"Erfahre mehr in den ",[18,1392,1394],{"href":20,"rel":1393},[],"offiziellen Git 2.52.0 Release Notes"," und erkunde unser ",[18,1397,1400],{"href":1398,"rel":1399},"https://about.gitlab.com/blog/tags/git/",[],"vollständiges Archiv der Git-Entwicklungs-Berichterstattung",[1402,1403,1404],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":261,"searchDepth":275,"depth":275,"links":1406},[1407,1408,1409,1410,1411,1416],{"id":36,"depth":275,"text":37},{"id":612,"depth":275,"text":613},{"id":765,"depth":275,"text":766},{"id":866,"depth":275,"text":867},{"id":1164,"depth":275,"text":1165,"children":1412},[1413,1414,1415],{"id":1172,"depth":403,"text":1173},{"id":1201,"depth":403,"text":1202},{"id":1313,"depth":403,"text":1314},{"id":1376,"depth":275,"text":1377},"open-source","2025-11-17","Alles zum aktuellen Release, darunter der neue git-last-modified(1)-Befehl, Verbesserungen an History-Rewriting-Tools und eine neue Maintenance-Strategie.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png",{},"/de-de/blog/whats-new-in-git-2-52-0",{"config":1427,"title":5,"description":1428},{"noIndex":1422},"Erfahre alles über dieses Release, darunter der neue git-last-modified(1)-Befehl, Verbesserungen an History-Rewriting-Tools und eine neue Maintenance-Strategie.","whats-new-in-git-2-52-0","de-de/blog/whats-new-in-git-2-52-0",[1432,1433,1434],"open source","git","community","BlogPost","gs6_LG3Kb8-uo_bSjY-MDmiyJAl21ZV5mbnKsFKA0UE",{"logo":1438,"freeTrial":1443,"sales":1448,"login":1453,"items":1458,"search":1786,"minimal":1820,"duo":1838,"switchNav":1847,"pricingDeployment":1858},{"config":1439},{"href":1440,"dataGaName":1441,"dataGaLocation":1442},"/de-de/","gitlab logo","header",{"text":1444,"config":1445},"Kostenlose Testversion anfordern",{"href":1446,"dataGaName":1447,"dataGaLocation":1442},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1449,"config":1450},"Demo anfordern",{"href":1451,"dataGaName":1452,"dataGaLocation":1442},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1454,"config":1455},"Anmelden",{"href":1456,"dataGaName":1457,"dataGaLocation":1442},"https://gitlab.com/users/sign_in/","sign in",[1459,1488,1590,1595,1708,1764],{"text":1460,"config":1461,"menu":1463},"Plattform",{"dataNavLevelOne":1462},"platform",{"type":1464,"columns":1465},"cards",[1466,1472,1480],{"title":1460,"description":1467,"link":1468},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1469,"config":1470},"Die Plattform erkunden",{"href":1471,"dataGaName":1462,"dataGaLocation":1442},"/de-de/platform/",{"title":1473,"description":1474,"link":1475},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1476,"config":1477},"Lerne GitLab Duo kennen",{"href":1478,"dataGaName":1479,"dataGaLocation":1442},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1481,"description":1482,"link":1483},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1484,"config":1485},"Mehr erfahren",{"href":1486,"dataGaName":1487,"dataGaLocation":1442},"/de-de/why-gitlab/","why gitlab",{"text":1489,"left":271,"config":1490,"menu":1492},"Produkt",{"dataNavLevelOne":1491},"solutions",{"type":1493,"link":1494,"columns":1498,"feature":1569},"lists",{"text":1495,"config":1496},"Alle Lösungen anzeigen",{"href":1497,"dataGaName":1491,"dataGaLocation":1442},"/de-de/solutions/",[1499,1524,1547],{"title":1500,"description":1501,"link":1502,"items":1507},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1503},{"icon":1504,"href":1505,"dataGaName":1506,"dataGaLocation":1442},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1508,1512,1515,1520],{"text":1509,"config":1510},"CI/CD",{"href":1511,"dataGaLocation":1442,"dataGaName":1509},"/de-de/solutions/continuous-integration/",{"text":1473,"config":1513},{"href":1478,"dataGaLocation":1442,"dataGaName":1514},"gitlab duo agent platform - product menu",{"text":1516,"config":1517},"Quellcodeverwaltung",{"href":1518,"dataGaLocation":1442,"dataGaName":1519},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1521,"config":1522},"Automatische Softwarebereitstellung",{"href":1505,"dataGaLocation":1442,"dataGaName":1523},"Automated software delivery",{"title":1525,"description":1526,"link":1527,"items":1532},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1528},{"href":1529,"dataGaName":1530,"dataGaLocation":1442,"icon":1531},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1533,1537,1542],{"text":1534,"config":1535},"Anwendungssicherheitstests",{"href":1529,"dataGaName":1536,"dataGaLocation":1442},"Application security testing",{"text":1538,"config":1539},"Schutz der Software-Lieferkette",{"href":1540,"dataGaLocation":1442,"dataGaName":1541},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1543,"config":1544},"Software-Compliance",{"href":1545,"dataGaName":1546,"dataGaLocation":1442},"/de-de/solutions/software-compliance/","software compliance",{"title":1548,"link":1549,"items":1554},"Messung",{"config":1550},{"icon":1551,"href":1552,"dataGaName":1553,"dataGaLocation":1442},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1555,1559,1564],{"text":1556,"config":1557},"Sichtbarkeit und Messung",{"href":1552,"dataGaLocation":1442,"dataGaName":1558},"Visibility and Measurement",{"text":1560,"config":1561},"Wertstrommanagement",{"href":1562,"dataGaLocation":1442,"dataGaName":1563},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1565,"config":1566},"Analysen und Einblicke",{"href":1567,"dataGaLocation":1442,"dataGaName":1568},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1570,"type":1493,"items":1571},"GitLab für",[1572,1578,1584],{"text":1573,"config":1574},"Enterprise",{"icon":1575,"href":1576,"dataGaLocation":1442,"dataGaName":1577},"Building","/de-de/enterprise/","enterprise",{"text":1579,"config":1580},"Kleinunternehmen",{"icon":1581,"href":1582,"dataGaLocation":1442,"dataGaName":1583},"Work","/de-de/small-business/","small business",{"text":1585,"config":1586},"Öffentlicher Sektor",{"icon":1587,"href":1588,"dataGaLocation":1442,"dataGaName":1589},"Organization","/de-de/solutions/public-sector/","public sector",{"text":1591,"config":1592},"Preise",{"href":1593,"dataGaName":1594,"dataGaLocation":1442,"dataNavLevelOne":1594},"/de-de/pricing/","pricing",{"text":1596,"config":1597,"menu":1599},"Ressourcen",{"dataNavLevelOne":1598},"resources",{"type":1493,"link":1600,"columns":1604,"feature":1697},{"text":1601,"config":1602},"Alle Ressourcen anzeigen",{"href":1603,"dataGaName":1598,"dataGaLocation":1442},"/de-de/resources/",[1605,1638,1665],{"title":1606,"items":1607},"Erste Schritte",[1608,1613,1618,1623,1628,1633],{"text":1609,"config":1610},"Installieren",{"href":1611,"dataGaName":1612,"dataGaLocation":1442},"/de-de/install/","install",{"text":1614,"config":1615},"Kurzanleitungen",{"href":1616,"dataGaName":1617,"dataGaLocation":1442},"/de-de/get-started/","quick setup checklists",{"text":1619,"config":1620},"Lernen",{"href":1621,"dataGaLocation":1442,"dataGaName":1622},"https://university.gitlab.com/","learn",{"text":1624,"config":1625},"Produktdokumentation",{"href":1626,"dataGaName":1627,"dataGaLocation":1442},"https://docs.gitlab.com/","product documentation",{"text":1629,"config":1630},"Best-Practice-Videos",{"href":1631,"dataGaName":1632,"dataGaLocation":1442},"/de-de/getting-started-videos/","best practice videos",{"text":1634,"config":1635},"Integrationen",{"href":1636,"dataGaName":1637,"dataGaLocation":1442},"/de-de/integrations/","integrations",{"title":1639,"items":1640},"Entdecken",[1641,1646,1651,1656,1660],{"text":1642,"config":1643},"Kundenerfolge",{"href":1644,"dataGaName":1645,"dataGaLocation":1442},"/de-de/customers/","customer success stories",{"text":1647,"config":1648},"Blog",{"href":1649,"dataGaName":1650,"dataGaLocation":1442},"/de-de/blog/","blog",{"text":1652,"config":1653},"Demo-Hub",{"href":1654,"dataGaName":1655,"dataGaLocation":1442},"/de-de/demo-hub/","demo hub",{"text":1657,"config":1658},"The Source",{"href":1659,"dataGaName":1650,"dataGaLocation":1442},"/de-de/the-source/",{"text":1661,"config":1662},"Remote",{"href":1663,"dataGaName":1664,"dataGaLocation":1442},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1666,"items":1667},"Vernetzen",[1668,1673,1678,1682,1687,1692],{"text":1669,"config":1670},"GitLab-Services",{"href":1671,"dataGaName":1672,"dataGaLocation":1442},"/de-de/services/","services",{"text":1674,"config":1675},"Beitragen",{"href":1676,"dataGaName":1677,"dataGaLocation":1442},"https://contributors.gitlab.com","contribute",{"text":1679,"config":1680},"Community",{"href":1681,"dataGaName":1434,"dataGaLocation":1442},"/community/",{"text":1683,"config":1684},"Forum",{"href":1685,"dataGaName":1686,"dataGaLocation":1442},"https://forum.gitlab.com/","forum",{"text":1688,"config":1689},"Veranstaltungen",{"href":1690,"dataGaName":1691,"dataGaLocation":1442},"/events/","events",{"text":1693,"config":1694},"Partner",{"href":1695,"dataGaName":1696,"dataGaLocation":1442},"/de-de/partners/","partners",{"config":1698,"title":1701,"text":1702,"link":1703},{"background":1699,"textColor":1700},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":1704,"config":1705},"Aktuelle Nachrichten",{"href":1706,"dataGaName":1707,"dataGaLocation":1442},"/de-de/whats-new/","whats new",{"text":1709,"config":1710,"menu":1712},"Unternehmen",{"dataNavLevelOne":1711},"company",{"type":1493,"columns":1713},[1714],{"items":1715},[1716,1721,1727,1729,1734,1739,1744,1749,1754,1759],{"text":1717,"config":1718},"Über",{"href":1719,"dataGaName":1720,"dataGaLocation":1442},"/de-de/company/","about",{"text":1722,"config":1723,"footerGa":1726},"Karriere",{"href":1724,"dataGaName":1725,"dataGaLocation":1442},"/jobs/","jobs",{"dataGaName":1725},{"text":1688,"config":1728},{"href":1690,"dataGaName":1691,"dataGaLocation":1442},{"text":1730,"config":1731},"Geschäftsführung",{"href":1732,"dataGaName":1733,"dataGaLocation":1442},"/company/team/e-group/","leadership",{"text":1735,"config":1736},"Handbuch",{"href":1737,"dataGaName":1738,"dataGaLocation":1442},"https://handbook.gitlab.com/","handbook",{"text":1740,"config":1741},"Investor Relations",{"href":1742,"dataGaName":1743,"dataGaLocation":1442},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1745,"config":1746},"Trust Center",{"href":1747,"dataGaName":1748,"dataGaLocation":1442},"/de-de/security/","trust center",{"text":1750,"config":1751},"AI Transparency Center",{"href":1752,"dataGaName":1753,"dataGaLocation":1442},"/de-de/ai-transparency-center/","ai transparency center",{"text":1755,"config":1756},"Newsletter",{"href":1757,"dataGaName":1758,"dataGaLocation":1442},"/company/contact/#contact-forms","newsletter",{"text":1760,"config":1761},"Presse",{"href":1762,"dataGaName":1763,"dataGaLocation":1442},"/press/","press",{"text":1765,"config":1766,"menu":1767},"Kontakt",{"dataNavLevelOne":1711},{"type":1493,"columns":1768},[1769],{"items":1770},[1771,1776,1781],{"text":1772,"config":1773},"Vertrieb kontaktieren",{"href":1774,"dataGaName":1775,"dataGaLocation":1442},"/de-de/sales/","talk to sales",{"text":1777,"config":1778},"Support-Portal",{"href":1779,"dataGaName":1780,"dataGaLocation":1442},"https://support.gitlab.com/hc/en-us","support portal",{"text":1782,"config":1783},"Kundenportal",{"href":1784,"dataGaName":1785,"dataGaLocation":1442},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1787,"login":1788,"suggestions":1795},"Schließen",{"text":1789,"link":1790},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1791,"config":1792},"gitlab.com",{"href":1456,"dataGaName":1793,"dataGaLocation":1794},"search login","search",{"text":1796,"default":1797},"Vorschläge",[1798,1800,1805,1807,1812,1817],{"text":1473,"config":1799},{"href":1478,"dataGaName":1473,"dataGaLocation":1794},{"text":1801,"config":1802},"Codevorschläge (KI)",{"href":1803,"dataGaName":1804,"dataGaLocation":1794},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1509,"config":1806},{"href":1511,"dataGaName":1509,"dataGaLocation":1794},{"text":1808,"config":1809},"GitLab auf AWS",{"href":1810,"dataGaName":1811,"dataGaLocation":1794},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1813,"config":1814},"GitLab auf Google Cloud",{"href":1815,"dataGaName":1816,"dataGaLocation":1794},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1481,"config":1818},{"href":1486,"dataGaName":1819,"dataGaLocation":1794},"Why GitLab?",{"freeTrial":1821,"mobileIcon":1826,"desktopIcon":1831,"secondaryButton":1834},{"text":1822,"config":1823},"Kostenlos testen",{"href":1824,"dataGaName":1447,"dataGaLocation":1825},"https://gitlab.com/-/trials/new/","nav",{"altText":1827,"config":1828},"GitLab-Symbol",{"src":1829,"dataGaName":1830,"dataGaLocation":1825},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1827,"config":1832},{"src":1833,"dataGaName":1830,"dataGaLocation":1825},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1606,"config":1835},{"href":1836,"dataGaName":1837,"dataGaLocation":1825},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1839,"mobileIcon":1843,"desktopIcon":1845},{"text":1840,"config":1841},"Mehr über GitLab Duo erfahren",{"href":1478,"dataGaName":1842,"dataGaLocation":1825},"gitlab duo",{"altText":1827,"config":1844},{"src":1829,"dataGaName":1830,"dataGaLocation":1825},{"altText":1827,"config":1846},{"src":1833,"dataGaName":1830,"dataGaLocation":1825},{"button":1848,"mobileIcon":1853,"desktopIcon":1855},{"text":1849,"config":1850},"/Option",{"href":1851,"dataGaName":1852,"dataGaLocation":1825},"#contact","switch",{"altText":1827,"config":1854},{"src":1829,"dataGaName":1830,"dataGaLocation":1825},{"altText":1827,"config":1856},{"src":1857,"dataGaName":1830,"dataGaLocation":1825},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1859,"mobileIcon":1864,"desktopIcon":1866},{"text":1860,"config":1861},"Zurück zur Preisübersicht",{"href":1593,"dataGaName":1862,"dataGaLocation":1825,"icon":1863},"back to pricing","GoBack",{"altText":1827,"config":1865},{"src":1829,"dataGaName":1830,"dataGaLocation":1825},{"altText":1827,"config":1867},{"src":1833,"dataGaName":1830,"dataGaLocation":1825},{"title":1869,"button":1870,"config":1874},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1484,"config":1871},{"href":1872,"dataGaName":1873,"dataGaLocation":1442},"/de-de/gitlab-orbit/","orbit",{"layout":1875,"disabled":1422},"release",{"data":1877},{"text":1878,"source":1879,"edit":1885,"contribute":1890,"config":1895,"items":1900,"minimal":2106},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":1880,"config":1881},"Quelltext der Seite anzeigen",{"href":1882,"dataGaName":1883,"dataGaLocation":1884},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1886,"config":1887},"Diese Seite bearbeiten",{"href":1888,"dataGaName":1889,"dataGaLocation":1884},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1891,"config":1892},"Beteilige dich",{"href":1893,"dataGaName":1894,"dataGaLocation":1884},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1896,"facebook":1897,"youtube":1898,"linkedin":1899},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1901,1946,1999,2041,2073],{"title":1591,"links":1902,"subMenu":1917},[1903,1907,1912],{"text":1904,"config":1905},"Tarife anzeigen",{"href":1593,"dataGaName":1906,"dataGaLocation":1884},"view plans",{"text":1908,"config":1909},"Vorteile von Premium",{"href":1910,"dataGaName":1911,"dataGaLocation":1884},"/de-de/pricing/premium/","why premium",{"text":1913,"config":1914},"Vorteile von Ultimate",{"href":1915,"dataGaName":1916,"dataGaLocation":1884},"/de-de/pricing/ultimate/","why ultimate",[1918],{"title":1765,"links":1919},[1920,1922,1924,1926,1931,1936,1941],{"text":1772,"config":1921},{"href":1774,"dataGaName":1452,"dataGaLocation":1884},{"text":1777,"config":1923},{"href":1779,"dataGaName":1780,"dataGaLocation":1884},{"text":1782,"config":1925},{"href":1784,"dataGaName":1785,"dataGaLocation":1884},{"text":1927,"config":1928},"Status",{"href":1929,"dataGaName":1930,"dataGaLocation":1884},"https://status.gitlab.com/","status",{"text":1932,"config":1933},"Nutzungsbedingungen",{"href":1934,"dataGaName":1935,"dataGaLocation":1884},"/terms/","terms of use",{"text":1937,"config":1938},"Datenschutzerklärung",{"href":1939,"dataGaName":1940,"dataGaLocation":1884},"/de-de/privacy/","privacy statement",{"text":1942,"config":1943},"Cookie-Einstellungen",{"dataGaName":1944,"dataGaLocation":1884,"id":1945,"isOneTrustButton":271},"cookie preferences","ot-sdk-btn",{"title":1489,"links":1947,"subMenu":1956},[1948,1952],{"text":1949,"config":1950},"DevSecOps-Plattform",{"href":1471,"dataGaName":1951,"dataGaLocation":1884},"devsecops platform",{"text":1953,"config":1954},"KI-unterstützte Entwicklung",{"href":1478,"dataGaName":1955,"dataGaLocation":1884},"ai-assisted development",[1957],{"title":1958,"links":1959},"Themen",[1960,1964,1969,1974,1979,1984,1989,1994],{"text":1509,"config":1961},{"href":1962,"dataGaName":1963,"dataGaLocation":1884},"/de-de/topics/ci-cd/","cicd",{"text":1965,"config":1966},"GitOps",{"href":1967,"dataGaName":1968,"dataGaLocation":1884},"/de-de/topics/gitops/","gitops",{"text":1970,"config":1971},"DevOps",{"href":1972,"dataGaName":1973,"dataGaLocation":1884},"/de-de/topics/devops/","devops",{"text":1975,"config":1976},"Versionskontrolle",{"href":1977,"dataGaName":1978,"dataGaLocation":1884},"/de-de/topics/version-control/","version control",{"text":1980,"config":1981},"DevSecOps",{"href":1982,"dataGaName":1983,"dataGaLocation":1884},"/de-de/topics/devsecops/","devsecops",{"text":1985,"config":1986},"Cloud-nativ",{"href":1987,"dataGaName":1988,"dataGaLocation":1884},"/de-de/topics/cloud-native/","cloud native",{"text":1990,"config":1991},"KI für das Programmieren",{"href":1992,"dataGaName":1993,"dataGaLocation":1884},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":1995,"config":1996},"Agentische KI",{"href":1997,"dataGaName":1998,"dataGaLocation":1884},"/de-de/topics/agentic-ai/","agentic ai",{"title":2000,"links":2001},"Lösungen",[2002,2005,2007,2012,2016,2019,2022,2025,2027,2029,2031,2036],{"text":1534,"config":2003},{"href":1529,"dataGaName":2004,"dataGaLocation":1884},"Application Security Testing",{"text":1521,"config":2006},{"href":1505,"dataGaName":1506,"dataGaLocation":1884},{"text":2008,"config":2009},"Agile Entwicklung",{"href":2010,"dataGaName":2011,"dataGaLocation":1884},"/de-de/solutions/agile-delivery/","agile delivery",{"text":2013,"config":2014},"SCM",{"href":1518,"dataGaName":2015,"dataGaLocation":1884},"source code management",{"text":1509,"config":2017},{"href":1511,"dataGaName":2018,"dataGaLocation":1884},"continuous integration & delivery",{"text":1560,"config":2020},{"href":1562,"dataGaName":2021,"dataGaLocation":1884},"value stream management",{"text":1965,"config":2023},{"href":2024,"dataGaName":1968,"dataGaLocation":1884},"/de-de/solutions/gitops/",{"text":1573,"config":2026},{"href":1576,"dataGaName":1577,"dataGaLocation":1884},{"text":1579,"config":2028},{"href":1582,"dataGaName":1583,"dataGaLocation":1884},{"text":1585,"config":2030},{"href":1588,"dataGaName":1589,"dataGaLocation":1884},{"text":2032,"config":2033},"Bildungswesen",{"href":2034,"dataGaName":2035,"dataGaLocation":1884},"/de-de/solutions/education/","education",{"text":2037,"config":2038},"Finanzdienstleistungen",{"href":2039,"dataGaName":2040,"dataGaLocation":1884},"/de-de/solutions/finance/","financial services",{"title":1596,"links":2042},[2043,2045,2047,2049,2052,2054,2057,2059,2061,2063,2065,2067,2069,2071],{"text":1609,"config":2044},{"href":1611,"dataGaName":1612,"dataGaLocation":1884},{"text":1614,"config":2046},{"href":1616,"dataGaName":1617,"dataGaLocation":1884},{"text":1619,"config":2048},{"href":1621,"dataGaName":1622,"dataGaLocation":1884},{"text":1624,"config":2050},{"href":1626,"dataGaName":2051,"dataGaLocation":1884},"docs",{"text":1647,"config":2053},{"href":1649,"dataGaName":1650,"dataGaLocation":1884},{"text":2055,"config":2056},"Neuerungen",{"href":1706,"dataGaName":1707,"dataGaLocation":1884},{"text":1642,"config":2058},{"href":1644,"dataGaName":1645,"dataGaLocation":1884},{"text":1661,"config":2060},{"href":1663,"dataGaName":1664,"dataGaLocation":1884},{"text":1669,"config":2062},{"href":1671,"dataGaName":1672,"dataGaLocation":1884},{"text":1674,"config":2064},{"href":1676,"dataGaName":1677,"dataGaLocation":1884},{"text":1679,"config":2066},{"href":1681,"dataGaName":1434,"dataGaLocation":1884},{"text":1683,"config":2068},{"href":1685,"dataGaName":1686,"dataGaLocation":1884},{"text":1688,"config":2070},{"href":1690,"dataGaName":1691,"dataGaLocation":1884},{"text":1693,"config":2072},{"href":1695,"dataGaName":1696,"dataGaLocation":1884},{"title":1709,"links":2074},[2075,2077,2079,2081,2083,2085,2090,2095,2097,2099,2101],{"text":1717,"config":2076},{"href":1719,"dataGaName":1711,"dataGaLocation":1884},{"text":1722,"config":2078},{"href":1724,"dataGaName":1725,"dataGaLocation":1884},{"text":1730,"config":2080},{"href":1732,"dataGaName":1733,"dataGaLocation":1884},{"text":1735,"config":2082},{"href":1737,"dataGaName":1738,"dataGaLocation":1884},{"text":1740,"config":2084},{"href":1742,"dataGaName":1743,"dataGaLocation":1884},{"text":2086,"config":2087},"Nachhaltigkeit",{"href":2088,"dataGaName":2089,"dataGaLocation":1884},"/sustainability/","Sustainability",{"text":2091,"config":2092},"Vielfalt, Inklusion und Zugehörigkeit",{"href":2093,"dataGaName":2094,"dataGaLocation":1884},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1745,"config":2096},{"href":1747,"dataGaName":1748,"dataGaLocation":1884},{"text":1755,"config":2098},{"href":1757,"dataGaName":1758,"dataGaLocation":1884},{"text":1760,"config":2100},{"href":1762,"dataGaName":1763,"dataGaLocation":1884},{"text":2102,"config":2103},"Transparenzerklärung zu moderner Sklaverei",{"href":2104,"dataGaName":2105,"dataGaLocation":1884},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2107},[2108,2111,2114],{"text":2109,"config":2110},"Terms",{"href":1934,"dataGaName":1935,"dataGaLocation":1884},{"text":2112,"config":2113},"Cookies",{"dataGaName":1944,"dataGaLocation":1884,"id":1945,"isOneTrustButton":271},{"text":2115,"config":2116},"Datenschutz",{"href":1939,"dataGaName":1940,"dataGaLocation":1884},[2118,2132,2144],{"id":2119,"title":7,"body":1421,"config":2120,"content":2122,"description":1421,"extension":2126,"meta":2127,"navigation":271,"path":2128,"seo":2129,"stem":2130,"__hash__":2131},"blogAuthors/en-us/blog/authors/christian-couder.yml",{"template":2121},"BlogAuthor",{"name":7,"config":2123},{"headshot":2124,"ctfId":2125},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663687/Blog/Author%20Headshots/chriscool-headshot.jpg","chriscool","yml",{},"/en-us/blog/authors/christian-couder",{},"en-us/blog/authors/christian-couder","6VsKjKNdm1XKAmFMZHj53ROyylDlxaSJhcARRkw6EQQ",{"id":2133,"title":8,"body":1421,"config":2134,"content":2135,"description":1421,"extension":2126,"meta":2139,"navigation":271,"path":2140,"seo":2141,"stem":2142,"__hash__":2143},"blogAuthors/en-us/blog/authors/toon-claes.yml",{"template":2121},{"name":8,"config":2136},{"headshot":2137,"ctfId":2138},"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",{"id":2145,"title":9,"body":1421,"config":2146,"content":2147,"description":1421,"extension":2126,"meta":2151,"navigation":271,"path":2152,"seo":2153,"stem":2154,"__hash__":2155},"blogAuthors/en-us/blog/authors/patrick-steinhardt.yml",{"template":2121},{"name":9,"config":2148},{"headshot":2149,"ctfId":2150},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661952/Blog/Author%20Headshots/pks-gitlab-headshot.png","pksgitlab",{},"/en-us/blog/authors/patrick-steinhardt",{},"en-us/blog/authors/patrick-steinhardt","SV9Yd_vW69UbvntDP-SEOV9NKT_VwUAj5nfftf2ElSw",[2157,2164,2172],{"title":2158,"description":2159,"heroImage":2160,"category":1417,"date":2161,"authors":2162,"slug":2163,"externalUrl":1421},"Was ist neu in Git 2.55.0?","Neue Funktionen in Git 2.55: git-history(1) fixup, fsmonitor-Daemon für Linux, Push zu Remote-Gruppen und mehr.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[8],"whats-new-in-git-2-55-0",{"title":2165,"description":2166,"heroImage":2167,"category":1417,"date":2168,"authors":2169,"slug":2171,"externalUrl":1421},"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.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[2170],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":2173,"description":2174,"heroImage":2175,"category":1417,"date":2176,"authors":2177,"slug":2178,"externalUrl":1421},"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.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776711651/sj7xxyyuimlarswbyft5.png","2026-04-20",[9],"whats-new-in-git-2-54-0",{"promotions":2180},[2181,2195,2207,2219],{"id":2182,"categories":2183,"header":2185,"text":2186,"button":2187,"image":2192},"ai-modernization",[2184],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":2188,"config":2189},"Ermittle deinen KI-Reifegrad",{"href":2190,"dataGaName":2191,"dataGaLocation":1650},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":2193},{"src":2194},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2196,"categories":2197,"header":2199,"text":2186,"button":2200,"image":2204},"devops-modernization",[2198,1983],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":2201,"config":2202},"Ermittle deinen DevOps-Reifegrad",{"href":2203,"dataGaName":2191,"dataGaLocation":1650},"/de-de/assessments/devops-modernization-assessment/",{"config":2205},{"src":2206},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2208,"categories":2209,"header":2211,"text":2186,"button":2212,"image":2216},"security-modernization",[2210],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2213,"config":2214},"Ermittle deinen Sicherheitsreifegrad",{"href":2215,"dataGaName":2191,"dataGaLocation":1650},"/de-de/assessments/security-modernization-assessment/",{"config":2217},{"src":2218},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2220,"paths":2221,"header":2224,"text":2225,"button":2226,"image":2231},"github-azure-migration",[2222,2223],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":2227,"config":2228},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2229,"dataGaName":2230,"dataGaLocation":1650},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2232},{"src":2206},{"header":2234,"blurb":2235,"button":2236,"secondaryButton":2241},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2237,"config":2238},"Kostenlosen Test starten",{"href":2239,"dataGaName":1447,"dataGaLocation":2240},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1772,"config":2242},{"href":1774,"dataGaName":1452,"dataGaLocation":2240},1786803724782]