[{"data":1,"prerenderedAt":719},["ShallowReactive",2],{"/en-us/blog/whats-new-in-git-2-47-0/":3,"navigation-en-us":37,"banner-en-us":464,"footer-en-us":481,"Justin Tobler":691,"next-steps-en-us":704},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":26,"_id":30,"_type":31,"title":32,"_source":33,"_file":34,"_stem":35,"_extension":36},"/en-us/blog/whats-new-in-git-2-47-0","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"What's new in Git 2.47.0?","Learn about the latest version of Git, including new global variables to configure reference and object hash formats. Discover contributions from GitLab's Git team and the wider Git community.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663691/Blog/Hero%20Images/AdobeStock_752438815.jpg","https://about.gitlab.com/blog/whats-new-in-git-2-47-0","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"What's new in Git 2.47.0?\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Justin Tobler\"}],\n        \"datePublished\": \"2024-10-07\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22},[18],"Justin Tobler","2024-10-07","The Git project recently released [Git\nv2.47.0](https://lore.kernel.org/git/xmqqa5fg9bsz.fsf@gitster.g/).\n\nLet's look at a few notable highlights from this release, which includes\n\ncontributions from GitLab's Git team and the wider Git community.\n\n\n## New global configuration options\n\n\nIf you have been following recent Git releases, you are probably familiar\nwith the new \"reftable\" reference backend that became available with\n\n[Git version\n2.45](https://about.gitlab.com/blog/whats-new-in-git-2-45-0/).\nCheck out our [Beginner's guide to the Git reftable\nformat](https://about.gitlab.com/blog/a-beginners-guide-to-the-git-reftable-format/)\nto learn more. Previously, in order to initialize a repository with the\n\"reftable\" format, the `--ref-format` option needed to be passed to\ngit-init(1):\n\n\n```sh\n\n$ git init --ref-format reftable\n\n```\n\n\nWith the 2.47 release, Git now has the `init.defaultRefFormat` configuration\n\noption, which tells Git which reference backend to use when initializing a\n\nrepository. This can be used to override the default \"files\" backend and\nbegin using the \"reftable\" backend. To configure, execute the following:\n\n\n```sh\n\n$ git config set --global init.defaultRefFormat reftable\n\n```\n\n\nAs some of you may know, the object hash format used by Git repositories is\n\nalso configurable. By default, repositories are initialized to use the SHA-1\n\nobject format. An alternative is the SHA-256 format, which is more secure\nand future-proof. You can read more about this in one of our\n\n[previous blog posts on SHA-256 support in\nGitaly](https://about.gitlab.com/blog/sha256-support-in-gitaly/#what-is-sha-256%3F).\nA SHA-256 repository can be created by passing the `--object-format` option\nto git-init(1):\n\n\n```sh\n\n$ git init --object-format sha256\n\n```\n\n\nIn this Git release another configuration option,\n`init.defaultObjectFormat`, has been added. This option tells Git which\nobject format to use by default when initializing a repository. To\nconfigure, execute the following:\n\n\n```sh\n\n$ git config set --global init.defaultObjectFormat sha256\n\n```\n\n\nSomething to note, SHA-256 repositories are not interoperable with SHA-1\n\nrepositories and not all forges support hosting SHA-256 repositories. GitLab\n\nrecently announced [experimental support for SHA-256\nrepositories](https://about.gitlab.com/blog/gitlab-now-supports-sha256-repositories/)\nif you want to try it out.\n\n\nThese options provide a useful mechanism to begin using these repository\n\nfeatures without having to consciously think about it every time you\ninitialize a new repository.\n\n\nThis project was led by [Patrick Steinhardt](https://gitlab.com/pks-gitlab).\n\n\n## New subcommand for git-refs(1)\n\n\nIn the previous Git release, the\n[git-refs(1)](https://git-scm.com/docs/git-refs) command was introduced to\nprovide low-level access to references in a\n\nrepository and provided the \"migrate\" subcommand to convert between\nreference backends. This release adds a new \"verify\" subcommand which allows\nthe user to check the reference database for consistency. To verify the\nconsistency of a repository, we often execute\n[git-fsck(1)](https://git-scm.com/docs/git-fsck).\n\n\nNotably, this command does not explicitly verify the reference database of\nthe repository though. With the introduction of the \"reftable\" reference\nformat, which is a binary format and thus harder to inspect manually, it is\nnow even more important that tooling be established to fill this gap. Let's\nset up a repository with an invalid reference to demonstrate:\n\n\n```sh\n\n# The \"files\" backend is used so we can easily create an invalid reference.\n\n$ git init --ref-format files\n\n$ git commit --allow-empty -m \"init\"\n\n# A lone '@' is not a valid reference name.\n\n$ cp .git/refs/heads/main .git/refs/heads/@\n\n$ git refs verify\n\nerror: refs/heads/@: badRefName: invalid refname format\n\n```\n\n\nWe can see the invalid reference was detected and an error message printed\nto the user. While this tooling is not something the end-user will likely\nrun, it is particularly useful on the server side to ensure repositories\nremain consistent. Eventually, the goal is to integrate this command as part\nof git-fsck(1) to provide a unified way to execute repository consistency\nchecks.\n\n\nThis project was led by Jialuo She as part of the Google Summer of Code. To\n\nlearn more, you can read Jialuo's [GSoC\nreport](https://luolibrary.com/2024/08/25/GSoC-Final-Report/).\n\n\n## Ongoing reftables work\n\n\nThis release also includes fixes for some bugs found in the \"reftable\"\nbackend. One of these bugs is particularly interesting and revolves around\nhow table compaction was being performed.\n\n\nAs you may recall, the reftable backend consists of a series of tables\n\ncontaining the state of all the references in the repository. Each atomic\nset of reference changes results in a new table being written and recorded\nin the \"tables.list\" file. To reduce the number of tables present, after\neach reference update, the tables are compacted to follow a geometric\nsequence by file size. After the tables are compacted, the \"tables.list\"\nfile is updated to reflect the new on-disk state of the reftables.\n\n\nBy design, concurrent table writes and compaction is allowed.\nSynchronization at certain points is controlled through the use of lock\nfiles. For example, when compaction is starting the \"tables.list\" file is\ninitially locked so the file can be consistently read and the tables\nrequiring compaction can also be locked. Since the actual table compaction\ncan take a while the lock is released, allowing concurrent writes to\nproceed. This is safe because concurrent writers know that they must not\nmodify the now-locked tables which are about to be compacted. When the newly\ncompacted tables have finished being written, the \"tables.list\" file is\nlocked again and this time it is updated to reflect the new table state.\n\n\nThere is a problem though: What happens if a concurrent reference update\nwrites a new table to the \"tables.list\" in the middle of table compaction\nafter the initial lock was released, but before the new list file was\nwritten? If this race were to occur, the compacting process would not know\nabout the new table and consequently rewrite the \"tables.list\" file without\nthe new table. This effectively drops the concurrent update and could result\nin references not being added, updated, or removed as expected.\n\n\nLuckily, the fix to remediate this problem is rather straightforward. When\nthe compacting process acquires the lock to write to the \"tables.list\" it\nmust first check if any updates to the file have occurred and reload the\nfile. Doing so ensures any concurrent table updates are also reflected\nappropriately. For more information on this fix, check out the corresponding\n\n[mailing-list\nthread](https://lore.kernel.org/git/cover.1722435214.git.ps@pks.im/).\n\n\nThis project was led by [Patrick Steinhardt](https://gitlab.com/pks-gitlab).\n\n\n## Fixes for git-maintenance(1)\n\n\nAs a repository grows, it is important that it is properly maintained. By\n\ndefault, Git executes\n\n[git-maintenance(1)](https://git-scm.com/docs/git-maintenance) after certain\n\noperations to keep the repository healthy. To avoid performing unnecessary\n\nmaintenance, the `--auto` option is specified which uses defined heuristics\nto determine whether maintenance tasks should be run. The command can be\n\nconfigured to perform various different maintenance tasks, but by default,\nit simply executes [git-gc(1)](https://git-scm.com/docs/git-gc) in the\nbackground and allows the user to carry on with their business.\n\n\nThis works as expected until maintenance is configured to perform\nnon-default maintenance tasks. When this happens the configured maintenance\ntasks are performed in the foreground and the initial maintenance process\ndoesn't exit until all tasks complete. Only the \"gc\" task detaches into the\nbackground as expected. It turns out this was because git-gc(1), when run\nwith `--auto`, was accidentally detaching itself, and other maintenance\ntasks had no means to do so. This had the potential to slow down certain Git\ncommands as auto-maintenance had to run to completion before they could\nexit.\n\n\nThis release addresses this issue by teaching git-maintenance(1) the\n`--detach` option, which allows the whole git-maintenance(1) process to run\nin the background instead of individual tasks. The auto-maintenance\nperformed by Git was also updated to use this new option. For more\ninformation on this fix, check out the [mailing-list\nthread](https://lore.kernel.org/git/cover.1723533091.git.ps@pks.im/).\n\n\nA little earlier it was mentioned that the auto-maintenance uses a set of\n\nheuristics to determine whether or not certain maintenance operations should\nbe performed. Unfortunately for the \"files\" reference backend, when\n\n[git-pack-refs(1)](https://git-scm.com/docs/git-pack-refs) executes with the\n\n`--auto` option, there is no such heuristic and loose references are\n\nunconditionally packed into a \"packed-refs\" file. For repositories with many\n\nreferences, rewriting the \"packed-refs\" file can be quite time-consuming.\n\n\nThis release also introduces a heuristic that decides whether it should pack\n\nloose references in the \"files\" backend. This heuristic takes into account\nthe size of the existing \"packed-refs\" file and the number of loose\nreferences present in the repository. The larger the \"packed-refs\" file\ngets, the higher the threshold for the number of loose references before\nreference packing occurs. This effectively makes reference packing in the\n\"files\" backend less aggressive while still keeping the repository in a\nmaintained state. Check out the [mailing-list\nthread](https://lore.kernel.org/git/cover.1725280479.git.ps@pks.im/)\n\nfor more info.\n\n\nThis project was led by [Patrick Steinhardt](https://gitlab.com/pks-gitlab).\n\n\n## Code refactoring and maintainability improvements\n\n\nIn addition to functional changes, there is also work being done to refactor\n\nand clean up the code. These improvements are also valuable because they\nhelp move the project closer toward the longstanding goal of libifying its\ninternal components. To read more, here is a recent\n\n[update\nthread](https://lore.kernel.org/git/eoy2sjhnul57g6crprxi3etgeuacjmgxpl4yllstih7woyuebm@bd62ib3fi2ju/)\nregarding libification.\n\n\nOne area of improvement has been around resolving memory leaks. The Git\nproject has quite a few memory leaks. For the most part, these leaks don't\ncause much trouble because usually a Git process only runs for a short\namount of time and the system cleans up after, but in the context of\nlibification it becomes something that should be addressed. Tests in the\nproject can be compiled with a leak sanitizer to detect leaks, but due to\nthe presence of existing leaks, it is difficult to validate and enforce that\nnew changes do not introduce new leaks. There has been an ongoing effort to\nfix all memory leaks surfaced by existing tests in the project. Leak-free\ntests are subsequently marked with `TEST_PASSES_SANITIZE_LEAK=true` to\nindicate that they are expected to be free of leaks going forward. Prior to\nthis release, the project had 223 test files containing memory leaks. This\nhas now been whittled down to just 60 in this release.\n\n\nAnother ongoing effort has been to reduce the use of global variables\n\nthroughout the project. One such notorious global variable is\n`the_repository`, which contains the state of the repository being operated\non and is referenced all over the project. This release comes with a number\nof patches that remove uses of `the_repository` in favor of directly passing\nthe value where needed. Subsystems in the Git project that still depend on\n`the_repository` have `USE_THE_REPOSITORY_VARIABLE` defined allowing the\nglobal to be used. Now the refs, config, and path subsystems no longer rely\non its use.\n\n\nThis project was led by [Patrick Steinhardt](https://gitlab.com/pks-gitlab)\n\nwith the help of [John Cai](https://gitlab.com/jcaigitlab) and\n\n[Jeff King](https://github.com/peff).\n\n\n## Read more\n\n\nThis blog post highlighted just a few of the contributions made by GitLab\nand the wider Git community for this latest release. You can learn about\nthese from the [official release\nannouncement](https://lore.kernel.org/git/xmqqa5fg9bsz.fsf@gitster.g/)\n\nof the Git project. Also, check out our [previous Git release blog\nposts](https://about.gitlab.com/blog/tags/git/)\n\nto see other past highlights of contributions from GitLab team members.\n\n\n- [What’s new in Git\n2.46.0?](https://about.gitlab.com/blog/whats-new-in-git-2-46-0/)\n\n- [What's new in Git\n2.45.0?](https://about.gitlab.com/blog/whats-new-in-git-2-45-0/)\n\n- [A beginner's guide to the Git reftable\nformat](https://about.gitlab.com/blog/a-beginners-guide-to-the-git-reftable-format/)\n\n- [Git pull vs. git fetch: What's the\ndifference?](https://about.gitlab.com/blog/git-pull-vs-git-fetch-whats-the-difference/)\n","open-source",[23,24,25],"git","open source","community",{"slug":27,"featured":28,"template":29},"whats-new-in-git-2-47-0",true,"BlogPost","content:en-us:blog:whats-new-in-git-2-47-0.yml","yaml","Whats New In Git 2 47 0","content","en-us/blog/whats-new-in-git-2-47-0.yml","en-us/blog/whats-new-in-git-2-47-0","yml",{"_path":38,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"data":40,"_id":460,"_type":31,"title":461,"_source":33,"_file":462,"_stem":463,"_extension":36},"/shared/en-us/main-navigation","en-us",{"logo":41,"freeTrial":46,"sales":51,"login":56,"items":61,"search":391,"minimal":422,"duo":441,"pricingDeployment":450},{"config":42},{"href":43,"dataGaName":44,"dataGaLocation":45},"/","gitlab logo","header",{"text":47,"config":48},"Get free trial",{"href":49,"dataGaName":50,"dataGaLocation":45},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":52,"config":53},"Talk to sales",{"href":54,"dataGaName":55,"dataGaLocation":45},"/sales/","sales",{"text":57,"config":58},"Sign in",{"href":59,"dataGaName":60,"dataGaLocation":45},"https://gitlab.com/users/sign_in/","sign in",[62,106,203,208,312,372],{"text":63,"config":64,"cards":66,"footer":89},"Platform",{"dataNavLevelOne":65},"platform",[67,73,81],{"title":63,"description":68,"link":69},"The most comprehensive AI-powered DevSecOps Platform",{"text":70,"config":71},"Explore our Platform",{"href":72,"dataGaName":65,"dataGaLocation":45},"/platform/",{"title":74,"description":75,"link":76},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":77,"config":78},"Meet GitLab Duo",{"href":79,"dataGaName":80,"dataGaLocation":45},"/gitlab-duo/","gitlab duo ai",{"title":82,"description":83,"link":84},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":85,"config":86},"Learn more",{"href":87,"dataGaName":88,"dataGaLocation":45},"/why-gitlab/","why gitlab",{"title":90,"items":91},"Get started with",[92,97,102],{"text":93,"config":94},"Platform Engineering",{"href":95,"dataGaName":96,"dataGaLocation":45},"/solutions/platform-engineering/","platform engineering",{"text":98,"config":99},"Developer Experience",{"href":100,"dataGaName":101,"dataGaLocation":45},"/developer-experience/","Developer experience",{"text":103,"config":104},"MLOps",{"href":105,"dataGaName":103,"dataGaLocation":45},"/topics/devops/the-role-of-ai-in-devops/",{"text":107,"left":28,"config":108,"link":110,"lists":114,"footer":185},"Product",{"dataNavLevelOne":109},"solutions",{"text":111,"config":112},"View all Solutions",{"href":113,"dataGaName":109,"dataGaLocation":45},"/solutions/",[115,140,164],{"title":116,"description":117,"link":118,"items":123},"Automation","CI/CD and automation to accelerate deployment",{"config":119},{"icon":120,"href":121,"dataGaName":122,"dataGaLocation":45},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[124,128,132,136],{"text":125,"config":126},"CI/CD",{"href":127,"dataGaLocation":45,"dataGaName":125},"/solutions/continuous-integration/",{"text":129,"config":130},"AI-Assisted Development",{"href":79,"dataGaLocation":45,"dataGaName":131},"AI assisted development",{"text":133,"config":134},"Source Code Management",{"href":135,"dataGaLocation":45,"dataGaName":133},"/solutions/source-code-management/",{"text":137,"config":138},"Automated Software Delivery",{"href":121,"dataGaLocation":45,"dataGaName":139},"Automated software delivery",{"title":141,"description":142,"link":143,"items":148},"Security","Deliver code faster without compromising security",{"config":144},{"href":145,"dataGaName":146,"dataGaLocation":45,"icon":147},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[149,154,159],{"text":150,"config":151},"Application Security Testing",{"href":152,"dataGaName":153,"dataGaLocation":45},"/solutions/application-security-testing/","Application security testing",{"text":155,"config":156},"Software Supply Chain Security",{"href":157,"dataGaLocation":45,"dataGaName":158},"/solutions/supply-chain/","Software supply chain security",{"text":160,"config":161},"Software Compliance",{"href":162,"dataGaName":163,"dataGaLocation":45},"/solutions/software-compliance/","software compliance",{"title":165,"link":166,"items":171},"Measurement",{"config":167},{"icon":168,"href":169,"dataGaName":170,"dataGaLocation":45},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[172,176,180],{"text":173,"config":174},"Visibility & Measurement",{"href":169,"dataGaLocation":45,"dataGaName":175},"Visibility and Measurement",{"text":177,"config":178},"Value Stream Management",{"href":179,"dataGaLocation":45,"dataGaName":177},"/solutions/value-stream-management/",{"text":181,"config":182},"Analytics & Insights",{"href":183,"dataGaLocation":45,"dataGaName":184},"/solutions/analytics-and-insights/","Analytics and insights",{"title":186,"items":187},"GitLab for",[188,193,198],{"text":189,"config":190},"Enterprise",{"href":191,"dataGaLocation":45,"dataGaName":192},"/enterprise/","enterprise",{"text":194,"config":195},"Small Business",{"href":196,"dataGaLocation":45,"dataGaName":197},"/small-business/","small business",{"text":199,"config":200},"Public Sector",{"href":201,"dataGaLocation":45,"dataGaName":202},"/solutions/public-sector/","public sector",{"text":204,"config":205},"Pricing",{"href":206,"dataGaName":207,"dataGaLocation":45,"dataNavLevelOne":207},"/pricing/","pricing",{"text":209,"config":210,"link":212,"lists":216,"feature":299},"Resources",{"dataNavLevelOne":211},"resources",{"text":213,"config":214},"View all resources",{"href":215,"dataGaName":211,"dataGaLocation":45},"/resources/",[217,250,272],{"title":218,"items":219},"Getting started",[220,225,230,235,240,245],{"text":221,"config":222},"Install",{"href":223,"dataGaName":224,"dataGaLocation":45},"/install/","install",{"text":226,"config":227},"Quick start guides",{"href":228,"dataGaName":229,"dataGaLocation":45},"/get-started/","quick setup checklists",{"text":231,"config":232},"Learn",{"href":233,"dataGaLocation":45,"dataGaName":234},"https://university.gitlab.com/","learn",{"text":236,"config":237},"Product documentation",{"href":238,"dataGaName":239,"dataGaLocation":45},"https://docs.gitlab.com/","product documentation",{"text":241,"config":242},"Best practice videos",{"href":243,"dataGaName":244,"dataGaLocation":45},"/getting-started-videos/","best practice videos",{"text":246,"config":247},"Integrations",{"href":248,"dataGaName":249,"dataGaLocation":45},"/integrations/","integrations",{"title":251,"items":252},"Discover",[253,258,262,267],{"text":254,"config":255},"Customer success stories",{"href":256,"dataGaName":257,"dataGaLocation":45},"/customers/","customer success stories",{"text":259,"config":260},"Blog",{"href":261,"dataGaName":5,"dataGaLocation":45},"/blog/",{"text":263,"config":264},"Remote",{"href":265,"dataGaName":266,"dataGaLocation":45},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":268,"config":269},"TeamOps",{"href":270,"dataGaName":271,"dataGaLocation":45},"/teamops/","teamops",{"title":273,"items":274},"Connect",[275,280,284,289,294],{"text":276,"config":277},"GitLab Services",{"href":278,"dataGaName":279,"dataGaLocation":45},"/services/","services",{"text":281,"config":282},"Community",{"href":283,"dataGaName":25,"dataGaLocation":45},"/community/",{"text":285,"config":286},"Forum",{"href":287,"dataGaName":288,"dataGaLocation":45},"https://forum.gitlab.com/","forum",{"text":290,"config":291},"Events",{"href":292,"dataGaName":293,"dataGaLocation":45},"/events/","events",{"text":295,"config":296},"Partners",{"href":297,"dataGaName":298,"dataGaLocation":45},"/partners/","partners",{"backgroundColor":300,"textColor":301,"text":302,"image":303,"link":307},"#2f2a6b","#fff","Insights for the future of software development",{"altText":304,"config":305},"the source promo card",{"src":306},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":308,"config":309},"Read the latest",{"href":310,"dataGaName":311,"dataGaLocation":45},"/the-source/","the source",{"text":313,"config":314,"lists":316},"Company",{"dataNavLevelOne":315},"company",[317],{"items":318},[319,324,330,332,337,342,347,352,357,362,367],{"text":320,"config":321},"About",{"href":322,"dataGaName":323,"dataGaLocation":45},"/company/","about",{"text":325,"config":326,"footerGa":329},"Jobs",{"href":327,"dataGaName":328,"dataGaLocation":45},"/jobs/","jobs",{"dataGaName":328},{"text":290,"config":331},{"href":292,"dataGaName":293,"dataGaLocation":45},{"text":333,"config":334},"Leadership",{"href":335,"dataGaName":336,"dataGaLocation":45},"/company/team/e-group/","leadership",{"text":338,"config":339},"Team",{"href":340,"dataGaName":341,"dataGaLocation":45},"/company/team/","team",{"text":343,"config":344},"Handbook",{"href":345,"dataGaName":346,"dataGaLocation":45},"https://handbook.gitlab.com/","handbook",{"text":348,"config":349},"Investor relations",{"href":350,"dataGaName":351,"dataGaLocation":45},"https://ir.gitlab.com/","investor relations",{"text":353,"config":354},"Trust Center",{"href":355,"dataGaName":356,"dataGaLocation":45},"/security/","trust center",{"text":358,"config":359},"AI Transparency Center",{"href":360,"dataGaName":361,"dataGaLocation":45},"/ai-transparency-center/","ai transparency center",{"text":363,"config":364},"Newsletter",{"href":365,"dataGaName":366,"dataGaLocation":45},"/company/contact/","newsletter",{"text":368,"config":369},"Press",{"href":370,"dataGaName":371,"dataGaLocation":45},"/press/","press",{"text":373,"config":374,"lists":375},"Contact us",{"dataNavLevelOne":315},[376],{"items":377},[378,381,386],{"text":52,"config":379},{"href":54,"dataGaName":380,"dataGaLocation":45},"talk to sales",{"text":382,"config":383},"Get help",{"href":384,"dataGaName":385,"dataGaLocation":45},"/support/","get help",{"text":387,"config":388},"Customer portal",{"href":389,"dataGaName":390,"dataGaLocation":45},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":392,"login":393,"suggestions":400},"Close",{"text":394,"link":395},"To search repositories and projects, login to",{"text":396,"config":397},"gitlab.com",{"href":59,"dataGaName":398,"dataGaLocation":399},"search login","search",{"text":401,"default":402},"Suggestions",[403,405,409,411,415,419],{"text":74,"config":404},{"href":79,"dataGaName":74,"dataGaLocation":399},{"text":406,"config":407},"Code Suggestions (AI)",{"href":408,"dataGaName":406,"dataGaLocation":399},"/solutions/code-suggestions/",{"text":125,"config":410},{"href":127,"dataGaName":125,"dataGaLocation":399},{"text":412,"config":413},"GitLab on AWS",{"href":414,"dataGaName":412,"dataGaLocation":399},"/partners/technology-partners/aws/",{"text":416,"config":417},"GitLab on Google Cloud",{"href":418,"dataGaName":416,"dataGaLocation":399},"/partners/technology-partners/google-cloud-platform/",{"text":420,"config":421},"Why GitLab?",{"href":87,"dataGaName":420,"dataGaLocation":399},{"freeTrial":423,"mobileIcon":428,"desktopIcon":433,"secondaryButton":436},{"text":424,"config":425},"Start free trial",{"href":426,"dataGaName":50,"dataGaLocation":427},"https://gitlab.com/-/trials/new/","nav",{"altText":429,"config":430},"Gitlab Icon",{"src":431,"dataGaName":432,"dataGaLocation":427},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":429,"config":434},{"src":435,"dataGaName":432,"dataGaLocation":427},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":437,"config":438},"Get Started",{"href":439,"dataGaName":440,"dataGaLocation":427},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":442,"mobileIcon":446,"desktopIcon":448},{"text":443,"config":444},"Learn more about GitLab Duo",{"href":79,"dataGaName":445,"dataGaLocation":427},"gitlab duo",{"altText":429,"config":447},{"src":431,"dataGaName":432,"dataGaLocation":427},{"altText":429,"config":449},{"src":435,"dataGaName":432,"dataGaLocation":427},{"freeTrial":451,"mobileIcon":456,"desktopIcon":458},{"text":452,"config":453},"Back to pricing",{"href":206,"dataGaName":454,"dataGaLocation":427,"icon":455},"back to pricing","GoBack",{"altText":429,"config":457},{"src":431,"dataGaName":432,"dataGaLocation":427},{"altText":429,"config":459},{"src":435,"dataGaName":432,"dataGaLocation":427},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":465,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"title":466,"button":467,"image":472,"config":476,"_id":478,"_type":31,"_source":33,"_file":479,"_stem":480,"_extension":36},"/shared/en-us/banner","is now in public beta!",{"text":468,"config":469},"Try the Beta",{"href":470,"dataGaName":471,"dataGaLocation":45},"/gitlab-duo/agent-platform/","duo banner",{"altText":473,"config":474},"GitLab Duo Agent Platform",{"src":475},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":477},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":482,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"data":483,"_id":687,"_type":31,"title":688,"_source":33,"_file":689,"_stem":690,"_extension":36},"/shared/en-us/main-footer",{"text":484,"source":485,"edit":491,"contribute":496,"config":501,"items":506,"minimal":679},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":486,"config":487},"View page source",{"href":488,"dataGaName":489,"dataGaLocation":490},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":492,"config":493},"Edit this page",{"href":494,"dataGaName":495,"dataGaLocation":490},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":497,"config":498},"Please contribute",{"href":499,"dataGaName":500,"dataGaLocation":490},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":502,"facebook":503,"youtube":504,"linkedin":505},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[507,530,586,615,649],{"title":63,"links":508,"subMenu":513},[509],{"text":510,"config":511},"DevSecOps platform",{"href":72,"dataGaName":512,"dataGaLocation":490},"devsecops platform",[514],{"title":204,"links":515},[516,520,525],{"text":517,"config":518},"View plans",{"href":206,"dataGaName":519,"dataGaLocation":490},"view plans",{"text":521,"config":522},"Why Premium?",{"href":523,"dataGaName":524,"dataGaLocation":490},"/pricing/premium/","why premium",{"text":526,"config":527},"Why Ultimate?",{"href":528,"dataGaName":529,"dataGaLocation":490},"/pricing/ultimate/","why ultimate",{"title":531,"links":532},"Solutions",[533,538,540,542,547,552,556,559,563,568,570,573,576,581],{"text":534,"config":535},"Digital transformation",{"href":536,"dataGaName":537,"dataGaLocation":490},"/topics/digital-transformation/","digital transformation",{"text":150,"config":539},{"href":152,"dataGaName":150,"dataGaLocation":490},{"text":139,"config":541},{"href":121,"dataGaName":122,"dataGaLocation":490},{"text":543,"config":544},"Agile development",{"href":545,"dataGaName":546,"dataGaLocation":490},"/solutions/agile-delivery/","agile delivery",{"text":548,"config":549},"Cloud transformation",{"href":550,"dataGaName":551,"dataGaLocation":490},"/topics/cloud-native/","cloud transformation",{"text":553,"config":554},"SCM",{"href":135,"dataGaName":555,"dataGaLocation":490},"source code management",{"text":125,"config":557},{"href":127,"dataGaName":558,"dataGaLocation":490},"continuous integration & delivery",{"text":560,"config":561},"Value stream management",{"href":179,"dataGaName":562,"dataGaLocation":490},"value stream management",{"text":564,"config":565},"GitOps",{"href":566,"dataGaName":567,"dataGaLocation":490},"/solutions/gitops/","gitops",{"text":189,"config":569},{"href":191,"dataGaName":192,"dataGaLocation":490},{"text":571,"config":572},"Small business",{"href":196,"dataGaName":197,"dataGaLocation":490},{"text":574,"config":575},"Public sector",{"href":201,"dataGaName":202,"dataGaLocation":490},{"text":577,"config":578},"Education",{"href":579,"dataGaName":580,"dataGaLocation":490},"/solutions/education/","education",{"text":582,"config":583},"Financial services",{"href":584,"dataGaName":585,"dataGaLocation":490},"/solutions/finance/","financial services",{"title":209,"links":587},[588,590,592,594,597,599,601,603,605,607,609,611,613],{"text":221,"config":589},{"href":223,"dataGaName":224,"dataGaLocation":490},{"text":226,"config":591},{"href":228,"dataGaName":229,"dataGaLocation":490},{"text":231,"config":593},{"href":233,"dataGaName":234,"dataGaLocation":490},{"text":236,"config":595},{"href":238,"dataGaName":596,"dataGaLocation":490},"docs",{"text":259,"config":598},{"href":261,"dataGaName":5,"dataGaLocation":490},{"text":254,"config":600},{"href":256,"dataGaName":257,"dataGaLocation":490},{"text":263,"config":602},{"href":265,"dataGaName":266,"dataGaLocation":490},{"text":276,"config":604},{"href":278,"dataGaName":279,"dataGaLocation":490},{"text":268,"config":606},{"href":270,"dataGaName":271,"dataGaLocation":490},{"text":281,"config":608},{"href":283,"dataGaName":25,"dataGaLocation":490},{"text":285,"config":610},{"href":287,"dataGaName":288,"dataGaLocation":490},{"text":290,"config":612},{"href":292,"dataGaName":293,"dataGaLocation":490},{"text":295,"config":614},{"href":297,"dataGaName":298,"dataGaLocation":490},{"title":313,"links":616},[617,619,621,623,625,627,629,633,638,640,642,644],{"text":320,"config":618},{"href":322,"dataGaName":315,"dataGaLocation":490},{"text":325,"config":620},{"href":327,"dataGaName":328,"dataGaLocation":490},{"text":333,"config":622},{"href":335,"dataGaName":336,"dataGaLocation":490},{"text":338,"config":624},{"href":340,"dataGaName":341,"dataGaLocation":490},{"text":343,"config":626},{"href":345,"dataGaName":346,"dataGaLocation":490},{"text":348,"config":628},{"href":350,"dataGaName":351,"dataGaLocation":490},{"text":630,"config":631},"Sustainability",{"href":632,"dataGaName":630,"dataGaLocation":490},"/sustainability/",{"text":634,"config":635},"Diversity, inclusion and belonging (DIB)",{"href":636,"dataGaName":637,"dataGaLocation":490},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":353,"config":639},{"href":355,"dataGaName":356,"dataGaLocation":490},{"text":363,"config":641},{"href":365,"dataGaName":366,"dataGaLocation":490},{"text":368,"config":643},{"href":370,"dataGaName":371,"dataGaLocation":490},{"text":645,"config":646},"Modern Slavery Transparency Statement",{"href":647,"dataGaName":648,"dataGaLocation":490},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":650,"links":651},"Contact Us",[652,655,657,659,664,669,674],{"text":653,"config":654},"Contact an expert",{"href":54,"dataGaName":55,"dataGaLocation":490},{"text":382,"config":656},{"href":384,"dataGaName":385,"dataGaLocation":490},{"text":387,"config":658},{"href":389,"dataGaName":390,"dataGaLocation":490},{"text":660,"config":661},"Status",{"href":662,"dataGaName":663,"dataGaLocation":490},"https://status.gitlab.com/","status",{"text":665,"config":666},"Terms of use",{"href":667,"dataGaName":668,"dataGaLocation":490},"/terms/","terms of use",{"text":670,"config":671},"Privacy statement",{"href":672,"dataGaName":673,"dataGaLocation":490},"/privacy/","privacy statement",{"text":675,"config":676},"Cookie preferences",{"dataGaName":677,"dataGaLocation":490,"id":678,"isOneTrustButton":28},"cookie preferences","ot-sdk-btn",{"items":680},[681,683,685],{"text":665,"config":682},{"href":667,"dataGaName":668,"dataGaLocation":490},{"text":670,"config":684},{"href":672,"dataGaName":673,"dataGaLocation":490},{"text":675,"config":686},{"dataGaName":677,"dataGaLocation":490,"id":678,"isOneTrustButton":28},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[692],{"_path":693,"_dir":694,"_draft":6,"_partial":6,"_locale":7,"content":695,"config":699,"_id":701,"_type":31,"title":18,"_source":33,"_file":702,"_stem":703,"_extension":36},"/en-us/blog/authors/justin-tobler","authors",{"name":18,"config":696},{"headshot":697,"ctfId":698},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664737/Blog/Author%20Headshots/james_tobler_headshot.png","5pnOIbNI1Sc5IFnReNHNtv",{"template":700},"BlogAuthor","content:en-us:blog:authors:justin-tobler.yml","en-us/blog/authors/justin-tobler.yml","en-us/blog/authors/justin-tobler",{"_path":705,"_dir":39,"_draft":6,"_partial":6,"_locale":7,"header":706,"eyebrow":707,"blurb":708,"button":709,"secondaryButton":713,"_id":715,"_type":31,"title":716,"_source":33,"_file":717,"_stem":718,"_extension":36},"/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":47,"config":710},{"href":711,"dataGaName":50,"dataGaLocation":712},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":52,"config":714},{"href":54,"dataGaName":55,"dataGaLocation":712},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1758326232043]