[{"data":1,"prerenderedAt":1554},["ShallowReactive",2],{"/blog/categories/open-source/page/10":3,"navigation-en-us":20,"banner-en-us":448,"footer-en-us":458,"open-source-category-page-total-items-en-us":703,"open-source-category-page-featured-en-us":704,"open-source-category-page-10-en-us":1492},{"id":4,"title":5,"body":6,"category":6,"config":7,"content":11,"description":6,"extension":12,"meta":13,"navigation":14,"path":15,"seo":16,"slug":6,"stem":18,"testContent":6,"type":6,"__hash__":19},"blogCategories/en-us/blog/categories/open-source.yml","Open Source",null,{"template":8,"slug":9,"hide":10},"BlogCategory","open-source",false,{"name":5},"yml",{},true,"/en-us/blog/categories/open-source",{"title":5,"description":17},"Browse articles related to Open Source on the GitLab Blog","en-us/blog/categories/open-source","NMRZaCM4ca10TUDhzj6jsX7u5M9zSlzzVFGKbuj2Nz0",{"logo":21,"freeTrial":26,"sales":31,"login":36,"items":41,"search":368,"minimal":399,"duo":418,"switchNav":427,"pricingDeployment":438},{"config":22},{"href":23,"dataGaName":24,"dataGaLocation":25},"/","gitlab logo","header",{"text":27,"config":28},"Get free trial",{"href":29,"dataGaName":30,"dataGaLocation":25},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":32,"config":33},"Request a demo",{"href":34,"dataGaName":35,"dataGaLocation":25},"/sales/?contact-topic=request-demo","sales",{"text":37,"config":38},"Sign in",{"href":39,"dataGaName":40,"dataGaLocation":25},"https://gitlab.com/users/sign_in/","sign in",[42,71,171,176,290,346],{"text":43,"config":44,"menu":46},"Platform",{"dataNavLevelOne":45},"platform",{"type":47,"columns":48},"cards",[49,55,63],{"title":43,"description":50,"link":51},"The intelligent orchestration platform for DevSecOps",{"text":52,"config":53},"Explore our Platform",{"href":54,"dataGaName":45,"dataGaLocation":25},"/platform/",{"title":56,"description":57,"link":58},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":59,"config":60},"Meet GitLab Duo",{"href":61,"dataGaName":62,"dataGaLocation":25},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":64,"description":65,"link":66},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":67,"config":68},"Learn more",{"href":69,"dataGaName":70,"dataGaLocation":25},"/why-gitlab/","why gitlab",{"text":72,"left":14,"config":73,"menu":75},"Product",{"dataNavLevelOne":74},"solutions",{"type":76,"link":77,"columns":81,"feature":150},"lists",{"text":78,"config":79},"View all Solutions",{"href":80,"dataGaName":74,"dataGaLocation":25},"/solutions/",[82,106,129],{"title":83,"description":84,"link":85,"items":90},"Automation","CI/CD and automation to accelerate deployment",{"config":86},{"icon":87,"href":88,"dataGaName":89,"dataGaLocation":25},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[91,95,98,102],{"text":92,"config":93},"CI/CD",{"href":94,"dataGaLocation":25,"dataGaName":92},"/solutions/continuous-integration/",{"text":56,"config":96},{"href":61,"dataGaLocation":25,"dataGaName":97},"gitlab duo agent platform - product menu",{"text":99,"config":100},"Source Code Management",{"href":101,"dataGaLocation":25,"dataGaName":99},"/solutions/source-code-management/",{"text":103,"config":104},"Automated Software Delivery",{"href":88,"dataGaLocation":25,"dataGaName":105},"Automated software delivery",{"title":107,"description":108,"link":109,"items":114},"Security","Deliver code faster without compromising security",{"config":110},{"href":111,"dataGaName":112,"dataGaLocation":25,"icon":113},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[115,119,124],{"text":116,"config":117},"Application Security Testing",{"href":111,"dataGaName":118,"dataGaLocation":25},"Application security testing",{"text":120,"config":121},"Software Supply Chain Security",{"href":122,"dataGaLocation":25,"dataGaName":123},"/solutions/supply-chain/","Software supply chain security",{"text":125,"config":126},"Software Compliance",{"href":127,"dataGaName":128,"dataGaLocation":25},"/solutions/software-compliance/","software compliance",{"title":130,"link":131,"items":136},"Measurement",{"config":132},{"icon":133,"href":134,"dataGaName":135,"dataGaLocation":25},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[137,141,145],{"text":138,"config":139},"Visibility & Measurement",{"href":134,"dataGaLocation":25,"dataGaName":140},"Visibility and Measurement",{"text":142,"config":143},"Value Stream Management",{"href":144,"dataGaLocation":25,"dataGaName":142},"/solutions/value-stream-management/",{"text":146,"config":147},"Analytics & Insights",{"href":148,"dataGaLocation":25,"dataGaName":149},"/solutions/analytics-and-insights/","Analytics and insights",{"title":151,"type":76,"items":152},"GitLab for",[153,159,165],{"text":154,"config":155},"Enterprise",{"icon":156,"href":157,"dataGaLocation":25,"dataGaName":158},"Building","/enterprise/","enterprise",{"text":160,"config":161},"Small Business",{"icon":162,"href":163,"dataGaLocation":25,"dataGaName":164},"Work","/small-business/","small business",{"text":166,"config":167},"Public Sector",{"icon":168,"href":169,"dataGaLocation":25,"dataGaName":170},"Organization","/solutions/public-sector/","public sector",{"text":172,"config":173},"Pricing",{"href":174,"dataGaName":175,"dataGaLocation":25,"dataNavLevelOne":175},"/pricing/","pricing",{"text":177,"config":178,"menu":180},"Resources",{"dataNavLevelOne":179},"resources",{"type":76,"link":181,"columns":185,"feature":279},{"text":182,"config":183},"View all resources",{"href":184,"dataGaName":179,"dataGaLocation":25},"/resources/",[186,219,246],{"title":187,"items":188},"Getting started",[189,194,199,204,209,214],{"text":190,"config":191},"Install",{"href":192,"dataGaName":193,"dataGaLocation":25},"/install/","install",{"text":195,"config":196},"Quick start guides",{"href":197,"dataGaName":198,"dataGaLocation":25},"/get-started/","quick setup checklists",{"text":200,"config":201},"Learn",{"href":202,"dataGaLocation":25,"dataGaName":203},"https://university.gitlab.com/","learn",{"text":205,"config":206},"Product documentation",{"href":207,"dataGaName":208,"dataGaLocation":25},"https://docs.gitlab.com/","product documentation",{"text":210,"config":211},"Best practice videos",{"href":212,"dataGaName":213,"dataGaLocation":25},"/getting-started-videos/","best practice videos",{"text":215,"config":216},"Integrations",{"href":217,"dataGaName":218,"dataGaLocation":25},"/integrations/","integrations",{"title":220,"items":221},"Discover",[222,227,232,237,241],{"text":223,"config":224},"Customer success stories",{"href":225,"dataGaName":226,"dataGaLocation":25},"/customers/","customer success stories",{"text":228,"config":229},"Blog",{"href":230,"dataGaName":231,"dataGaLocation":25},"/blog/","blog",{"text":233,"config":234},"Demo Hub",{"href":235,"dataGaName":236,"dataGaLocation":25},"/demo-hub/","demo hub",{"text":238,"config":239},"The Source",{"href":240,"dataGaName":231,"dataGaLocation":25},"/the-source/",{"text":242,"config":243},"Remote",{"href":244,"dataGaName":245,"dataGaLocation":25},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":247,"items":248},"Connect",[249,254,259,264,269,274],{"text":250,"config":251},"GitLab Services",{"href":252,"dataGaName":253,"dataGaLocation":25},"/services/","services",{"text":255,"config":256},"Contribute",{"href":257,"dataGaName":258,"dataGaLocation":25},"https://contributors.gitlab.com","contribute",{"text":260,"config":261},"Community",{"href":262,"dataGaName":263,"dataGaLocation":25},"/community/","community",{"text":265,"config":266},"Forum",{"href":267,"dataGaName":268,"dataGaLocation":25},"https://forum.gitlab.com/","forum",{"text":270,"config":271},"Events",{"href":272,"dataGaName":273,"dataGaLocation":25},"/events/","events",{"text":275,"config":276},"Partners",{"href":277,"dataGaName":278,"dataGaLocation":25},"/partners/","partners",{"config":280,"title":283,"text":284,"link":285},{"background":281,"textColor":282},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":286,"config":287},"Read the latest",{"href":288,"dataGaName":289,"dataGaLocation":25},"/whats-new/","whats new",{"text":291,"config":292,"menu":294},"Company",{"dataNavLevelOne":293},"company",{"type":76,"columns":295},[296],{"items":297},[298,303,309,311,316,321,326,331,336,341],{"text":299,"config":300},"About",{"href":301,"dataGaName":302,"dataGaLocation":25},"/company/","about",{"text":304,"config":305,"footerGa":308},"Jobs",{"href":306,"dataGaName":307,"dataGaLocation":25},"/jobs/","jobs",{"dataGaName":307},{"text":270,"config":310},{"href":272,"dataGaName":273,"dataGaLocation":25},{"text":312,"config":313},"Leadership",{"href":314,"dataGaName":315,"dataGaLocation":25},"/company/team/e-group/","leadership",{"text":317,"config":318},"Handbook",{"href":319,"dataGaName":320,"dataGaLocation":25},"https://handbook.gitlab.com/","handbook",{"text":322,"config":323},"Investor relations",{"href":324,"dataGaName":325,"dataGaLocation":25},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":327,"config":328},"Trust Center",{"href":329,"dataGaName":330,"dataGaLocation":25},"/security/","trust center",{"text":332,"config":333},"AI Transparency Center",{"href":334,"dataGaName":335,"dataGaLocation":25},"/ai-transparency-center/","ai transparency center",{"text":337,"config":338},"Newsletter",{"href":339,"dataGaName":340,"dataGaLocation":25},"/company/contact/#contact-forms","newsletter",{"text":342,"config":343},"Press",{"href":344,"dataGaName":345,"dataGaLocation":25},"/press/","press",{"text":347,"config":348,"menu":349},"Contact us",{"dataNavLevelOne":293},{"type":76,"columns":350},[351],{"items":352},[353,358,363],{"text":354,"config":355},"Talk to sales",{"href":356,"dataGaName":357,"dataGaLocation":25},"/sales/","talk to sales",{"text":359,"config":360},"Support portal",{"href":361,"dataGaName":362,"dataGaLocation":25},"https://support.gitlab.com/hc/en-us","support portal",{"text":364,"config":365},"Customer portal",{"href":366,"dataGaName":367,"dataGaLocation":25},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":369,"login":370,"suggestions":377},"Close",{"text":371,"link":372},"To search repositories and projects, login to",{"text":373,"config":374},"gitlab.com",{"href":39,"dataGaName":375,"dataGaLocation":376},"search login","search",{"text":378,"default":379},"Suggestions",[380,382,386,388,392,396],{"text":56,"config":381},{"href":61,"dataGaName":56,"dataGaLocation":376},{"text":383,"config":384},"Code Suggestions (AI)",{"href":385,"dataGaName":383,"dataGaLocation":376},"/solutions/code-suggestions/",{"text":92,"config":387},{"href":94,"dataGaName":92,"dataGaLocation":376},{"text":389,"config":390},"GitLab on AWS",{"href":391,"dataGaName":389,"dataGaLocation":376},"/partners/technology-partners/aws/",{"text":393,"config":394},"GitLab on Google Cloud",{"href":395,"dataGaName":393,"dataGaLocation":376},"/partners/technology-partners/google-cloud-platform/",{"text":397,"config":398},"Why GitLab?",{"href":69,"dataGaName":397,"dataGaLocation":376},{"freeTrial":400,"mobileIcon":405,"desktopIcon":410,"secondaryButton":413},{"text":401,"config":402},"Start free trial",{"href":403,"dataGaName":30,"dataGaLocation":404},"https://gitlab.com/-/trials/new/","nav",{"altText":406,"config":407},"Gitlab Icon",{"src":408,"dataGaName":409,"dataGaLocation":404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":406,"config":411},{"src":412,"dataGaName":409,"dataGaLocation":404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":414,"config":415},"Get Started",{"href":416,"dataGaName":417,"dataGaLocation":404},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":419,"mobileIcon":423,"desktopIcon":425},{"text":420,"config":421},"Learn more about GitLab Duo",{"href":61,"dataGaName":422,"dataGaLocation":404},"gitlab duo",{"altText":406,"config":424},{"src":408,"dataGaName":409,"dataGaLocation":404},{"altText":406,"config":426},{"src":412,"dataGaName":409,"dataGaLocation":404},{"button":428,"mobileIcon":433,"desktopIcon":435},{"text":429,"config":430},"/switch",{"href":431,"dataGaName":432,"dataGaLocation":404},"#contact","switch",{"altText":406,"config":434},{"src":408,"dataGaName":409,"dataGaLocation":404},{"altText":406,"config":436},{"src":437,"dataGaName":409,"dataGaLocation":404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":439,"mobileIcon":444,"desktopIcon":446},{"text":440,"config":441},"Back to pricing",{"href":174,"dataGaName":442,"dataGaLocation":404,"icon":443},"back to pricing","GoBack",{"altText":406,"config":445},{"src":408,"dataGaName":409,"dataGaLocation":404},{"altText":406,"config":447},{"src":412,"dataGaName":409,"dataGaLocation":404},{"title":449,"titleMobile":450,"button":451,"config":456},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":67,"config":452},{"href":453,"dataGaName":454,"dataGaLocation":455},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":457,"disabled":10},"release",{"data":459},{"text":460,"source":461,"edit":467,"contribute":472,"config":477,"items":482,"minimal":692},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":462,"config":463},"View page source",{"href":464,"dataGaName":465,"dataGaLocation":466},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":468,"config":469},"Edit this page",{"href":470,"dataGaName":471,"dataGaLocation":466},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":473,"config":474},"Please contribute",{"href":475,"dataGaName":476,"dataGaLocation":466},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":478,"facebook":479,"youtube":480,"linkedin":481},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[483,530,584,628,660],{"title":172,"links":484,"subMenu":499},[485,489,494],{"text":486,"config":487},"View plans",{"href":174,"dataGaName":488,"dataGaLocation":466},"view plans",{"text":490,"config":491},"Why Premium?",{"href":492,"dataGaName":493,"dataGaLocation":466},"/pricing/premium/","why premium",{"text":495,"config":496},"Why Ultimate?",{"href":497,"dataGaName":498,"dataGaLocation":466},"/pricing/ultimate/","why ultimate",[500],{"title":501,"links":502},"Contact Us",[503,506,508,510,515,520,525],{"text":504,"config":505},"Contact sales",{"href":356,"dataGaName":35,"dataGaLocation":466},{"text":359,"config":507},{"href":361,"dataGaName":362,"dataGaLocation":466},{"text":364,"config":509},{"href":366,"dataGaName":367,"dataGaLocation":466},{"text":511,"config":512},"Status",{"href":513,"dataGaName":514,"dataGaLocation":466},"https://status.gitlab.com/","status",{"text":516,"config":517},"Terms of use",{"href":518,"dataGaName":519,"dataGaLocation":466},"/terms/","terms of use",{"text":521,"config":522},"Privacy statement",{"href":523,"dataGaName":524,"dataGaLocation":466},"/privacy/","privacy statement",{"text":526,"config":527},"Cookie preferences",{"dataGaName":528,"dataGaLocation":466,"id":529,"isOneTrustButton":14},"cookie preferences","ot-sdk-btn",{"title":72,"links":531,"subMenu":540},[532,536],{"text":533,"config":534},"DevSecOps platform",{"href":54,"dataGaName":535,"dataGaLocation":466},"devsecops platform",{"text":537,"config":538},"AI-Assisted Development",{"href":61,"dataGaName":539,"dataGaLocation":466},"ai-assisted development",[541],{"title":542,"links":543},"Topics",[544,549,554,559,564,569,574,579],{"text":545,"config":546},"CICD",{"href":547,"dataGaName":548,"dataGaLocation":466},"/topics/ci-cd/","cicd",{"text":550,"config":551},"GitOps",{"href":552,"dataGaName":553,"dataGaLocation":466},"/topics/gitops/","gitops",{"text":555,"config":556},"DevOps",{"href":557,"dataGaName":558,"dataGaLocation":466},"/topics/devops/","devops",{"text":560,"config":561},"Version Control",{"href":562,"dataGaName":563,"dataGaLocation":466},"/topics/version-control/","version control",{"text":565,"config":566},"DevSecOps",{"href":567,"dataGaName":568,"dataGaLocation":466},"/topics/devsecops/","devsecops",{"text":570,"config":571},"Cloud Native",{"href":572,"dataGaName":573,"dataGaLocation":466},"/topics/cloud-native/","cloud native",{"text":575,"config":576},"AI for Coding",{"href":577,"dataGaName":578,"dataGaLocation":466},"/topics/devops/ai-for-coding/","ai for coding",{"text":580,"config":581},"Agentic AI",{"href":582,"dataGaName":583,"dataGaLocation":466},"/topics/agentic-ai/","agentic ai",{"title":585,"links":586},"Solutions",[587,589,591,596,600,603,607,610,612,615,618,623],{"text":116,"config":588},{"href":111,"dataGaName":116,"dataGaLocation":466},{"text":105,"config":590},{"href":88,"dataGaName":89,"dataGaLocation":466},{"text":592,"config":593},"Agile development",{"href":594,"dataGaName":595,"dataGaLocation":466},"/solutions/agile-delivery/","agile delivery",{"text":597,"config":598},"SCM",{"href":101,"dataGaName":599,"dataGaLocation":466},"source code management",{"text":545,"config":601},{"href":94,"dataGaName":602,"dataGaLocation":466},"continuous integration & delivery",{"text":604,"config":605},"Value stream management",{"href":144,"dataGaName":606,"dataGaLocation":466},"value stream management",{"text":550,"config":608},{"href":609,"dataGaName":553,"dataGaLocation":466},"/solutions/gitops/",{"text":154,"config":611},{"href":157,"dataGaName":158,"dataGaLocation":466},{"text":613,"config":614},"Small business",{"href":163,"dataGaName":164,"dataGaLocation":466},{"text":616,"config":617},"Public sector",{"href":169,"dataGaName":170,"dataGaLocation":466},{"text":619,"config":620},"Education",{"href":621,"dataGaName":622,"dataGaLocation":466},"/solutions/education/","education",{"text":624,"config":625},"Financial services",{"href":626,"dataGaName":627,"dataGaLocation":466},"/solutions/finance/","financial services",{"title":177,"links":629},[630,632,634,636,639,641,644,646,648,650,652,654,656,658],{"text":190,"config":631},{"href":192,"dataGaName":193,"dataGaLocation":466},{"text":195,"config":633},{"href":197,"dataGaName":198,"dataGaLocation":466},{"text":200,"config":635},{"href":202,"dataGaName":203,"dataGaLocation":466},{"text":205,"config":637},{"href":207,"dataGaName":638,"dataGaLocation":466},"docs",{"text":228,"config":640},{"href":230,"dataGaName":231,"dataGaLocation":466},{"text":642,"config":643},"What's new",{"href":288,"dataGaName":289,"dataGaLocation":466},{"text":223,"config":645},{"href":225,"dataGaName":226,"dataGaLocation":466},{"text":242,"config":647},{"href":244,"dataGaName":245,"dataGaLocation":466},{"text":250,"config":649},{"href":252,"dataGaName":253,"dataGaLocation":466},{"text":255,"config":651},{"href":257,"dataGaName":258,"dataGaLocation":466},{"text":260,"config":653},{"href":262,"dataGaName":263,"dataGaLocation":466},{"text":265,"config":655},{"href":267,"dataGaName":268,"dataGaLocation":466},{"text":270,"config":657},{"href":272,"dataGaName":273,"dataGaLocation":466},{"text":275,"config":659},{"href":277,"dataGaName":278,"dataGaLocation":466},{"title":291,"links":661},[662,664,666,668,670,672,676,681,683,685,687],{"text":299,"config":663},{"href":301,"dataGaName":293,"dataGaLocation":466},{"text":304,"config":665},{"href":306,"dataGaName":307,"dataGaLocation":466},{"text":312,"config":667},{"href":314,"dataGaName":315,"dataGaLocation":466},{"text":317,"config":669},{"href":319,"dataGaName":320,"dataGaLocation":466},{"text":322,"config":671},{"href":324,"dataGaName":325,"dataGaLocation":466},{"text":673,"config":674},"Sustainability",{"href":675,"dataGaName":673,"dataGaLocation":466},"/sustainability/",{"text":677,"config":678},"Diversity, inclusion and belonging (DIB)",{"href":679,"dataGaName":680,"dataGaLocation":466},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":327,"config":682},{"href":329,"dataGaName":330,"dataGaLocation":466},{"text":337,"config":684},{"href":339,"dataGaName":340,"dataGaLocation":466},{"text":342,"config":686},{"href":344,"dataGaName":345,"dataGaLocation":466},{"text":688,"config":689},"Modern Slavery Transparency Statement",{"href":690,"dataGaName":691,"dataGaLocation":466},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":693},[694,697,700],{"text":695,"config":696},"Terms",{"href":518,"dataGaName":519,"dataGaLocation":466},{"text":698,"config":699},"Cookies",{"dataGaName":528,"dataGaLocation":466,"id":529,"isOneTrustButton":14},{"text":701,"config":702},"Privacy",{"href":523,"dataGaName":524,"dataGaLocation":466},151,{"id":705,"title":706,"authors":707,"body":709,"category":9,"date":1478,"description":1479,"extension":1480,"externalUrl":6,"faq":6,"featured":10,"heroImage":1481,"meta":1482,"navigation":14,"path":1483,"seo":1484,"slug":1486,"stem":1487,"tags":1488,"template":1490,"updatedDate":6,"__hash__":1491},"blogPosts/en-us/blog/whats-new-in-git-2-55-0.md","What's new in Git 2.55.0?",[708],"Toon Claes",{"type":710,"value":711,"toc":1466},"minimark",[712,723,726,777,783,801,810,876,882,905,908,928,931,955,970,995,1020,1025,1040,1043,1064,1067,1075,1082,1100,1107,1128,1133,1156,1164,1167,1178,1196,1199,1205,1219,1236,1239,1248,1255,1262,1265,1273,1316,1334,1337,1359,1384,1387,1395,1413,1420,1428,1444,1448,1462],[713,714,715,716,722],"p",{},"The Git project recently released ",[717,718,721],"a",{"href":719,"rel":720},"https://lore.kernel.org/git/xmqqv7b1w9vr.fsf@gitster.g/T/#u",[],"Git 2.55.0",". Let's look at a few notable highlights from this release, which includes contributions from the Git team at GitLab.",[713,724,725],{},"What's covered:",[727,728,729,740,746,755,765,771],"ul",{},[730,731,732],"li",{},[717,733,735,736],{"href":734},"#git-history1-learns-fixup","git-history(1) learns ",[737,738,739],"code",{},"fixup",[730,741,742],{},[717,743,745],{"href":744},"#fsmonitor-daemon-for-linux","fsmonitor daemon for Linux",[730,747,748],{},[717,749,751,754],{"href":750},"#git-push-to-a-remote-group",[737,752,753],{},"git push"," to a remote group",[730,756,757],{},[717,758,760,761,764],{"href":759},"#limiting-git-log-graph-lane-width","Limiting ",[737,762,763],{},"git log --graph"," lane width",[730,766,767],{},[717,768,770],{"href":769},"#evolution-of-rust-in-the-git-codebase","Evolution of Rust in the Git codebase",[730,772,773],{},[717,774,776],{"href":775},"#faster-git-grep1-and-git-cherry1-in-partial-clones","Faster git-grep(1) and git-cherry(1) in partial clones",[778,779,735,781],"h2",{"id":780},"git-history1-learns-fixup",[737,782,739],{},[713,784,785,786,791,792,797,798,800],{},"In ",[717,787,790],{"href":788,"rel":789},"https://about.gitlab.com/blog/whats-new-in-git-2-54-0/#easier-editing-of-your-commit-history",[],"our highlights of Git 2.54.0",", we covered the introduction of ",[717,793,796],{"href":794,"rel":795},"https://git-scm.com/docs/git-history",[],"git-history(1)",". In 2.55.0, a new subcommand for this tool was added: ",[737,799,739],{},".",[713,802,803,804,809],{},"Imagine you've made some changes and you want to amend those changes into an existing commit. The most common approach to this is to create a fixup commit and autosquash it with ",[717,805,808],{"href":806,"rel":807},"https://git-scm.com/docs/git-rebase",[],"git-rebase(1)",":",[811,812,817],"pre",{"className":813,"code":814,"language":815,"meta":816,"style":816},"language-shell shiki shiki-themes github-light","git commit --fixup=\u003Ccommit-id>\ngit rebase -i --autosquash \u003Ccommit-id>^\n","shell","",[737,818,819,846],{"__ignoreMap":816},[820,821,824,828,832,836,840,843],"span",{"class":822,"line":823},"line",1,[820,825,827],{"class":826},"s7eDp","git",[820,829,831],{"class":830},"sYBdl"," commit",[820,833,835],{"class":834},"sYu0t"," --fixup=",[820,837,839],{"class":838},"sD7c4","\u003C",[820,841,842],{"class":834},"commit-id",[820,844,845],{"class":838},">\n",[820,847,849,851,854,857,860,863,866,870,873],{"class":822,"line":848},2,[820,850,827],{"class":826},[820,852,853],{"class":830}," rebase",[820,855,856],{"class":834}," -i",[820,858,859],{"class":834}," --autosquash",[820,861,862],{"class":838}," \u003C",[820,864,865],{"class":830},"commit-i",[820,867,869],{"class":868},"sgsFI","d",[820,871,872],{"class":838},">",[820,874,875],{"class":830},"^\n",[713,877,878,879,881],{},"Doing this in two steps is clumsy, especially because it requires an interactive rebase. Instead you can use the git-history(1) ",[737,880,739],{}," command:",[811,883,885],{"className":813,"code":884,"language":815,"meta":816,"style":816},"git history fixup \u003Ccommit-id>\n",[737,886,887],{"__ignoreMap":816},[820,888,889,891,894,897,899,901,903],{"class":822,"line":823},[820,890,827],{"class":826},[820,892,893],{"class":830}," history",[820,895,896],{"class":830}," fixup",[820,898,862],{"class":838},[820,900,865],{"class":830},[820,902,869],{"class":868},[820,904,845],{"class":838},[713,906,907],{},"This takes the staged changes and amends them into the given commit. As an added bonus, because you're using git-history(1), all other local branches that\ncontain the fixed-up commit are updated as well. So when working with stacked branches, fixup-ing a commit in the stack will automatically rebase all related branches.",[713,909,910,911,916,917,922,923,800],{},"This ",[717,912,915],{"href":913,"rel":914},"https://gitlab.com/git-scm/git/-/commit/ca7d7d642406e608214ee4529a75a6ad2310de35",[],"feature"," was ",[717,918,921],{"href":919,"rel":920},"https://lore.kernel.org/git/20260427-b4-pks-history-fixup-v3-0-cb908f06264b@pks.im/",[],"implemented"," by ",[717,924,927],{"href":925,"rel":926},"https://gitlab.com/pks-gitlab",[],"Patrick Steinhardt",[778,929,745],{"id":930},"fsmonitor-daemon-for-linux",[713,932,933,934,939,940,916,943,948,949,954],{},"When working with large monorepos, ",[717,935,938],{"href":936,"rel":937},"https://git-scm.com/docs/git-status",[],"git-status(1)"," can be slow to determine what changed in the local worktree because Git would need to traverse the whole working tree to see which files are modified. To speed up this process, in January 2018 a setting ",[737,941,942],{},"core.fsmonitor",[717,944,947],{"href":945,"rel":946},"https://gitlab.com/git-scm/git/-/commit/e05336bddacb90cf243aacc0f7b7f34f900453d7",[],"added"," in Git 2.16. Back then, you had to provide your own tool (like ",[717,950,953],{"href":951,"rel":952},"https://facebook.github.io/watchman/",[],"Watchman","). When this was configured, this tool runs in the background and monitors changes on the file system. This informs Git that a file was touched and Git then verifies whether the file was modified and updates the cached status. Then whenever the user calls git-status(1), it can simply return the cached status.",[713,956,957,958,916,960,965,966,969],{},"In April 2022, the setting ",[737,959,942],{},[717,961,964],{"href":962,"rel":963},"https://gitlab.com/git-scm/git/-/commit/1e0ea5c4316d2241dd76ef430a2779db9a097dfb",[],"changed"," to accept a boolean value. When this setting is set to ",[737,967,968],{},"true",", a daemon built-in into Git is used and no more third-party tool is needed. But this filesystem monitor was only implemented for Windows and macOS, support for GNU/Linux did not yet exist.",[713,971,972,973,978,979,984,985,990,991,994],{},"This changes in Git 2.55, where support for Linux has been added, too. To achieve this, ",[717,974,977],{"href":975,"rel":976},"https://man7.org/linux/man-pages/man7/inotify.7.html",[],"inotify(7)","\nis used. inotify(7) was chosen over ",[717,980,983],{"href":981,"rel":982},"https://www.man7.org/linux/man-pages/man7/fanotify.7.html",[],"fanotify(7)"," because fanotify(7) requires elevated privileges. This comes with a small ",[717,986,989],{"href":987,"rel":988},"https://git-scm.com/docs/git-fsmonitor--daemon#_linux_caveats",[],"caveat"," though, the fsmonitor needs to put a watcher on each and every directory in the repository. In a large repo you might hit the limit of inotify watches (",[737,992,993],{},"fs.inotify.max_user_watches","), which you may need to raise.",[713,996,997,998,1003,1004,922,1009,1014,1015,800],{},"These ",[717,999,1002],{"href":1000,"rel":1001},"https://gitlab.com/git-scm/git/-/commit/4d11b9c21863c1a860fdf61a9066f0d94c0d692a",[],"changes"," were ",[717,1005,1008],{"href":1006,"rel":1007},"https://lore.kernel.org/git/pull.2147.v15.git.git.1776259657.gitgitgadget@gmail.com/",[],"submitted",[717,1010,1013],{"href":1011,"rel":1012},"https://paultarjan.com/",[],"Paul Tarjan"," based on work by Eric DeCosta and ",[717,1016,1019],{"href":1017,"rel":1018},"https://github.com/maryis",[],"Marziyeh Esipreh",[778,1021,1023,754],{"id":1022},"git-push-to-a-remote-group",[737,1024,753],{},[713,1026,1027,1028,1033,1034,1039],{},"Quite some time ago ",[717,1029,1032],{"href":1030,"rel":1031},"https://git-scm.com/docs/git-fetch",[],"git-fetch(1)"," learned to fetch from a ",[717,1035,1038],{"href":1036,"rel":1037},"https://git-scm.com/docs/git-fetch#Documentation/git-fetch.txt-group",[],"group"," of remotes.",[713,1041,1042],{},"The following command configures a group of remotes:",[811,1044,1046],{"className":813,"code":1045,"language":815,"meta":816,"style":816},"git config set remotes.forks \"origin upstream\"\n",[737,1047,1048],{"__ignoreMap":816},[820,1049,1050,1052,1055,1058,1061],{"class":822,"line":823},[820,1051,827],{"class":826},[820,1053,1054],{"class":830}," config",[820,1056,1057],{"class":830}," set",[820,1059,1060],{"class":830}," remotes.forks",[820,1062,1063],{"class":830}," \"origin upstream\"\n",[713,1065,1066],{},"When this is set up, you can git-fetch(1) from this \"forks\" group, and then all the remotes in that list are fetched from. This can be useful when you want to get the updates from a set of remotes in one go.",[713,1068,1069,1074],{},[717,1070,1073],{"href":1071,"rel":1072},"https://git-scm.com/docs/git-push",[],"git-push(1)",", however, was not able to use remote groups.",[713,1076,1077,1078,1081],{},"In Git 2.55, this gap is closed and git-push(1) now accepts a remote group too. For example if you want to push the ",[737,1079,1080],{},"main"," branch to the group mentioned above:",[811,1083,1085],{"className":813,"code":1084,"language":815,"meta":816,"style":816},"git push forks main\n",[737,1086,1087],{"__ignoreMap":816},[820,1088,1089,1091,1094,1097],{"class":822,"line":823},[820,1090,827],{"class":826},[820,1092,1093],{"class":830}," push",[820,1095,1096],{"class":830}," forks",[820,1098,1099],{"class":830}," main\n",[713,1101,1102,1103,1106],{},"Similar as with git-fetch(1), this command pushes the specified refs to each of the remotes in the group. Each remote is pushed independently and honors its own ",[737,1104,1105],{},"remote.\u003Cname>.push"," mapping and mirror settings.",[713,1108,910,1109,916,1113,922,1117,1122,1123,800],{},[717,1110,915],{"href":1111,"rel":1112},"https://gitlab.com/git-scm/git/-/commit/2c677d20b684cdcae669fe508d4cd60fea8cb320",[],[717,1114,1008],{"href":1115,"rel":1116},"https://lore.kernel.org/git/20260503153402.1333220-1-usmanakinyemi202@gmail.com/",[],[717,1118,1121],{"href":1119,"rel":1120},"https://github.com/Unique-Usman",[],"Usman Akinyemi",", suggested by ",[717,1124,1127],{"href":1125,"rel":1126},"https://lore.kernel.org/git/xmqqiki0ivgy.fsf@gitster.g/",[],"Junio C Hamano",[778,1129,760,1131,764],{"id":1130},"limiting-git-log-graph-lane-width",[737,1132,763],{},[713,1134,1135,1136,1143,1144,1149,1150,1155],{},"The ",[717,1137,1140],{"href":1138,"rel":1139},"https://git-scm.com/docs/git-log#Documentation/git-log.txt---graph",[],[737,1141,1142],{},"--graph"," option of ",[717,1145,1148],{"href":1146,"rel":1147},"https://git-scm.com/docs/git-log",[],"git-log(1)"," draws an ASCII representation of the commit history. In a repository with many active contributors this graph can grow very wide. For example, on the\n",[717,1151,1154],{"href":1152,"rel":1153},"https://gitlab.com/git-scm/git/",[],"git.git"," repository this graph grows nine lanes wide after only 30 commits:",[811,1157,1162],{"className":1158,"code":1160,"language":1161,"meta":816},[1159],"language-text","* 26d8d94e94 A few more topics before -rc2\n*   02bb39c5cb Merge branch 'js/objects-larger-than-4gb-on-windows-more'\n|\\\n| * c6a4629e32 odb: use size_t for object_info.sizep and the size APIs\n| * 7a3a78cc76 packfile,delta: drop the `cast_size_t_to_ulong()` wrappers\n| * 188bac14f7 pack-objects: use size_t for in-core object sizes\n| * 2d83cc3f84 packfile: widen unpack_entry()'s size out-parameter to size_t\n| * 1d43315b31 pack-objects(check_pack_inflate()): use size_t instead of unsigned long\n| * 33afe87338 patch-delta: use size_t for sizes\n| * 8ea69373a4 compat/msvc: use _chsize_s for ftruncate\n* |   8cf57cbec4 Merge branch 'kw/gitattributes-typofix'\n|\\ \\\n| * | 0bf506efd4 gitattributes: fix eol attribute for Perl scripts\n* | |   8d96f09e92 Merge branch 'js/objects-larger-than-4gb-on-windows'\n|\\ \\ \\\n| * | | ab3810eb6f zlib: properly clamp to uLong\n* | | | 95e20213fa Hopefully final batch before -rc2\n* | | |   8632b5c49d Merge branch 'en/commit-graph-timestamp-fix'\n|\\ \\ \\ \\\n| * | | | fbcc5408fc commit-graph: use timestamp_t for max parent generation accumulator\n* | | | |   619931f561 Merge branch 'dl/posix-unused-warning-clang'\n|\\ \\ \\ \\ \\\n| * | | | | cf48887610 compat/posix.h: simplify GIT_GNUC_PREREQ() comparison\n| * | | | | ffd45926dc compat/posix.h: clean up GIT_GNUC_PREREQ() and UNUSED\n| * | | | | 689dc92e50 compat/posix.h: enable UNUSED warning messages for Clang\n* | | | | |   621962aa7a Merge branch 'td/ls-files-pathspec-prefilter'\n|\\ \\ \\ \\ \\ \\\n| * | | | | | 3f5203eeb4 ls-files: filter pathspec before lstat\n| | |_|_|_|/\n| |/| | | |\n* | | | | |   0c706d5092 Merge branch 'ta/doc-config-adoc-fixes'\n|\\ \\ \\ \\ \\ \\\n| * | | | | | 4fa2c6e045 doc: git-config: escape erroneous highlight markup\n| * | | | | | 042221cccb doc: config/sideband: fix description list delimiter\n| * | | | | | 3eb61fda62 doc: config: terminate runaway lists\n* | | | | | |   49cb068fb2 Merge branch 'jc/t1400-fifo-cleanup'\n|\\ \\ \\ \\ \\ \\ \\\n| * | | | | | | e8f12e0e95 t1400: have fifo test clean after itself\n* | | | | | | |   b4970f8448 Merge branch 'td/describe-tag-iteration'\n|\\ \\ \\ \\ \\ \\ \\ \\\n| * | | | | | | | 55088ac8a4 describe: limit default ref iteration to tags\n","text",[737,1163,1160],{"__ignoreMap":816},[713,1165,1166],{},"This happens because every lane continues downward to the commit from where the branch was created. This pushes the commit messages off to the right, making it harder to read. Especially when the terminal screen width is reached, this becomes unusable.",[713,1168,1169,1170,1173,1174,1177],{},"Git 2.55 adds a new ",[737,1171,1172],{},"--graph-lane-limit=\u003Cn>"," option to limit the number of lanes that are drawn. Any lanes beyond the limit are replaced with a ",[737,1175,1176],{},"~","\ntruncation mark, so it stays obvious that the graph was trimmed:",[811,1179,1181],{"className":813,"code":1180,"language":815,"meta":816,"style":816},"git log --graph --graph-lane-limit=5\n",[737,1182,1183],{"__ignoreMap":816},[820,1184,1185,1187,1190,1193],{"class":822,"line":823},[820,1186,827],{"class":826},[820,1188,1189],{"class":830}," log",[820,1191,1192],{"class":834}," --graph",[820,1194,1195],{"class":834}," --graph-lane-limit=5\n",[713,1197,1198],{},"Using this option for the same 30 commits as above, we'll get:",[811,1200,1203],{"className":1201,"code":1202,"language":1161,"meta":816},[1159],"* 26d8d94e94 A few more topics before -rc2\n*   02bb39c5cb Merge branch 'js/objects-larger-than-4gb-on-windows-more'\n|\\\n| * c6a4629e32 odb: use size_t for object_info.sizep and the size APIs\n| * 7a3a78cc76 packfile,delta: drop the `cast_size_t_to_ulong()` wrappers\n| * 188bac14f7 pack-objects: use size_t for in-core object sizes\n| * 2d83cc3f84 packfile: widen unpack_entry()'s size out-parameter to size_t\n| * 1d43315b31 pack-objects(check_pack_inflate()): use size_t instead of unsigned long\n| * 33afe87338 patch-delta: use size_t for sizes\n| * 8ea69373a4 compat/msvc: use _chsize_s for ftruncate\n* |   8cf57cbec4 Merge branch 'kw/gitattributes-typofix'\n|\\ \\\n| * | 0bf506efd4 gitattributes: fix eol attribute for Perl scripts\n* | |   8d96f09e92 Merge branch 'js/objects-larger-than-4gb-on-windows'\n|\\ \\ \\\n| * | | ab3810eb6f zlib: properly clamp to uLong\n* | | | 95e20213fa Hopefully final batch before -rc2\n* | | |   8632b5c49d Merge branch 'en/commit-graph-timestamp-fix'\n|\\ \\ \\ \\\n| * | | | fbcc5408fc commit-graph: use timestamp_t for max parent generation accumulator\n* | | | |   619931f561 Merge branch 'dl/posix-unused-warning-clang'\n|\\ \\ \\ \\ \\\n| * | | | ~ cf48887610 compat/posix.h: simplify GIT_GNUC_PREREQ() comparison\n| * | | | ~ ffd45926dc compat/posix.h: clean up GIT_GNUC_PREREQ() and UNUSED\n| * | | | ~ 689dc92e50 compat/posix.h: enable UNUSED warning messages for Clang\n* | | | | ~ 621962aa7a Merge branch 'td/ls-files-pathspec-prefilter'\n|\\ \\ \\ \\ \\~\n| * | | | ~ 3f5203eeb4 ls-files: filter pathspec before lstat\n| | |_|_|_~\n| |/| | | ~\n* | | | | ~ 0c706d5092 Merge branch 'ta/doc-config-adoc-fixes'\n|\\ \\ \\ \\ \\~\n| * | | | ~ 4fa2c6e045 doc: git-config: escape erroneous highlight markup\n| * | | | ~ 042221cccb doc: config/sideband: fix description list delimiter\n| * | | | ~ 3eb61fda62 doc: config: terminate runaway lists\n* | | | | ~ 49cb068fb2 Merge branch 'jc/t1400-fifo-cleanup'\n|\\ \\ \\ \\ \\~\n| * | | | ~ e8f12e0e95 t1400: have fifo test clean after itself\n* | | | | ~ b4970f8448 Merge branch 'td/describe-tag-iteration'\n|\\ \\ \\ \\ \\~\n| * | | | ~ 55088ac8a4 describe: limit default ref iteration to tags\n",[737,1204,1202],{"__ignoreMap":816},[713,1206,1207,1208,1210,1211,1214,1215,1218],{},"The option only makes sense together with ",[737,1209,1142],{},". The default is ",[737,1212,1213],{},"0",", which\nmeans no limit, and zero or negative values are treated the same way, just like\n",[737,1216,1217],{},"--max-parents"," does.",[713,1220,910,1221,1225,1226,1230,1231,800],{},[717,1222,915],{"href":1223,"rel":1224},"https://gitlab.com/git-scm/git/-/commit/7af2503365b4bc683c16e667b88c0796d6d9d2ee",[],"\nwas ",[717,1227,1008],{"href":1228,"rel":1229},"https://lore.kernel.org/git/20260328001113.1275291-1-pabloosabaterr@gmail.com/",[],"\nby ",[717,1232,1235],{"href":1233,"rel":1234},"https://pablosabater.dev/",[],"Pablo Sabater",[778,1237,770],{"id":1238},"evolution-of-rust-in-the-git-codebase",[713,1240,1241,1242,1247],{},"In March 2025, with the release of Git 2.49, the first ",[717,1243,1246],{"href":1244,"rel":1245},"https://www.rust-lang.org/",[],"Rust"," code was added to the Git codebase. Rust\nbindings were added to allow Rust code to call into libgit. But none of that Rust code was used by the Git binaries.",[713,1249,1250,1251,1254],{},"In November 2025, in Git 2.52, the first Rust production code was introduced into Git. Then a Rust implementation for the ",[737,1252,1253],{},"varint","\nsubsystem was added. This code is optionally compiled if the Rust compiler is available, and when it's not, the C implementation is used. This was added as a test balloon for distributors to start preparing their tooling for a Git release that requires Rust at some point.",[713,1256,1257,1258,1261],{},"Earlier this year, in Version 2.54, more Rust code was added to the codebase with the introduction of the ",[737,1259,1260],{},"ObjectID"," type. This was added as part of the efforts to implement interoperability between SHA-1 and SHA-256.",[713,1263,1264],{},"Until this release, both build systems Make and Meson would gracefully fall back to the C implementation if the Rust compiler is not found. With this v2.55 release the Rust compiler is required unless you explicitly disable it in the build system.",[713,1266,1267,1268,1272],{},"Please note that this doesn't affect users of Git. It only affects those who ",[1269,1270,1271],"em",{},"build"," Git from source. If you compile Git and don't want to use Rust, disable it with one of these commands:",[811,1274,1276],{"className":813,"code":1275,"language":815,"meta":816,"style":816},"# Meson\nmeson configure -Drust=disabled\n\n# Makefile\nmake NO_RUST=YesPlease\n",[737,1277,1278,1284,1295,1301,1307],{"__ignoreMap":816},[820,1279,1280],{"class":822,"line":823},[820,1281,1283],{"class":1282},"sAwPA","# Meson\n",[820,1285,1286,1289,1292],{"class":822,"line":848},[820,1287,1288],{"class":826},"meson",[820,1290,1291],{"class":830}," configure",[820,1293,1294],{"class":834}," -Drust=disabled\n",[820,1296,1298],{"class":822,"line":1297},3,[820,1299,1300],{"emptyLinePlaceholder":14},"\n",[820,1302,1304],{"class":822,"line":1303},4,[820,1305,1306],{"class":1282},"# Makefile\n",[820,1308,1310,1313],{"class":822,"line":1309},5,[820,1311,1312],{"class":826},"make",[820,1314,1315],{"class":830}," NO_RUST=YesPlease\n",[713,1317,1318,1319,1324,1325,1324,1328,1333],{},"Bringing Rust into Git has been an ongoing (and unfinished), multi-release, community effort. It's impossible to attribute this to a single person, but some of the most prominent contributors include ",[717,1320,1323],{"href":1321,"rel":1322},"https://mastodon.social/@bk2204",[],"brian m. carlson",", ",[717,1326,927],{"href":925,"rel":1327},[],[717,1329,1332],{"href":1330,"rel":1331},"https://github.com/ezekielnewren",[],"Ezekiel Newren",", and Calvin Wan.",[778,1335,776],{"id":1336},"faster-git-grep1-and-git-cherry1-in-partial-clones",[713,1338,1339,1344,1345,1350,1351,1358],{},[717,1340,1343],{"href":1341,"rel":1342},"https://git-scm.com/docs/git-clone",[],"git-clone(1)"," has this feature called ",[717,1346,1349],{"href":1347,"rel":1348},"https://git-scm.com/docs/partial-clone",[],"partial clone",". This allows the user to apply a filter to what is sent over from the server. In practice, this is done with the ",[717,1352,1355],{"href":1353,"rel":1354},"https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---filterfilter-spec",[],[737,1356,1357],{},"--filter"," option. For example:",[811,1360,1362],{"className":813,"code":1361,"language":815,"meta":816,"style":816},"git clone --filter=blob:none \u003Cremote>\n",[737,1363,1364],{"__ignoreMap":816},[820,1365,1366,1368,1371,1374,1376,1379,1382],{"class":822,"line":823},[820,1367,827],{"class":826},[820,1369,1370],{"class":830}," clone",[820,1372,1373],{"class":834}," --filter=blob:none",[820,1375,862],{"class":838},[820,1377,1378],{"class":830},"remot",[820,1380,1381],{"class":868},"e",[820,1383,845],{"class":838},[713,1385,1386],{},"This will clone the repository, but that clone excludes all blobs (i.e. the contents of the files in the tree). This can speed up the clone tremendously,\nbut it comes at the cost that Git needs to download blobs later when other commands are used that read file contents. And some commands might need a lot of missing blobs.",[713,1388,1389,1394],{},[717,1390,1393],{"href":1391,"rel":1392},"https://git-scm.com/docs/git-grep",[],"git-grep(1)"," is one of those commands, as it searches the content of the files. To do so, it obviously needs to\nhave those files. Imagine you want to search the word \"TODO\" 100 commits back in history:",[811,1396,1398],{"className":813,"code":1397,"language":815,"meta":816,"style":816},"git grep TODO HEAD~100\n",[737,1399,1400],{"__ignoreMap":816},[820,1401,1402,1404,1407,1410],{"class":822,"line":823},[820,1403,827],{"class":826},[820,1405,1406],{"class":830}," grep",[820,1408,1409],{"class":830}," TODO",[820,1411,1412],{"class":830}," HEAD~100\n",[713,1414,1415,1416,1419],{},"This command resolves the ",[737,1417,1418],{},"HEAD~100"," commit and the trees associated with that. But those trees might point to blobs that aren't downloaded yet. Previously, each blob was downloaded separately. But that is improved in Git 2.55. In this version of Git, the blob downloads are batched together into a single negotiating round-trip with the server.",[713,1421,1422,1423,800],{},"This batching is now implemented for both git-grep(1) and ",[717,1424,1427],{"href":1425,"rel":1426},"https://git-scm.com/docs/git-cherry",[],"git-cherry(1)",[713,1429,910,1430,916,1435,922,1439,800],{},[717,1431,1434],{"href":1432,"rel":1433},"https://gitlab.com/git-scm/git/-/commit/6d2ba7ead7ab074bfd88e194bb75d6b384c44d4e",[],"change",[717,1436,1008],{"href":1437,"rel":1438},"https://lore.kernel.org/git/pull.2089.v3.git.1778775928.gitgitgadget@gmail.com/",[],[717,1440,1443],{"href":1441,"rel":1442},"https://github.com/newren",[],"Elijah Newren",[778,1445,1447],{"id":1446},"read-more","Read more",[713,1449,1450,1451,1455,1456,1461],{},"This article highlighted just a few of the contributions made by GitLab and the wider Git community for this latest release. You can learn about these from the ",[717,1452,1454],{"href":719,"rel":1453},[],"official release announcement"," of the Git project. Also, check out our ",[717,1457,1460],{"href":1458,"rel":1459},"https://about.gitlab.com/blog/tags/git/",[],"previous Git release blog posts"," to see other past highlights of contributions from GitLab team members.",[1463,1464,1465],"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);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":816,"searchDepth":848,"depth":848,"links":1467},[1468,1470,1471,1473,1475,1476,1477],{"id":780,"depth":848,"text":1469},"git-history(1) learns fixup",{"id":930,"depth":848,"text":745},{"id":1022,"depth":848,"text":1472},"git push to a remote group",{"id":1130,"depth":848,"text":1474},"Limiting git log --graph lane width",{"id":1238,"depth":848,"text":770},{"id":1336,"depth":848,"text":776},{"id":1446,"depth":848,"text":1447},"2026-06-29","Learn about the new features and changes in Git 2.55, including a new git-history(1) fixup command, an fsmonitor daemon for Linux, pushing to remote groups, and more.","md","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png",{},"/en-us/blog/whats-new-in-git-2-55-0",{"config":1485,"title":706,"description":1479},{"noIndex":10},"whats-new-in-git-2-55-0","en-us/blog/whats-new-in-git-2-55-0",[1489,827,263],"open source","BlogPost","-lUvZPVGbV8nUfJJgFqWhK9rY8tG_VpZXw9SbSwtMig",[1493,1500,1507,1514,1521,1528,1534,1540,1546],{"title":1494,"heroImage":1495,"category":9,"description":1496,"authors":1497,"slug":1499,"externalUrl":6},"Native code intelligence is coming to GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749673090/Blog/Hero%20Images/random_code.jpg","We're enhancing code review with Sourcegraph – no extra plugins required.",[1498],"Mayank Tahilramani","sourcegraph-code-intelligence-integration-for-gitlab",{"title":1501,"heroImage":1502,"category":9,"description":1503,"authors":1504,"slug":1506,"externalUrl":6},"Optimize GitOps workflow with version control from GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749673081/Blog/Hero%20Images/gitops-image-unsplash.jpg","A GitOps workflow improves development, operations and business processes and GitLab’s CI plays a vital role.",[1505],"Brein Matturro","optimize-gitops-workflow",{"title":1508,"heroImage":1509,"category":9,"description":1510,"authors":1511,"slug":1513,"externalUrl":6},"Getting Started with Kubernetes","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749678474/Blog/Hero%20Images/clouds_kubernetes101.jpg","Pods, nodes, clusters – oh my! Get the lowdown on Kubernetes from Brendan O'Leary's talk at Contribute 2019.",[1512],"Sara Kassabian","kubernetes-101",{"title":1515,"heroImage":1516,"category":9,"description":1517,"authors":1518,"slug":1520,"externalUrl":6},"How Delta made the journey to cloud native","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749678376/Blog/Hero%20Images/deltacommit.jpg","Delta tossed aside the rule book to go cloud native and achieve workflow portability. Here's how it's done.",[1519],"Valerie Silverthorne","delta-cloud-native",{"title":1522,"heroImage":1523,"category":9,"description":1524,"authors":1525,"slug":1527,"externalUrl":6},"DevOps on the edge: Upcoming collaborations between GitLab and Arm","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682923/Blog/Hero%20Images/gitlab-arm-collaboration.jpg","Check out the latest news from the technical evangelist team about upcoming initiatives from GitLab and Arm.",[1526],"Priyanka Sharma","devops-on-the-edge-a-conversation-about-gitlab-and-arm",{"title":1529,"heroImage":1530,"category":9,"description":1531,"authors":1532,"slug":1533,"externalUrl":6},"Redbox delivers On Demand with GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749673064/Blog/Hero%20Images/redbox-blog-jannes-glas-unsplash.jpg","Redbox's Joel Vasallo and Nicholas Konieczko explain how they ‘deliver software like a fox’ with GitLab.",[1505],"redbox-on-demand-delivers-with-gitlab",{"title":1535,"heroImage":1536,"category":9,"description":1537,"authors":1538,"slug":1539,"externalUrl":6},"GitLab Commit: How MRI Technologies used GitLab to bring unified toolchains to NASA","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749678434/Blog/Hero%20Images/nasagitlab.jpg","Live from GitLab Commit: NASA will be flying Kubernetes clusters to the moon and GitLab is helping.",[1519],"open-source-nasa-gl",{"title":1541,"heroImage":1542,"category":9,"description":1543,"authors":1544,"slug":1545,"externalUrl":6},"How one government agency is creating a transparent digital democracy with GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679611/Blog/Hero%20Images/cook-county-blog-unsplash.jpg","The Cook County Assessor’s office explains how they're using GitLab to help create a new level of government transparency.",[1505],"creating-a-transparent-digital-democracy",{"title":1547,"heroImage":1548,"category":9,"description":1549,"authors":1550,"slug":1553,"externalUrl":6},"How to manage your Snowflake spend with Periscope and dbt","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749670255/Blog/Hero%20Images/data-servers.jpg","The GitLab data team is open sourcing the dbt package they use to manage their Snowflake spend.",[1551,1552],"Taylor Murphy","Emilie Schario","managing-your-snowflake-spend-with-periscope-and-dbt",1786803794635]