[{"data":1,"prerenderedAt":1958},["ShallowReactive",2],{"/de-de/blog/whats-new-in-git-2-45-0":3,"navigation-de-de":1175,"banner-de-de":1606,"footer-de-de":1614,"blog-post-authors-de-de-Patrick Steinhardt":1855,"blog-related-posts-de-de-whats-new-in-git-2-45-0":1870,"blog-promotions-de-de":1894,"next-steps-de-de":1948},{"id":4,"title":5,"authors":6,"body":8,"category":1155,"date":1156,"description":1157,"extension":1158,"externalUrl":1159,"faq":1159,"featured":1160,"heroImage":1161,"meta":1162,"navigation":97,"path":1163,"seo":1164,"slug":1168,"stem":1169,"tags":1170,"template":1173,"updatedDate":1159,"__hash__":1174},"blogPosts/de-de/blog/whats-new-in-git-2-45-0.md","Was ist neu in Git 2.45.0?",[7],"Patrick Steinhardt",{"type":9,"value":10,"toc":1146},"minimark",[11,23,28,31,46,61,64,412,415,543,546,563,592,595,610,772,791,794,802,806,809,812,817,820,835,838,841,883,890,893,904,961,964,972,976,979,986,1022,1025,1036,1071,1076,1080,1087,1094,1097,1100,1111,1124,1129,1133,1142],[12,13,14,15,22],"p",{},"Das Git-Projekt hat kürzlich ",[16,17,21],"a",{"href":18,"rel":19,"title":20},"https://lore.kernel.org/git/xmqq8r0ww0sj.fsf@gitster.g/",[],"Git Version\n2.45.0","Git-Version\n2.45.0"," veröffentlicht. Werfen wir einen Blick auf die Highlights dieser\nVersion, die Beiträge des Git-Teams von GitLab und der gesamten\nGit-Community enthält.",[24,25,27],"h2",{"id":26},"reftables-ein-neues-backend-zum-speichern-von-referenzen","Reftables: Ein neues Backend zum Speichern von Referenzen",[12,29,30],{},"Jedes Git-Repository muss zwei grundlegende Datenstrukturen erfassen:",[32,33,34,38],"ul",{},[35,36,37],"li",{},"Den Objektgraphen, der die Daten deiner Dateien, die Verzeichnisstruktur,\nCommit-Nachrichten und Tags speichert.",[35,39,40,41,45],{},"Referenzen, die auf diesen Objektgraphen verweisen, um bestimmte Objekte\nmit einem leichter verständlichen Namen zu verknüpfen. Ein Branch ist zum\nBeispiel eine Referenz, deren Name mit dem Präfix ",[42,43,44],"code",{},"refs/heads/"," beginnt.",[47,48,49],"blockquote",{},[12,50,51,55,56],{},[52,53,54],"strong",{},"Ü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. ",[16,57,60],{"href":58,"rel":59},"https://about.gitlab.com/de-de/customers/siemens/",[],"Erfolgsstory lesen",[12,62,63],{},"Das Format, in dem Referenzen in einem Repository auf der Festplatte\ngespeichert werden, ist seit der Einführung von Git weitgehend unverändert\ngeblieben und wird als „files“-Format bezeichnet. Jedes Mal, wenn du eine\nReferenz erstellst, legt Git eine sogenannte „lose Referenz“ an. Das ist\neine einfache Datei in deinem Git-Repository, deren Pfad mit dem Namen der\nReferenz übereinstimmt. Zum Beispiel:",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-shell shiki shiki-themes github-light","$ git init .\n\nInitialized empty Git repository in /tmp/repo/.git/\n\n\n# Das Updaten einer Referenz veranlasst Git dazu, eine “lose Referenz”\n\n# zu erstellen. Diese lose Referenz ist eine einfache Datei, welche die\n\n# Objekt-ID des Commits enthält.\n\n$ git commit --allow-empty --message \"Initial commit\"\n\n[main (root-commit) c70f266] Initial commit\n\n$ cat .git/refs/heads/main\n\nc70f26689975782739ef9666af079535b12b5946\n\n\n# Wenn man eine zweite Referenz erstellt, wird diese als zweite lose\n\n# Referenz gespeichert.\n\n$ git branch feature\n\n$ cat .git/refs/heads/feature\n\nc70f26689975782739ef9666af079535b12b5946\n\n$ tree .git/refs\n\n.git/refs/\n\n├── heads\n\n│   ├── feature\n\n│   └── main\n\n└── tags\n\n\n3 directories, 2 files\n","shell","",[42,72,73,92,99,120,125,130,137,142,148,153,159,164,184,189,203,208,219,224,230,235,240,246,251,257,262,275,280,290,295,300,305,316,321,327,332,341,346,357,362,373,378,387,392,397],{"__ignoreMap":70},[74,75,78,82,86,89],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"s7eDp","$",[74,83,85],{"class":84},"sYBdl"," git",[74,87,88],{"class":84}," init",[74,90,91],{"class":84}," .\n",[74,93,95],{"class":76,"line":94},2,[74,96,98],{"emptyLinePlaceholder":97},true,"\n",[74,100,102,105,108,111,114,117],{"class":76,"line":101},3,[74,103,104],{"class":80},"Initialized",[74,106,107],{"class":84}," empty",[74,109,110],{"class":84}," Git",[74,112,113],{"class":84}," repository",[74,115,116],{"class":84}," in",[74,118,119],{"class":84}," /tmp/repo/.git/\n",[74,121,123],{"class":76,"line":122},4,[74,124,98],{"emptyLinePlaceholder":97},[74,126,128],{"class":76,"line":127},5,[74,129,98],{"emptyLinePlaceholder":97},[74,131,133],{"class":76,"line":132},6,[74,134,136],{"class":135},"sAwPA","# Das Updaten einer Referenz veranlasst Git dazu, eine “lose Referenz”\n",[74,138,140],{"class":76,"line":139},7,[74,141,98],{"emptyLinePlaceholder":97},[74,143,145],{"class":76,"line":144},8,[74,146,147],{"class":135},"# zu erstellen. Diese lose Referenz ist eine einfache Datei, welche die\n",[74,149,151],{"class":76,"line":150},9,[74,152,98],{"emptyLinePlaceholder":97},[74,154,156],{"class":76,"line":155},10,[74,157,158],{"class":135},"# Objekt-ID des Commits enthält.\n",[74,160,162],{"class":76,"line":161},11,[74,163,98],{"emptyLinePlaceholder":97},[74,165,167,169,171,174,178,181],{"class":76,"line":166},12,[74,168,81],{"class":80},[74,170,85],{"class":84},[74,172,173],{"class":84}," commit",[74,175,177],{"class":176},"sYu0t"," --allow-empty",[74,179,180],{"class":176}," --message",[74,182,183],{"class":84}," \"Initial commit\"\n",[74,185,187],{"class":76,"line":186},13,[74,188,98],{"emptyLinePlaceholder":97},[74,190,192,196,200],{"class":76,"line":191},14,[74,193,195],{"class":194},"sgsFI","[main (root",[74,197,199],{"class":198},"sD7c4","-",[74,201,202],{"class":194},"commit) c70f266] Initial commit\n",[74,204,206],{"class":76,"line":205},15,[74,207,98],{"emptyLinePlaceholder":97},[74,209,211,213,216],{"class":76,"line":210},16,[74,212,81],{"class":80},[74,214,215],{"class":84}," cat",[74,217,218],{"class":84}," .git/refs/heads/main\n",[74,220,222],{"class":76,"line":221},17,[74,223,98],{"emptyLinePlaceholder":97},[74,225,227],{"class":76,"line":226},18,[74,228,229],{"class":80},"c70f26689975782739ef9666af079535b12b5946\n",[74,231,233],{"class":76,"line":232},19,[74,234,98],{"emptyLinePlaceholder":97},[74,236,238],{"class":76,"line":237},20,[74,239,98],{"emptyLinePlaceholder":97},[74,241,243],{"class":76,"line":242},21,[74,244,245],{"class":135},"# Wenn man eine zweite Referenz erstellt, wird diese als zweite lose\n",[74,247,249],{"class":76,"line":248},22,[74,250,98],{"emptyLinePlaceholder":97},[74,252,254],{"class":76,"line":253},23,[74,255,256],{"class":135},"# Referenz gespeichert.\n",[74,258,260],{"class":76,"line":259},24,[74,261,98],{"emptyLinePlaceholder":97},[74,263,265,267,269,272],{"class":76,"line":264},25,[74,266,81],{"class":80},[74,268,85],{"class":84},[74,270,271],{"class":84}," branch",[74,273,274],{"class":84}," feature\n",[74,276,278],{"class":76,"line":277},26,[74,279,98],{"emptyLinePlaceholder":97},[74,281,283,285,287],{"class":76,"line":282},27,[74,284,81],{"class":80},[74,286,215],{"class":84},[74,288,289],{"class":84}," .git/refs/heads/feature\n",[74,291,293],{"class":76,"line":292},28,[74,294,98],{"emptyLinePlaceholder":97},[74,296,298],{"class":76,"line":297},29,[74,299,229],{"class":80},[74,301,303],{"class":76,"line":302},30,[74,304,98],{"emptyLinePlaceholder":97},[74,306,308,310,313],{"class":76,"line":307},31,[74,309,81],{"class":80},[74,311,312],{"class":84}," tree",[74,314,315],{"class":84}," .git/refs\n",[74,317,319],{"class":76,"line":318},32,[74,320,98],{"emptyLinePlaceholder":97},[74,322,324],{"class":76,"line":323},33,[74,325,326],{"class":80},".git/refs/\n",[74,328,330],{"class":76,"line":329},34,[74,331,98],{"emptyLinePlaceholder":97},[74,333,335,338],{"class":76,"line":334},35,[74,336,337],{"class":80},"├──",[74,339,340],{"class":84}," heads\n",[74,342,344],{"class":76,"line":343},36,[74,345,98],{"emptyLinePlaceholder":97},[74,347,349,352,355],{"class":76,"line":348},37,[74,350,351],{"class":80},"│",[74,353,354],{"class":84},"   ├──",[74,356,274],{"class":84},[74,358,360],{"class":76,"line":359},38,[74,361,98],{"emptyLinePlaceholder":97},[74,363,365,367,370],{"class":76,"line":364},39,[74,366,351],{"class":80},[74,368,369],{"class":84},"   └──",[74,371,372],{"class":84}," main\n",[74,374,376],{"class":76,"line":375},40,[74,377,98],{"emptyLinePlaceholder":97},[74,379,381,384],{"class":76,"line":380},41,[74,382,383],{"class":80},"└──",[74,385,386],{"class":84}," tags\n",[74,388,390],{"class":76,"line":389},42,[74,391,98],{"emptyLinePlaceholder":97},[74,393,395],{"class":76,"line":394},43,[74,396,98],{"emptyLinePlaceholder":97},[74,398,400,403,406,409],{"class":76,"line":399},44,[74,401,402],{"class":80},"3",[74,404,405],{"class":84}," directories,",[74,407,408],{"class":176}," 2",[74,410,411],{"class":84}," files\n",[12,413,414],{},"Von Zeit zu Zeit packt Git diese Referenzen in ein „gepacktes“ Dateiformat,\ndamit es effizienter wird, Referenzen nachzuschlagen. Zum Beispiel:",[65,416,418],{"className":67,"code":417,"language":69,"meta":70,"style":70},"# Wenn man Referenzen packt, erstellt Git eine “packed-refs” Datei.\n\n# Diese Datei enthält die sortierte Liste von vorher losen Referenzen.\n\n# Die losen Referenzen existieren nicht mehr.\n\n$ git pack-refs --all\n\n$ cat .git/refs/heads/main\n\ncat: .git/refs/heads/main: No such file or directory\n\n$ cat .git/packed-refs\n\n# pack-refs with: peeled fully-peeled sorted\n\nc70f26689975782739ef9666af079535b12b5946 refs/heads/feature\n\nc70f26689975782739ef9666af079535b12b5946 refs/heads/main\n",[42,419,420,425,429,434,438,443,447,459,463,471,475,498,502,511,515,520,524,532,536],{"__ignoreMap":70},[74,421,422],{"class":76,"line":77},[74,423,424],{"class":135},"# Wenn man Referenzen packt, erstellt Git eine “packed-refs” Datei.\n",[74,426,427],{"class":76,"line":94},[74,428,98],{"emptyLinePlaceholder":97},[74,430,431],{"class":76,"line":101},[74,432,433],{"class":135},"# Diese Datei enthält die sortierte Liste von vorher losen Referenzen.\n",[74,435,436],{"class":76,"line":122},[74,437,98],{"emptyLinePlaceholder":97},[74,439,440],{"class":76,"line":127},[74,441,442],{"class":135},"# Die losen Referenzen existieren nicht mehr.\n",[74,444,445],{"class":76,"line":132},[74,446,98],{"emptyLinePlaceholder":97},[74,448,449,451,453,456],{"class":76,"line":139},[74,450,81],{"class":80},[74,452,85],{"class":84},[74,454,455],{"class":84}," pack-refs",[74,457,458],{"class":176}," --all\n",[74,460,461],{"class":76,"line":144},[74,462,98],{"emptyLinePlaceholder":97},[74,464,465,467,469],{"class":76,"line":150},[74,466,81],{"class":80},[74,468,215],{"class":84},[74,470,218],{"class":84},[74,472,473],{"class":76,"line":155},[74,474,98],{"emptyLinePlaceholder":97},[74,476,477,480,483,486,489,492,495],{"class":76,"line":161},[74,478,479],{"class":80},"cat:",[74,481,482],{"class":84}," .git/refs/heads/main:",[74,484,485],{"class":84}," No",[74,487,488],{"class":84}," such",[74,490,491],{"class":84}," file",[74,493,494],{"class":84}," or",[74,496,497],{"class":84}," directory\n",[74,499,500],{"class":76,"line":166},[74,501,98],{"emptyLinePlaceholder":97},[74,503,504,506,508],{"class":76,"line":186},[74,505,81],{"class":80},[74,507,215],{"class":84},[74,509,510],{"class":84}," .git/packed-refs\n",[74,512,513],{"class":76,"line":191},[74,514,98],{"emptyLinePlaceholder":97},[74,516,517],{"class":76,"line":205},[74,518,519],{"class":135},"# pack-refs with: peeled fully-peeled sorted\n",[74,521,522],{"class":76,"line":210},[74,523,98],{"emptyLinePlaceholder":97},[74,525,526,529],{"class":76,"line":221},[74,527,528],{"class":80},"c70f26689975782739ef9666af079535b12b5946",[74,530,531],{"class":84}," refs/heads/feature\n",[74,533,534],{"class":76,"line":226},[74,535,98],{"emptyLinePlaceholder":97},[74,537,538,540],{"class":76,"line":232},[74,539,528],{"class":80},[74,541,542],{"class":84}," refs/heads/main\n",[12,544,545],{},"Dieses Format ist zwar ziemlich simpel, hat aber Einschränkungen:",[32,547,548,551,554,557,560],{},[35,549,550],{},"In großen Mono-Repos mit vielen Referenzen stießen wir auf Probleme mit\nder Skalierbarkeit. Das Löschen von Referenzen ist besonders ineffizient, da\ndie gesamte „packed-refs“-Datei neu geschrieben werden muss, um die\ngelöschte Referenz zu entfernen. In unseren größten Repositorys kann dies\ndazu führen, dass bei jedem Löschen einer Referenz mehrere Gigabyte an Daten\nneu geschrieben werden müssen.",[35,552,553],{},"Da mehrere Dateien gelesen werden müssen, um alle Referenzen des Repos zu\nermitteln, ist dies atomar nicht möglich. Sobald andere Prozesse existieren,\ndie in das Repo schreiben wollen, kann es dadurch zu Inkonsistenzen kommen.",[35,555,556],{},"Es ist unmöglich, atomar mehrere Referenzen gleichzeitig zu schreiben,\nweil dafür mehrere Dateien erstellt oder aktualisiert werden müssen.",[35,558,559],{},"Das Packen von Referenzen lässt sich nicht gut skalieren, weil die gesamte\n„packed-refs“-Datei neu geschrieben werden muss.",[35,561,562],{},"Da lose Referenzen den Dateisystempfad als Namen verwenden, unterliegen\nsie dem dateisystemspezifischen Verhalten. So können z. B. Dateisysteme, die\nGroß- und Kleinschreibung nicht unterscheiden, keine Referenzen speichern,\nbei denen nur die Groß- und Kleinschreibung unterschiedlich ist.",[12,564,565,566,571,572,577,578,584,585,591],{},"Um diese Probleme zu lösen, wurde mit Git v2.45.0 ein neues\n„reftable“-Backend eingeführt, das ein neues Binärformat zum Speichern von\nReferenzen verwendet. Dieses neue Backend wird schon sehr lange entwickelt:\nes wurde ursprünglich von ",[16,567,570],{"href":568,"rel":569,"title":570},"https://sfconservancy.org/blog/2018/jan/30/shawn-pearce/",[],"Shawn\nPearce"," im Juli 2017 vorgeschlagen und zunächst in\n",[16,573,576],{"href":574,"rel":575,"title":576},"https://www.eclipse.org/jgit/",[],"JGit"," implementiert. Das\n",[16,579,583],{"href":580,"rel":581,"title":582},"https://www.gerritcodereview.com/",[],"Gerrit Projekt","Gerrit-Projekt"," nutzt\nes bereits ausgiebig. Im Jahr 2021 hat ",[16,586,590],{"href":587,"rel":588,"title":589},"https://hanwen.home.xs4all.nl/",[],"Han-Wen Nienhuys","Han-Wen\nNienhuys"," die Bibliothek\nin Git hochgeladen, die es ermöglicht, das reftable-Format zu lesen und zu\nschreiben.",[12,593,594],{},"Das neue „reftable“-Backend, das wir in Git v2.45.0 hochgeladen haben,\nbringt nun endlich die reftable-Bibliothek und Git zusammen, so dass du das\nneue Format als Speicher-Backend in deinen Git-Repositorys verwenden kannst.",[12,596,597,598,601,602,605,606,609],{},"Wenn du mindestens Git v2.45.0 verwendest, kannst du neue Repositorys mit\ndem „reftable“-Format erstellen, indem du den Schalter\n",[42,599,600],{},"--ref-format=reftable"," entweder an ",[42,603,604],{},"git-init(1)"," oder an ",[42,607,608],{},"git-clone(1)","\nübergibst. Zum Beispiel:",[65,611,613],{"className":67,"code":612,"language":69,"meta":70,"style":70},"$ git init --ref-format=reftable .\n\nInitialized empty Git repository in /tmp/repo/.git/\n\n$ git rev-parse --show-ref-format\n\nreftable\n\n$ find -type f .git/reftable/\n\n.git/reftable/0x000000000001-0x000000000001-01b5e47d.ref\n\n.git/reftable/tables.list\n\n\n$ git commit --allow-empty --message \"Initial commit\"\n\n$ find -type f .git/reftable/\n\n.git/reftable/0x000000000001-0x000000000001-01b5e47d.ref\n\n.git/reftable/0x000000000002-0x000000000002-87006b81.ref\n\n.git/reftable/tables.list\n",[42,614,615,628,632,646,650,662,666,671,675,691,695,700,704,709,713,717,731,735,747,751,755,759,764,768],{"__ignoreMap":70},[74,616,617,619,621,623,626],{"class":76,"line":77},[74,618,81],{"class":80},[74,620,85],{"class":84},[74,622,88],{"class":84},[74,624,625],{"class":176}," --ref-format=reftable",[74,627,91],{"class":84},[74,629,630],{"class":76,"line":94},[74,631,98],{"emptyLinePlaceholder":97},[74,633,634,636,638,640,642,644],{"class":76,"line":101},[74,635,104],{"class":80},[74,637,107],{"class":84},[74,639,110],{"class":84},[74,641,113],{"class":84},[74,643,116],{"class":84},[74,645,119],{"class":84},[74,647,648],{"class":76,"line":122},[74,649,98],{"emptyLinePlaceholder":97},[74,651,652,654,656,659],{"class":76,"line":127},[74,653,81],{"class":80},[74,655,85],{"class":84},[74,657,658],{"class":84}," rev-parse",[74,660,661],{"class":176}," --show-ref-format\n",[74,663,664],{"class":76,"line":132},[74,665,98],{"emptyLinePlaceholder":97},[74,667,668],{"class":76,"line":139},[74,669,670],{"class":80},"reftable\n",[74,672,673],{"class":76,"line":144},[74,674,98],{"emptyLinePlaceholder":97},[74,676,677,679,682,685,688],{"class":76,"line":150},[74,678,81],{"class":80},[74,680,681],{"class":84}," find",[74,683,684],{"class":176}," -type",[74,686,687],{"class":84}," f",[74,689,690],{"class":84}," .git/reftable/\n",[74,692,693],{"class":76,"line":155},[74,694,98],{"emptyLinePlaceholder":97},[74,696,697],{"class":76,"line":161},[74,698,699],{"class":80},".git/reftable/0x000000000001-0x000000000001-01b5e47d.ref\n",[74,701,702],{"class":76,"line":166},[74,703,98],{"emptyLinePlaceholder":97},[74,705,706],{"class":76,"line":186},[74,707,708],{"class":80},".git/reftable/tables.list\n",[74,710,711],{"class":76,"line":191},[74,712,98],{"emptyLinePlaceholder":97},[74,714,715],{"class":76,"line":205},[74,716,98],{"emptyLinePlaceholder":97},[74,718,719,721,723,725,727,729],{"class":76,"line":210},[74,720,81],{"class":80},[74,722,85],{"class":84},[74,724,173],{"class":84},[74,726,177],{"class":176},[74,728,180],{"class":176},[74,730,183],{"class":84},[74,732,733],{"class":76,"line":221},[74,734,98],{"emptyLinePlaceholder":97},[74,736,737,739,741,743,745],{"class":76,"line":226},[74,738,81],{"class":80},[74,740,681],{"class":84},[74,742,684],{"class":176},[74,744,687],{"class":84},[74,746,690],{"class":84},[74,748,749],{"class":76,"line":232},[74,750,98],{"emptyLinePlaceholder":97},[74,752,753],{"class":76,"line":237},[74,754,699],{"class":80},[74,756,757],{"class":76,"line":242},[74,758,98],{"emptyLinePlaceholder":97},[74,760,761],{"class":76,"line":248},[74,762,763],{"class":80},".git/reftable/0x000000000002-0x000000000002-87006b81.ref\n",[74,765,766],{"class":76,"line":253},[74,767,98],{"emptyLinePlaceholder":97},[74,769,770],{"class":76,"line":259},[74,771,708],{"class":80},[12,773,774,775,778,779,782,783,786,787,790],{},"Wie du siehst, werden die Referenzen jetzt im Verzeichnis ",[42,776,777],{},".git/reftable","\nstatt in ",[42,780,781],{},".git/refs"," gespeichert. Die Referenzen und die Reflogs werden in\n„tables“ gespeichert. Das sind die Dateien, die auf ",[42,784,785],{},".ref"," enden. Die Datei\n",[42,788,789],{},"tables.list"," enthält die Liste aller derzeit aktiven Tabellen. Die\ntechnischen Details rund um die Funktionsweise werden wir in einem separaten\nBlogbeitrag erklären. Bleib dran!",[12,792,793],{},"Das „reftable“-Backend ist als vollwertiger Ersatz für das „files“-Backend\ngedacht. Aus der Sicht der Benutzer(innen) sollte also alles gleich\nfunktionieren.",[12,795,796,797,801],{},"Dieses Projekt wurde von ",[16,798,7],{"href":799,"rel":800,"title":7},"https://gitlab.com/pks-gitlab",[]," geleitet. Dank gebührt auch Shawn Pearce, dem Erfinder\ndes Formats, und Han-Wen Nienhuys, dem Autor der reftable-Bibliothek.",[24,803,805],{"id":804},"bessere-tools-für-referenzen","Bessere Tools für Referenzen",[12,807,808],{},"Das Format „reftable“ löst zwar viele der Probleme, die wir haben, es bringt\nallerdings auch einige neue Probleme mit sich. Eines der wichtigsten\nProbleme ist die Zugänglichkeit der darin enthaltenen Daten.",[12,810,811],{},"Mit dem „files“-Backend kannst du im schlimmsten Fall deine normalen\nUnix-Tools verwenden, um den Zustand der Referenzen zu überprüfen. Sowohl\ndie „gepackten“ als auch die „losen“ Referenzen enthalten menschenlesbare\nDaten, die man leicht verstehen kann. Das ist beim „reftable“-Format anders,\nda es sich um ein Binärformat handelt. Daher muss Git alle notwendigen Tools\nbereitstellen, um Daten aus dem neuen „reftable“-Format zu extrahieren.",[813,814,816],"h3",{"id":815},"auflisten-aller-referenzen","Auflisten aller Referenzen",[12,818,819],{},"Das erste Problem bestand darin, dass es im Grunde unmöglich ist, alle\nReferenzen zu ermitteln, die ein Repository kennt. Das ist zunächst etwas\nrätselhaft: Du kannst über Git Referenzen erstellen und ändern, aber es kann\nnicht alle Referenzen auflisten, die es kennt?",[12,821,822,823,826,827,830,831,834],{},"Während es problemlos alle „normalen“ Referenzen auflisten kann, die mit dem\nPräfix ",[42,824,825],{},"refs/"," beginnen, verwendet Git auch sogenannte Pseudo-Referenzen.\nDiese Dateien befinden sich direkt im Stammverzeichnis des\nGit-Verzeichnisses und wären zum Beispiel Dateien wie ",[42,828,829],{},".git/MERGE_HEAD",". Das\nProblem dabei ist, dass diese Pseudo-Referenzen neben anderen Dateien\nliegen, die Git speichert, wie z. B. ",[42,832,833],{},".git/config",".",[12,836,837],{},"Während einige Pseudo-Referenzen bekannt und daher leicht zu identifizieren\nsind, gibt es theoretisch keine Grenzen dafür, welche Referenzen Git\nschreiben kann. Nichts hält dich davon ab, eine Referenz mit dem Namen\n„foobar“ zu erstellen.",[12,839,840],{},"Zum Beispiel:",[65,842,844],{"className":67,"code":843,"language":69,"meta":70,"style":70},"$ git update-ref foobar HEAD\n\n$ cat .git/foobar\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d\n",[42,845,846,861,865,874,878],{"__ignoreMap":70},[74,847,848,850,852,855,858],{"class":76,"line":77},[74,849,81],{"class":80},[74,851,85],{"class":84},[74,853,854],{"class":84}," update-ref",[74,856,857],{"class":84}," foobar",[74,859,860],{"class":84}," HEAD\n",[74,862,863],{"class":76,"line":94},[74,864,98],{"emptyLinePlaceholder":97},[74,866,867,869,871],{"class":76,"line":101},[74,868,81],{"class":80},[74,870,215],{"class":84},[74,872,873],{"class":84}," .git/foobar\n",[74,875,876],{"class":76,"line":122},[74,877,98],{"emptyLinePlaceholder":97},[74,879,880],{"class":76,"line":127},[74,881,882],{"class":80},"f32633d4d7da32ccc3827e90ecdc10570927c77d\n",[12,884,885,886,889],{},"Das Problem des „files“-Backends ist, dass es Referenzen nur aufzählen kann,\nindem es Verzeichnisse durchsucht. Um herauszufinden, dass es sich bei\n",[42,887,888],{},".git/foobar"," tatsächlich um eine Referenz handelt, müsste Git die Datei\nöffnen und prüfen, ob sie wie eine Referenz formatiert ist oder nicht.",[12,891,892],{},"Das „reftable“-Backend hingegen kennt sämtliche Referenzen, die es enthält:\nSie sind in seinen Datenstrukturen kodiert, so dass es lediglich diese\nReferenzen dekodieren und zurückgeben muss. Aufgrund der Einschränkungen des\n„files“-Backends gibt es jedoch kein Tool, mit dem du alle vorhandenen\nReferenzen ermitteln kannst.",[12,894,895,896,899,900,903],{},"Um dieses Problem zu lösen, haben wir ",[42,897,898],{},"git-for-each-ref(1)"," mit dem neuen\nFlag ",[42,901,902],{},"--include-root-refs"," ausgestattet, das auch alle Referenzen auflistet,\ndie im Stammverzeichnis der Referenznamen-Hierarchie existieren. Zum\nBeispiel:",[65,905,907],{"className":67,"code":906,"language":69,"meta":70,"style":70},"$ git for-each-ref --include-root-refs\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    HEAD\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    MERGE_HEAD\n\nf32633d4d7da32ccc3827e90ecdc10570927c77d commit    refs/heads/main\n",[42,908,909,921,925,935,939,948,952],{"__ignoreMap":70},[74,910,911,913,915,918],{"class":76,"line":77},[74,912,81],{"class":80},[74,914,85],{"class":84},[74,916,917],{"class":84}," for-each-ref",[74,919,920],{"class":176}," --include-root-refs\n",[74,922,923],{"class":76,"line":94},[74,924,98],{"emptyLinePlaceholder":97},[74,926,927,930,932],{"class":76,"line":101},[74,928,929],{"class":80},"f32633d4d7da32ccc3827e90ecdc10570927c77d",[74,931,173],{"class":84},[74,933,934],{"class":84},"    HEAD\n",[74,936,937],{"class":76,"line":122},[74,938,98],{"emptyLinePlaceholder":97},[74,940,941,943,945],{"class":76,"line":127},[74,942,929],{"class":80},[74,944,173],{"class":84},[74,946,947],{"class":84},"    MERGE_HEAD\n",[74,949,950],{"class":76,"line":132},[74,951,98],{"emptyLinePlaceholder":97},[74,953,954,956,958],{"class":76,"line":139},[74,955,929],{"class":80},[74,957,173],{"class":84},[74,959,960],{"class":84},"    refs/heads/main\n",[12,962,963],{},"Für das „files“-Backend wird dieses neue Flag nach dem Best-Effort-Prinzip\nbehandelt, d.h. es werden alle Referenzen aufgenommen, die mit einem\nbekannten Pseudo-Referenznamen übereinstimmen. Für das „reftable“-Backend\nkönnen wir einfach alle bekannten Referenzen auflisten.",[12,965,796,966,971],{},[16,967,970],{"href":968,"rel":969,"title":970},"https://gitlab.com/knayakgl",[],"Karthik Nayak"," geleitet.",[813,973,975],{"id":974},"auflisten-aller-reflogs","Auflisten aller reflogs",[12,977,978],{},"Jedes Mal, wenn du einen Branch aktualisierst, zeichnet Git diese\nBranch-Aktualisierung standardmäßig in einem sogenannten reflog auf. Dieses\nreflog ermöglicht es dir, Änderungen an diesem Branch rückgängig zu machen,\nfalls du eine unbeabsichtigte Änderung vorgenommen hast, und kann daher sehr\nhilfreich sein.",[12,980,981,982,985],{},"Mit dem „files“-Backend werden diese Protokolle in deinem\n",[42,983,984],{},".git/logs","-Verzeichnis gespeichert:",[65,987,989],{"className":67,"code":988,"language":69,"meta":70,"style":70},"$ find -type f .git/logs/\n\n.git/logs/HEAD\n\n.git/logs/refs/heads/main\n",[42,990,991,1004,1008,1013,1017],{"__ignoreMap":70},[74,992,993,995,997,999,1001],{"class":76,"line":77},[74,994,81],{"class":80},[74,996,681],{"class":84},[74,998,684],{"class":176},[74,1000,687],{"class":84},[74,1002,1003],{"class":84}," .git/logs/\n",[74,1005,1006],{"class":76,"line":94},[74,1007,98],{"emptyLinePlaceholder":97},[74,1009,1010],{"class":76,"line":101},[74,1011,1012],{"class":80},".git/logs/HEAD\n",[74,1014,1015],{"class":76,"line":122},[74,1016,98],{"emptyLinePlaceholder":97},[74,1018,1019],{"class":76,"line":127},[74,1020,1021],{"class":80},".git/logs/refs/heads/main\n",[12,1023,1024],{},"Tatsächlich ist die Auflistung der Dateien in diesem Verzeichnis die einzige\nMöglichkeit, um herauszufinden, welche Referenzen überhaupt ein reflog\nhaben. Dies ist ein Problem für das „reftable“-Backend, das diese Logs\nzusammen mit den Referenzen speichert. Folglich gibt es keine Möglichkeit\nmehr, herauszufinden, welche reflogs im Repository überhaupt existieren,\nwenn du das „reftable“ Format verwendest.",[12,1026,1027,1028,1031,1032,1035],{},"Dies ist jedoch nicht wirklich die Schuld des „reftable“-Formats, sondern\neine Lücke in den von Git bereitgestellten Tools. Um diese Lücke zu\nschließen, haben wir einen neuen Unterbefehl ",[42,1029,1030],{},"list"," für ",[42,1033,1034],{},"git-reflog(1)","\neingeführt, mit dem du alle vorhandenen reflogs auflisten kannst:",[65,1037,1039],{"className":67,"code":1038,"language":69,"meta":70,"style":70},"$ git reflog list\n\nHEAD\n\nrefs/heads/main\n",[42,1040,1041,1053,1057,1062,1066],{"__ignoreMap":70},[74,1042,1043,1045,1047,1050],{"class":76,"line":77},[74,1044,81],{"class":80},[74,1046,85],{"class":84},[74,1048,1049],{"class":84}," reflog",[74,1051,1052],{"class":84}," list\n",[74,1054,1055],{"class":76,"line":94},[74,1056,98],{"emptyLinePlaceholder":97},[74,1058,1059],{"class":76,"line":101},[74,1060,1061],{"class":80},"HEAD\n",[74,1063,1064],{"class":76,"line":122},[74,1065,98],{"emptyLinePlaceholder":97},[74,1067,1068],{"class":76,"line":127},[74,1069,1070],{"class":80},"refs/heads/main\n",[12,1072,796,1073,971],{},[16,1074,7],{"href":799,"rel":1075,"title":7},[],[813,1077,1079],{"id":1078},"effizienteres-packen-von-referenzen","Effizienteres Packen von Referenzen",[12,1081,1082,1083,1086],{},"Um effizient zu bleiben, müssen Git-Repositorys regelmäßig gewartet werden.\nNormalerweise wird diese Wartung durch verschiedene Git-Befehle ausgelöst,\ndie Daten in die Git-Repositorys schreiben, indem sie den Befehl ",[42,1084,1085],{},"git maintenance run --auto"," ausführen. Dieser Befehl optimiert nur die\nDatenstrukturen, die tatsächlich optimiert werden müssen, damit Git keine\nComputeressourcen verschwendet.",[12,1088,1089,1090,1093],{},"Eine Datenstruktur, die von der Git-Wartung optimiert wird, ist die\nReferenzdatenbank, die mit dem Befehl ",[42,1091,1092],{},"git pack-refs --all"," optimiert wird.\nFür das „files“-Backend bedeutet dies, dass alle Referenzen in die\n„packed-refs“-Datei gepackt und die losen Referenzen gelöscht werden,\nwährend für das „reftable“-Backend alle Tabellen in einer einzigen Tabelle\nzusammengefasst werden.",[12,1095,1096],{},"Im Hinblick auf das „files“-Backend können wir nicht viel besser vorgehen.\nDa die gesamte „packed-refs“-Datei ohnehin neu geschrieben werden muss, ist\nes sinnvoll, alle losen Referenzen zu packen.",[12,1098,1099],{},"Für das „reftable“-Backend ist dies jedoch suboptimal, da sich das\n„reftable“-Backend selbst optimiert. Jedes Mal, wenn Git eine neue Tabelle\nan das „reftable“-Backend anhängt, führt es eine automatische Komprimierung\ndurch und führt die Tabellen nach Bedarf zusammen. Deshalb sollte sich die\nReferenzdatenbank immer in einem gut optimierten Zustand befinden, sodass\ndas Zusammenführen aller Tabellen vergebliche Mühe wäre.",[12,1101,1102,1103,1106,1107,1110],{},"In Git v2.45.0 haben wir daher einen neuen Modus ",[42,1104,1105],{},"git pack-refs --auto","\neingeführt, der das Referenz-Backend auffordert, nach Bedarf zu optimieren.\nWährend das „files“-Backend auch bei gesetztem ",[42,1108,1109],{},"--auto","-Flag weiterhin\ngleich funktioniert, verwendet das „reftable“-Backend die gleichen\nHeuristiken, die es bereits für seine automatische Komprimierung verwendet.\nIn der Praxis sollte dies in den meisten Fällen kein Problem darstellen.",[12,1112,1113,1114,1116,1117,1119,1120,1123],{},"Außerdem wurde ",[42,1115,1085],{}," so angepasst, dass das Flag\n",[42,1118,1109],{}," an ",[42,1121,1122],{},"git-pack-refs(1)"," übergeben wird, um diesen neuen Modus\nstandardmäßig zu verwenden.",[12,1125,796,1126,971],{},[16,1127,7],{"href":799,"rel":1128,"title":7},[],[24,1130,1132],{"id":1131},"weiterlesen","Weiterlesen",[12,1134,1135,1136,1141],{},"In diesem Blogbeitrag ging es vor allem um das neue „reftable“-Backend, das\nes uns ermöglicht, in großen Repositorys mit vielen Referenzen besser zu\nskalieren, sowie um die zugehörigen Tools, die wir parallel dazu eingeführt\nhaben, damit es gut funktioniert. Natürlich hat die Git-Community mit dieser\nVersion auch verschiedene Leistungsverbesserungen, Fehlerbehebungen und\nkleinere Funktionen eingeführt. Diese kannst du in der ",[16,1137,1140],{"href":18,"rel":1138,"title":1139},[],"offiziellen Versionsankündigung","offiziellen\nVersionsankündigung"," des Git-Projekts nachlesen.",[1143,1144,1145],"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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}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":70,"searchDepth":94,"depth":94,"links":1147},[1148,1149,1154],{"id":26,"depth":94,"text":27},{"id":804,"depth":94,"text":805,"children":1150},[1151,1152,1153],{"id":815,"depth":101,"text":816},{"id":974,"depth":101,"text":975},{"id":1078,"depth":101,"text":1079},{"id":1131,"depth":94,"text":1132},"open-source","2024-04-30","Hier sind einige Highlights der Beiträge des Git-Teams von GitLab und der breiteren Git-Community zur neuesten Git-Version, darunter reftables und bessere Tools für Referenzen.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659507/Blog/Hero%20Images/AdobeStock_623844718.jpg",{},"/de-de/blog/whats-new-in-git-2-45-0",{"ogTitle":5,"ogImage":1161,"ogDescription":1157,"ogSiteName":1165,"noIndex":1160,"ogType":1166,"ogUrl":1167,"title":5,"canonicalUrls":1167,"description":1157},"https://about.gitlab.com","article","https://about.gitlab.com/blog/whats-new-in-git-2-45-0","whats-new-in-git-2-45-0","de-de/blog/whats-new-in-git-2-45-0",[1171,1172],"git","community","BlogPost","PEWh2dJUqGIsGeDL1mDBCgdouNxQZ5WD5nKWWBupk00",{"logo":1176,"freeTrial":1181,"sales":1186,"login":1191,"items":1196,"search":1524,"minimal":1558,"duo":1576,"switchNav":1585,"pricingDeployment":1596},{"config":1177},{"href":1178,"dataGaName":1179,"dataGaLocation":1180},"/de-de/","gitlab logo","header",{"text":1182,"config":1183},"Kostenlose Testversion anfordern",{"href":1184,"dataGaName":1185,"dataGaLocation":1180},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":1187,"config":1188},"Demo anfordern",{"href":1189,"dataGaName":1190,"dataGaLocation":1180},"/de-de/sales/?contact-topic=request-demo","sales",{"text":1192,"config":1193},"Anmelden",{"href":1194,"dataGaName":1195,"dataGaLocation":1180},"https://gitlab.com/users/sign_in/","sign in",[1197,1226,1328,1333,1446,1502],{"text":1198,"config":1199,"menu":1201},"Plattform",{"dataNavLevelOne":1200},"platform",{"type":1202,"columns":1203},"cards",[1204,1210,1218],{"title":1198,"description":1205,"link":1206},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":1207,"config":1208},"Die Plattform erkunden",{"href":1209,"dataGaName":1200,"dataGaLocation":1180},"/de-de/platform/",{"title":1211,"description":1212,"link":1213},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":1214,"config":1215},"Lerne GitLab Duo kennen",{"href":1216,"dataGaName":1217,"dataGaLocation":1180},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1219,"description":1220,"link":1221},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":1222,"config":1223},"Mehr erfahren",{"href":1224,"dataGaName":1225,"dataGaLocation":1180},"/de-de/why-gitlab/","why gitlab",{"text":1227,"left":97,"config":1228,"menu":1230},"Produkt",{"dataNavLevelOne":1229},"solutions",{"type":1231,"link":1232,"columns":1236,"feature":1307},"lists",{"text":1233,"config":1234},"Alle Lösungen anzeigen",{"href":1235,"dataGaName":1229,"dataGaLocation":1180},"/de-de/solutions/",[1237,1262,1285],{"title":1238,"description":1239,"link":1240,"items":1245},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":1241},{"icon":1242,"href":1243,"dataGaName":1244,"dataGaLocation":1180},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[1246,1250,1253,1258],{"text":1247,"config":1248},"CI/CD",{"href":1249,"dataGaLocation":1180,"dataGaName":1247},"/de-de/solutions/continuous-integration/",{"text":1211,"config":1251},{"href":1216,"dataGaLocation":1180,"dataGaName":1252},"gitlab duo agent platform - product menu",{"text":1254,"config":1255},"Quellcodeverwaltung",{"href":1256,"dataGaLocation":1180,"dataGaName":1257},"/de-de/solutions/source-code-management/","Source Code Management",{"text":1259,"config":1260},"Automatische Softwarebereitstellung",{"href":1243,"dataGaLocation":1180,"dataGaName":1261},"Automated software delivery",{"title":1263,"description":1264,"link":1265,"items":1270},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":1266},{"href":1267,"dataGaName":1268,"dataGaLocation":1180,"icon":1269},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1271,1275,1280],{"text":1272,"config":1273},"Anwendungssicherheitstests",{"href":1267,"dataGaName":1274,"dataGaLocation":1180},"Application security testing",{"text":1276,"config":1277},"Schutz der Software-Lieferkette",{"href":1278,"dataGaLocation":1180,"dataGaName":1279},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":1281,"config":1282},"Software-Compliance",{"href":1283,"dataGaName":1284,"dataGaLocation":1180},"/de-de/solutions/software-compliance/","software compliance",{"title":1286,"link":1287,"items":1292},"Messung",{"config":1288},{"icon":1289,"href":1290,"dataGaName":1291,"dataGaLocation":1180},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[1293,1297,1302],{"text":1294,"config":1295},"Sichtbarkeit und Messung",{"href":1290,"dataGaLocation":1180,"dataGaName":1296},"Visibility and Measurement",{"text":1298,"config":1299},"Wertstrommanagement",{"href":1300,"dataGaLocation":1180,"dataGaName":1301},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":1303,"config":1304},"Analysen und Einblicke",{"href":1305,"dataGaLocation":1180,"dataGaName":1306},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":1308,"type":1231,"items":1309},"GitLab für",[1310,1316,1322],{"text":1311,"config":1312},"Enterprise",{"icon":1313,"href":1314,"dataGaLocation":1180,"dataGaName":1315},"Building","/de-de/enterprise/","enterprise",{"text":1317,"config":1318},"Kleinunternehmen",{"icon":1319,"href":1320,"dataGaLocation":1180,"dataGaName":1321},"Work","/de-de/small-business/","small business",{"text":1323,"config":1324},"Öffentlicher Sektor",{"icon":1325,"href":1326,"dataGaLocation":1180,"dataGaName":1327},"Organization","/de-de/solutions/public-sector/","public sector",{"text":1329,"config":1330},"Preise",{"href":1331,"dataGaName":1332,"dataGaLocation":1180,"dataNavLevelOne":1332},"/de-de/pricing/","pricing",{"text":1334,"config":1335,"menu":1337},"Ressourcen",{"dataNavLevelOne":1336},"resources",{"type":1231,"link":1338,"columns":1342,"feature":1435},{"text":1339,"config":1340},"Alle Ressourcen anzeigen",{"href":1341,"dataGaName":1336,"dataGaLocation":1180},"/de-de/resources/",[1343,1376,1403],{"title":1344,"items":1345},"Erste Schritte",[1346,1351,1356,1361,1366,1371],{"text":1347,"config":1348},"Installieren",{"href":1349,"dataGaName":1350,"dataGaLocation":1180},"/de-de/install/","install",{"text":1352,"config":1353},"Kurzanleitungen",{"href":1354,"dataGaName":1355,"dataGaLocation":1180},"/de-de/get-started/","quick setup checklists",{"text":1357,"config":1358},"Lernen",{"href":1359,"dataGaLocation":1180,"dataGaName":1360},"https://university.gitlab.com/","learn",{"text":1362,"config":1363},"Produktdokumentation",{"href":1364,"dataGaName":1365,"dataGaLocation":1180},"https://docs.gitlab.com/","product documentation",{"text":1367,"config":1368},"Best-Practice-Videos",{"href":1369,"dataGaName":1370,"dataGaLocation":1180},"/de-de/getting-started-videos/","best practice videos",{"text":1372,"config":1373},"Integrationen",{"href":1374,"dataGaName":1375,"dataGaLocation":1180},"/de-de/integrations/","integrations",{"title":1377,"items":1378},"Entdecken",[1379,1384,1389,1394,1398],{"text":1380,"config":1381},"Kundenerfolge",{"href":1382,"dataGaName":1383,"dataGaLocation":1180},"/de-de/customers/","customer success stories",{"text":1385,"config":1386},"Blog",{"href":1387,"dataGaName":1388,"dataGaLocation":1180},"/de-de/blog/","blog",{"text":1390,"config":1391},"Demo-Hub",{"href":1392,"dataGaName":1393,"dataGaLocation":1180},"/de-de/demo-hub/","demo hub",{"text":1395,"config":1396},"The Source",{"href":1397,"dataGaName":1388,"dataGaLocation":1180},"/de-de/the-source/",{"text":1399,"config":1400},"Remote",{"href":1401,"dataGaName":1402,"dataGaLocation":1180},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1404,"items":1405},"Vernetzen",[1406,1411,1416,1420,1425,1430],{"text":1407,"config":1408},"GitLab-Services",{"href":1409,"dataGaName":1410,"dataGaLocation":1180},"/de-de/services/","services",{"text":1412,"config":1413},"Beitragen",{"href":1414,"dataGaName":1415,"dataGaLocation":1180},"https://contributors.gitlab.com","contribute",{"text":1417,"config":1418},"Community",{"href":1419,"dataGaName":1172,"dataGaLocation":1180},"/community/",{"text":1421,"config":1422},"Forum",{"href":1423,"dataGaName":1424,"dataGaLocation":1180},"https://forum.gitlab.com/","forum",{"text":1426,"config":1427},"Veranstaltungen",{"href":1428,"dataGaName":1429,"dataGaLocation":1180},"/events/","events",{"text":1431,"config":1432},"Partner",{"href":1433,"dataGaName":1434,"dataGaLocation":1180},"/de-de/partners/","partners",{"config":1436,"title":1439,"text":1440,"link":1441},{"background":1437,"textColor":1438},"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":1442,"config":1443},"Aktuelle Nachrichten",{"href":1444,"dataGaName":1445,"dataGaLocation":1180},"/de-de/whats-new/","whats new",{"text":1447,"config":1448,"menu":1450},"Unternehmen",{"dataNavLevelOne":1449},"company",{"type":1231,"columns":1451},[1452],{"items":1453},[1454,1459,1465,1467,1472,1477,1482,1487,1492,1497],{"text":1455,"config":1456},"Über",{"href":1457,"dataGaName":1458,"dataGaLocation":1180},"/de-de/company/","about",{"text":1460,"config":1461,"footerGa":1464},"Karriere",{"href":1462,"dataGaName":1463,"dataGaLocation":1180},"/jobs/","jobs",{"dataGaName":1463},{"text":1426,"config":1466},{"href":1428,"dataGaName":1429,"dataGaLocation":1180},{"text":1468,"config":1469},"Geschäftsführung",{"href":1470,"dataGaName":1471,"dataGaLocation":1180},"/company/team/e-group/","leadership",{"text":1473,"config":1474},"Handbuch",{"href":1475,"dataGaName":1476,"dataGaLocation":1180},"https://handbook.gitlab.com/","handbook",{"text":1478,"config":1479},"Investor Relations",{"href":1480,"dataGaName":1481,"dataGaLocation":1180},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1483,"config":1484},"Trust Center",{"href":1485,"dataGaName":1486,"dataGaLocation":1180},"/de-de/security/","trust center",{"text":1488,"config":1489},"AI Transparency Center",{"href":1490,"dataGaName":1491,"dataGaLocation":1180},"/de-de/ai-transparency-center/","ai transparency center",{"text":1493,"config":1494},"Newsletter",{"href":1495,"dataGaName":1496,"dataGaLocation":1180},"/company/contact/#contact-forms","newsletter",{"text":1498,"config":1499},"Presse",{"href":1500,"dataGaName":1501,"dataGaLocation":1180},"/press/","press",{"text":1503,"config":1504,"menu":1505},"Kontakt",{"dataNavLevelOne":1449},{"type":1231,"columns":1506},[1507],{"items":1508},[1509,1514,1519],{"text":1510,"config":1511},"Vertrieb kontaktieren",{"href":1512,"dataGaName":1513,"dataGaLocation":1180},"/de-de/sales/","talk to sales",{"text":1515,"config":1516},"Support-Portal",{"href":1517,"dataGaName":1518,"dataGaLocation":1180},"https://support.gitlab.com/hc/en-us","support portal",{"text":1520,"config":1521},"Kundenportal",{"href":1522,"dataGaName":1523,"dataGaLocation":1180},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1525,"login":1526,"suggestions":1533},"Schließen",{"text":1527,"link":1528},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":1529,"config":1530},"gitlab.com",{"href":1194,"dataGaName":1531,"dataGaLocation":1532},"search login","search",{"text":1534,"default":1535},"Vorschläge",[1536,1538,1543,1545,1550,1555],{"text":1211,"config":1537},{"href":1216,"dataGaName":1211,"dataGaLocation":1532},{"text":1539,"config":1540},"Codevorschläge (KI)",{"href":1541,"dataGaName":1542,"dataGaLocation":1532},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1247,"config":1544},{"href":1249,"dataGaName":1247,"dataGaLocation":1532},{"text":1546,"config":1547},"GitLab auf AWS",{"href":1548,"dataGaName":1549,"dataGaLocation":1532},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":1551,"config":1552},"GitLab auf Google Cloud",{"href":1553,"dataGaName":1554,"dataGaLocation":1532},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1219,"config":1556},{"href":1224,"dataGaName":1557,"dataGaLocation":1532},"Why GitLab?",{"freeTrial":1559,"mobileIcon":1564,"desktopIcon":1569,"secondaryButton":1572},{"text":1560,"config":1561},"Kostenlos testen",{"href":1562,"dataGaName":1185,"dataGaLocation":1563},"https://gitlab.com/-/trials/new/","nav",{"altText":1565,"config":1566},"GitLab-Symbol",{"src":1567,"dataGaName":1568,"dataGaLocation":1563},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1565,"config":1570},{"src":1571,"dataGaName":1568,"dataGaLocation":1563},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1344,"config":1573},{"href":1574,"dataGaName":1575,"dataGaLocation":1563},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":1577,"mobileIcon":1581,"desktopIcon":1583},{"text":1578,"config":1579},"Mehr über GitLab Duo erfahren",{"href":1216,"dataGaName":1580,"dataGaLocation":1563},"gitlab duo",{"altText":1565,"config":1582},{"src":1567,"dataGaName":1568,"dataGaLocation":1563},{"altText":1565,"config":1584},{"src":1571,"dataGaName":1568,"dataGaLocation":1563},{"button":1586,"mobileIcon":1591,"desktopIcon":1593},{"text":1587,"config":1588},"/Option",{"href":1589,"dataGaName":1590,"dataGaLocation":1563},"#contact","switch",{"altText":1565,"config":1592},{"src":1567,"dataGaName":1568,"dataGaLocation":1563},{"altText":1565,"config":1594},{"src":1595,"dataGaName":1568,"dataGaLocation":1563},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1597,"mobileIcon":1602,"desktopIcon":1604},{"text":1598,"config":1599},"Zurück zur Preisübersicht",{"href":1331,"dataGaName":1600,"dataGaLocation":1563,"icon":1601},"back to pricing","GoBack",{"altText":1565,"config":1603},{"src":1567,"dataGaName":1568,"dataGaLocation":1563},{"altText":1565,"config":1605},{"src":1571,"dataGaName":1568,"dataGaLocation":1563},{"title":1607,"button":1608,"config":1612},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":1222,"config":1609},{"href":1610,"dataGaName":1611,"dataGaLocation":1180},"/de-de/gitlab-orbit/","orbit",{"layout":1613,"disabled":1160},"release",{"data":1615},{"text":1616,"source":1617,"edit":1623,"contribute":1628,"config":1633,"items":1638,"minimal":1844},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":1618,"config":1619},"Quelltext der Seite anzeigen",{"href":1620,"dataGaName":1621,"dataGaLocation":1622},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1624,"config":1625},"Diese Seite bearbeiten",{"href":1626,"dataGaName":1627,"dataGaLocation":1622},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1629,"config":1630},"Beteilige dich",{"href":1631,"dataGaName":1632,"dataGaLocation":1622},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1634,"facebook":1635,"youtube":1636,"linkedin":1637},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1639,1684,1737,1779,1811],{"title":1329,"links":1640,"subMenu":1655},[1641,1645,1650],{"text":1642,"config":1643},"Tarife anzeigen",{"href":1331,"dataGaName":1644,"dataGaLocation":1622},"view plans",{"text":1646,"config":1647},"Vorteile von Premium",{"href":1648,"dataGaName":1649,"dataGaLocation":1622},"/de-de/pricing/premium/","why premium",{"text":1651,"config":1652},"Vorteile von Ultimate",{"href":1653,"dataGaName":1654,"dataGaLocation":1622},"/de-de/pricing/ultimate/","why ultimate",[1656],{"title":1503,"links":1657},[1658,1660,1662,1664,1669,1674,1679],{"text":1510,"config":1659},{"href":1512,"dataGaName":1190,"dataGaLocation":1622},{"text":1515,"config":1661},{"href":1517,"dataGaName":1518,"dataGaLocation":1622},{"text":1520,"config":1663},{"href":1522,"dataGaName":1523,"dataGaLocation":1622},{"text":1665,"config":1666},"Status",{"href":1667,"dataGaName":1668,"dataGaLocation":1622},"https://status.gitlab.com/","status",{"text":1670,"config":1671},"Nutzungsbedingungen",{"href":1672,"dataGaName":1673,"dataGaLocation":1622},"/terms/","terms of use",{"text":1675,"config":1676},"Datenschutzerklärung",{"href":1677,"dataGaName":1678,"dataGaLocation":1622},"/de-de/privacy/","privacy statement",{"text":1680,"config":1681},"Cookie-Einstellungen",{"dataGaName":1682,"dataGaLocation":1622,"id":1683,"isOneTrustButton":97},"cookie preferences","ot-sdk-btn",{"title":1227,"links":1685,"subMenu":1694},[1686,1690],{"text":1687,"config":1688},"DevSecOps-Plattform",{"href":1209,"dataGaName":1689,"dataGaLocation":1622},"devsecops platform",{"text":1691,"config":1692},"KI-unterstützte Entwicklung",{"href":1216,"dataGaName":1693,"dataGaLocation":1622},"ai-assisted development",[1695],{"title":1696,"links":1697},"Themen",[1698,1702,1707,1712,1717,1722,1727,1732],{"text":1247,"config":1699},{"href":1700,"dataGaName":1701,"dataGaLocation":1622},"/de-de/topics/ci-cd/","cicd",{"text":1703,"config":1704},"GitOps",{"href":1705,"dataGaName":1706,"dataGaLocation":1622},"/de-de/topics/gitops/","gitops",{"text":1708,"config":1709},"DevOps",{"href":1710,"dataGaName":1711,"dataGaLocation":1622},"/de-de/topics/devops/","devops",{"text":1713,"config":1714},"Versionskontrolle",{"href":1715,"dataGaName":1716,"dataGaLocation":1622},"/de-de/topics/version-control/","version control",{"text":1718,"config":1719},"DevSecOps",{"href":1720,"dataGaName":1721,"dataGaLocation":1622},"/de-de/topics/devsecops/","devsecops",{"text":1723,"config":1724},"Cloud-nativ",{"href":1725,"dataGaName":1726,"dataGaLocation":1622},"/de-de/topics/cloud-native/","cloud native",{"text":1728,"config":1729},"KI für das Programmieren",{"href":1730,"dataGaName":1731,"dataGaLocation":1622},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":1733,"config":1734},"Agentische KI",{"href":1735,"dataGaName":1736,"dataGaLocation":1622},"/de-de/topics/agentic-ai/","agentic ai",{"title":1738,"links":1739},"Lösungen",[1740,1743,1745,1750,1754,1757,1760,1763,1765,1767,1769,1774],{"text":1272,"config":1741},{"href":1267,"dataGaName":1742,"dataGaLocation":1622},"Application Security Testing",{"text":1259,"config":1744},{"href":1243,"dataGaName":1244,"dataGaLocation":1622},{"text":1746,"config":1747},"Agile Entwicklung",{"href":1748,"dataGaName":1749,"dataGaLocation":1622},"/de-de/solutions/agile-delivery/","agile delivery",{"text":1751,"config":1752},"SCM",{"href":1256,"dataGaName":1753,"dataGaLocation":1622},"source code management",{"text":1247,"config":1755},{"href":1249,"dataGaName":1756,"dataGaLocation":1622},"continuous integration & delivery",{"text":1298,"config":1758},{"href":1300,"dataGaName":1759,"dataGaLocation":1622},"value stream management",{"text":1703,"config":1761},{"href":1762,"dataGaName":1706,"dataGaLocation":1622},"/de-de/solutions/gitops/",{"text":1311,"config":1764},{"href":1314,"dataGaName":1315,"dataGaLocation":1622},{"text":1317,"config":1766},{"href":1320,"dataGaName":1321,"dataGaLocation":1622},{"text":1323,"config":1768},{"href":1326,"dataGaName":1327,"dataGaLocation":1622},{"text":1770,"config":1771},"Bildungswesen",{"href":1772,"dataGaName":1773,"dataGaLocation":1622},"/de-de/solutions/education/","education",{"text":1775,"config":1776},"Finanzdienstleistungen",{"href":1777,"dataGaName":1778,"dataGaLocation":1622},"/de-de/solutions/finance/","financial services",{"title":1334,"links":1780},[1781,1783,1785,1787,1790,1792,1795,1797,1799,1801,1803,1805,1807,1809],{"text":1347,"config":1782},{"href":1349,"dataGaName":1350,"dataGaLocation":1622},{"text":1352,"config":1784},{"href":1354,"dataGaName":1355,"dataGaLocation":1622},{"text":1357,"config":1786},{"href":1359,"dataGaName":1360,"dataGaLocation":1622},{"text":1362,"config":1788},{"href":1364,"dataGaName":1789,"dataGaLocation":1622},"docs",{"text":1385,"config":1791},{"href":1387,"dataGaName":1388,"dataGaLocation":1622},{"text":1793,"config":1794},"Neuerungen",{"href":1444,"dataGaName":1445,"dataGaLocation":1622},{"text":1380,"config":1796},{"href":1382,"dataGaName":1383,"dataGaLocation":1622},{"text":1399,"config":1798},{"href":1401,"dataGaName":1402,"dataGaLocation":1622},{"text":1407,"config":1800},{"href":1409,"dataGaName":1410,"dataGaLocation":1622},{"text":1412,"config":1802},{"href":1414,"dataGaName":1415,"dataGaLocation":1622},{"text":1417,"config":1804},{"href":1419,"dataGaName":1172,"dataGaLocation":1622},{"text":1421,"config":1806},{"href":1423,"dataGaName":1424,"dataGaLocation":1622},{"text":1426,"config":1808},{"href":1428,"dataGaName":1429,"dataGaLocation":1622},{"text":1431,"config":1810},{"href":1433,"dataGaName":1434,"dataGaLocation":1622},{"title":1447,"links":1812},[1813,1815,1817,1819,1821,1823,1828,1833,1835,1837,1839],{"text":1455,"config":1814},{"href":1457,"dataGaName":1449,"dataGaLocation":1622},{"text":1460,"config":1816},{"href":1462,"dataGaName":1463,"dataGaLocation":1622},{"text":1468,"config":1818},{"href":1470,"dataGaName":1471,"dataGaLocation":1622},{"text":1473,"config":1820},{"href":1475,"dataGaName":1476,"dataGaLocation":1622},{"text":1478,"config":1822},{"href":1480,"dataGaName":1481,"dataGaLocation":1622},{"text":1824,"config":1825},"Nachhaltigkeit",{"href":1826,"dataGaName":1827,"dataGaLocation":1622},"/sustainability/","Sustainability",{"text":1829,"config":1830},"Vielfalt, Inklusion und Zugehörigkeit",{"href":1831,"dataGaName":1832,"dataGaLocation":1622},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1483,"config":1834},{"href":1485,"dataGaName":1486,"dataGaLocation":1622},{"text":1493,"config":1836},{"href":1495,"dataGaName":1496,"dataGaLocation":1622},{"text":1498,"config":1838},{"href":1500,"dataGaName":1501,"dataGaLocation":1622},{"text":1840,"config":1841},"Transparenzerklärung zu moderner Sklaverei",{"href":1842,"dataGaName":1843,"dataGaLocation":1622},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1845},[1846,1849,1852],{"text":1847,"config":1848},"Terms",{"href":1672,"dataGaName":1673,"dataGaLocation":1622},{"text":1850,"config":1851},"Cookies",{"dataGaName":1682,"dataGaLocation":1622,"id":1683,"isOneTrustButton":97},{"text":1853,"config":1854},"Datenschutz",{"href":1677,"dataGaName":1678,"dataGaLocation":1622},[1856],{"id":1857,"title":7,"body":1159,"config":1858,"content":1860,"description":1159,"extension":1864,"meta":1865,"navigation":97,"path":1866,"seo":1867,"stem":1868,"__hash__":1869},"blogAuthors/en-us/blog/authors/patrick-steinhardt.yml",{"template":1859},"BlogAuthor",{"name":7,"config":1861},{"headshot":1862,"ctfId":1863},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661952/Blog/Author%20Headshots/pks-gitlab-headshot.png","pksgitlab","yml",{},"/en-us/blog/authors/patrick-steinhardt",{},"en-us/blog/authors/patrick-steinhardt","SV9Yd_vW69UbvntDP-SEOV9NKT_VwUAj5nfftf2ElSw",[1871,1879,1887],{"title":1872,"description":1873,"heroImage":1874,"category":1155,"date":1875,"authors":1876,"slug":1878,"externalUrl":1159},"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",[1877],"Toon Claes","whats-new-in-git-2-55-0",{"title":1880,"description":1881,"heroImage":1882,"category":1155,"date":1883,"authors":1884,"slug":1886,"externalUrl":1159},"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",[1885],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1888,"description":1889,"heroImage":1890,"category":1155,"date":1891,"authors":1892,"slug":1893,"externalUrl":1159},"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",[7],"whats-new-in-git-2-54-0",{"promotions":1895},[1896,1910,1922,1934],{"id":1897,"categories":1898,"header":1900,"text":1901,"button":1902,"image":1907},"ai-modernization",[1899],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":1903,"config":1904},"Ermittle deinen KI-Reifegrad",{"href":1905,"dataGaName":1906,"dataGaLocation":1388},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":1908},{"src":1909},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1911,"categories":1912,"header":1914,"text":1901,"button":1915,"image":1919},"devops-modernization",[1913,1721],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":1916,"config":1917},"Ermittle deinen DevOps-Reifegrad",{"href":1918,"dataGaName":1906,"dataGaLocation":1388},"/de-de/assessments/devops-modernization-assessment/",{"config":1920},{"src":1921},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1923,"categories":1924,"header":1926,"text":1901,"button":1927,"image":1931},"security-modernization",[1925],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":1928,"config":1929},"Ermittle deinen Sicherheitsreifegrad",{"href":1930,"dataGaName":1906,"dataGaLocation":1388},"/de-de/assessments/security-modernization-assessment/",{"config":1932},{"src":1933},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1935,"paths":1936,"header":1939,"text":1940,"button":1941,"image":1946},"github-azure-migration",[1937,1938],"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":1942,"config":1943},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":1944,"dataGaName":1945,"dataGaLocation":1388},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1947},{"src":1921},{"header":1949,"blurb":1950,"button":1951,"secondaryButton":1956},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":1952,"config":1953},"Kostenlosen Test starten",{"href":1954,"dataGaName":1185,"dataGaLocation":1955},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":1510,"config":1957},{"href":1512,"dataGaName":1190,"dataGaLocation":1955},1786803740067]