[{"data":1,"prerenderedAt":1376},["ShallowReactive",2],{"/blog/sha256-support-in-gitaly":3,"navigation-en-us":593,"banner-en-us":1020,"footer-en-us":1030,"blog-post-authors-en-us-John Cai":1275,"blog-related-posts-en-us-sha256-support-in-gitaly":1290,"blog-promotions-en-us":1312,"next-steps-en-us":1366},{"id":4,"title":5,"authors":6,"body":8,"category":572,"date":573,"description":574,"extension":575,"externalUrl":576,"faq":576,"featured":351,"heroImage":577,"meta":578,"navigation":351,"path":579,"seo":580,"slug":585,"stem":586,"tags":587,"template":591,"updatedDate":576,"__hash__":592},"blogPosts/en-us/blog/sha256-support-in-gitaly.md","GitLab Gitaly project now supports the SHA 256 hashing algorithm",[7],"John Cai",{"type":9,"value":10,"toc":565},"minimark",[11,28,33,42,50,60,67,70,76,81,90,105,114,118,121,125,132,138,146,359,362,372,375,381,384,393,396,561],[12,13,14,15,21,22,27],"p",{},"We've taken a huge step in SHA-256 support in GitLab: The ",[16,17,20],"a",{"href":18,"rel":19},"https://gitlab.com/gitlab-org/gitaly",[],"Gitaly"," project now fully supports SHA-256 repositories. While there is ",[16,23,26],{"href":24,"rel":25},"https://gitlab.com/groups/gitlab-org/-/epics/10981",[],"still some work"," we need to do in other parts of the GitLab application before SHA-256 repositories can be used, this milestone is important.",[29,30,32],"h2",{"id":31},"what-is-sha-256","What is SHA-256?",[12,34,35,36,41],{},"SHA-256 is a ",[16,37,40],{"href":38,"rel":39},"https://handbook.gitlab.com/handbook/security/policies_and_standards/cryptographic-standard/#algorithmic-standards",[],"hashing algorithm",". Given an input of data, it produces a fixed-length hash of 64 characters with hexadecimal digits. Git uses hashing algorithms to generate IDs for commits and other Git objects such as blobs,\ntrees, and tags.",[12,43,44,45,49],{},"Git uses the SHA-1 algorithm by default. If you've ever used Git, you know that\ncommit IDs are a bunch of hexademical digits. A ",[46,47,48],"code",{},"git log"," command yields\nsomething like the following:",[51,52,58],"pre",{"className":53,"code":55,"language":56,"meta":57},[54],"language-text","commit bcd64dba39c90daee2e1e8d9015809b992174e34 (HEAD -> main, origin/main, origin/HEAD)\nAuthor: John Cai \u003Cjcai@gitlab.com>\nDate:   Wed Jul 26 13:41:34 2023 -0400\n\n    Fix README.md\n\n","text","",[46,59,55],{"__ignoreMap":57},[12,61,62,63,66],{},"The ",[46,64,65],{},"bcd64dba39c90daee2e1e8d9015809b992174e34"," is the ID of the commit and is a\n40-character hash generated by using the SHA-1 hashing algorithm.",[12,68,69],{},"In SHA-256 repositories, everything is the same except, instead of a 40-character\nID, it's now a 64-character ID:",[51,71,74],{"className":72,"code":73,"language":56,"meta":57},[54],"commit e60501431d52f6d06b4749cf205b0dd09141ea0b3155a45b9246df24eee9b97b (HEAD -> master)\nAuthor: John Cai \u003Cjcai@gitlab.com>\nDate:   Fri Jul 7 12:56:52 2023 -0400\n\n    Fix README.md\n\n",[46,75,73],{"__ignoreMap":57},[77,78,80],"h3",{"id":79},"why-sha-256","Why SHA-256?",[12,82,83,84,89],{},"SHA-1, which has been the algorithm that has been used until now in Git, is\ninsecure. In 2017, ",[16,85,88],{"href":86,"rel":87},"https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html",[],"Google was able to produce a hash collision",". While the Git project is not yet impacted by these kinds of attacks due to the\nway it stores objects, it is only a matter of time until new attacks on SHA-1\nwill be found that would also impact Git.",[12,91,92,93,98,99,104],{},"Federal regulations such as NIST and CISA ",[16,94,97],{"href":95,"rel":96},"https://csrc.nist.gov/projects/hash-functions/nist-policy-on-hash-functions",[],"guidelines",",\nwhich ",[16,100,103],{"href":101,"rel":102},"https://www.fedramp.gov/",[],"FedRamp"," enforces, set a due date in 2030 to\nstop using SHA-1, and encourage agencies to move away from it sooner if\npossible.",[12,106,107,108,113],{},"In addition, SHA-256 has been labeled experimental in the Git project for a long time,\nbut as of Git 2.42.0, the project has decided to ",[16,109,112],{"href":110,"rel":111},"https://github.com/git/git/blob/master/Documentation/RelNotes/2.42.0.txt#L41-L45",[],"remove the experimental label",".",[77,115,117],{"id":116},"what-does-this-mean-for-developers","What does this mean for developers?",[12,119,120],{},"From a usability perspective, SHA-256 and SHA-1 repositories really don't have a\nsignificant difference. For personal projects, SHA-1 is probably fine. However,\ncompanies and organizations are likely to switch to using SHA-256 repositories\nfor security reasons.",[77,122,124],{"id":123},"see-sha-256-in-action","See SHA-256 in action",[12,126,127,128,131],{},"If you have ",[46,129,130],{},"sha256sum(1)"," installed, you can generate such a hash on the command line:",[51,133,136],{"className":134,"code":135,"language":56,"meta":57},[54],"> printf '%s' \"please hash this data\" | sha256sum\n62f73749b40cc70f453320e1ffc37e405ba50474b5db68ad436e64b61fbb8cf0  -\n",[46,137,135],{"__ignoreMap":57},[12,139,140,141,145],{},"We can also see this in action in a Git repository. Let's create a repository,\nadd an initial commit, and inspect the contents of the commit object. ",[142,143,144],"strong",{},"Note:"," If\nyou try this yourself, the commit IDs will be different because the date of the\ncommit is part of the hash calculation.",[51,147,151],{"className":148,"code":149,"language":150,"meta":57,"style":57},"language-shell shiki shiki-themes github-light","> git init test-repo\n> cd test-repo\n> echo \"This is a README\" >README.md\n> git add .\n> git commit -m \"README\"\n[main (root-commit) 328b61f] README\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\n> zlib-flate -uncompress \u003C ./git/objects/32/8b61f2449205870f69b5981f58bd8cdbb22f95\ncommit 159tree 09303be712bd8e923f9b227c8522257fa32ca7dc\nauthor John Cai \u003Cjcai@gitlab.com> 1688748132 -0400\ncommitter John Cai \u003Cjcai@gitlab.com> 1688748132 -0400\n\nREADME\n","shell",[46,152,153,166,174,192,204,215,227,254,269,283,295,324,346,353],{"__ignoreMap":57},[154,155,158,162],"span",{"class":156,"line":157},"line",1,[154,159,161],{"class":160},"sD7c4",">",[154,163,165],{"class":164},"sgsFI"," git init test-repo\n",[154,167,169,171],{"class":156,"line":168},2,[154,170,161],{"class":160},[154,172,173],{"class":164}," cd test-repo\n",[154,175,177,179,182,186,189],{"class":156,"line":176},3,[154,178,161],{"class":160},[154,180,181],{"class":164}," echo ",[154,183,185],{"class":184},"sYBdl","\"This is a README\"",[154,187,188],{"class":160}," >",[154,190,191],{"class":164},"README.md\n",[154,193,195,197,200],{"class":156,"line":194},4,[154,196,161],{"class":160},[154,198,199],{"class":164}," git add ",[154,201,203],{"class":202},"sYu0t",".\n",[154,205,207,209,212],{"class":156,"line":206},5,[154,208,161],{"class":160},[154,210,211],{"class":164}," git commit -m ",[154,213,214],{"class":184},"\"README\"\n",[154,216,218,221,224],{"class":156,"line":217},6,[154,219,220],{"class":164},"[main (root",[154,222,223],{"class":160},"-",[154,225,226],{"class":164},"commit) 328b61f] README\n",[154,228,230,234,237,240,242,245,248,251],{"class":156,"line":229},7,[154,231,233],{"class":232},"s7eDp"," 1",[154,235,236],{"class":184}," file",[154,238,239],{"class":184}," changed,",[154,241,233],{"class":202},[154,243,244],{"class":184}," insertion",[154,246,247],{"class":164},"(",[154,249,250],{"class":232},"+",[154,252,253],{"class":164},")\n",[154,255,257,260,263,266],{"class":156,"line":256},8,[154,258,259],{"class":232}," create",[154,261,262],{"class":184}," mode",[154,264,265],{"class":202}," 100644",[154,267,268],{"class":184}," README.md\n",[154,270,272,274,277,280],{"class":156,"line":271},9,[154,273,161],{"class":160},[154,275,276],{"class":164}," zlib-flate -uncompress ",[154,278,279],{"class":160},"\u003C",[154,281,282],{"class":164}," ./git/objects/32/8b61f2449205870f69b5981f58bd8cdbb22f95\n",[154,284,286,289,292],{"class":156,"line":285},10,[154,287,288],{"class":232},"commit",[154,290,291],{"class":184}," 159tree",[154,293,294],{"class":184}," 09303be712bd8e923f9b227c8522257fa32ca7dc\n",[154,296,298,301,304,307,310,313,316,318,321],{"class":156,"line":297},11,[154,299,300],{"class":232},"author",[154,302,303],{"class":184}," John",[154,305,306],{"class":184}," Cai",[154,308,309],{"class":160}," \u003C",[154,311,312],{"class":184},"jcai@gitlab.co",[154,314,315],{"class":164},"m",[154,317,161],{"class":160},[154,319,320],{"class":202}," 1688748132",[154,322,323],{"class":202}," -0400\n",[154,325,327,330,332,334,336,338,340,342,344],{"class":156,"line":326},12,[154,328,329],{"class":232},"committer",[154,331,303],{"class":184},[154,333,306],{"class":184},[154,335,309],{"class":160},[154,337,312],{"class":184},[154,339,315],{"class":164},[154,341,161],{"class":160},[154,343,320],{"class":202},[154,345,323],{"class":202},[154,347,349],{"class":156,"line":348},13,[154,350,352],{"emptyLinePlaceholder":351},true,"\n",[154,354,356],{"class":156,"line":355},14,[154,357,358],{"class":232},"README\n",[12,360,361],{},"In the last step, we uncompress the actual commit file on disk. Git zlib compresses object\nfiles before storing them on disk.",[12,363,364,367,368,371],{},[46,365,366],{},"zlib-flate(1)"," is a utility that comes packaed with ",[46,369,370],{},"qpdf"," that uncompresses zlib compressed files.",[12,373,374],{},"Now, if we feed this data back into the SHA-1 algorithm, we get a predictable result:",[51,376,379],{"className":377,"code":378,"language":56,"meta":57},[54],"> zlib-flate -uncompress \u003C .git/objects/32/8b61f2449205870f69b5981f58bd8cdbb22f95 | sha1sum\n328b61f2449205870f69b5981f58bd8cdbb22f95  -\n",[46,380,378],{"__ignoreMap":57},[12,382,383],{},"As we can see, the result of this is the commit ID.",[12,385,386,387,392],{},"The recommendation by NIST was to replace SHA-1 with SHA-2 or SHA-3. The\nGit project has ",[16,388,391],{"href":389,"rel":390},"https://git-scm.com/docs/hash-function-transition/",[],"undergone this effort",",\nand the current state of the feature is that it's fully usable in Git and no\nlonger deemed experimental.",[12,394,395],{},"In fact, you can create and use repositories with SHA-256 as the hashing algorithm\nto see it in action on your local machine:",[51,397,399],{"className":148,"code":398,"language":150,"meta":57,"style":57},"> git init --object-format=sha256 test-repo\n> cd test-repo\n> echo \"This is a README\" >README.md\n> git add .\n> git commit -m \"README\"\n[main (root-commit) e605014] README\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\n> git log\ncommit e60501431d52f6d06b4749cf205b0dd09141ea0b3155a45b9246df24eee9b97b (HEAD -> master)\nAuthor: John Cai \u003Cjcai@gitlab.com>\nDate:   Fri Jul 7 12:56:52 2023 -0400\n\n    README\n\n",[46,400,401,417,423,435,443,451,460,478,488,495,512,530,552,556],{"__ignoreMap":57},[154,402,403,405,408,411,414],{"class":156,"line":157},[154,404,161],{"class":160},[154,406,407],{"class":164}," git init --object-format",[154,409,410],{"class":160},"=",[154,412,413],{"class":184},"sha256",[154,415,416],{"class":232}," test-repo\n",[154,418,419,421],{"class":156,"line":168},[154,420,161],{"class":160},[154,422,173],{"class":164},[154,424,425,427,429,431,433],{"class":156,"line":176},[154,426,161],{"class":160},[154,428,181],{"class":164},[154,430,185],{"class":184},[154,432,188],{"class":160},[154,434,191],{"class":164},[154,436,437,439,441],{"class":156,"line":194},[154,438,161],{"class":160},[154,440,199],{"class":164},[154,442,203],{"class":202},[154,444,445,447,449],{"class":156,"line":206},[154,446,161],{"class":160},[154,448,211],{"class":164},[154,450,214],{"class":184},[154,452,453,455,457],{"class":156,"line":217},[154,454,220],{"class":164},[154,456,223],{"class":160},[154,458,459],{"class":164},"commit) e605014] README\n",[154,461,462,464,466,468,470,472,474,476],{"class":156,"line":229},[154,463,233],{"class":232},[154,465,236],{"class":184},[154,467,239],{"class":184},[154,469,233],{"class":202},[154,471,244],{"class":184},[154,473,247],{"class":164},[154,475,250],{"class":232},[154,477,253],{"class":164},[154,479,480,482,484,486],{"class":156,"line":256},[154,481,259],{"class":232},[154,483,262],{"class":184},[154,485,265],{"class":202},[154,487,268],{"class":184},[154,489,490,492],{"class":156,"line":271},[154,491,161],{"class":160},[154,493,494],{"class":164}," git log\n",[154,496,497,499,502,505,507,510],{"class":156,"line":285},[154,498,288],{"class":232},[154,500,501],{"class":184}," e60501431d52f6d06b4749cf205b0dd09141ea0b3155a45b9246df24eee9b97b",[154,503,504],{"class":164}," (HEAD -",[154,506,161],{"class":160},[154,508,509],{"class":184}," master",[154,511,253],{"class":164},[154,513,514,517,519,521,523,525,527],{"class":156,"line":297},[154,515,516],{"class":232},"Author:",[154,518,303],{"class":184},[154,520,306],{"class":184},[154,522,309],{"class":160},[154,524,312],{"class":184},[154,526,315],{"class":164},[154,528,529],{"class":160},">\n",[154,531,532,535,538,541,544,547,550],{"class":156,"line":326},[154,533,534],{"class":232},"Date:",[154,536,537],{"class":184},"   Fri",[154,539,540],{"class":184}," Jul",[154,542,543],{"class":202}," 7",[154,545,546],{"class":184}," 12:56:52",[154,548,549],{"class":202}," 2023",[154,551,323],{"class":202},[154,553,554],{"class":156,"line":348},[154,555,352],{"emptyLinePlaceholder":351},[154,557,558],{"class":156,"line":355},[154,559,560],{"class":232},"    README\n",[562,563,564],"style",{},"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 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 .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}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":57,"searchDepth":168,"depth":168,"links":566},[567],{"id":31,"depth":168,"text":32,"children":568},[569,570,571],{"id":79,"depth":176,"text":80},{"id":116,"depth":176,"text":117},{"id":123,"depth":176,"text":124},"news","2023-08-28","Gitaly now supports SHA-256 repositories. Here's why it matters.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667792/Blog/Hero%20Images/git-241.jpg",{},"/en-us/blog/sha256-support-in-gitaly",{"title":5,"description":574,"ogTitle":5,"ogDescription":574,"noIndex":581,"ogImage":577,"ogUrl":582,"ogSiteName":583,"ogType":584,"canonicalUrls":582},false,"https://about.gitlab.com/blog/sha256-support-in-gitaly","https://about.gitlab.com","article","sha256-support-in-gitaly","en-us/blog/sha256-support-in-gitaly",[588,572,589,590],"git","open source","community","BlogPost","OiGFDr2iAZeGHgCrBYWZT_aeSrZrKbXLB_u6Njnwqyk",{"logo":594,"freeTrial":599,"sales":604,"login":609,"items":614,"search":940,"minimal":971,"duo":990,"switchNav":999,"pricingDeployment":1010},{"config":595},{"href":596,"dataGaName":597,"dataGaLocation":598},"/","gitlab logo","header",{"text":600,"config":601},"Get free trial",{"href":602,"dataGaName":603,"dataGaLocation":598},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":605,"config":606},"Request a demo",{"href":607,"dataGaName":608,"dataGaLocation":598},"/sales/?contact-topic=request-demo","sales",{"text":610,"config":611},"Sign in",{"href":612,"dataGaName":613,"dataGaLocation":598},"https://gitlab.com/users/sign_in/","sign in",[615,644,744,749,862,918],{"text":616,"config":617,"menu":619},"Platform",{"dataNavLevelOne":618},"platform",{"type":620,"columns":621},"cards",[622,628,636],{"title":616,"description":623,"link":624},"The intelligent orchestration platform for DevSecOps",{"text":625,"config":626},"Explore our Platform",{"href":627,"dataGaName":618,"dataGaLocation":598},"/platform/",{"title":629,"description":630,"link":631},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":632,"config":633},"Meet GitLab Duo",{"href":634,"dataGaName":635,"dataGaLocation":598},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":637,"description":638,"link":639},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":640,"config":641},"Learn more",{"href":642,"dataGaName":643,"dataGaLocation":598},"/why-gitlab/","why gitlab",{"text":645,"left":351,"config":646,"menu":648},"Product",{"dataNavLevelOne":647},"solutions",{"type":649,"link":650,"columns":654,"feature":723},"lists",{"text":651,"config":652},"View all Solutions",{"href":653,"dataGaName":647,"dataGaLocation":598},"/solutions/",[655,679,702],{"title":656,"description":657,"link":658,"items":663},"Automation","CI/CD and automation to accelerate deployment",{"config":659},{"icon":660,"href":661,"dataGaName":662,"dataGaLocation":598},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[664,668,671,675],{"text":665,"config":666},"CI/CD",{"href":667,"dataGaLocation":598,"dataGaName":665},"/solutions/continuous-integration/",{"text":629,"config":669},{"href":634,"dataGaLocation":598,"dataGaName":670},"gitlab duo agent platform - product menu",{"text":672,"config":673},"Source Code Management",{"href":674,"dataGaLocation":598,"dataGaName":672},"/solutions/source-code-management/",{"text":676,"config":677},"Automated Software Delivery",{"href":661,"dataGaLocation":598,"dataGaName":678},"Automated software delivery",{"title":680,"description":681,"link":682,"items":687},"Security","Deliver code faster without compromising security",{"config":683},{"href":684,"dataGaName":685,"dataGaLocation":598,"icon":686},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[688,692,697],{"text":689,"config":690},"Application Security Testing",{"href":684,"dataGaName":691,"dataGaLocation":598},"Application security testing",{"text":693,"config":694},"Software Supply Chain Security",{"href":695,"dataGaLocation":598,"dataGaName":696},"/solutions/supply-chain/","Software supply chain security",{"text":698,"config":699},"Software Compliance",{"href":700,"dataGaName":701,"dataGaLocation":598},"/solutions/software-compliance/","software compliance",{"title":703,"link":704,"items":709},"Measurement",{"config":705},{"icon":706,"href":707,"dataGaName":708,"dataGaLocation":598},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[710,714,718],{"text":711,"config":712},"Visibility & Measurement",{"href":707,"dataGaLocation":598,"dataGaName":713},"Visibility and Measurement",{"text":715,"config":716},"Value Stream Management",{"href":717,"dataGaLocation":598,"dataGaName":715},"/solutions/value-stream-management/",{"text":719,"config":720},"Analytics & Insights",{"href":721,"dataGaLocation":598,"dataGaName":722},"/solutions/analytics-and-insights/","Analytics and insights",{"title":724,"type":649,"items":725},"GitLab for",[726,732,738],{"text":727,"config":728},"Enterprise",{"icon":729,"href":730,"dataGaLocation":598,"dataGaName":731},"Building","/enterprise/","enterprise",{"text":733,"config":734},"Small Business",{"icon":735,"href":736,"dataGaLocation":598,"dataGaName":737},"Work","/small-business/","small business",{"text":739,"config":740},"Public Sector",{"icon":741,"href":742,"dataGaLocation":598,"dataGaName":743},"Organization","/solutions/public-sector/","public sector",{"text":745,"config":746},"Pricing",{"href":747,"dataGaName":748,"dataGaLocation":598,"dataNavLevelOne":748},"/pricing/","pricing",{"text":750,"config":751,"menu":753},"Resources",{"dataNavLevelOne":752},"resources",{"type":649,"link":754,"columns":758,"feature":851},{"text":755,"config":756},"View all resources",{"href":757,"dataGaName":752,"dataGaLocation":598},"/resources/",[759,792,819],{"title":760,"items":761},"Getting started",[762,767,772,777,782,787],{"text":763,"config":764},"Install",{"href":765,"dataGaName":766,"dataGaLocation":598},"/install/","install",{"text":768,"config":769},"Quick start guides",{"href":770,"dataGaName":771,"dataGaLocation":598},"/get-started/","quick setup checklists",{"text":773,"config":774},"Learn",{"href":775,"dataGaLocation":598,"dataGaName":776},"https://university.gitlab.com/","learn",{"text":778,"config":779},"Product documentation",{"href":780,"dataGaName":781,"dataGaLocation":598},"https://docs.gitlab.com/","product documentation",{"text":783,"config":784},"Best practice videos",{"href":785,"dataGaName":786,"dataGaLocation":598},"/getting-started-videos/","best practice videos",{"text":788,"config":789},"Integrations",{"href":790,"dataGaName":791,"dataGaLocation":598},"/integrations/","integrations",{"title":793,"items":794},"Discover",[795,800,805,810,814],{"text":796,"config":797},"Customer success stories",{"href":798,"dataGaName":799,"dataGaLocation":598},"/customers/","customer success stories",{"text":801,"config":802},"Blog",{"href":803,"dataGaName":804,"dataGaLocation":598},"/blog/","blog",{"text":806,"config":807},"Demo Hub",{"href":808,"dataGaName":809,"dataGaLocation":598},"/demo-hub/","demo hub",{"text":811,"config":812},"The Source",{"href":813,"dataGaName":804,"dataGaLocation":598},"/the-source/",{"text":815,"config":816},"Remote",{"href":817,"dataGaName":818,"dataGaLocation":598},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":820,"items":821},"Connect",[822,827,832,836,841,846],{"text":823,"config":824},"GitLab Services",{"href":825,"dataGaName":826,"dataGaLocation":598},"/services/","services",{"text":828,"config":829},"Contribute",{"href":830,"dataGaName":831,"dataGaLocation":598},"https://contributors.gitlab.com","contribute",{"text":833,"config":834},"Community",{"href":835,"dataGaName":590,"dataGaLocation":598},"/community/",{"text":837,"config":838},"Forum",{"href":839,"dataGaName":840,"dataGaLocation":598},"https://forum.gitlab.com/","forum",{"text":842,"config":843},"Events",{"href":844,"dataGaName":845,"dataGaLocation":598},"/events/","events",{"text":847,"config":848},"Partners",{"href":849,"dataGaName":850,"dataGaLocation":598},"/partners/","partners",{"config":852,"title":855,"text":856,"link":857},{"background":853,"textColor":854},"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":858,"config":859},"Read the latest",{"href":860,"dataGaName":861,"dataGaLocation":598},"/whats-new/","whats new",{"text":863,"config":864,"menu":866},"Company",{"dataNavLevelOne":865},"company",{"type":649,"columns":867},[868],{"items":869},[870,875,881,883,888,893,898,903,908,913],{"text":871,"config":872},"About",{"href":873,"dataGaName":874,"dataGaLocation":598},"/company/","about",{"text":876,"config":877,"footerGa":880},"Jobs",{"href":878,"dataGaName":879,"dataGaLocation":598},"/jobs/","jobs",{"dataGaName":879},{"text":842,"config":882},{"href":844,"dataGaName":845,"dataGaLocation":598},{"text":884,"config":885},"Leadership",{"href":886,"dataGaName":887,"dataGaLocation":598},"/company/team/e-group/","leadership",{"text":889,"config":890},"Handbook",{"href":891,"dataGaName":892,"dataGaLocation":598},"https://handbook.gitlab.com/","handbook",{"text":894,"config":895},"Investor relations",{"href":896,"dataGaName":897,"dataGaLocation":598},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":899,"config":900},"Trust Center",{"href":901,"dataGaName":902,"dataGaLocation":598},"/security/","trust center",{"text":904,"config":905},"AI Transparency Center",{"href":906,"dataGaName":907,"dataGaLocation":598},"/ai-transparency-center/","ai transparency center",{"text":909,"config":910},"Newsletter",{"href":911,"dataGaName":912,"dataGaLocation":598},"/company/contact/#contact-forms","newsletter",{"text":914,"config":915},"Press",{"href":916,"dataGaName":917,"dataGaLocation":598},"/press/","press",{"text":919,"config":920,"menu":921},"Contact us",{"dataNavLevelOne":865},{"type":649,"columns":922},[923],{"items":924},[925,930,935],{"text":926,"config":927},"Talk to sales",{"href":928,"dataGaName":929,"dataGaLocation":598},"/sales/","talk to sales",{"text":931,"config":932},"Support portal",{"href":933,"dataGaName":934,"dataGaLocation":598},"https://support.gitlab.com/hc/en-us","support portal",{"text":936,"config":937},"Customer portal",{"href":938,"dataGaName":939,"dataGaLocation":598},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":941,"login":942,"suggestions":949},"Close",{"text":943,"link":944},"To search repositories and projects, login to",{"text":945,"config":946},"gitlab.com",{"href":612,"dataGaName":947,"dataGaLocation":948},"search login","search",{"text":950,"default":951},"Suggestions",[952,954,958,960,964,968],{"text":629,"config":953},{"href":634,"dataGaName":629,"dataGaLocation":948},{"text":955,"config":956},"Code Suggestions (AI)",{"href":957,"dataGaName":955,"dataGaLocation":948},"/solutions/code-suggestions/",{"text":665,"config":959},{"href":667,"dataGaName":665,"dataGaLocation":948},{"text":961,"config":962},"GitLab on AWS",{"href":963,"dataGaName":961,"dataGaLocation":948},"/partners/technology-partners/aws/",{"text":965,"config":966},"GitLab on Google Cloud",{"href":967,"dataGaName":965,"dataGaLocation":948},"/partners/technology-partners/google-cloud-platform/",{"text":969,"config":970},"Why GitLab?",{"href":642,"dataGaName":969,"dataGaLocation":948},{"freeTrial":972,"mobileIcon":977,"desktopIcon":982,"secondaryButton":985},{"text":973,"config":974},"Start free trial",{"href":975,"dataGaName":603,"dataGaLocation":976},"https://gitlab.com/-/trials/new/","nav",{"altText":978,"config":979},"Gitlab Icon",{"src":980,"dataGaName":981,"dataGaLocation":976},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":978,"config":983},{"src":984,"dataGaName":981,"dataGaLocation":976},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":986,"config":987},"Get Started",{"href":988,"dataGaName":989,"dataGaLocation":976},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":991,"mobileIcon":995,"desktopIcon":997},{"text":992,"config":993},"Learn more about GitLab Duo",{"href":634,"dataGaName":994,"dataGaLocation":976},"gitlab duo",{"altText":978,"config":996},{"src":980,"dataGaName":981,"dataGaLocation":976},{"altText":978,"config":998},{"src":984,"dataGaName":981,"dataGaLocation":976},{"button":1000,"mobileIcon":1005,"desktopIcon":1007},{"text":1001,"config":1002},"/switch",{"href":1003,"dataGaName":1004,"dataGaLocation":976},"#contact","switch",{"altText":978,"config":1006},{"src":980,"dataGaName":981,"dataGaLocation":976},{"altText":978,"config":1008},{"src":1009,"dataGaName":981,"dataGaLocation":976},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1011,"mobileIcon":1016,"desktopIcon":1018},{"text":1012,"config":1013},"Back to pricing",{"href":747,"dataGaName":1014,"dataGaLocation":976,"icon":1015},"back to pricing","GoBack",{"altText":978,"config":1017},{"src":980,"dataGaName":981,"dataGaLocation":976},{"altText":978,"config":1019},{"src":984,"dataGaName":981,"dataGaLocation":976},{"title":1021,"titleMobile":1022,"button":1023,"config":1028},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":640,"config":1024},{"href":1025,"dataGaName":1026,"dataGaLocation":1027},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1029,"disabled":581},"release",{"data":1031},{"text":1032,"source":1033,"edit":1039,"contribute":1044,"config":1049,"items":1054,"minimal":1264},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1034,"config":1035},"View page source",{"href":1036,"dataGaName":1037,"dataGaLocation":1038},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1040,"config":1041},"Edit this page",{"href":1042,"dataGaName":1043,"dataGaLocation":1038},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1045,"config":1046},"Please contribute",{"href":1047,"dataGaName":1048,"dataGaLocation":1038},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1050,"facebook":1051,"youtube":1052,"linkedin":1053},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1055,1102,1156,1200,1232],{"title":745,"links":1056,"subMenu":1071},[1057,1061,1066],{"text":1058,"config":1059},"View plans",{"href":747,"dataGaName":1060,"dataGaLocation":1038},"view plans",{"text":1062,"config":1063},"Why Premium?",{"href":1064,"dataGaName":1065,"dataGaLocation":1038},"/pricing/premium/","why premium",{"text":1067,"config":1068},"Why Ultimate?",{"href":1069,"dataGaName":1070,"dataGaLocation":1038},"/pricing/ultimate/","why ultimate",[1072],{"title":1073,"links":1074},"Contact Us",[1075,1078,1080,1082,1087,1092,1097],{"text":1076,"config":1077},"Contact sales",{"href":928,"dataGaName":608,"dataGaLocation":1038},{"text":931,"config":1079},{"href":933,"dataGaName":934,"dataGaLocation":1038},{"text":936,"config":1081},{"href":938,"dataGaName":939,"dataGaLocation":1038},{"text":1083,"config":1084},"Status",{"href":1085,"dataGaName":1086,"dataGaLocation":1038},"https://status.gitlab.com/","status",{"text":1088,"config":1089},"Terms of use",{"href":1090,"dataGaName":1091,"dataGaLocation":1038},"/terms/","terms of use",{"text":1093,"config":1094},"Privacy statement",{"href":1095,"dataGaName":1096,"dataGaLocation":1038},"/privacy/","privacy statement",{"text":1098,"config":1099},"Cookie preferences",{"dataGaName":1100,"dataGaLocation":1038,"id":1101,"isOneTrustButton":351},"cookie preferences","ot-sdk-btn",{"title":645,"links":1103,"subMenu":1112},[1104,1108],{"text":1105,"config":1106},"DevSecOps platform",{"href":627,"dataGaName":1107,"dataGaLocation":1038},"devsecops platform",{"text":1109,"config":1110},"AI-Assisted Development",{"href":634,"dataGaName":1111,"dataGaLocation":1038},"ai-assisted development",[1113],{"title":1114,"links":1115},"Topics",[1116,1121,1126,1131,1136,1141,1146,1151],{"text":1117,"config":1118},"CICD",{"href":1119,"dataGaName":1120,"dataGaLocation":1038},"/topics/ci-cd/","cicd",{"text":1122,"config":1123},"GitOps",{"href":1124,"dataGaName":1125,"dataGaLocation":1038},"/topics/gitops/","gitops",{"text":1127,"config":1128},"DevOps",{"href":1129,"dataGaName":1130,"dataGaLocation":1038},"/topics/devops/","devops",{"text":1132,"config":1133},"Version Control",{"href":1134,"dataGaName":1135,"dataGaLocation":1038},"/topics/version-control/","version control",{"text":1137,"config":1138},"DevSecOps",{"href":1139,"dataGaName":1140,"dataGaLocation":1038},"/topics/devsecops/","devsecops",{"text":1142,"config":1143},"Cloud Native",{"href":1144,"dataGaName":1145,"dataGaLocation":1038},"/topics/cloud-native/","cloud native",{"text":1147,"config":1148},"AI for Coding",{"href":1149,"dataGaName":1150,"dataGaLocation":1038},"/topics/devops/ai-for-coding/","ai for coding",{"text":1152,"config":1153},"Agentic AI",{"href":1154,"dataGaName":1155,"dataGaLocation":1038},"/topics/agentic-ai/","agentic ai",{"title":1157,"links":1158},"Solutions",[1159,1161,1163,1168,1172,1175,1179,1182,1184,1187,1190,1195],{"text":689,"config":1160},{"href":684,"dataGaName":689,"dataGaLocation":1038},{"text":678,"config":1162},{"href":661,"dataGaName":662,"dataGaLocation":1038},{"text":1164,"config":1165},"Agile development",{"href":1166,"dataGaName":1167,"dataGaLocation":1038},"/solutions/agile-delivery/","agile delivery",{"text":1169,"config":1170},"SCM",{"href":674,"dataGaName":1171,"dataGaLocation":1038},"source code management",{"text":1117,"config":1173},{"href":667,"dataGaName":1174,"dataGaLocation":1038},"continuous integration & delivery",{"text":1176,"config":1177},"Value stream management",{"href":717,"dataGaName":1178,"dataGaLocation":1038},"value stream management",{"text":1122,"config":1180},{"href":1181,"dataGaName":1125,"dataGaLocation":1038},"/solutions/gitops/",{"text":727,"config":1183},{"href":730,"dataGaName":731,"dataGaLocation":1038},{"text":1185,"config":1186},"Small business",{"href":736,"dataGaName":737,"dataGaLocation":1038},{"text":1188,"config":1189},"Public sector",{"href":742,"dataGaName":743,"dataGaLocation":1038},{"text":1191,"config":1192},"Education",{"href":1193,"dataGaName":1194,"dataGaLocation":1038},"/solutions/education/","education",{"text":1196,"config":1197},"Financial services",{"href":1198,"dataGaName":1199,"dataGaLocation":1038},"/solutions/finance/","financial services",{"title":750,"links":1201},[1202,1204,1206,1208,1211,1213,1216,1218,1220,1222,1224,1226,1228,1230],{"text":763,"config":1203},{"href":765,"dataGaName":766,"dataGaLocation":1038},{"text":768,"config":1205},{"href":770,"dataGaName":771,"dataGaLocation":1038},{"text":773,"config":1207},{"href":775,"dataGaName":776,"dataGaLocation":1038},{"text":778,"config":1209},{"href":780,"dataGaName":1210,"dataGaLocation":1038},"docs",{"text":801,"config":1212},{"href":803,"dataGaName":804,"dataGaLocation":1038},{"text":1214,"config":1215},"What's new",{"href":860,"dataGaName":861,"dataGaLocation":1038},{"text":796,"config":1217},{"href":798,"dataGaName":799,"dataGaLocation":1038},{"text":815,"config":1219},{"href":817,"dataGaName":818,"dataGaLocation":1038},{"text":823,"config":1221},{"href":825,"dataGaName":826,"dataGaLocation":1038},{"text":828,"config":1223},{"href":830,"dataGaName":831,"dataGaLocation":1038},{"text":833,"config":1225},{"href":835,"dataGaName":590,"dataGaLocation":1038},{"text":837,"config":1227},{"href":839,"dataGaName":840,"dataGaLocation":1038},{"text":842,"config":1229},{"href":844,"dataGaName":845,"dataGaLocation":1038},{"text":847,"config":1231},{"href":849,"dataGaName":850,"dataGaLocation":1038},{"title":863,"links":1233},[1234,1236,1238,1240,1242,1244,1248,1253,1255,1257,1259],{"text":871,"config":1235},{"href":873,"dataGaName":865,"dataGaLocation":1038},{"text":876,"config":1237},{"href":878,"dataGaName":879,"dataGaLocation":1038},{"text":884,"config":1239},{"href":886,"dataGaName":887,"dataGaLocation":1038},{"text":889,"config":1241},{"href":891,"dataGaName":892,"dataGaLocation":1038},{"text":894,"config":1243},{"href":896,"dataGaName":897,"dataGaLocation":1038},{"text":1245,"config":1246},"Sustainability",{"href":1247,"dataGaName":1245,"dataGaLocation":1038},"/sustainability/",{"text":1249,"config":1250},"Diversity, inclusion and belonging (DIB)",{"href":1251,"dataGaName":1252,"dataGaLocation":1038},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":899,"config":1254},{"href":901,"dataGaName":902,"dataGaLocation":1038},{"text":909,"config":1256},{"href":911,"dataGaName":912,"dataGaLocation":1038},{"text":914,"config":1258},{"href":916,"dataGaName":917,"dataGaLocation":1038},{"text":1260,"config":1261},"Modern Slavery Transparency Statement",{"href":1262,"dataGaName":1263,"dataGaLocation":1038},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1265},[1266,1269,1272],{"text":1267,"config":1268},"Terms",{"href":1090,"dataGaName":1091,"dataGaLocation":1038},{"text":1270,"config":1271},"Cookies",{"dataGaName":1100,"dataGaLocation":1038,"id":1101,"isOneTrustButton":351},{"text":1273,"config":1274},"Privacy",{"href":1095,"dataGaName":1096,"dataGaLocation":1038},[1276],{"id":1277,"title":7,"body":576,"config":1278,"content":1280,"description":576,"extension":1284,"meta":1285,"navigation":351,"path":1286,"seo":1287,"stem":1288,"__hash__":1289},"blogAuthors/en-us/blog/authors/john-cai.yml",{"template":1279},"BlogAuthor",{"name":7,"config":1281},{"headshot":1282,"ctfId":1283},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667386/Blog/Author%20Headshots/jcaigitlab-headshot.jpg","jcaigitlab","yml",{},"/en-us/blog/authors/john-cai",{},"en-us/blog/authors/john-cai","ZVYNi74tXFMr-R9r7W2HQhXeJWkOGIBPQKmUbR7EDps",[1291,1299,1306],{"title":1292,"description":1293,"heroImage":1294,"category":572,"date":1295,"authors":1296,"slug":1298,"externalUrl":576},"GitLab named a Leader in the 2026 Gartner® Magic Quadrant™ for DevSecOps Platforms","Agents made coding fast. GitLab is the Intelligent Orchestration Platform for DevSecOps that brings speed with control for the rest of the software lifecycle.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-06-17",[1297],"Manav Khurana","gitlab-leader-2026-gartner-mq-devsecops-platforms",{"title":1300,"description":1301,"heroImage":1302,"category":572,"date":1295,"authors":1303,"slug":1305,"externalUrl":576},"GitLab and Capgemini accelerate DevSecOps transformation","The global alliance helps organizations modernize software delivery, secure their supply chain, and bring AI into development workflows.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1781279411/n3pkmddd2eswa8qbu06z.png",[1304],"Alex Picker","gitlab-and-capgemini-global-alliance-partnership",{"title":1307,"description":1308,"heroImage":1309,"category":572,"date":1295,"authors":1310,"slug":1311,"externalUrl":576},"Introducing the 2026 EMEA GitLab Partner Award winners","Learn about the EMEA partners who made an outstanding impact over the past year.\n","https://res.cloudinary.com/about-gitlab-com/image/upload/v1781608381/biycl2ib2kpsbspjlac7.png",[1304],"2026-emea-gitlab-partner-awards",{"promotions":1313},[1314,1328,1340,1352],{"id":1315,"categories":1316,"header":1318,"text":1319,"button":1320,"image":1325},"ai-modernization",[1317],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1321,"config":1322},"Get your AI maturity score",{"href":1323,"dataGaName":1324,"dataGaLocation":804},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1326},{"src":1327},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1329,"categories":1330,"header":1332,"text":1319,"button":1333,"image":1337},"devops-modernization",[1331,1140],"product","Are you just managing tools or shipping innovation?",{"text":1334,"config":1335},"Get your DevOps maturity score",{"href":1336,"dataGaName":1324,"dataGaLocation":804},"/assessments/devops-modernization-assessment/",{"config":1338},{"src":1339},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1341,"categories":1342,"header":1344,"text":1319,"button":1345,"image":1349},"security-modernization",[1343],"security","Are you trading speed for security?",{"text":1346,"config":1347},"Get your security maturity score",{"href":1348,"dataGaName":1324,"dataGaLocation":804},"/assessments/security-modernization-assessment/",{"config":1350},{"src":1351},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1353,"paths":1354,"header":1357,"text":1358,"button":1359,"image":1364},"github-azure-migration",[1355,1356],"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":1360,"config":1361},"See how GitLab compares to GitHub",{"href":1362,"dataGaName":1363,"dataGaLocation":804},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1365},{"src":1339},{"header":1367,"blurb":1368,"button":1369,"secondaryButton":1374},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1370,"config":1371},"Get your free trial",{"href":1372,"dataGaName":603,"dataGaLocation":1373},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1076,"config":1375},{"href":928,"dataGaName":608,"dataGaLocation":1373},1786803737554]