[{"data":1,"prerenderedAt":1365},["ShallowReactive",2],{"/blog/partial-clone-for-massive-repositories":3,"navigation-en-us":582,"banner-en-us":1008,"footer-en-us":1018,"blog-post-authors-en-us-James Ramsay":1262,"blog-related-posts-en-us-partial-clone-for-massive-repositories":1276,"blog-promotions-en-us":1301,"next-steps-en-us":1355},{"id":4,"title":5,"authors":6,"body":8,"category":564,"date":565,"description":566,"extension":567,"externalUrl":568,"faq":568,"featured":569,"heroImage":570,"meta":571,"navigation":348,"path":572,"seo":573,"slug":577,"stem":578,"tags":579,"template":580,"updatedDate":568,"__hash__":581},"blogPosts/en-us/blog/partial-clone-for-massive-repositories.md","How Git Partial Clone lets you fetch only the large file you need",[7],"James Ramsay",{"type":9,"value":10,"toc":554},"minimark",[11,27,32,47,63,78,82,85,99,102,105,109,115,126,201,208,264,267,321,324,364,367,371,378,387,396,400,415,435,442,450,454,461,470,474,477,485,488,503,507,510,530,533,536,550],[12,13,14,15,21,22,26],"p",{},"The Git project began nearly 15 years ago, on ",[16,17,20],"a",{"href":18,"rel":19},"https://marc.info/?l=linux-kernel&m=111288700902396",[],"April 7,\n2005",", and is now the\n",[16,23,25],{"href":24},"/topics/version-control/","version control system"," of choice for developers. Yet, there are certain types of projects that\noften do not use Git, particularly projects that have many large binary files,\nsuch as video games. One reason projects with large binary files don't use Git\nis because, when a Git repository is cloned, Git will download every version of\nevery file in the repo. For most use cases, downloading this history is a\nuseful feature, but it slows cloning and fetching for projects with large binary\nfiles, assuming the project even fits on your computer.",[28,29,31],"h2",{"id":30},"what-is-partial-clone","What is Partial Clone?",[12,33,34,35,40,41,46],{},"Partial Clone is a new feature of Git that replaces ",[16,36,39],{"href":37,"rel":38},"https://git-lfs.github.com/",[],"Git\nLFS"," and makes working with very large repositories\nbetter by teaching Git how to work without downloading every file. Partial Clone\nhas been\n",[16,42,45],{"href":43,"rel":44},"https://public-inbox.org/git/xmqqeg4o27zw.fsf@gitster.mtv.corp.google.com/",[],"years","\nin the making, with code contributions from GitLab, GitHub, Microsoft and\nGoogle. Today it is experimentally available in Git and GitLab, and can be\nenabled by administrators",[12,48,49,50,58,59,62],{},"(see the partial clone documentation).\nPartial Clone speeds up fetching and cloning because less data is\ntransferred, and reduces disk usage on your local computer. For example, cloning\n",[16,51,54],{"href":52,"rel":53},"https://gitlab.com/gitlab-com/www-gitlab-com",[],[55,56,57],"code",{},"gitlab-com/www-gitlab-com","\nusing Partial Clone (",[55,60,61],{},"--filter=blob:none",") is at least 50% faster, and transfers\n70% less data.",[12,64,65,66,71,72,77],{},"Note: Partial Clone is one specific performance optimization for very large\nrepositories. ",[16,67,70],{"href":68,"rel":69},"https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/",[],"Sparse\nCheckout","\nis a related optimization that is particularly focused on repositories with\ntremendously large numbers of files and revisions such as\n",[16,73,76],{"href":74,"rel":75},"https://devblogs.microsoft.com/bharry/the-largest-git-repo-on-the-planet/",[],"Windows","\ncode base.",[28,79,81],{"id":80},"a-brief-history-of-large-files","A brief history of large files",[12,83,84],{},"\"What about Git LFS?\" you may ask. Doesn't LFS stand for \"large file storage\"?",[12,86,87,88,93,94,98],{},"Previously, extra tools were required to store large files in Git. In 2010,\n",[16,89,92],{"href":90,"rel":91},"https://git-annex.branchable.com/",[],"git-annex"," was released, and five years\nlater in 2015, ",[16,95,97],{"href":37,"rel":96},[],"Git LFS"," was released. Both\ngit-annex and Git LFS added large file support to Git in a similar way: Instead\nof storing a large file in Git, store a pointer file that links to the large\nfile. Then, when someone needs a large file, they can download it on-demand\nusing the pointer.",[12,100,101],{},"The criticism of this approach is that there are now two places to store files,\nin Git or in Git LFS. Which means that everyone must remember that big files need\nto go in Git LFS to keep the Git repo small and fast. There are downsides to\nthis approach. Besides being susceptible to human error, the pointer encodes\ndecisions based on bandwidth and file type into the structure of the repository\nthat influence all the people using the repository. Our assumptions about\nbandwidth and storage are likely to change over time, and vary by the location,\nbut decisions encoded in the repository are not flexible. Administrators and\ndevelopers alike benefit from flexibility in where to store large files, and\nwhich files to download.",[12,103,104],{},"Partial Clone solves these problems by removing the need for two classes of\nstorage, and special pointers. Let's walk through an example to understand how.",[28,106,108],{"id":107},"how-to-get-started-with-partial-clone","How to get started with Partial Clone",[12,110,111,112,114],{},"Let's continue to use ",[55,113,57],{}," as an example project, since\nit has quite a lot of images. For a larger repository, like a video game with\ndetailed textures and models that could take up a lot of disk space, the benefits will be even more significant.",[12,116,117,118,121,122,125],{},"Instead of a vanilla ",[55,119,120],{},"git clone",", we will include a filter spec which controls\nwhat is excluded when fetching data. In this situation, we just want to exclude\nlarge binary files. I've included ",[55,123,124],{},"--no-checkout"," so we can more clearly observe\nwhat is happening.",[127,128,133],"pre",{"className":129,"code":130,"language":131,"meta":132,"style":132},"language-bash shiki shiki-themes github-light","git clone --filter=blob:none --no-checkout git@gitlab.com/gitlab-com/www-gitlab-com.git\n# Cloning into 'www-gitlab-com'...\n# remote: Enumerating objects: 624541, done.\n# remote: Counting objects: 100% (624541/624541), done.\n# remote: Compressing objects: 100% (151886/151886), done.\n# remote: Total 624541 (delta 432983), reused 622339 (delta 430843), pack-reused 0\n# Receiving objects: 100% (624541/624541), 74.61 MiB | 8.14 MiB/s, done.\n# Resolving deltas: 100% (432983/432983), done.\n","bash","",[55,134,135,158,165,171,177,183,189,195],{"__ignoreMap":132},[136,137,140,144,148,152,155],"span",{"class":138,"line":139},"line",1,[136,141,143],{"class":142},"s7eDp","git",[136,145,147],{"class":146},"sYBdl"," clone",[136,149,151],{"class":150},"sYu0t"," --filter=blob:none",[136,153,154],{"class":150}," --no-checkout",[136,156,157],{"class":146}," git@gitlab.com/gitlab-com/www-gitlab-com.git\n",[136,159,161],{"class":138,"line":160},2,[136,162,164],{"class":163},"sAwPA","# Cloning into 'www-gitlab-com'...\n",[136,166,168],{"class":138,"line":167},3,[136,169,170],{"class":163},"# remote: Enumerating objects: 624541, done.\n",[136,172,174],{"class":138,"line":173},4,[136,175,176],{"class":163},"# remote: Counting objects: 100% (624541/624541), done.\n",[136,178,180],{"class":138,"line":179},5,[136,181,182],{"class":163},"# remote: Compressing objects: 100% (151886/151886), done.\n",[136,184,186],{"class":138,"line":185},6,[136,187,188],{"class":163},"# remote: Total 624541 (delta 432983), reused 622339 (delta 430843), pack-reused 0\n",[136,190,192],{"class":138,"line":191},7,[136,193,194],{"class":163},"# Receiving objects: 100% (624541/624541), 74.61 MiB | 8.14 MiB/s, done.\n",[136,196,198],{"class":138,"line":197},8,[136,199,200],{"class":163},"# Resolving deltas: 100% (432983/432983), done.\n",[12,202,203,204,207],{},"Above we explicitly told Git not to checkout the default branch. Normally\n",[55,205,206],{},"checkout"," doesn't require fetching any data from the server, because we have\neverything locally. When using Partial Clone, since we are deliberately not downloading everything, Git will need to fetch any missing files when doing a\ncheckout.",[127,209,211],{"className":129,"code":210,"language":131,"meta":132,"style":132},"git checkout master\n# remote: Enumerating objects: 12080, done.\n# remote: Counting objects: 100% (12080/12080), done.\n# remote: Compressing objects: 100% (11640/11640), done.\n# remote: Total 12080 (delta 442), reused 9773 (delta 409), pack-reused 0\n# Receiving objects: 100% (12080/12080), 1.10 GiB | 8.49 MiB/s, done.\n# Resolving deltas: 100% (442/442), done.\n# Updating files: 100% (12342/12342), done.\n# Filtering content: 100% (3/3), 131.24 MiB | 4.73 MiB/s, done.\n",[55,212,213,223,228,233,238,243,248,253,258],{"__ignoreMap":132},[136,214,215,217,220],{"class":138,"line":139},[136,216,143],{"class":142},[136,218,219],{"class":146}," checkout",[136,221,222],{"class":146}," master\n",[136,224,225],{"class":138,"line":160},[136,226,227],{"class":163},"# remote: Enumerating objects: 12080, done.\n",[136,229,230],{"class":138,"line":167},[136,231,232],{"class":163},"# remote: Counting objects: 100% (12080/12080), done.\n",[136,234,235],{"class":138,"line":173},[136,236,237],{"class":163},"# remote: Compressing objects: 100% (11640/11640), done.\n",[136,239,240],{"class":138,"line":179},[136,241,242],{"class":163},"# remote: Total 12080 (delta 442), reused 9773 (delta 409), pack-reused 0\n",[136,244,245],{"class":138,"line":185},[136,246,247],{"class":163},"# Receiving objects: 100% (12080/12080), 1.10 GiB | 8.49 MiB/s, done.\n",[136,249,250],{"class":138,"line":191},[136,251,252],{"class":163},"# Resolving deltas: 100% (442/442), done.\n",[136,254,255],{"class":138,"line":197},[136,256,257],{"class":163},"# Updating files: 100% (12342/12342), done.\n",[136,259,261],{"class":138,"line":260},9,[136,262,263],{"class":163},"# Filtering content: 100% (3/3), 131.24 MiB | 4.73 MiB/s, done.\n",[12,265,266],{},"If we checkout a different branch or commit, we'll need to download more missing\nfiles.",[127,268,270],{"className":129,"code":269,"language":131,"meta":132,"style":132},"git checkout 92d1f39b60f957d0bc3c5621bb3e17a3984bdf72\n# remote: Enumerating objects: 1968, done.\n# remote: Counting objects: 100% (1968/1968), done.\n# remote: Compressing objects: 100% (1953/1953), done.\n# remote: Total 1968 (delta 23), reused 1623 (delta 15), pack-reused 0\n# Receiving objects: 100% (1968/1968), 327.44 MiB | 8.83 MiB/s, done.\n# Resolving deltas: 100% (23/23), done.\n# Updating files: 100% (2255/2255), done.\n# Note: switching to '92d1f39b60f957d0bc3c5621bb3e17a3984bdf72'.\n",[55,271,272,281,286,291,296,301,306,311,316],{"__ignoreMap":132},[136,273,274,276,278],{"class":138,"line":139},[136,275,143],{"class":142},[136,277,219],{"class":146},[136,279,280],{"class":146}," 92d1f39b60f957d0bc3c5621bb3e17a3984bdf72\n",[136,282,283],{"class":138,"line":160},[136,284,285],{"class":163},"# remote: Enumerating objects: 1968, done.\n",[136,287,288],{"class":138,"line":167},[136,289,290],{"class":163},"# remote: Counting objects: 100% (1968/1968), done.\n",[136,292,293],{"class":138,"line":173},[136,294,295],{"class":163},"# remote: Compressing objects: 100% (1953/1953), done.\n",[136,297,298],{"class":138,"line":179},[136,299,300],{"class":163},"# remote: Total 1968 (delta 23), reused 1623 (delta 15), pack-reused 0\n",[136,302,303],{"class":138,"line":185},[136,304,305],{"class":163},"# Receiving objects: 100% (1968/1968), 327.44 MiB | 8.83 MiB/s, done.\n",[136,307,308],{"class":138,"line":191},[136,309,310],{"class":163},"# Resolving deltas: 100% (23/23), done.\n",[136,312,313],{"class":138,"line":197},[136,314,315],{"class":163},"# Updating files: 100% (2255/2255), done.\n",[136,317,318],{"class":138,"line":260},[136,319,320],{"class":163},"# Note: switching to '92d1f39b60f957d0bc3c5621bb3e17a3984bdf72'.\n",[12,322,323],{},"Git remembers the filter spec we provided when cloning the repository so that\nfetching updates will also exclude large files until we need them.",[127,325,327],{"className":129,"code":326,"language":131,"meta":132,"style":132},"git config remote.origin.promisor\n# true\n\ngit config remote.origin.partialclonefilter\n# blob:none\n",[55,328,329,339,344,350,359],{"__ignoreMap":132},[136,330,331,333,336],{"class":138,"line":139},[136,332,143],{"class":142},[136,334,335],{"class":146}," config",[136,337,338],{"class":146}," remote.origin.promisor\n",[136,340,341],{"class":138,"line":160},[136,342,343],{"class":163},"# true\n",[136,345,346],{"class":138,"line":167},[136,347,349],{"emptyLinePlaceholder":348},true,"\n",[136,351,352,354,356],{"class":138,"line":173},[136,353,143],{"class":142},[136,355,335],{"class":146},[136,357,358],{"class":146}," remote.origin.partialclonefilter\n",[136,360,361],{"class":138,"line":179},[136,362,363],{"class":163},"# blob:none\n",[12,365,366],{},"When committing changes, you simply commit binary files like you would any other\nfile. There is no extra tool to install or configure, no need to treat big files\ndifferently to small files.",[28,368,370],{"id":369},"network-and-storage","Network and Storage",[12,372,373,374,377],{},"If you are already using ",[16,375,97],{"href":37,"rel":376},[]," today, you might\nbe aware that large files are stored and transferred differently to regular Git\nobjects. On GitLab.com, Git LFS objects are stored in object storage (like AWS\nS3) rather than fast attached storage (like SSD), and transferred over HTTP even\nwhen using SSH for regular Git objects. Using object storage has the advantage\nof reducing storage costs for large binary files, while using simpler HTTP\nrequests for large downloads allows the possibility of resumable and parallel\ndownloads.",[12,379,380,381,386],{},"Partial Clone\n",[16,382,385],{"href":383,"rel":384},"https://public-inbox.org/git/20190625134039.21707-1-chriscool@tuxfamily.org/",[],"already","\nsupports more than one remote, and work is underway to allow large files to be\nstored in a different location such as object storage. Unlike Git LFS, however,\nthe repository or instance administrator will be able to choose which objects\nshould be stored where, and change this configuration over time if needed.",[12,388,389,390,395],{},"Follow the epic for ",[16,391,394],{"href":392,"rel":393},"https://gitlab.com/groups/gitlab-org/-/epics/1487",[],"improved large file\nstorage"," to learn more and\nfollow our progress.",[28,397,399],{"id":398},"performance","Performance",[12,401,402,403,408,409,414],{},"When fetching new objects from the Git server using a ",[16,404,407],{"href":405,"rel":406},"https://github.com/git/git/blob/v2.25.0/Documentation/rev-list-options.txt#L735",[],"filter\nspec","\nto exclude objects from the response, Git will check each object and exclude\nany that match the filter spec. In ",[16,410,413],{"href":411,"rel":412},"https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.25.0.txt",[],"Git\n2.25",",\nthe most recent version, filtering has not been optimized for performance.",[12,416,417,422,423,428,429,434],{},[16,418,421],{"href":419,"rel":420},"https://github.com/peff/",[],"Jeff King (Peff)"," (GitHub) recently\n",[16,424,427],{"href":425,"rel":426},"https://public-inbox.org/git/20200214182147.GA654525@coredump.intra.peff.net/",[],"contributed","\nperformance improvements for blob size filtering, which will likely be included\nin ",[16,430,433],{"href":431,"rel":432},"https://gitlab.com/gitlab-org/gitaly/issues/2497",[],"Git 2.26",", and our plan is\nto include it in GitLab 12.10 release.",[12,436,437,438,441],{},"Optimizing the sparse filter spec option (",[55,439,440],{},"--filter:sparse","), which filters\nbased on file path is more complex because blobs, which contain the file\ncontent, do not include file path information. The directory structure of a\nrepository is stored in tree objects.",[12,443,389,444,449],{},[16,445,448],{"href":446,"rel":447},"https://gitlab.com/groups/gitlab-org/-/epics/1671",[],"Partial Clone performance\nimprovements"," to learn more\nand follow our progress.",[28,451,453],{"id":452},"usability","Usability",[12,455,456,457,460],{},"One of the drawbacks of Git LFS was that it required installing an additional\ntool. In comparison, Partial Clone does not require any additional tools.\nHowever, it does require learning new options and configurations, such as to\nclone using the ",[55,458,459],{},"--filter"," option.",[12,462,463,464,469],{},"We want to make it easy for people get their work done, who simply desire Git to\njust work. They shouldn't need to work out which is the optimal blob size filter\nspec for a project? Or what even is a filter spec?  While Partial Clone remains\nexperimental, we haven't made any changes to the GitLab interface to highlight\nPartial Clone, but we are investigating this and welcome your feedback. Please\njoin the conversation on this\n",[16,465,468],{"href":466,"rel":467},"https://gitlab.com/gitlab-org/gitlab/issues/207744",[],"issue",".",[28,471,473],{"id":472},"file-locking-and-tool-integrations","File locking and tool integrations",[12,475,476],{},"Any conversation of large binary files, particularly in regards to video\ngames is incomplete without discussing file locking and tooling integrations.",[12,478,479,480,484],{},"Unlike plain text ",[16,481,483],{"href":482},"/solutions/source-code-management/","source code",", resolving conflicts between different versions of\na binary file is often impossible. To prevent conflicts in binary file editing,\nan exclusive file lock is used, meaning only one person at a time can edit a\nsingle file, regardless of branches. If conflicts can't be resolved, allowing multiple\nversions of a individual file to be created in parallel on different branches is a bug, not\na feature. GitLab already has basic file locking support, but it is really only\nuseful for plain text because it only applies to the default branch, and is not\nintegrated with any local tools.",[12,486,487],{},"Local tooling integrations are important for binary asset workflows, to\nautomatically propagate file locks to the local development environment, and to\nallow artists to work on assets without needing to use Git from the command\nline. Propagating file locks quickly to local development environments is also\nimportant because it prevents work from being wasted before it even happens.",[12,489,490,491,496,497,502],{},"Follow the ",[16,492,495],{"href":493,"rel":494},"https://gitlab.com/groups/gitlab-org/-/epics/1488",[],"file locking"," and\n",[16,498,501],{"href":499,"rel":500},"https://gitlab.com/groups/gitlab-org/-/epics/2704",[],"integrations"," epics for more\ninformation about what we're working on.",[28,504,506],{"id":505},"conclusion","Conclusion",[12,508,509],{},"Large files are necessary for many projects, and Git will soon support this\nnatively, without the need for extra tools. Although Partial Clone is still an\nexperimental feature, we are making improvements with every release and the\nfeature is now ready for testing.",[12,511,512,513,517,518,523,524,529],{},"Thank you to the Git community for your work over the past years on improving\nsupport for enormous repositories. Particularly, thank you to ",[16,514,516],{"href":419,"rel":515},[],"Jeff\nKing"," (GitHub) and Christian\nCouder (senior backend\nengineer on Gitaly at GitLab) for your early experimentation with Partial Clone,\nJonathan Tan (Google) and ",[16,519,522],{"href":520,"rel":521},"https://github.com/jeffhostetler",[],"Jeff Hostetler","\n(Microsoft) for contributing the ",[16,525,528],{"href":526,"rel":527},"https://public-inbox.org/git/cover.1506714999.git.jonathantanmy@google.com/",[],"first\nimplementation","\nof Partial Clone and promisor remotes, and the many others who've also\ncontributed.",[12,531,532],{},"If you are already using Partial Clone, or would like to help us test Partial\nClone on a large project, please get in touch with me, James\nRamsay (group manager, product\nfor Create at GitLab), Jordi\nMon (senior product marketing\nmanager for Dev at GitLab), or your account manager.",[12,534,535],{},"For more information on Partial Clone, check out the documentation.",[12,537,538,539,544,545],{},"Cover image by ",[16,540,543],{"href":541,"rel":542},"https://unsplash.com/@simonlerouge",[],"Simon Boxus"," on\n",[16,546,549],{"href":547,"rel":548},"https://unsplash.com/photos/4ftI4lCcByM",[],"Unsplash",[551,552,553],"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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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":132,"searchDepth":160,"depth":160,"links":555},[556,557,558,559,560,561,562,563],{"id":30,"depth":160,"text":31},{"id":80,"depth":160,"text":81},{"id":107,"depth":160,"text":108},{"id":369,"depth":160,"text":370},{"id":398,"depth":160,"text":399},{"id":452,"depth":160,"text":453},{"id":472,"depth":160,"text":473},{"id":505,"depth":160,"text":506},"open-source","2020-03-13","Work faster with this experimental Partial Clone feature for huge Git repositories, saving you time, bandwidth, and storage, one large file at a time.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681131/Blog/Hero%20Images/partial-clone-for-massive-repositories.jpg",{},"/en-us/blog/partial-clone-for-massive-repositories",{"title":5,"description":566,"ogTitle":5,"ogDescription":566,"noIndex":569,"ogImage":570,"ogUrl":574,"ogSiteName":575,"ogType":576,"canonicalUrls":574},"https://about.gitlab.com/blog/partial-clone-for-massive-repositories","https://about.gitlab.com","article","partial-clone-for-massive-repositories","en-us/blog/partial-clone-for-massive-repositories",[143,398],"BlogPost","3V4RtuXyXG9OiAk2sHhp170TAKfffxG_l8NgCmce68E",{"logo":583,"freeTrial":588,"sales":593,"login":598,"items":603,"search":928,"minimal":959,"duo":978,"switchNav":987,"pricingDeployment":998},{"config":584},{"href":585,"dataGaName":586,"dataGaLocation":587},"/","gitlab logo","header",{"text":589,"config":590},"Get free trial",{"href":591,"dataGaName":592,"dataGaLocation":587},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":594,"config":595},"Request a demo",{"href":596,"dataGaName":597,"dataGaLocation":587},"/sales/?contact-topic=request-demo","sales",{"text":599,"config":600},"Sign in",{"href":601,"dataGaName":602,"dataGaLocation":587},"https://gitlab.com/users/sign_in/","sign in",[604,633,732,737,850,906],{"text":605,"config":606,"menu":608},"Platform",{"dataNavLevelOne":607},"platform",{"type":609,"columns":610},"cards",[611,617,625],{"title":605,"description":612,"link":613},"The intelligent orchestration platform for DevSecOps",{"text":614,"config":615},"Explore our Platform",{"href":616,"dataGaName":607,"dataGaLocation":587},"/platform/",{"title":618,"description":619,"link":620},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":621,"config":622},"Meet GitLab Duo",{"href":623,"dataGaName":624,"dataGaLocation":587},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":626,"description":627,"link":628},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":629,"config":630},"Learn more",{"href":631,"dataGaName":632,"dataGaLocation":587},"/why-gitlab/","why gitlab",{"text":634,"left":348,"config":635,"menu":637},"Product",{"dataNavLevelOne":636},"solutions",{"type":638,"link":639,"columns":643,"feature":711},"lists",{"text":640,"config":641},"View all Solutions",{"href":642,"dataGaName":636,"dataGaLocation":587},"/solutions/",[644,667,690],{"title":645,"description":646,"link":647,"items":652},"Automation","CI/CD and automation to accelerate deployment",{"config":648},{"icon":649,"href":650,"dataGaName":651,"dataGaLocation":587},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[653,657,660,663],{"text":654,"config":655},"CI/CD",{"href":656,"dataGaLocation":587,"dataGaName":654},"/solutions/continuous-integration/",{"text":618,"config":658},{"href":623,"dataGaLocation":587,"dataGaName":659},"gitlab duo agent platform - product menu",{"text":661,"config":662},"Source Code Management",{"href":482,"dataGaLocation":587,"dataGaName":661},{"text":664,"config":665},"Automated Software Delivery",{"href":650,"dataGaLocation":587,"dataGaName":666},"Automated software delivery",{"title":668,"description":669,"link":670,"items":675},"Security","Deliver code faster without compromising security",{"config":671},{"href":672,"dataGaName":673,"dataGaLocation":587,"icon":674},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[676,680,685],{"text":677,"config":678},"Application Security Testing",{"href":672,"dataGaName":679,"dataGaLocation":587},"Application security testing",{"text":681,"config":682},"Software Supply Chain Security",{"href":683,"dataGaLocation":587,"dataGaName":684},"/solutions/supply-chain/","Software supply chain security",{"text":686,"config":687},"Software Compliance",{"href":688,"dataGaName":689,"dataGaLocation":587},"/solutions/software-compliance/","software compliance",{"title":691,"link":692,"items":697},"Measurement",{"config":693},{"icon":694,"href":695,"dataGaName":696,"dataGaLocation":587},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[698,702,706],{"text":699,"config":700},"Visibility & Measurement",{"href":695,"dataGaLocation":587,"dataGaName":701},"Visibility and Measurement",{"text":703,"config":704},"Value Stream Management",{"href":705,"dataGaLocation":587,"dataGaName":703},"/solutions/value-stream-management/",{"text":707,"config":708},"Analytics & Insights",{"href":709,"dataGaLocation":587,"dataGaName":710},"/solutions/analytics-and-insights/","Analytics and insights",{"title":712,"type":638,"items":713},"GitLab for",[714,720,726],{"text":715,"config":716},"Enterprise",{"icon":717,"href":718,"dataGaLocation":587,"dataGaName":719},"Building","/enterprise/","enterprise",{"text":721,"config":722},"Small Business",{"icon":723,"href":724,"dataGaLocation":587,"dataGaName":725},"Work","/small-business/","small business",{"text":727,"config":728},"Public Sector",{"icon":729,"href":730,"dataGaLocation":587,"dataGaName":731},"Organization","/solutions/public-sector/","public sector",{"text":733,"config":734},"Pricing",{"href":735,"dataGaName":736,"dataGaLocation":587,"dataNavLevelOne":736},"/pricing/","pricing",{"text":738,"config":739,"menu":741},"Resources",{"dataNavLevelOne":740},"resources",{"type":638,"link":742,"columns":746,"feature":839},{"text":743,"config":744},"View all resources",{"href":745,"dataGaName":740,"dataGaLocation":587},"/resources/",[747,779,806],{"title":748,"items":749},"Getting started",[750,755,760,765,770,775],{"text":751,"config":752},"Install",{"href":753,"dataGaName":754,"dataGaLocation":587},"/install/","install",{"text":756,"config":757},"Quick start guides",{"href":758,"dataGaName":759,"dataGaLocation":587},"/get-started/","quick setup checklists",{"text":761,"config":762},"Learn",{"href":763,"dataGaLocation":587,"dataGaName":764},"https://university.gitlab.com/","learn",{"text":766,"config":767},"Product documentation",{"href":768,"dataGaName":769,"dataGaLocation":587},"https://docs.gitlab.com/","product documentation",{"text":771,"config":772},"Best practice videos",{"href":773,"dataGaName":774,"dataGaLocation":587},"/getting-started-videos/","best practice videos",{"text":776,"config":777},"Integrations",{"href":778,"dataGaName":501,"dataGaLocation":587},"/integrations/",{"title":780,"items":781},"Discover",[782,787,792,797,801],{"text":783,"config":784},"Customer success stories",{"href":785,"dataGaName":786,"dataGaLocation":587},"/customers/","customer success stories",{"text":788,"config":789},"Blog",{"href":790,"dataGaName":791,"dataGaLocation":587},"/blog/","blog",{"text":793,"config":794},"Demo Hub",{"href":795,"dataGaName":796,"dataGaLocation":587},"/demo-hub/","demo hub",{"text":798,"config":799},"The Source",{"href":800,"dataGaName":791,"dataGaLocation":587},"/the-source/",{"text":802,"config":803},"Remote",{"href":804,"dataGaName":805,"dataGaLocation":587},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":807,"items":808},"Connect",[809,814,819,824,829,834],{"text":810,"config":811},"GitLab Services",{"href":812,"dataGaName":813,"dataGaLocation":587},"/services/","services",{"text":815,"config":816},"Contribute",{"href":817,"dataGaName":818,"dataGaLocation":587},"https://contributors.gitlab.com","contribute",{"text":820,"config":821},"Community",{"href":822,"dataGaName":823,"dataGaLocation":587},"/community/","community",{"text":825,"config":826},"Forum",{"href":827,"dataGaName":828,"dataGaLocation":587},"https://forum.gitlab.com/","forum",{"text":830,"config":831},"Events",{"href":832,"dataGaName":833,"dataGaLocation":587},"/events/","events",{"text":835,"config":836},"Partners",{"href":837,"dataGaName":838,"dataGaLocation":587},"/partners/","partners",{"config":840,"title":843,"text":844,"link":845},{"background":841,"textColor":842},"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":846,"config":847},"Read the latest",{"href":848,"dataGaName":849,"dataGaLocation":587},"/whats-new/","whats new",{"text":851,"config":852,"menu":854},"Company",{"dataNavLevelOne":853},"company",{"type":638,"columns":855},[856],{"items":857},[858,863,869,871,876,881,886,891,896,901],{"text":859,"config":860},"About",{"href":861,"dataGaName":862,"dataGaLocation":587},"/company/","about",{"text":864,"config":865,"footerGa":868},"Jobs",{"href":866,"dataGaName":867,"dataGaLocation":587},"/jobs/","jobs",{"dataGaName":867},{"text":830,"config":870},{"href":832,"dataGaName":833,"dataGaLocation":587},{"text":872,"config":873},"Leadership",{"href":874,"dataGaName":875,"dataGaLocation":587},"/company/team/e-group/","leadership",{"text":877,"config":878},"Handbook",{"href":879,"dataGaName":880,"dataGaLocation":587},"https://handbook.gitlab.com/","handbook",{"text":882,"config":883},"Investor relations",{"href":884,"dataGaName":885,"dataGaLocation":587},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":887,"config":888},"Trust Center",{"href":889,"dataGaName":890,"dataGaLocation":587},"/security/","trust center",{"text":892,"config":893},"AI Transparency Center",{"href":894,"dataGaName":895,"dataGaLocation":587},"/ai-transparency-center/","ai transparency center",{"text":897,"config":898},"Newsletter",{"href":899,"dataGaName":900,"dataGaLocation":587},"/company/contact/#contact-forms","newsletter",{"text":902,"config":903},"Press",{"href":904,"dataGaName":905,"dataGaLocation":587},"/press/","press",{"text":907,"config":908,"menu":909},"Contact us",{"dataNavLevelOne":853},{"type":638,"columns":910},[911],{"items":912},[913,918,923],{"text":914,"config":915},"Talk to sales",{"href":916,"dataGaName":917,"dataGaLocation":587},"/sales/","talk to sales",{"text":919,"config":920},"Support portal",{"href":921,"dataGaName":922,"dataGaLocation":587},"https://support.gitlab.com/hc/en-us","support portal",{"text":924,"config":925},"Customer portal",{"href":926,"dataGaName":927,"dataGaLocation":587},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":929,"login":930,"suggestions":937},"Close",{"text":931,"link":932},"To search repositories and projects, login to",{"text":933,"config":934},"gitlab.com",{"href":601,"dataGaName":935,"dataGaLocation":936},"search login","search",{"text":938,"default":939},"Suggestions",[940,942,946,948,952,956],{"text":618,"config":941},{"href":623,"dataGaName":618,"dataGaLocation":936},{"text":943,"config":944},"Code Suggestions (AI)",{"href":945,"dataGaName":943,"dataGaLocation":936},"/solutions/code-suggestions/",{"text":654,"config":947},{"href":656,"dataGaName":654,"dataGaLocation":936},{"text":949,"config":950},"GitLab on AWS",{"href":951,"dataGaName":949,"dataGaLocation":936},"/partners/technology-partners/aws/",{"text":953,"config":954},"GitLab on Google Cloud",{"href":955,"dataGaName":953,"dataGaLocation":936},"/partners/technology-partners/google-cloud-platform/",{"text":957,"config":958},"Why GitLab?",{"href":631,"dataGaName":957,"dataGaLocation":936},{"freeTrial":960,"mobileIcon":965,"desktopIcon":970,"secondaryButton":973},{"text":961,"config":962},"Start free trial",{"href":963,"dataGaName":592,"dataGaLocation":964},"https://gitlab.com/-/trials/new/","nav",{"altText":966,"config":967},"Gitlab Icon",{"src":968,"dataGaName":969,"dataGaLocation":964},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":966,"config":971},{"src":972,"dataGaName":969,"dataGaLocation":964},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":974,"config":975},"Get Started",{"href":976,"dataGaName":977,"dataGaLocation":964},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":979,"mobileIcon":983,"desktopIcon":985},{"text":980,"config":981},"Learn more about GitLab Duo",{"href":623,"dataGaName":982,"dataGaLocation":964},"gitlab duo",{"altText":966,"config":984},{"src":968,"dataGaName":969,"dataGaLocation":964},{"altText":966,"config":986},{"src":972,"dataGaName":969,"dataGaLocation":964},{"button":988,"mobileIcon":993,"desktopIcon":995},{"text":989,"config":990},"/switch",{"href":991,"dataGaName":992,"dataGaLocation":964},"#contact","switch",{"altText":966,"config":994},{"src":968,"dataGaName":969,"dataGaLocation":964},{"altText":966,"config":996},{"src":997,"dataGaName":969,"dataGaLocation":964},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":999,"mobileIcon":1004,"desktopIcon":1006},{"text":1000,"config":1001},"Back to pricing",{"href":735,"dataGaName":1002,"dataGaLocation":964,"icon":1003},"back to pricing","GoBack",{"altText":966,"config":1005},{"src":968,"dataGaName":969,"dataGaLocation":964},{"altText":966,"config":1007},{"src":972,"dataGaName":969,"dataGaLocation":964},{"title":1009,"titleMobile":1010,"button":1011,"config":1016},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":629,"config":1012},{"href":1013,"dataGaName":1014,"dataGaLocation":1015},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1017,"disabled":569},"release",{"data":1019},{"text":1020,"source":1021,"edit":1027,"contribute":1032,"config":1037,"items":1042,"minimal":1251},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1022,"config":1023},"View page source",{"href":1024,"dataGaName":1025,"dataGaLocation":1026},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1028,"config":1029},"Edit this page",{"href":1030,"dataGaName":1031,"dataGaLocation":1026},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1033,"config":1034},"Please contribute",{"href":1035,"dataGaName":1036,"dataGaLocation":1026},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1038,"facebook":1039,"youtube":1040,"linkedin":1041},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1043,1090,1143,1187,1219],{"title":733,"links":1044,"subMenu":1059},[1045,1049,1054],{"text":1046,"config":1047},"View plans",{"href":735,"dataGaName":1048,"dataGaLocation":1026},"view plans",{"text":1050,"config":1051},"Why Premium?",{"href":1052,"dataGaName":1053,"dataGaLocation":1026},"/pricing/premium/","why premium",{"text":1055,"config":1056},"Why Ultimate?",{"href":1057,"dataGaName":1058,"dataGaLocation":1026},"/pricing/ultimate/","why ultimate",[1060],{"title":1061,"links":1062},"Contact Us",[1063,1066,1068,1070,1075,1080,1085],{"text":1064,"config":1065},"Contact sales",{"href":916,"dataGaName":597,"dataGaLocation":1026},{"text":919,"config":1067},{"href":921,"dataGaName":922,"dataGaLocation":1026},{"text":924,"config":1069},{"href":926,"dataGaName":927,"dataGaLocation":1026},{"text":1071,"config":1072},"Status",{"href":1073,"dataGaName":1074,"dataGaLocation":1026},"https://status.gitlab.com/","status",{"text":1076,"config":1077},"Terms of use",{"href":1078,"dataGaName":1079,"dataGaLocation":1026},"/terms/","terms of use",{"text":1081,"config":1082},"Privacy statement",{"href":1083,"dataGaName":1084,"dataGaLocation":1026},"/privacy/","privacy statement",{"text":1086,"config":1087},"Cookie preferences",{"dataGaName":1088,"dataGaLocation":1026,"id":1089,"isOneTrustButton":348},"cookie preferences","ot-sdk-btn",{"title":634,"links":1091,"subMenu":1100},[1092,1096],{"text":1093,"config":1094},"DevSecOps platform",{"href":616,"dataGaName":1095,"dataGaLocation":1026},"devsecops platform",{"text":1097,"config":1098},"AI-Assisted Development",{"href":623,"dataGaName":1099,"dataGaLocation":1026},"ai-assisted development",[1101],{"title":1102,"links":1103},"Topics",[1104,1109,1114,1119,1123,1128,1133,1138],{"text":1105,"config":1106},"CICD",{"href":1107,"dataGaName":1108,"dataGaLocation":1026},"/topics/ci-cd/","cicd",{"text":1110,"config":1111},"GitOps",{"href":1112,"dataGaName":1113,"dataGaLocation":1026},"/topics/gitops/","gitops",{"text":1115,"config":1116},"DevOps",{"href":1117,"dataGaName":1118,"dataGaLocation":1026},"/topics/devops/","devops",{"text":1120,"config":1121},"Version Control",{"href":24,"dataGaName":1122,"dataGaLocation":1026},"version control",{"text":1124,"config":1125},"DevSecOps",{"href":1126,"dataGaName":1127,"dataGaLocation":1026},"/topics/devsecops/","devsecops",{"text":1129,"config":1130},"Cloud Native",{"href":1131,"dataGaName":1132,"dataGaLocation":1026},"/topics/cloud-native/","cloud native",{"text":1134,"config":1135},"AI for Coding",{"href":1136,"dataGaName":1137,"dataGaLocation":1026},"/topics/devops/ai-for-coding/","ai for coding",{"text":1139,"config":1140},"Agentic AI",{"href":1141,"dataGaName":1142,"dataGaLocation":1026},"/topics/agentic-ai/","agentic ai",{"title":1144,"links":1145},"Solutions",[1146,1148,1150,1155,1159,1162,1166,1169,1171,1174,1177,1182],{"text":677,"config":1147},{"href":672,"dataGaName":677,"dataGaLocation":1026},{"text":666,"config":1149},{"href":650,"dataGaName":651,"dataGaLocation":1026},{"text":1151,"config":1152},"Agile development",{"href":1153,"dataGaName":1154,"dataGaLocation":1026},"/solutions/agile-delivery/","agile delivery",{"text":1156,"config":1157},"SCM",{"href":482,"dataGaName":1158,"dataGaLocation":1026},"source code management",{"text":1105,"config":1160},{"href":656,"dataGaName":1161,"dataGaLocation":1026},"continuous integration & delivery",{"text":1163,"config":1164},"Value stream management",{"href":705,"dataGaName":1165,"dataGaLocation":1026},"value stream management",{"text":1110,"config":1167},{"href":1168,"dataGaName":1113,"dataGaLocation":1026},"/solutions/gitops/",{"text":715,"config":1170},{"href":718,"dataGaName":719,"dataGaLocation":1026},{"text":1172,"config":1173},"Small business",{"href":724,"dataGaName":725,"dataGaLocation":1026},{"text":1175,"config":1176},"Public sector",{"href":730,"dataGaName":731,"dataGaLocation":1026},{"text":1178,"config":1179},"Education",{"href":1180,"dataGaName":1181,"dataGaLocation":1026},"/solutions/education/","education",{"text":1183,"config":1184},"Financial services",{"href":1185,"dataGaName":1186,"dataGaLocation":1026},"/solutions/finance/","financial services",{"title":738,"links":1188},[1189,1191,1193,1195,1198,1200,1203,1205,1207,1209,1211,1213,1215,1217],{"text":751,"config":1190},{"href":753,"dataGaName":754,"dataGaLocation":1026},{"text":756,"config":1192},{"href":758,"dataGaName":759,"dataGaLocation":1026},{"text":761,"config":1194},{"href":763,"dataGaName":764,"dataGaLocation":1026},{"text":766,"config":1196},{"href":768,"dataGaName":1197,"dataGaLocation":1026},"docs",{"text":788,"config":1199},{"href":790,"dataGaName":791,"dataGaLocation":1026},{"text":1201,"config":1202},"What's new",{"href":848,"dataGaName":849,"dataGaLocation":1026},{"text":783,"config":1204},{"href":785,"dataGaName":786,"dataGaLocation":1026},{"text":802,"config":1206},{"href":804,"dataGaName":805,"dataGaLocation":1026},{"text":810,"config":1208},{"href":812,"dataGaName":813,"dataGaLocation":1026},{"text":815,"config":1210},{"href":817,"dataGaName":818,"dataGaLocation":1026},{"text":820,"config":1212},{"href":822,"dataGaName":823,"dataGaLocation":1026},{"text":825,"config":1214},{"href":827,"dataGaName":828,"dataGaLocation":1026},{"text":830,"config":1216},{"href":832,"dataGaName":833,"dataGaLocation":1026},{"text":835,"config":1218},{"href":837,"dataGaName":838,"dataGaLocation":1026},{"title":851,"links":1220},[1221,1223,1225,1227,1229,1231,1235,1240,1242,1244,1246],{"text":859,"config":1222},{"href":861,"dataGaName":853,"dataGaLocation":1026},{"text":864,"config":1224},{"href":866,"dataGaName":867,"dataGaLocation":1026},{"text":872,"config":1226},{"href":874,"dataGaName":875,"dataGaLocation":1026},{"text":877,"config":1228},{"href":879,"dataGaName":880,"dataGaLocation":1026},{"text":882,"config":1230},{"href":884,"dataGaName":885,"dataGaLocation":1026},{"text":1232,"config":1233},"Sustainability",{"href":1234,"dataGaName":1232,"dataGaLocation":1026},"/sustainability/",{"text":1236,"config":1237},"Diversity, inclusion and belonging (DIB)",{"href":1238,"dataGaName":1239,"dataGaLocation":1026},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":887,"config":1241},{"href":889,"dataGaName":890,"dataGaLocation":1026},{"text":897,"config":1243},{"href":899,"dataGaName":900,"dataGaLocation":1026},{"text":902,"config":1245},{"href":904,"dataGaName":905,"dataGaLocation":1026},{"text":1247,"config":1248},"Modern Slavery Transparency Statement",{"href":1249,"dataGaName":1250,"dataGaLocation":1026},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1252},[1253,1256,1259],{"text":1254,"config":1255},"Terms",{"href":1078,"dataGaName":1079,"dataGaLocation":1026},{"text":1257,"config":1258},"Cookies",{"dataGaName":1088,"dataGaLocation":1026,"id":1089,"isOneTrustButton":348},{"text":1260,"config":1261},"Privacy",{"href":1083,"dataGaName":1084,"dataGaLocation":1026},[1263],{"id":1264,"title":7,"body":568,"config":1265,"content":1267,"description":568,"extension":1270,"meta":1271,"navigation":348,"path":1272,"seo":1273,"stem":1274,"__hash__":1275},"blogAuthors/en-us/blog/authors/james-ramsay.yml",{"template":1266},"BlogAuthor",{"name":7,"config":1268},{"headshot":132,"ctfId":1269},"jramsay","yml",{},"/en-us/blog/authors/james-ramsay",{},"en-us/blog/authors/james-ramsay","iKU7kqEnGoklxsvYnqw2L7oAOICkVwJOVHAkOv_GdM4",[1277,1285,1293],{"title":1278,"description":1279,"heroImage":1280,"category":564,"date":1281,"authors":1282,"slug":1284,"externalUrl":568},"What's new in Git 2.55.0?","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.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[1283],"Toon Claes","whats-new-in-git-2-55-0",{"title":1286,"description":1287,"heroImage":1288,"category":564,"date":1289,"authors":1290,"slug":1292,"externalUrl":568},"GitLab AI Hackathon 2026: Meet the winners","Nearly 7,000 developers built 600+ AI agents and flows on GitLab Duo Agent Platform. Find out who won and what they created.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[1291],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1294,"description":1295,"heroImage":1296,"category":564,"date":1297,"authors":1298,"slug":1300,"externalUrl":568},"What’s new in Git 2.54.0?","Learn about release contributions, including new repository maintenance, a new command to edit commit history, a replacement for git-sizer(1), and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782734716/ztwgrvlolpifo01vj8qc.png","2026-04-20",[1299],"Patrick Steinhardt","whats-new-in-git-2-54-0",{"promotions":1302},[1303,1317,1329,1341],{"id":1304,"categories":1305,"header":1307,"text":1308,"button":1309,"image":1314},"ai-modernization",[1306],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1310,"config":1311},"Get your AI maturity score",{"href":1312,"dataGaName":1313,"dataGaLocation":791},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1315},{"src":1316},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1318,"categories":1319,"header":1321,"text":1308,"button":1322,"image":1326},"devops-modernization",[1320,1127],"product","Are you just managing tools or shipping innovation?",{"text":1323,"config":1324},"Get your DevOps maturity score",{"href":1325,"dataGaName":1313,"dataGaLocation":791},"/assessments/devops-modernization-assessment/",{"config":1327},{"src":1328},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1330,"categories":1331,"header":1333,"text":1308,"button":1334,"image":1338},"security-modernization",[1332],"security","Are you trading speed for security?",{"text":1335,"config":1336},"Get your security maturity score",{"href":1337,"dataGaName":1313,"dataGaLocation":791},"/assessments/security-modernization-assessment/",{"config":1339},{"src":1340},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1342,"paths":1343,"header":1346,"text":1347,"button":1348,"image":1353},"github-azure-migration",[1344,1345],"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":1349,"config":1350},"See how GitLab compares to GitHub",{"href":1351,"dataGaName":1352,"dataGaLocation":791},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1354},{"src":1328},{"header":1356,"blurb":1357,"button":1358,"secondaryButton":1363},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1359,"config":1360},"Get your free trial",{"href":1361,"dataGaName":592,"dataGaLocation":1362},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1064,"config":1364},{"href":916,"dataGaName":597,"dataGaLocation":1362},1786734929425]