[{"data":1,"prerenderedAt":1353},["ShallowReactive",2],{"/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes":3,"navigation-en-us":555,"banner-en-us":983,"footer-en-us":993,"blog-post-authors-en-us-Karthik Nayak|Manuel Kraft":1237,"blog-related-posts-en-us-how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes":1264,"blog-promotions-en-us":1290,"next-steps-en-us":1343},{"id":4,"title":5,"authors":6,"body":9,"category":532,"date":533,"description":534,"extension":535,"externalUrl":536,"faq":536,"featured":272,"heroImage":537,"meta":538,"navigation":272,"path":539,"seo":540,"slug":545,"stem":546,"tags":547,"template":553,"updatedDate":536,"__hash__":554},"blogPosts/en-us/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes.md","How we decreased GitLab repo backup times from 48 hours to 41 minutes",[7,8],"Karthik Nayak","Manuel Kraft",{"type":10,"value":11,"toc":522},"minimark",[12,28,31,36,39,78,81,84,88,100,103,108,111,118,121,137,147,158,162,165,171,406,415,419,422,452,456,459,479,482,497,501,504,507,518],[13,14,15,16,22,23,27],"p",{},"Repository backups are a critical component of any robust disaster recovery strategy. However, as repositories grow in size, the process of creating reliable backups becomes increasingly challenging.  Our own ",[17,18,21],"a",{"href":19,"rel":20},"https://gitlab.com/gitlab-org/gitlab",[],"Rails repository"," was taking 48 hours to back up — forcing impossible choices between backup frequency and system performance. We wanted to tackle this issue for our customers and for our own users internally.\nUltimately, we traced the issue to a 15-year-old Git function with O(N²) complexity and fixed it with an algorithmic change, ",[24,25,26],"strong",{},"reducing backup times exponentially",". The result: lower costs, reduced risk, and backup strategies that actually scale with your codebase.",[13,29,30],{},"This turned out to be a Git scalability issue that affects anyone with large repositories. Here's how we tracked it down and fixed it.",[32,33,35],"h2",{"id":34},"backup-at-scale","Backup at scale",[13,37,38],{},"First, let's look at the problem. As organizations scale their repositories and backups grow more complex, here are some of the challenges they can face:",[40,41,42,49,60,66,72],"ul",{},[43,44,45,48],"li",{},[24,46,47],{},"Time-prohibitive backups:"," For very large repositories, creating a repository backup could take several hours, which can hinder the ability to schedule regular backups.",[43,50,51,54,55,59],{},[24,52,53],{},"Resource intensity:"," Extended backup processes can consume substantial server resources, potentially impacting other operations. For teams also looking to reduce Gitaly load from clone and fetch operations, see ",[17,56,58],{"href":57},"/blog/reduce-the-load-on-gitlab-gitaly-with-bundle-uri/","how bundle URI can offload Git traffic to cloud storage",".",[43,61,62,65],{},[24,63,64],{},"Backup windows:"," Finding adequate maintenance windows for such lengthy processes can be difficult for teams running 24/7 operations.",[43,67,68,71],{},[24,69,70],{},"Increased failure risk:"," Long-running processes are more susceptible to interruptions from network issues, server restarts, and system errors, which can force teams to restart the entire very long backup process from scratch.",[43,73,74,77],{},[24,75,76],{},"Race conditions:"," Because it takes a long time to create a backup, the repository might have changed a lot during the process, potentially creating an invalid backup or interrupting the backup because objects are no longer available.",[13,79,80],{},"These challenges can lead to compromising on backup frequency or completeness – an unacceptable trade-off when it comes to data protection. Extended backup windows can force customers into workarounds. Some might adopt external tooling, while others might reduce backup frequency, resulting in potential inconsistent data protection strategies across organizations.",[13,82,83],{},"Now, let's dig into how we identified a performance bottleneck, found a resolution, and deployed it to help cut backup times.",[32,85,87],{"id":86},"the-technical-challenge","The technical challenge",[13,89,90,91,99],{},"GitLab's repository backup functionality relies on the ",[17,92,95],{"href":93,"rel":94},"https://git-scm.com/docs/git-bundle",[],[96,97,98],"code",{},"git bundle create"," command, which captures a complete snapshot of a repository, including all objects and references like branches and tags. This bundle serves as a restoration point for recreating the repository in its exact state.",[13,101,102],{},"However, the implementation of the command suffered from poor scalability related to reference count, creating a performance bottleneck. As repositories accumulated more references, processing time increased exponentially. In our largest repositories containing millions of references, backup operations could extend beyond 48 hours.",[104,105,107],"h3",{"id":106},"root-cause-analysis","Root cause analysis",[13,109,110],{},"To identify the root cause of this performance bottleneck, we analyzed a flame graph of the command during execution.",[13,112,113],{},[114,115],"img",{"alt":116,"src":117},"Flame graph showing command during execution","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097176/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750097176388.jpg",[13,119,120],{},"A flame graph displays the execution path of a command through its stack trace. Each bar corresponds to a function in the code, with the bar's width indicating how much time the command spent executing within that particular function.",[13,122,123,124,126,127,130,131,136],{},"When examining the flame graph of ",[96,125,98],{}," running on a repository with 10,000 references, approximately 80% of the execution time is consumed by the ",[96,128,129],{},"object_array_remove_duplicates()"," function. This function was introduced to Git in the ",[17,132,135],{"href":133,"rel":134},"https://gitlab.com/gitlab-org/git/-/commit/b2a6d1c686",[],"commit b2a6d1c686"," (bundle: allow the same ref to be given more than once, 2009-01-17).",[13,138,139,140,142,143,146],{},"To understand this change, it's important to know that ",[96,141,98],{}," allows users to specify which references to include in the bundle. For complete repository bundles, the ",[96,144,145],{},"--all"," flag packages all references.",[13,148,149,150,153,154,157],{},"The commit addressed a problem where users providing duplicate references through the command line – such as ",[96,151,152],{},"git bundle create main.bundle main main"," - would create a bundle without properly handling the duplicated main reference. Unbundling this bundle in a Git repository would break, because it tries to write the same ref twice. The code to avoid duplication uses nested ",[96,155,156],{},"for"," loops that iterate through all references to identify duplicates. This O(N²) algorithm becomes a significant performance bottleneck in repositories with large reference counts, consuming substantial processing time.",[104,159,161],{"id":160},"the-fix-from-on-to-efficient-mapping","The fix: From O(N²) to efficient mapping",[13,163,164],{},"To resolve this performance issue, we contributed an upstream fix to Git that replaces the nested loops with a map data structure. Each reference is added to the map, which automatically ensures only a single copy of each reference is retained for processing.",[13,166,167,168,170],{},"This change dramatically enhances the performance of ",[96,169,98],{}," and enables much better scalability in repositories with large reference counts. Benchmark testing on a repository with 10,000 references demonstrates a 6x performance improvement.",[172,173,178],"pre",{"className":174,"code":175,"language":176,"meta":177,"style":177},"language-shell shiki shiki-themes github-light","Benchmark 1: bundle (refcount = 100000, revision = master)\n  Time (mean ± σ):  14.653 s ±  0.203 s [User: 13.940 s, System: 0.762 s]\n  Range (min … max):   14.237 s … 14.920 s  10 runs\n\nBenchmark 2: bundle (refcount = 100000, revision = HEAD)\n  Time (mean ± σ):      2.394 s ±  0.023 s  [User: 1.684 s, System: 0.798 s]\n  Range (min … max):    2.364 s …  2.425 s  10 runs\n\nSummary\n  bundle (refcount = 100000, revision = HEAD) ran\n    6.12 ± 0.10 times faster than bundle (refcount = 100000, revision = master)\n","shell","",[96,179,180,218,249,267,274,299,323,337,342,348,369],{"__ignoreMap":177},[181,182,185,189,193,196,200,203,206,209,212,215],"span",{"class":183,"line":184},"line",1,[181,186,188],{"class":187},"s7eDp","Benchmark",[181,190,192],{"class":191},"sYBdl"," 1:",[181,194,195],{"class":191}," bundle",[181,197,199],{"class":198},"sgsFI"," (refcount ",[181,201,202],{"class":191},"=",[181,204,205],{"class":191}," 100000,",[181,207,208],{"class":191}," revision",[181,210,211],{"class":191}," =",[181,213,214],{"class":191}," master",[181,216,217],{"class":198},")\n",[181,219,221,224,227,230,233,236,240,243,246],{"class":183,"line":220},2,[181,222,223],{"class":187},"  Time",[181,225,226],{"class":198}," (mean ",[181,228,229],{"class":191},"±",[181,231,232],{"class":191}," σ",[181,234,235],{"class":198},"):  14.653 s ±  0.203 s [User: ",[181,237,239],{"class":238},"sYu0t","13.940",[181,241,242],{"class":198}," s, System: ",[181,244,245],{"class":238},"0.762",[181,247,248],{"class":198}," s]\n",[181,250,252,255,258,261,264],{"class":183,"line":251},3,[181,253,254],{"class":187},"  Range",[181,256,257],{"class":198}," (min ",[181,259,260],{"class":191},"…",[181,262,263],{"class":191}," max",[181,265,266],{"class":198},"):   14.237 s … 14.920 s  10 runs\n",[181,268,270],{"class":183,"line":269},4,[181,271,273],{"emptyLinePlaceholder":272},true,"\n",[181,275,277,279,282,284,286,288,290,292,294,297],{"class":183,"line":276},5,[181,278,188],{"class":187},[181,280,281],{"class":191}," 2:",[181,283,195],{"class":191},[181,285,199],{"class":198},[181,287,202],{"class":191},[181,289,205],{"class":191},[181,291,208],{"class":191},[181,293,211],{"class":191},[181,295,296],{"class":191}," HEAD",[181,298,217],{"class":198},[181,300,302,304,306,308,310,313,316,318,321],{"class":183,"line":301},6,[181,303,223],{"class":187},[181,305,226],{"class":198},[181,307,229],{"class":191},[181,309,232],{"class":191},[181,311,312],{"class":198},"):      2.394 s ±  0.023 s  [User: ",[181,314,315],{"class":238},"1.684",[181,317,242],{"class":198},[181,319,320],{"class":238},"0.798",[181,322,248],{"class":198},[181,324,326,328,330,332,334],{"class":183,"line":325},7,[181,327,254],{"class":187},[181,329,257],{"class":198},[181,331,260],{"class":191},[181,333,263],{"class":191},[181,335,336],{"class":198},"):    2.364 s …  2.425 s  10 runs\n",[181,338,340],{"class":183,"line":339},8,[181,341,273],{"emptyLinePlaceholder":272},[181,343,345],{"class":183,"line":344},9,[181,346,347],{"class":187},"Summary\n",[181,349,351,354,356,358,360,362,364,366],{"class":183,"line":350},10,[181,352,353],{"class":187},"  bundle",[181,355,199],{"class":198},[181,357,202],{"class":191},[181,359,205],{"class":191},[181,361,208],{"class":191},[181,363,211],{"class":191},[181,365,296],{"class":191},[181,367,368],{"class":198},") ran\n",[181,370,372,375,378,381,384,387,390,392,394,396,398,400,402,404],{"class":183,"line":371},11,[181,373,374],{"class":187},"    6.12",[181,376,377],{"class":191}," ±",[181,379,380],{"class":238}," 0.10",[181,382,383],{"class":191}," times",[181,385,386],{"class":191}," faster",[181,388,389],{"class":191}," than",[181,391,195],{"class":191},[181,393,199],{"class":198},[181,395,202],{"class":191},[181,397,205],{"class":191},[181,399,208],{"class":191},[181,401,211],{"class":191},[181,403,214],{"class":191},[181,405,217],{"class":198},[13,407,408,409,414],{},"The patch was accepted and ",[17,410,413],{"href":411,"rel":412},"https://gitlab.com/gitlab-org/git/-/commit/bb74c0abbc31da35be52999569ea481ebd149d1d",[],"merged"," into upstream Git. At GitLab, we backported this fix to ensure our customers could benefit immediately, without waiting for the next Git release.",[32,416,418],{"id":417},"the-result-dramatically-decreased-backup-times","The result: Dramatically decreased backup times",[13,420,421],{},"The performance gains from this improvement have been nothing short of transformative:",[40,423,424,434,440,446],{},[43,425,426,429,430,433],{},[24,427,428],{},"From 48 hours to 41 minutes:"," Creating a backup of our largest repository (",[96,431,432],{},"gitlab-org/gitlab",") now takes just 1.4% of the original time.",[43,435,436,439],{},[24,437,438],{},"Consistent performance:"," The improvement scales reliably across repository sizes.",[43,441,442,445],{},[24,443,444],{},"Resource efficiency:"," We significantly reduced server load during backup operations.",[43,447,448,451],{},[24,449,450],{},"Broader applicability:"," While backup creation sees the most dramatic improvement, all bundle-based operations that operate on many references benefit.",[32,453,455],{"id":454},"what-this-means-for-gitlab-customers","What this means for GitLab customers",[13,457,458],{},"For GitLab customers, this enhancement delivers immediate and tangible benefits on how organizations approach repository backup and disaster recovery planning:",[40,460,461],{},[43,462,463,466,467,470,471,474,475,478],{},[24,464,465],{},"Transformed backup strategies","     * Enterprise teams can establish comprehensive nightly schedules without impacting development workflows or requiring extensive backup windows.     * Backups can now run seamlessly in the background during nightly schedules, instead of needing to be dedicated and lengthy.  * ",[24,468,469],{},"Enhanced business continuity","    * With backup times reduced from days to minutes, organizations significantly minimize their recovery point objectives (RPO). This translates to reduced business risk – in a disaster scenario, you're potentially recovering hours of work instead of days.  * ",[24,472,473],{},"Reduced operational overhead","     * Less server resource consumption and shorter maintenance windows.    * Shorter backup windows mean reduced compute costs, especially in cloud environments, where extended processing time translates directly to higher bills.  * ",[24,476,477],{},"Future-proofed infrastructure","     * Growing repositories no longer force difficult choices between backup frequency and system performance.     * As your codebase expands, your backup strategy can scale seamlessly alongside it",[13,480,481],{},"Organizations can now implement more robust backup strategies without compromising on performance or completeness. What was once a challenging trade-off has become a straightforward operational practice.",[13,483,484,485,490,491,496],{},"Starting with the ",[17,486,489],{"href":487,"rel":488},"https://docs.gitlab.com/releases/18/gitlab-18-0-released/",[],"GitLab 18.0"," release, all GitLab customers regardless of their license tier can already fully take advantage of these improvements for their ",[17,492,495],{"href":493,"rel":494},"https://docs.gitlab.com/administration/backup_restore/backup_gitlab/",[],"backup"," strategy and execution. There is no further change in configuration required.",[32,498,500],{"id":499},"whats-next","What's next",[13,502,503],{},"This breakthrough is part of our ongoing commitment to scalable, enterprise-grade Git infrastructure. While the improvement of 48 hours to 41 minutes for backup creation time represents a significant milestone, we continue to identify and address performance bottlenecks throughout our stack.",[13,505,506],{},"We're particularly proud that this enhancement was contributed upstream to the Git project, benefiting not just GitLab users but the broader Git community. This collaborative approach to development ensures that improvements are thoroughly reviewed, widely tested, and available to all.",[508,509,510],"blockquote",{},[13,511,512,513],{},"Deep infrastructure work like this is how we approach performance at GitLab. Join the GitLab 18 virtual launch event to see what other fundamental improvements we're shipping. ",[17,514,517],{"href":515,"rel":516},"https://about.gitlab.com/eighteen/",[],"Register today!",[519,520,521],"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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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":177,"searchDepth":220,"depth":220,"links":523},[524,525,529,530,531],{"id":34,"depth":220,"text":35},{"id":86,"depth":220,"text":87,"children":526},[527,528],{"id":106,"depth":251,"text":107},{"id":160,"depth":251,"text":161},{"id":417,"depth":220,"text":418},{"id":454,"depth":220,"text":455},{"id":499,"depth":220,"text":500},"engineering","2025-06-05","Learn how we tracked a performance bottleneck to a 15-year-old Git function and fixed it, leading to enhanced efficiency that supports more robust backup strategies and can reduce risk.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097166/Blog/Hero%20Images/Blog/Hero%20Images/REFERENCE%20-%20display%20preview%20for%20blog%20images%20%282%29_2pKf8RsKzAaThmQfqHIaa7_1750097166565.png",{},"/en-us/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes",{"title":5,"description":534,"ogTitle":5,"ogDescription":534,"noIndex":541,"ogImage":537,"ogUrl":542,"ogSiteName":543,"ogType":544,"canonicalUrls":542},false,"https://about.gitlab.com/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes","https://about.gitlab.com","article","how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes","en-us/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes",[548,549,550,551,552],"git","open source","product","performance","DevSecOps platform","BlogPost","tx8DiRwXz28oq0nk3EaDN9GgkDjgwAkcpLUYEVWzGJo",{"logo":556,"freeTrial":561,"sales":566,"login":571,"items":576,"search":903,"minimal":934,"duo":953,"switchNav":962,"pricingDeployment":973},{"config":557},{"href":558,"dataGaName":559,"dataGaLocation":560},"/","gitlab logo","header",{"text":562,"config":563},"Get free trial",{"href":564,"dataGaName":565,"dataGaLocation":560},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":567,"config":568},"Request a demo",{"href":569,"dataGaName":570,"dataGaLocation":560},"/sales/?contact-topic=request-demo","sales",{"text":572,"config":573},"Sign in",{"href":574,"dataGaName":575,"dataGaLocation":560},"https://gitlab.com/users/sign_in/","sign in",[577,606,706,711,825,881],{"text":578,"config":579,"menu":581},"Platform",{"dataNavLevelOne":580},"platform",{"type":582,"columns":583},"cards",[584,590,598],{"title":578,"description":585,"link":586},"The intelligent orchestration platform for DevSecOps",{"text":587,"config":588},"Explore our Platform",{"href":589,"dataGaName":580,"dataGaLocation":560},"/platform/",{"title":591,"description":592,"link":593},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":594,"config":595},"Meet GitLab Duo",{"href":596,"dataGaName":597,"dataGaLocation":560},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":599,"description":600,"link":601},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":602,"config":603},"Learn more",{"href":604,"dataGaName":605,"dataGaLocation":560},"/why-gitlab/","why gitlab",{"text":607,"left":272,"config":608,"menu":610},"Product",{"dataNavLevelOne":609},"solutions",{"type":611,"link":612,"columns":616,"feature":685},"lists",{"text":613,"config":614},"View all Solutions",{"href":615,"dataGaName":609,"dataGaLocation":560},"/solutions/",[617,641,664],{"title":618,"description":619,"link":620,"items":625},"Automation","CI/CD and automation to accelerate deployment",{"config":621},{"icon":622,"href":623,"dataGaName":624,"dataGaLocation":560},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[626,630,633,637],{"text":627,"config":628},"CI/CD",{"href":629,"dataGaLocation":560,"dataGaName":627},"/solutions/continuous-integration/",{"text":591,"config":631},{"href":596,"dataGaLocation":560,"dataGaName":632},"gitlab duo agent platform - product menu",{"text":634,"config":635},"Source Code Management",{"href":636,"dataGaLocation":560,"dataGaName":634},"/solutions/source-code-management/",{"text":638,"config":639},"Automated Software Delivery",{"href":623,"dataGaLocation":560,"dataGaName":640},"Automated software delivery",{"title":642,"description":643,"link":644,"items":649},"Security","Deliver code faster without compromising security",{"config":645},{"href":646,"dataGaName":647,"dataGaLocation":560,"icon":648},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[650,654,659],{"text":651,"config":652},"Application Security Testing",{"href":646,"dataGaName":653,"dataGaLocation":560},"Application security testing",{"text":655,"config":656},"Software Supply Chain Security",{"href":657,"dataGaLocation":560,"dataGaName":658},"/solutions/supply-chain/","Software supply chain security",{"text":660,"config":661},"Software Compliance",{"href":662,"dataGaName":663,"dataGaLocation":560},"/solutions/software-compliance/","software compliance",{"title":665,"link":666,"items":671},"Measurement",{"config":667},{"icon":668,"href":669,"dataGaName":670,"dataGaLocation":560},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[672,676,680],{"text":673,"config":674},"Visibility & Measurement",{"href":669,"dataGaLocation":560,"dataGaName":675},"Visibility and Measurement",{"text":677,"config":678},"Value Stream Management",{"href":679,"dataGaLocation":560,"dataGaName":677},"/solutions/value-stream-management/",{"text":681,"config":682},"Analytics & Insights",{"href":683,"dataGaLocation":560,"dataGaName":684},"/solutions/analytics-and-insights/","Analytics and insights",{"title":686,"type":611,"items":687},"GitLab for",[688,694,700],{"text":689,"config":690},"Enterprise",{"icon":691,"href":692,"dataGaLocation":560,"dataGaName":693},"Building","/enterprise/","enterprise",{"text":695,"config":696},"Small Business",{"icon":697,"href":698,"dataGaLocation":560,"dataGaName":699},"Work","/small-business/","small business",{"text":701,"config":702},"Public Sector",{"icon":703,"href":704,"dataGaLocation":560,"dataGaName":705},"Organization","/solutions/public-sector/","public sector",{"text":707,"config":708},"Pricing",{"href":709,"dataGaName":710,"dataGaLocation":560,"dataNavLevelOne":710},"/pricing/","pricing",{"text":712,"config":713,"menu":715},"Resources",{"dataNavLevelOne":714},"resources",{"type":611,"link":716,"columns":720,"feature":814},{"text":717,"config":718},"View all resources",{"href":719,"dataGaName":714,"dataGaLocation":560},"/resources/",[721,754,781],{"title":722,"items":723},"Getting started",[724,729,734,739,744,749],{"text":725,"config":726},"Install",{"href":727,"dataGaName":728,"dataGaLocation":560},"/install/","install",{"text":730,"config":731},"Quick start guides",{"href":732,"dataGaName":733,"dataGaLocation":560},"/get-started/","quick setup checklists",{"text":735,"config":736},"Learn",{"href":737,"dataGaLocation":560,"dataGaName":738},"https://university.gitlab.com/","learn",{"text":740,"config":741},"Product documentation",{"href":742,"dataGaName":743,"dataGaLocation":560},"https://docs.gitlab.com/","product documentation",{"text":745,"config":746},"Best practice videos",{"href":747,"dataGaName":748,"dataGaLocation":560},"/getting-started-videos/","best practice videos",{"text":750,"config":751},"Integrations",{"href":752,"dataGaName":753,"dataGaLocation":560},"/integrations/","integrations",{"title":755,"items":756},"Discover",[757,762,767,772,776],{"text":758,"config":759},"Customer success stories",{"href":760,"dataGaName":761,"dataGaLocation":560},"/customers/","customer success stories",{"text":763,"config":764},"Blog",{"href":765,"dataGaName":766,"dataGaLocation":560},"/blog/","blog",{"text":768,"config":769},"Demo Hub",{"href":770,"dataGaName":771,"dataGaLocation":560},"/demo-hub/","demo hub",{"text":773,"config":774},"The Source",{"href":775,"dataGaName":766,"dataGaLocation":560},"/the-source/",{"text":777,"config":778},"Remote",{"href":779,"dataGaName":780,"dataGaLocation":560},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":782,"items":783},"Connect",[784,789,794,799,804,809],{"text":785,"config":786},"GitLab Services",{"href":787,"dataGaName":788,"dataGaLocation":560},"/services/","services",{"text":790,"config":791},"Contribute",{"href":792,"dataGaName":793,"dataGaLocation":560},"https://contributors.gitlab.com","contribute",{"text":795,"config":796},"Community",{"href":797,"dataGaName":798,"dataGaLocation":560},"/community/","community",{"text":800,"config":801},"Forum",{"href":802,"dataGaName":803,"dataGaLocation":560},"https://forum.gitlab.com/","forum",{"text":805,"config":806},"Events",{"href":807,"dataGaName":808,"dataGaLocation":560},"/events/","events",{"text":810,"config":811},"Partners",{"href":812,"dataGaName":813,"dataGaLocation":560},"/partners/","partners",{"config":815,"title":818,"text":819,"link":820},{"background":816,"textColor":817},"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":821,"config":822},"Read the latest",{"href":823,"dataGaName":824,"dataGaLocation":560},"/whats-new/","whats new",{"text":826,"config":827,"menu":829},"Company",{"dataNavLevelOne":828},"company",{"type":611,"columns":830},[831],{"items":832},[833,838,844,846,851,856,861,866,871,876],{"text":834,"config":835},"About",{"href":836,"dataGaName":837,"dataGaLocation":560},"/company/","about",{"text":839,"config":840,"footerGa":843},"Jobs",{"href":841,"dataGaName":842,"dataGaLocation":560},"/jobs/","jobs",{"dataGaName":842},{"text":805,"config":845},{"href":807,"dataGaName":808,"dataGaLocation":560},{"text":847,"config":848},"Leadership",{"href":849,"dataGaName":850,"dataGaLocation":560},"/company/team/e-group/","leadership",{"text":852,"config":853},"Handbook",{"href":854,"dataGaName":855,"dataGaLocation":560},"https://handbook.gitlab.com/","handbook",{"text":857,"config":858},"Investor relations",{"href":859,"dataGaName":860,"dataGaLocation":560},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":862,"config":863},"Trust Center",{"href":864,"dataGaName":865,"dataGaLocation":560},"/security/","trust center",{"text":867,"config":868},"AI Transparency Center",{"href":869,"dataGaName":870,"dataGaLocation":560},"/ai-transparency-center/","ai transparency center",{"text":872,"config":873},"Newsletter",{"href":874,"dataGaName":875,"dataGaLocation":560},"/company/contact/#contact-forms","newsletter",{"text":877,"config":878},"Press",{"href":879,"dataGaName":880,"dataGaLocation":560},"/press/","press",{"text":882,"config":883,"menu":884},"Contact us",{"dataNavLevelOne":828},{"type":611,"columns":885},[886],{"items":887},[888,893,898],{"text":889,"config":890},"Talk to sales",{"href":891,"dataGaName":892,"dataGaLocation":560},"/sales/","talk to sales",{"text":894,"config":895},"Support portal",{"href":896,"dataGaName":897,"dataGaLocation":560},"https://support.gitlab.com/hc/en-us","support portal",{"text":899,"config":900},"Customer portal",{"href":901,"dataGaName":902,"dataGaLocation":560},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":904,"login":905,"suggestions":912},"Close",{"text":906,"link":907},"To search repositories and projects, login to",{"text":908,"config":909},"gitlab.com",{"href":574,"dataGaName":910,"dataGaLocation":911},"search login","search",{"text":913,"default":914},"Suggestions",[915,917,921,923,927,931],{"text":591,"config":916},{"href":596,"dataGaName":591,"dataGaLocation":911},{"text":918,"config":919},"Code Suggestions (AI)",{"href":920,"dataGaName":918,"dataGaLocation":911},"/solutions/code-suggestions/",{"text":627,"config":922},{"href":629,"dataGaName":627,"dataGaLocation":911},{"text":924,"config":925},"GitLab on AWS",{"href":926,"dataGaName":924,"dataGaLocation":911},"/partners/technology-partners/aws/",{"text":928,"config":929},"GitLab on Google Cloud",{"href":930,"dataGaName":928,"dataGaLocation":911},"/partners/technology-partners/google-cloud-platform/",{"text":932,"config":933},"Why GitLab?",{"href":604,"dataGaName":932,"dataGaLocation":911},{"freeTrial":935,"mobileIcon":940,"desktopIcon":945,"secondaryButton":948},{"text":936,"config":937},"Start free trial",{"href":938,"dataGaName":565,"dataGaLocation":939},"https://gitlab.com/-/trials/new/","nav",{"altText":941,"config":942},"Gitlab Icon",{"src":943,"dataGaName":944,"dataGaLocation":939},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":941,"config":946},{"src":947,"dataGaName":944,"dataGaLocation":939},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":949,"config":950},"Get Started",{"href":951,"dataGaName":952,"dataGaLocation":939},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":954,"mobileIcon":958,"desktopIcon":960},{"text":955,"config":956},"Learn more about GitLab Duo",{"href":596,"dataGaName":957,"dataGaLocation":939},"gitlab duo",{"altText":941,"config":959},{"src":943,"dataGaName":944,"dataGaLocation":939},{"altText":941,"config":961},{"src":947,"dataGaName":944,"dataGaLocation":939},{"button":963,"mobileIcon":968,"desktopIcon":970},{"text":964,"config":965},"/switch",{"href":966,"dataGaName":967,"dataGaLocation":939},"#contact","switch",{"altText":941,"config":969},{"src":943,"dataGaName":944,"dataGaLocation":939},{"altText":941,"config":971},{"src":972,"dataGaName":944,"dataGaLocation":939},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":974,"mobileIcon":979,"desktopIcon":981},{"text":975,"config":976},"Back to pricing",{"href":709,"dataGaName":977,"dataGaLocation":939,"icon":978},"back to pricing","GoBack",{"altText":941,"config":980},{"src":943,"dataGaName":944,"dataGaLocation":939},{"altText":941,"config":982},{"src":947,"dataGaName":944,"dataGaLocation":939},{"title":984,"titleMobile":985,"button":986,"config":991},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":602,"config":987},{"href":988,"dataGaName":989,"dataGaLocation":990},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":992,"disabled":541},"release",{"data":994},{"text":995,"source":996,"edit":1002,"contribute":1007,"config":1012,"items":1017,"minimal":1226},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":997,"config":998},"View page source",{"href":999,"dataGaName":1000,"dataGaLocation":1001},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1003,"config":1004},"Edit this page",{"href":1005,"dataGaName":1006,"dataGaLocation":1001},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1008,"config":1009},"Please contribute",{"href":1010,"dataGaName":1011,"dataGaLocation":1001},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1013,"facebook":1014,"youtube":1015,"linkedin":1016},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1018,1065,1118,1162,1194],{"title":707,"links":1019,"subMenu":1034},[1020,1024,1029],{"text":1021,"config":1022},"View plans",{"href":709,"dataGaName":1023,"dataGaLocation":1001},"view plans",{"text":1025,"config":1026},"Why Premium?",{"href":1027,"dataGaName":1028,"dataGaLocation":1001},"/pricing/premium/","why premium",{"text":1030,"config":1031},"Why Ultimate?",{"href":1032,"dataGaName":1033,"dataGaLocation":1001},"/pricing/ultimate/","why ultimate",[1035],{"title":1036,"links":1037},"Contact Us",[1038,1041,1043,1045,1050,1055,1060],{"text":1039,"config":1040},"Contact sales",{"href":891,"dataGaName":570,"dataGaLocation":1001},{"text":894,"config":1042},{"href":896,"dataGaName":897,"dataGaLocation":1001},{"text":899,"config":1044},{"href":901,"dataGaName":902,"dataGaLocation":1001},{"text":1046,"config":1047},"Status",{"href":1048,"dataGaName":1049,"dataGaLocation":1001},"https://status.gitlab.com/","status",{"text":1051,"config":1052},"Terms of use",{"href":1053,"dataGaName":1054,"dataGaLocation":1001},"/terms/","terms of use",{"text":1056,"config":1057},"Privacy statement",{"href":1058,"dataGaName":1059,"dataGaLocation":1001},"/privacy/","privacy statement",{"text":1061,"config":1062},"Cookie preferences",{"dataGaName":1063,"dataGaLocation":1001,"id":1064,"isOneTrustButton":272},"cookie preferences","ot-sdk-btn",{"title":607,"links":1066,"subMenu":1074},[1067,1070],{"text":552,"config":1068},{"href":589,"dataGaName":1069,"dataGaLocation":1001},"devsecops platform",{"text":1071,"config":1072},"AI-Assisted Development",{"href":596,"dataGaName":1073,"dataGaLocation":1001},"ai-assisted development",[1075],{"title":1076,"links":1077},"Topics",[1078,1083,1088,1093,1098,1103,1108,1113],{"text":1079,"config":1080},"CICD",{"href":1081,"dataGaName":1082,"dataGaLocation":1001},"/topics/ci-cd/","cicd",{"text":1084,"config":1085},"GitOps",{"href":1086,"dataGaName":1087,"dataGaLocation":1001},"/topics/gitops/","gitops",{"text":1089,"config":1090},"DevOps",{"href":1091,"dataGaName":1092,"dataGaLocation":1001},"/topics/devops/","devops",{"text":1094,"config":1095},"Version Control",{"href":1096,"dataGaName":1097,"dataGaLocation":1001},"/topics/version-control/","version control",{"text":1099,"config":1100},"DevSecOps",{"href":1101,"dataGaName":1102,"dataGaLocation":1001},"/topics/devsecops/","devsecops",{"text":1104,"config":1105},"Cloud Native",{"href":1106,"dataGaName":1107,"dataGaLocation":1001},"/topics/cloud-native/","cloud native",{"text":1109,"config":1110},"AI for Coding",{"href":1111,"dataGaName":1112,"dataGaLocation":1001},"/topics/devops/ai-for-coding/","ai for coding",{"text":1114,"config":1115},"Agentic AI",{"href":1116,"dataGaName":1117,"dataGaLocation":1001},"/topics/agentic-ai/","agentic ai",{"title":1119,"links":1120},"Solutions",[1121,1123,1125,1130,1134,1137,1141,1144,1146,1149,1152,1157],{"text":651,"config":1122},{"href":646,"dataGaName":651,"dataGaLocation":1001},{"text":640,"config":1124},{"href":623,"dataGaName":624,"dataGaLocation":1001},{"text":1126,"config":1127},"Agile development",{"href":1128,"dataGaName":1129,"dataGaLocation":1001},"/solutions/agile-delivery/","agile delivery",{"text":1131,"config":1132},"SCM",{"href":636,"dataGaName":1133,"dataGaLocation":1001},"source code management",{"text":1079,"config":1135},{"href":629,"dataGaName":1136,"dataGaLocation":1001},"continuous integration & delivery",{"text":1138,"config":1139},"Value stream management",{"href":679,"dataGaName":1140,"dataGaLocation":1001},"value stream management",{"text":1084,"config":1142},{"href":1143,"dataGaName":1087,"dataGaLocation":1001},"/solutions/gitops/",{"text":689,"config":1145},{"href":692,"dataGaName":693,"dataGaLocation":1001},{"text":1147,"config":1148},"Small business",{"href":698,"dataGaName":699,"dataGaLocation":1001},{"text":1150,"config":1151},"Public sector",{"href":704,"dataGaName":705,"dataGaLocation":1001},{"text":1153,"config":1154},"Education",{"href":1155,"dataGaName":1156,"dataGaLocation":1001},"/solutions/education/","education",{"text":1158,"config":1159},"Financial services",{"href":1160,"dataGaName":1161,"dataGaLocation":1001},"/solutions/finance/","financial services",{"title":712,"links":1163},[1164,1166,1168,1170,1173,1175,1178,1180,1182,1184,1186,1188,1190,1192],{"text":725,"config":1165},{"href":727,"dataGaName":728,"dataGaLocation":1001},{"text":730,"config":1167},{"href":732,"dataGaName":733,"dataGaLocation":1001},{"text":735,"config":1169},{"href":737,"dataGaName":738,"dataGaLocation":1001},{"text":740,"config":1171},{"href":742,"dataGaName":1172,"dataGaLocation":1001},"docs",{"text":763,"config":1174},{"href":765,"dataGaName":766,"dataGaLocation":1001},{"text":1176,"config":1177},"What's new",{"href":823,"dataGaName":824,"dataGaLocation":1001},{"text":758,"config":1179},{"href":760,"dataGaName":761,"dataGaLocation":1001},{"text":777,"config":1181},{"href":779,"dataGaName":780,"dataGaLocation":1001},{"text":785,"config":1183},{"href":787,"dataGaName":788,"dataGaLocation":1001},{"text":790,"config":1185},{"href":792,"dataGaName":793,"dataGaLocation":1001},{"text":795,"config":1187},{"href":797,"dataGaName":798,"dataGaLocation":1001},{"text":800,"config":1189},{"href":802,"dataGaName":803,"dataGaLocation":1001},{"text":805,"config":1191},{"href":807,"dataGaName":808,"dataGaLocation":1001},{"text":810,"config":1193},{"href":812,"dataGaName":813,"dataGaLocation":1001},{"title":826,"links":1195},[1196,1198,1200,1202,1204,1206,1210,1215,1217,1219,1221],{"text":834,"config":1197},{"href":836,"dataGaName":828,"dataGaLocation":1001},{"text":839,"config":1199},{"href":841,"dataGaName":842,"dataGaLocation":1001},{"text":847,"config":1201},{"href":849,"dataGaName":850,"dataGaLocation":1001},{"text":852,"config":1203},{"href":854,"dataGaName":855,"dataGaLocation":1001},{"text":857,"config":1205},{"href":859,"dataGaName":860,"dataGaLocation":1001},{"text":1207,"config":1208},"Sustainability",{"href":1209,"dataGaName":1207,"dataGaLocation":1001},"/sustainability/",{"text":1211,"config":1212},"Diversity, inclusion and belonging (DIB)",{"href":1213,"dataGaName":1214,"dataGaLocation":1001},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":862,"config":1216},{"href":864,"dataGaName":865,"dataGaLocation":1001},{"text":872,"config":1218},{"href":874,"dataGaName":875,"dataGaLocation":1001},{"text":877,"config":1220},{"href":879,"dataGaName":880,"dataGaLocation":1001},{"text":1222,"config":1223},"Modern Slavery Transparency Statement",{"href":1224,"dataGaName":1225,"dataGaLocation":1001},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1227},[1228,1231,1234],{"text":1229,"config":1230},"Terms",{"href":1053,"dataGaName":1054,"dataGaLocation":1001},{"text":1232,"config":1233},"Cookies",{"dataGaName":1063,"dataGaLocation":1001,"id":1064,"isOneTrustButton":272},{"text":1235,"config":1236},"Privacy",{"href":1058,"dataGaName":1059,"dataGaLocation":1001},[1238,1252],{"id":1239,"title":7,"body":536,"config":1240,"content":1242,"description":536,"extension":1246,"meta":1247,"navigation":272,"path":1248,"seo":1249,"stem":1250,"__hash__":1251},"blogAuthors/en-us/blog/authors/karthik-nayak.yml",{"template":1241},"BlogAuthor",{"name":7,"config":1243},{"headshot":1244,"ctfId":1245},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659809/Blog/Author%20Headshots/Screenshot_2025-06-04_at_8.49.51%C3%A2__AM.png","3Q6ZKvaiCRw7tFZdDGlecg","yml",{},"/en-us/blog/authors/karthik-nayak",{},"en-us/blog/authors/karthik-nayak","pDQbfmQk6aaJ6PA9L68AzPlzIUBcosTh7WBoq680gpk",{"id":1253,"title":8,"body":536,"config":1254,"content":1255,"description":536,"extension":1246,"meta":1259,"navigation":272,"path":1260,"seo":1261,"stem":1262,"__hash__":1263},"blogAuthors/en-us/blog/authors/manuel-kraft.yml",{"template":1241},{"name":8,"config":1256},{"headshot":1257,"ctfId":1258},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659815/Blog/Author%20Headshots/manuel_kraft.png","5q1NADtEqxyoV1F1s6JKDz",{},"/en-us/blog/authors/manuel-kraft",{},"en-us/blog/authors/manuel-kraft","TqWe6Rx9TnEopbWMshRuht-6QCOpGPAMjs1vtlA_93Y",[1265,1274,1282],{"title":1266,"description":1267,"heroImage":1268,"category":532,"date":1269,"authors":1270,"slug":1273,"externalUrl":536},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1271,1272],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1275,"description":1276,"heroImage":1277,"category":532,"date":1278,"authors":1279,"slug":1281,"externalUrl":536},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1280],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1283,"description":1284,"heroImage":1285,"category":532,"date":1286,"authors":1287,"slug":1289,"externalUrl":536},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1288],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1291},[1292,1306,1317,1329],{"id":1293,"categories":1294,"header":1296,"text":1297,"button":1298,"image":1303},"ai-modernization",[1295],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1299,"config":1300},"Get your AI maturity score",{"href":1301,"dataGaName":1302,"dataGaLocation":766},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1304},{"src":1305},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1307,"categories":1308,"header":1309,"text":1297,"button":1310,"image":1314},"devops-modernization",[550,1102],"Are you just managing tools or shipping innovation?",{"text":1311,"config":1312},"Get your DevOps maturity score",{"href":1313,"dataGaName":1302,"dataGaLocation":766},"/assessments/devops-modernization-assessment/",{"config":1315},{"src":1316},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1318,"categories":1319,"header":1321,"text":1297,"button":1322,"image":1326},"security-modernization",[1320],"security","Are you trading speed for security?",{"text":1323,"config":1324},"Get your security maturity score",{"href":1325,"dataGaName":1302,"dataGaLocation":766},"/assessments/security-modernization-assessment/",{"config":1327},{"src":1328},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1330,"paths":1331,"header":1334,"text":1335,"button":1336,"image":1341},"github-azure-migration",[1332,1333],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1337,"config":1338},"See how GitLab compares to GitHub",{"href":1339,"dataGaName":1340,"dataGaLocation":766},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1342},{"src":1316},{"header":1344,"blurb":1345,"button":1346,"secondaryButton":1351},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1347,"config":1348},"Get your free trial",{"href":1349,"dataGaName":565,"dataGaLocation":1350},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1039,"config":1352},{"href":891,"dataGaName":570,"dataGaLocation":1350},1786803750069]