[{"data":1,"prerenderedAt":723},["ShallowReactive",2],{"/en-us/blog/partial-clone-for-massive-repositories":3,"navigation-en-us":35,"banner-en-us":463,"footer-en-us":480,"James Ramsay":690,"next-steps-en-us":702,"footer-source-/en-us/blog/partial-clone-for-massive-repositories/":717},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":25,"_id":28,"_type":29,"title":30,"_source":31,"_file":32,"_stem":33,"_extension":34},"/en-us/blog/partial-clone-for-massive-repositories","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"How Git Partial Clone lets you fetch only the large file you need","Work faster with this experimental Partial Clone feature for huge Git repositories, saving you time, bandwidth, and storage, one large file at a time.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681131/Blog/Hero%20Images/partial-clone-for-massive-repositories.jpg","https://about.gitlab.com/blog/partial-clone-for-massive-repositories","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"How Git Partial Clone lets you fetch only the large file you need\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"James Ramsay\"}],\n        \"datePublished\": \"2020-03-13\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22},[18],"James Ramsay","2020-03-13","The Git project began nearly 15 years ago, on [April 7,\n\n2005](https://marc.info/?l=linux-kernel&m=111288700902396), and is now the\n\n[version control system](/topics/version-control/) of choice for developers.\nYet, there are certain types of projects that\n\noften do not use Git, particularly projects that have many large binary\nfiles,\n\nsuch as video games. One reason projects with large binary files don't use\nGit\n\nis because, when a Git repository is cloned, Git will download every version\nof\n\nevery file in the repo. For most use cases, downloading this history is a\n\nuseful feature, but it slows cloning and fetching for projects with large\nbinary\n\nfiles, assuming the project even fits on your computer.\n\n\n## What is Partial Clone?\n\n\nPartial Clone is a new feature of Git that replaces [Git\n\nLFS](https://git-lfs.github.com/) and makes working with very large\nrepositories\n\nbetter by teaching Git how to work without downloading every file. Partial\nClone\n\nhas been\n\n[years](https://public-inbox.org/git/xmqqeg4o27zw.fsf@gitster.mtv.corp.google.com/)\n\nin the making, with code contributions from GitLab, GitHub, Microsoft and\n\nGoogle. Today it is experimentally available in Git and GitLab, and can be\n\nenabled by administrators\n\n([docs](https://docs.gitlab.com/ee/topics/git/partial_clone.html)).\n\n\nPartial Clone speeds up fetching and cloning because less data is\n\ntransferred, and reduces disk usage on your local computer. For example,\ncloning\n\n[`gitlab-com/www-gitlab-com`](https://gitlab.com/gitlab-com/www-gitlab-com)\n\nusing Partial Clone (`--filter=blob:none`) is at least 50% faster, and\ntransfers\n\n70% less data.\n\n\nNote: Partial Clone is one specific performance optimization for very large\n\nrepositories. [Sparse\n\nCheckout](https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/)\n\nis a related optimization that is particularly focused on repositories with\n\ntremendously large numbers of files and revisions such as\n\n[Windows](https://devblogs.microsoft.com/bharry/the-largest-git-repo-on-the-planet/)\n\ncode base.\n\n\n## A brief history of large files\n\n\n\"What about Git LFS?\" you may ask. Doesn't LFS stand for \"large file\nstorage\"?\n\n\nPreviously, extra tools were required to store large files in Git. In 2010,\n\n[git-annex](https://git-annex.branchable.com/) was released, and five years\n\nlater in 2015, [Git LFS](https://git-lfs.github.com/) was released. Both\n\ngit-annex and Git LFS added large file support to Git in a similar way:\nInstead\n\nof storing a large file in Git, store a pointer file that links to the large\n\nfile. Then, when someone needs a large file, they can download it on-demand\n\nusing the pointer.\n\n\nThe criticism of this approach is that there are now two places to store\nfiles,\n\nin Git or in Git LFS. Which means that everyone must remember that big files\nneed\n\nto go in Git LFS to keep the Git repo small and fast. There are downsides to\n\nthis approach. Besides being susceptible to human error, the pointer encodes\n\ndecisions based on bandwidth and file type into the structure of the\nrepository\n\nthat influence all the people using the repository. Our assumptions about\n\nbandwidth and storage are likely to change over time, and vary by the\nlocation,\n\nbut decisions encoded in the repository are not flexible. Administrators and\n\ndevelopers alike benefit from flexibility in where to store large files, and\n\nwhich files to download.\n\n\nPartial Clone solves these problems by removing the need for two classes of\n\nstorage, and special pointers. Let's walk through an example to understand\nhow.\n\n\n## How to get started with Partial Clone\n\n\nLet's continue to use `gitlab-com/www-gitlab-com` as an example project,\nsince\n\nit has quite a lot of images. For a larger repository, like a video game\nwith\n\ndetailed textures and models that could take up a lot of disk space, the\nbenefits will be even more significant.\n\n\nInstead of a vanilla `git clone`, we will include a filter spec which\ncontrols\n\nwhat is excluded when fetching data. In this situation, we just want to\nexclude\n\nlarge binary files. I've included `--no-checkout` so we can more clearly\nobserve\n\nwhat is happening.\n\n\n```bash\n\ngit clone --filter=blob:none --no-checkout\ngit@gitlab.com/gitlab-com/www-gitlab-com.git\n\n# Cloning into 'www-gitlab-com'...\n\n# remote: Enumerating objects: 624541, done.\n\n# remote: Counting objects: 100% (624541/624541), done.\n\n# remote: Compressing objects: 100% (151886/151886), done.\n\n# remote: Total 624541 (delta 432983), reused 622339 (delta 430843),\npack-reused 0\n\n# Receiving objects: 100% (624541/624541), 74.61 MiB | 8.14 MiB/s, done.\n\n# Resolving deltas: 100% (432983/432983), done.\n\n\n```\n\n\nAbove we explicitly told Git not to checkout the default branch. Normally\n\n`checkout` doesn't require fetching any data from the server, because we\nhave\n\neverything locally. When using Partial Clone, since we are deliberately not\ndownloading everything, Git will need to fetch any missing files when doing\na\n\ncheckout.\n\n\n```bash\n\ngit checkout master\n\n# remote: Enumerating objects: 12080, done.\n\n# remote: Counting objects: 100% (12080/12080), done.\n\n# remote: Compressing objects: 100% (11640/11640), done.\n\n# remote: Total 12080 (delta 442), reused 9773 (delta 409), pack-reused 0\n\n# Receiving objects: 100% (12080/12080), 1.10 GiB | 8.49 MiB/s, done.\n\n# Resolving deltas: 100% (442/442), done.\n\n# Updating files: 100% (12342/12342), done.\n\n# Filtering content: 100% (3/3), 131.24 MiB | 4.73 MiB/s, done.\n\n```\n\n\nIf we checkout a different branch or commit, we'll need to download more\nmissing\n\nfiles.\n\n\n```bash\n\ngit checkout 92d1f39b60f957d0bc3c5621bb3e17a3984bdf72\n\n# remote: Enumerating objects: 1968, done.\n\n# remote: Counting objects: 100% (1968/1968), done.\n\n# remote: Compressing objects: 100% (1953/1953), done.\n\n# remote: Total 1968 (delta 23), reused 1623 (delta 15), pack-reused 0\n\n# Receiving objects: 100% (1968/1968), 327.44 MiB | 8.83 MiB/s, done.\n\n# Resolving deltas: 100% (23/23), done.\n\n# Updating files: 100% (2255/2255), done.\n\n# Note: switching to '92d1f39b60f957d0bc3c5621bb3e17a3984bdf72'.\n\n```\n\n\nGit remembers the filter spec we provided when cloning the repository so\nthat\n\nfetching updates will also exclude large files until we need them.\n\n\n```bash\n\ngit config remote.origin.promisor\n\n# true\n\n\ngit config remote.origin.partialclonefilter\n\n# blob:none\n\n```\n\n\nWhen committing changes, you simply commit binary files like you would any\nother\n\nfile. There is no extra tool to install or configure, no need to treat big\nfiles\n\ndifferently to small files.\n\n\n## Network and Storage\n\n\nIf you are already using [Git LFS](https://git-lfs.github.com/) today, you\nmight\n\nbe aware that large files are stored and transferred differently to regular\nGit\n\nobjects. On GitLab.com, Git LFS objects are stored in object storage (like\nAWS\n\nS3) rather than fast attached storage (like SSD), and transferred over HTTP\neven\n\nwhen using SSH for regular Git objects. Using object storage has the\nadvantage\n\nof reducing storage costs for large binary files, while using simpler HTTP\n\nrequests for large downloads allows the possibility of resumable and\nparallel\n\ndownloads.\n\n\nPartial Clone\n\n[already](https://public-inbox.org/git/20190625134039.21707-1-chriscool@tuxfamily.org/)\n\nsupports more than one remote, and work is underway to allow large files to\nbe\n\nstored in a different location such as object storage. Unlike Git LFS,\nhowever,\n\nthe repository or instance administrator will be able to choose which\nobjects\n\nshould be stored where, and change this configuration over time if needed.\n\n\nFollow the epic for [improved large file\n\nstorage](https://gitlab.com/groups/gitlab-org/-/epics/1487) to learn more\nand\n\nfollow our progress.\n\n\n## Performance\n\n\nWhen fetching new objects from the Git server using a [filter\n\nspec](https://github.com/git/git/blob/v2.25.0/Documentation/rev-list-options.txt#L735)\n to exclude objects from the response, Git will check each object and exclude\n any that match the filter spec. In [Git\n 2.25](https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.25.0.txt),\n the most recent version, filtering has not been optimized for performance.\n\n[Jeff King (Peff)](https://github.com/peff/) (GitHub) recently\n\n[contributed](https://public-inbox.org/git/20200214182147.GA654525@coredump.intra.peff.net/)\n\nperformance improvements for blob size filtering, which will likely be\nincluded\n\nin [Git 2.26](https://gitlab.com/gitlab-org/gitaly/issues/2497), and our\nplan is\n\nto include it in GitLab 12.10 release.\n\n\nOptimizing the sparse filter spec option (`--filter:sparse`), which filters\n\nbased on file path is more complex because blobs, which contain the file\n\ncontent, do not include file path information. The directory structure of a\n\nrepository is stored in tree objects.\n\n\nFollow the epic for [Partial Clone performance\n\nimprovements](https://gitlab.com/groups/gitlab-org/-/epics/1671) to learn\nmore\n\nand follow our progress.\n\n\n## Usability\n\n\nOne of the drawbacks of Git LFS was that it required installing an\nadditional\n\ntool. In comparison, Partial Clone does not require any additional tools.\n\nHowever, it does require learning new options and configurations, such as to\n\nclone using the `--filter` option.\n\n\nWe want to make it easy for people get their work done, who simply desire\nGit to\n\njust work. They shouldn't need to work out which is the optimal blob size\nfilter\n\nspec for a project? Or what even is a filter spec?  While Partial Clone\nremains\n\nexperimental, we haven't made any changes to the GitLab interface to\nhighlight\n\nPartial Clone, but we are investigating this and welcome your feedback.\nPlease\n\njoin the conversation on this\n\n[issue](https://gitlab.com/gitlab-org/gitlab/issues/207744).\n\n\n## File locking and tool integrations\n\n\nAny conversation of large binary files, particularly in regards to video\n\ngames is incomplete without discussing file locking and tooling\nintegrations.\n\n\nUnlike plain text [source\ncode](/solutions/source-code-management/), resolving conflicts\nbetween different versions of\n\na binary file is often impossible. To prevent conflicts in binary file\nediting,\n\nan exclusive file lock is used, meaning only one person at a time can edit a\n\nsingle file, regardless of branches. If conflicts can't be resolved,\nallowing multiple\n\nversions of a individual file to be created in parallel on different\nbranches is a bug, not\n\na feature. GitLab already has basic file locking support, but it is really\nonly\n\nuseful for plain text because it only applies to the default branch, and is\nnot\n\nintegrated with any local tools.\n\n\nLocal tooling integrations are important for binary asset workflows, to\n\nautomatically propagate file locks to the local development environment, and\nto\n\nallow artists to work on assets without needing to use Git from the command\n\nline. Propagating file locks quickly to local development environments is\nalso\n\nimportant because it prevents work from being wasted before it even happens.\n\n\nFollow the [file locking](https://gitlab.com/groups/gitlab-org/-/epics/1488)\nand\n\n[integrations](https://gitlab.com/groups/gitlab-org/-/epics/2704) epics for\nmore\n\ninformation about what we're working on.\n\n\n## Conclusion\n\n\nLarge files are necessary for many projects, and Git will soon support this\n\nnatively, without the need for extra tools. Although Partial Clone is still\nan\n\nexperimental feature, we are making improvements with every release and the\n\nfeature is now ready for testing.\n\n\nThank you to the Git community for your work over the past years on\nimproving\n\nsupport for enormous repositories. Particularly, thank you to [Jeff\n\nKing](https://github.com/peff/) (GitHub) and [Christian\n\nCouder](https://about.gitlab.com/company/team/#chriscool) (senior backend\n\nengineer on Gitaly at GitLab) for your early experimentation with Partial\nClone,\n\nJonathan Tan (Google) and [Jeff Hostetler](https://github.com/jeffhostetler)\n\n(Microsoft) for contributing the [first\n\nimplementation](https://public-inbox.org/git/cover.1506714999.git.jonathantanmy@google.com/)\n\nof Partial Clone and promisor remotes, and the many others who've also\n\ncontributed.\n\n\nIf you are already using Partial Clone, or would like to help us test\nPartial\n\nClone on a large project, please get in touch with me, [James\n\nRamsay](https://about.gitlab.com/company/team/#jramsay) (group manager,\nproduct\n\nfor Create at GitLab), [Jordi\n\nMon](https://about.gitlab.com/company/team/#jordi_mon) (senior product\nmarketing\n\nmanager for Dev at GitLab), or your account manager.\n\n\nFor more information on Partial Clone, check out [the\ndocumentation](https://docs.gitlab.com/ee/topics/git/partial_clone.html).\n\n\nCover image by [Simon Boxus](https://unsplash.com/@simonlerouge) on\n\n[Unsplash](https://unsplash.com/photos/4ftI4lCcByM)\n\n{: .note}\n","open-source",[23,24],"git","performance",{"slug":26,"featured":6,"template":27},"partial-clone-for-massive-repositories","BlogPost","content:en-us:blog:partial-clone-for-massive-repositories.yml","yaml","Partial Clone For Massive Repositories","content","en-us/blog/partial-clone-for-massive-repositories.yml","en-us/blog/partial-clone-for-massive-repositories","yml",{"_path":36,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"data":38,"_id":459,"_type":29,"title":460,"_source":31,"_file":461,"_stem":462,"_extension":34},"/shared/en-us/main-navigation","en-us",{"logo":39,"freeTrial":44,"sales":49,"login":54,"items":59,"search":390,"minimal":421,"duo":440,"pricingDeployment":449},{"config":40},{"href":41,"dataGaName":42,"dataGaLocation":43},"/","gitlab logo","header",{"text":45,"config":46},"Get free trial",{"href":47,"dataGaName":48,"dataGaLocation":43},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":50,"config":51},"Talk to sales",{"href":52,"dataGaName":53,"dataGaLocation":43},"/sales/","sales",{"text":55,"config":56},"Sign in",{"href":57,"dataGaName":58,"dataGaLocation":43},"https://gitlab.com/users/sign_in/","sign in",[60,104,201,206,311,371],{"text":61,"config":62,"cards":64,"footer":87},"Platform",{"dataNavLevelOne":63},"platform",[65,71,79],{"title":61,"description":66,"link":67},"The most comprehensive AI-powered DevSecOps Platform",{"text":68,"config":69},"Explore our Platform",{"href":70,"dataGaName":63,"dataGaLocation":43},"/platform/",{"title":72,"description":73,"link":74},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":75,"config":76},"Meet GitLab Duo",{"href":77,"dataGaName":78,"dataGaLocation":43},"/gitlab-duo/","gitlab duo ai",{"title":80,"description":81,"link":82},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":83,"config":84},"Learn more",{"href":85,"dataGaName":86,"dataGaLocation":43},"/why-gitlab/","why gitlab",{"title":88,"items":89},"Get started with",[90,95,100],{"text":91,"config":92},"Platform Engineering",{"href":93,"dataGaName":94,"dataGaLocation":43},"/solutions/platform-engineering/","platform engineering",{"text":96,"config":97},"Developer Experience",{"href":98,"dataGaName":99,"dataGaLocation":43},"/developer-experience/","Developer experience",{"text":101,"config":102},"MLOps",{"href":103,"dataGaName":101,"dataGaLocation":43},"/topics/devops/the-role-of-ai-in-devops/",{"text":105,"left":106,"config":107,"link":109,"lists":113,"footer":183},"Product",true,{"dataNavLevelOne":108},"solutions",{"text":110,"config":111},"View all Solutions",{"href":112,"dataGaName":108,"dataGaLocation":43},"/solutions/",[114,139,162],{"title":115,"description":116,"link":117,"items":122},"Automation","CI/CD and automation to accelerate deployment",{"config":118},{"icon":119,"href":120,"dataGaName":121,"dataGaLocation":43},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[123,127,131,135],{"text":124,"config":125},"CI/CD",{"href":126,"dataGaLocation":43,"dataGaName":124},"/solutions/continuous-integration/",{"text":128,"config":129},"AI-Assisted Development",{"href":77,"dataGaLocation":43,"dataGaName":130},"AI assisted development",{"text":132,"config":133},"Source Code Management",{"href":134,"dataGaLocation":43,"dataGaName":132},"/solutions/source-code-management/",{"text":136,"config":137},"Automated Software Delivery",{"href":120,"dataGaLocation":43,"dataGaName":138},"Automated software delivery",{"title":140,"description":141,"link":142,"items":147},"Security","Deliver code faster without compromising security",{"config":143},{"href":144,"dataGaName":145,"dataGaLocation":43,"icon":146},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[148,152,157],{"text":149,"config":150},"Application Security Testing",{"href":144,"dataGaName":151,"dataGaLocation":43},"Application security testing",{"text":153,"config":154},"Software Supply Chain Security",{"href":155,"dataGaLocation":43,"dataGaName":156},"/solutions/supply-chain/","Software supply chain security",{"text":158,"config":159},"Software Compliance",{"href":160,"dataGaName":161,"dataGaLocation":43},"/solutions/software-compliance/","software compliance",{"title":163,"link":164,"items":169},"Measurement",{"config":165},{"icon":166,"href":167,"dataGaName":168,"dataGaLocation":43},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[170,174,178],{"text":171,"config":172},"Visibility & Measurement",{"href":167,"dataGaLocation":43,"dataGaName":173},"Visibility and Measurement",{"text":175,"config":176},"Value Stream Management",{"href":177,"dataGaLocation":43,"dataGaName":175},"/solutions/value-stream-management/",{"text":179,"config":180},"Analytics & Insights",{"href":181,"dataGaLocation":43,"dataGaName":182},"/solutions/analytics-and-insights/","Analytics and insights",{"title":184,"items":185},"GitLab for",[186,191,196],{"text":187,"config":188},"Enterprise",{"href":189,"dataGaLocation":43,"dataGaName":190},"/enterprise/","enterprise",{"text":192,"config":193},"Small Business",{"href":194,"dataGaLocation":43,"dataGaName":195},"/small-business/","small business",{"text":197,"config":198},"Public Sector",{"href":199,"dataGaLocation":43,"dataGaName":200},"/solutions/public-sector/","public sector",{"text":202,"config":203},"Pricing",{"href":204,"dataGaName":205,"dataGaLocation":43,"dataNavLevelOne":205},"/pricing/","pricing",{"text":207,"config":208,"link":210,"lists":214,"feature":298},"Resources",{"dataNavLevelOne":209},"resources",{"text":211,"config":212},"View all resources",{"href":213,"dataGaName":209,"dataGaLocation":43},"/resources/",[215,248,270],{"title":216,"items":217},"Getting started",[218,223,228,233,238,243],{"text":219,"config":220},"Install",{"href":221,"dataGaName":222,"dataGaLocation":43},"/install/","install",{"text":224,"config":225},"Quick start guides",{"href":226,"dataGaName":227,"dataGaLocation":43},"/get-started/","quick setup checklists",{"text":229,"config":230},"Learn",{"href":231,"dataGaLocation":43,"dataGaName":232},"https://university.gitlab.com/","learn",{"text":234,"config":235},"Product documentation",{"href":236,"dataGaName":237,"dataGaLocation":43},"https://docs.gitlab.com/","product documentation",{"text":239,"config":240},"Best practice videos",{"href":241,"dataGaName":242,"dataGaLocation":43},"/getting-started-videos/","best practice videos",{"text":244,"config":245},"Integrations",{"href":246,"dataGaName":247,"dataGaLocation":43},"/integrations/","integrations",{"title":249,"items":250},"Discover",[251,256,260,265],{"text":252,"config":253},"Customer success stories",{"href":254,"dataGaName":255,"dataGaLocation":43},"/customers/","customer success stories",{"text":257,"config":258},"Blog",{"href":259,"dataGaName":5,"dataGaLocation":43},"/blog/",{"text":261,"config":262},"Remote",{"href":263,"dataGaName":264,"dataGaLocation":43},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":266,"config":267},"TeamOps",{"href":268,"dataGaName":269,"dataGaLocation":43},"/teamops/","teamops",{"title":271,"items":272},"Connect",[273,278,283,288,293],{"text":274,"config":275},"GitLab Services",{"href":276,"dataGaName":277,"dataGaLocation":43},"/services/","services",{"text":279,"config":280},"Community",{"href":281,"dataGaName":282,"dataGaLocation":43},"/community/","community",{"text":284,"config":285},"Forum",{"href":286,"dataGaName":287,"dataGaLocation":43},"https://forum.gitlab.com/","forum",{"text":289,"config":290},"Events",{"href":291,"dataGaName":292,"dataGaLocation":43},"/events/","events",{"text":294,"config":295},"Partners",{"href":296,"dataGaName":297,"dataGaLocation":43},"/partners/","partners",{"backgroundColor":299,"textColor":300,"text":301,"image":302,"link":306},"#2f2a6b","#fff","Insights for the future of software development",{"altText":303,"config":304},"the source promo card",{"src":305},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":307,"config":308},"Read the latest",{"href":309,"dataGaName":310,"dataGaLocation":43},"/the-source/","the source",{"text":312,"config":313,"lists":315},"Company",{"dataNavLevelOne":314},"company",[316],{"items":317},[318,323,329,331,336,341,346,351,356,361,366],{"text":319,"config":320},"About",{"href":321,"dataGaName":322,"dataGaLocation":43},"/company/","about",{"text":324,"config":325,"footerGa":328},"Jobs",{"href":326,"dataGaName":327,"dataGaLocation":43},"/jobs/","jobs",{"dataGaName":327},{"text":289,"config":330},{"href":291,"dataGaName":292,"dataGaLocation":43},{"text":332,"config":333},"Leadership",{"href":334,"dataGaName":335,"dataGaLocation":43},"/company/team/e-group/","leadership",{"text":337,"config":338},"Team",{"href":339,"dataGaName":340,"dataGaLocation":43},"/company/team/","team",{"text":342,"config":343},"Handbook",{"href":344,"dataGaName":345,"dataGaLocation":43},"https://handbook.gitlab.com/","handbook",{"text":347,"config":348},"Investor relations",{"href":349,"dataGaName":350,"dataGaLocation":43},"https://ir.gitlab.com/","investor relations",{"text":352,"config":353},"Trust Center",{"href":354,"dataGaName":355,"dataGaLocation":43},"/security/","trust center",{"text":357,"config":358},"AI Transparency Center",{"href":359,"dataGaName":360,"dataGaLocation":43},"/ai-transparency-center/","ai transparency center",{"text":362,"config":363},"Newsletter",{"href":364,"dataGaName":365,"dataGaLocation":43},"/company/contact/","newsletter",{"text":367,"config":368},"Press",{"href":369,"dataGaName":370,"dataGaLocation":43},"/press/","press",{"text":372,"config":373,"lists":374},"Contact us",{"dataNavLevelOne":314},[375],{"items":376},[377,380,385],{"text":50,"config":378},{"href":52,"dataGaName":379,"dataGaLocation":43},"talk to sales",{"text":381,"config":382},"Get help",{"href":383,"dataGaName":384,"dataGaLocation":43},"/support/","get help",{"text":386,"config":387},"Customer portal",{"href":388,"dataGaName":389,"dataGaLocation":43},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":391,"login":392,"suggestions":399},"Close",{"text":393,"link":394},"To search repositories and projects, login to",{"text":395,"config":396},"gitlab.com",{"href":57,"dataGaName":397,"dataGaLocation":398},"search login","search",{"text":400,"default":401},"Suggestions",[402,404,408,410,414,418],{"text":72,"config":403},{"href":77,"dataGaName":72,"dataGaLocation":398},{"text":405,"config":406},"Code Suggestions (AI)",{"href":407,"dataGaName":405,"dataGaLocation":398},"/solutions/code-suggestions/",{"text":124,"config":409},{"href":126,"dataGaName":124,"dataGaLocation":398},{"text":411,"config":412},"GitLab on AWS",{"href":413,"dataGaName":411,"dataGaLocation":398},"/partners/technology-partners/aws/",{"text":415,"config":416},"GitLab on Google Cloud",{"href":417,"dataGaName":415,"dataGaLocation":398},"/partners/technology-partners/google-cloud-platform/",{"text":419,"config":420},"Why GitLab?",{"href":85,"dataGaName":419,"dataGaLocation":398},{"freeTrial":422,"mobileIcon":427,"desktopIcon":432,"secondaryButton":435},{"text":423,"config":424},"Start free trial",{"href":425,"dataGaName":48,"dataGaLocation":426},"https://gitlab.com/-/trials/new/","nav",{"altText":428,"config":429},"Gitlab Icon",{"src":430,"dataGaName":431,"dataGaLocation":426},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":428,"config":433},{"src":434,"dataGaName":431,"dataGaLocation":426},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":436,"config":437},"Get Started",{"href":438,"dataGaName":439,"dataGaLocation":426},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":441,"mobileIcon":445,"desktopIcon":447},{"text":442,"config":443},"Learn more about GitLab Duo",{"href":77,"dataGaName":444,"dataGaLocation":426},"gitlab duo",{"altText":428,"config":446},{"src":430,"dataGaName":431,"dataGaLocation":426},{"altText":428,"config":448},{"src":434,"dataGaName":431,"dataGaLocation":426},{"freeTrial":450,"mobileIcon":455,"desktopIcon":457},{"text":451,"config":452},"Back to pricing",{"href":204,"dataGaName":453,"dataGaLocation":426,"icon":454},"back to pricing","GoBack",{"altText":428,"config":456},{"src":430,"dataGaName":431,"dataGaLocation":426},{"altText":428,"config":458},{"src":434,"dataGaName":431,"dataGaLocation":426},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":464,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"title":465,"button":466,"image":471,"config":475,"_id":477,"_type":29,"_source":31,"_file":478,"_stem":479,"_extension":34},"/shared/en-us/banner","is now in public beta!",{"text":467,"config":468},"Try the Beta",{"href":469,"dataGaName":470,"dataGaLocation":43},"/gitlab-duo/agent-platform/","duo banner",{"altText":472,"config":473},"GitLab Duo Agent Platform",{"src":474},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":476},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":481,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"data":482,"_id":686,"_type":29,"title":687,"_source":31,"_file":688,"_stem":689,"_extension":34},"/shared/en-us/main-footer",{"text":483,"source":484,"edit":490,"contribute":495,"config":500,"items":505,"minimal":678},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":485,"config":486},"View page source",{"href":487,"dataGaName":488,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":491,"config":492},"Edit this page",{"href":493,"dataGaName":494,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":496,"config":497},"Please contribute",{"href":498,"dataGaName":499,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":501,"facebook":502,"youtube":503,"linkedin":504},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[506,529,585,614,648],{"title":61,"links":507,"subMenu":512},[508],{"text":509,"config":510},"DevSecOps platform",{"href":70,"dataGaName":511,"dataGaLocation":489},"devsecops platform",[513],{"title":202,"links":514},[515,519,524],{"text":516,"config":517},"View plans",{"href":204,"dataGaName":518,"dataGaLocation":489},"view plans",{"text":520,"config":521},"Why Premium?",{"href":522,"dataGaName":523,"dataGaLocation":489},"/pricing/premium/","why premium",{"text":525,"config":526},"Why Ultimate?",{"href":527,"dataGaName":528,"dataGaLocation":489},"/pricing/ultimate/","why ultimate",{"title":530,"links":531},"Solutions",[532,537,539,541,546,551,555,558,562,567,569,572,575,580],{"text":533,"config":534},"Digital transformation",{"href":535,"dataGaName":536,"dataGaLocation":489},"/topics/digital-transformation/","digital transformation",{"text":149,"config":538},{"href":144,"dataGaName":149,"dataGaLocation":489},{"text":138,"config":540},{"href":120,"dataGaName":121,"dataGaLocation":489},{"text":542,"config":543},"Agile development",{"href":544,"dataGaName":545,"dataGaLocation":489},"/solutions/agile-delivery/","agile delivery",{"text":547,"config":548},"Cloud transformation",{"href":549,"dataGaName":550,"dataGaLocation":489},"/topics/cloud-native/","cloud transformation",{"text":552,"config":553},"SCM",{"href":134,"dataGaName":554,"dataGaLocation":489},"source code management",{"text":124,"config":556},{"href":126,"dataGaName":557,"dataGaLocation":489},"continuous integration & delivery",{"text":559,"config":560},"Value stream management",{"href":177,"dataGaName":561,"dataGaLocation":489},"value stream management",{"text":563,"config":564},"GitOps",{"href":565,"dataGaName":566,"dataGaLocation":489},"/solutions/gitops/","gitops",{"text":187,"config":568},{"href":189,"dataGaName":190,"dataGaLocation":489},{"text":570,"config":571},"Small business",{"href":194,"dataGaName":195,"dataGaLocation":489},{"text":573,"config":574},"Public sector",{"href":199,"dataGaName":200,"dataGaLocation":489},{"text":576,"config":577},"Education",{"href":578,"dataGaName":579,"dataGaLocation":489},"/solutions/education/","education",{"text":581,"config":582},"Financial services",{"href":583,"dataGaName":584,"dataGaLocation":489},"/solutions/finance/","financial services",{"title":207,"links":586},[587,589,591,593,596,598,600,602,604,606,608,610,612],{"text":219,"config":588},{"href":221,"dataGaName":222,"dataGaLocation":489},{"text":224,"config":590},{"href":226,"dataGaName":227,"dataGaLocation":489},{"text":229,"config":592},{"href":231,"dataGaName":232,"dataGaLocation":489},{"text":234,"config":594},{"href":236,"dataGaName":595,"dataGaLocation":489},"docs",{"text":257,"config":597},{"href":259,"dataGaName":5,"dataGaLocation":489},{"text":252,"config":599},{"href":254,"dataGaName":255,"dataGaLocation":489},{"text":261,"config":601},{"href":263,"dataGaName":264,"dataGaLocation":489},{"text":274,"config":603},{"href":276,"dataGaName":277,"dataGaLocation":489},{"text":266,"config":605},{"href":268,"dataGaName":269,"dataGaLocation":489},{"text":279,"config":607},{"href":281,"dataGaName":282,"dataGaLocation":489},{"text":284,"config":609},{"href":286,"dataGaName":287,"dataGaLocation":489},{"text":289,"config":611},{"href":291,"dataGaName":292,"dataGaLocation":489},{"text":294,"config":613},{"href":296,"dataGaName":297,"dataGaLocation":489},{"title":312,"links":615},[616,618,620,622,624,626,628,632,637,639,641,643],{"text":319,"config":617},{"href":321,"dataGaName":314,"dataGaLocation":489},{"text":324,"config":619},{"href":326,"dataGaName":327,"dataGaLocation":489},{"text":332,"config":621},{"href":334,"dataGaName":335,"dataGaLocation":489},{"text":337,"config":623},{"href":339,"dataGaName":340,"dataGaLocation":489},{"text":342,"config":625},{"href":344,"dataGaName":345,"dataGaLocation":489},{"text":347,"config":627},{"href":349,"dataGaName":350,"dataGaLocation":489},{"text":629,"config":630},"Sustainability",{"href":631,"dataGaName":629,"dataGaLocation":489},"/sustainability/",{"text":633,"config":634},"Diversity, inclusion and belonging (DIB)",{"href":635,"dataGaName":636,"dataGaLocation":489},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":352,"config":638},{"href":354,"dataGaName":355,"dataGaLocation":489},{"text":362,"config":640},{"href":364,"dataGaName":365,"dataGaLocation":489},{"text":367,"config":642},{"href":369,"dataGaName":370,"dataGaLocation":489},{"text":644,"config":645},"Modern Slavery Transparency Statement",{"href":646,"dataGaName":647,"dataGaLocation":489},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":649,"links":650},"Contact Us",[651,654,656,658,663,668,673],{"text":652,"config":653},"Contact an expert",{"href":52,"dataGaName":53,"dataGaLocation":489},{"text":381,"config":655},{"href":383,"dataGaName":384,"dataGaLocation":489},{"text":386,"config":657},{"href":388,"dataGaName":389,"dataGaLocation":489},{"text":659,"config":660},"Status",{"href":661,"dataGaName":662,"dataGaLocation":489},"https://status.gitlab.com/","status",{"text":664,"config":665},"Terms of use",{"href":666,"dataGaName":667,"dataGaLocation":489},"/terms/","terms of use",{"text":669,"config":670},"Privacy statement",{"href":671,"dataGaName":672,"dataGaLocation":489},"/privacy/","privacy statement",{"text":674,"config":675},"Cookie preferences",{"dataGaName":676,"dataGaLocation":489,"id":677,"isOneTrustButton":106},"cookie preferences","ot-sdk-btn",{"items":679},[680,682,684],{"text":664,"config":681},{"href":666,"dataGaName":667,"dataGaLocation":489},{"text":669,"config":683},{"href":671,"dataGaName":672,"dataGaLocation":489},{"text":674,"config":685},{"dataGaName":676,"dataGaLocation":489,"id":677,"isOneTrustButton":106},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[691],{"_path":692,"_dir":693,"_draft":6,"_partial":6,"_locale":7,"content":694,"config":697,"_id":699,"_type":29,"title":18,"_source":31,"_file":700,"_stem":701,"_extension":34},"/en-us/blog/authors/james-ramsay","authors",{"name":18,"config":695},{"headshot":7,"ctfId":696},"jramsay",{"template":698},"BlogAuthor","content:en-us:blog:authors:james-ramsay.yml","en-us/blog/authors/james-ramsay.yml","en-us/blog/authors/james-ramsay",{"_path":703,"_dir":37,"_draft":6,"_partial":6,"_locale":7,"header":704,"eyebrow":705,"blurb":706,"button":707,"secondaryButton":711,"_id":713,"_type":29,"title":714,"_source":31,"_file":715,"_stem":716,"_extension":34},"/shared/en-us/next-steps","Start shipping better software faster","50%+ of the Fortune 100 trust GitLab","See what your team can do with the intelligent\n\n\nDevSecOps platform.\n",{"text":45,"config":708},{"href":709,"dataGaName":48,"dataGaLocation":710},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":50,"config":712},{"href":52,"dataGaName":53,"dataGaLocation":710},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":718,"content":719,"config":722,"_id":28,"_type":29,"title":30,"_source":31,"_file":32,"_stem":33,"_extension":34},{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},{"title":9,"description":10,"authors":720,"heroImage":11,"date":19,"body":20,"category":21,"tags":721},[18],[23,24],{"slug":26,"featured":6,"template":27},1760469777464]