[{"data":1,"prerenderedAt":2119},["ShallowReactive",2],{"/blog/git-clone-override-policy":3,"navigation-en-us":1354,"banner-en-us":1786,"footer-en-us":1796,"blog-post-authors-en-us-Darwin Sanoy":2057,"blog-related-posts-en-us-git-clone-override-policy":2074,"blog-share-wrapper-en-us":2099,"next-steps-en-us":2109},{"id":4,"title":5,"authors":6,"body":8,"category":1336,"date":1337,"description":1338,"extension":1339,"externalUrl":1340,"faq":1340,"featured":682,"heroImage":1341,"meta":1342,"navigation":682,"path":1343,"seo":1344,"slug":1347,"stem":1348,"tags":1349,"template":1352,"updatedDate":1340,"__hash__":1353},"blogPosts/en-us/blog/git-clone-override-policy.md","Avoid the massive end-to-end tax of default full history clones",[7],"Darwin Sanoy",{"type":9,"value":10,"toc":1324},"minimark",[11,20,23,34,50,53,56,61,64,111,115,118,148,151,155,158,166,169,228,233,341,348,395,400,419,434,437,442,465,468,473,588,591,596,610,617,621,624,630,634,641,648,657,660,663,1068,1072,1075,1101,1104,1108,1182,1185,1198,1202,1205,1258,1260,1272,1276,1287,1291,1294,1309,1320],[12,13,14,15,19],"p",{},"It's easy to think of ",[16,17,18],"code",{},"git clone"," as a client-side operation, but the settings of this operation impact the server side and all networks in between. When you run a default full history clone, the server has to walk the entire history, build a pack file for it (that's what \"counting objects\" is actually doing), and ship it over the wire. The client then unpacks all of it and checks out a full working tree. Every layer, client CPU, network, the Git server's pack-building compute, and disk, pays for the size of that request. Make the request smaller and the whole stack gets cheaper at once, not just your laptop.",[12,21,22],{},"Agentic AI turns up the pressure on this in a way normal developer workflows don't. An agent doing repository work can clone far more often, and far less predictably, than a human ever would. If the default is a full history clone, you're now paying that tax at agent scale.",[12,24,25,26,29,30,33],{},"GitLab is working hard on the backend to serve large repositories faster. But you can also change what you ask for. Options like shallow clones (",[16,27,28],{},"--depth=1","), single-branch clones, and partial clones (",[16,31,32],{},"--filter=blob:none",") let you fetch only what a job actually needs. A more precise request immediately reduces peak load, unreliability, wait time, and cost. And every future backend improvement compounds on top of these leaner requests.",[12,35,36,37,43,44,49],{},"In ",[38,39,42],"a",{"href":40,"rel":41},"https://about.gitlab.com/blog/supercharge-your-git-workflows/",[],"Supercharge your Git workflows",", I walked through how ",[38,45,48],{"href":46,"rel":47},"https://gitlab.com/gitlab-accelerates-embedded/git-clone-perf/git-much-faster",[],"Git Much Faster"," benchmarks the settings that cut clone times by up to 93% and disk usage by up to 98%: disabling compression, widening the HTTP buffer, shallow and partial clones, and sparse checkout that skips binaries. Great numbers. There's just one catch: Every place that clones the repo has to be meticulously updated with many lines of optimizing code. A developer's laptop, a CI job, an agent spinning up a sandbox: Each one is a separate opportunity to forget.",[12,51,52],{},"That's not automation. That's hoping.",[12,54,55],{},"In this article, you will learn how to implement the Git Clone Override Policy to automatically enforce repository cloning optimizations and minimize costs.",[57,58,60],"h2",{"id":59},"where-the-clone-tax-hits-hardest","Where the clone tax hits hardest",[12,62,63],{},"Agentic AI is the newest and fastest growing pressure, but it's not the only place a default full history clone is costing the software industry dearly:",[65,66,67,75,81,87,93,99,105],"ul",{},[68,69,70,74],"li",{},[71,72,73],"strong",{},"Monorepos:"," Consolidating many projects into one repository means every clone pulls far more than any single team actually needs.",[68,76,77,80],{},[71,78,79],{},"Complex, long-running Git history:"," Years of commits compound total repository size even when the current tree is modest.",[68,82,83,86],{},[71,84,85],{},"Media, binaries, and embedded projects:"," Firmware images, vendor SDKs, and design assets stored directly in version control balloon a repository the way source code alone never would.",[68,88,89,92],{},[71,90,91],{},"CI/CD pipelines:"," A fresh clone on every job, run thousands of times a day, turns a small per-clone inefficiency into a large recurring one.",[68,94,95,98],{},[71,96,97],{},"Data science and machine learning data sets:"," Large data files tracked in git carry the same size tax as any other oversized blob.",[68,100,101,104],{},[71,102,103],{},"Remote developer environments:"," Cloud-hosted or ephemeral development environments want fast, lightweight startup, but still default to a full repository replication.",[68,106,107,110],{},[71,108,109],{},"Agentic AI:"," Many more clone requests, but far less predictable than any human-driven workflow.",[57,112,114],{"id":113},"making-the-optimization-impossible-to-skip","Making the optimization impossible to skip",[12,116,117],{},"The fix isn't a better README telling people which flags to set. It's moving the decision out of individual hands entirely: Commit the policy to the repository itself, as code, and let a small program enforce it.",[12,119,120,121,126,127,130,131,135,136,139,140,143,144,147],{},"That's what ",[38,122,125],{"href":123,"rel":124},"https://gitlab.com/gitlab-accelerates-embedded/git-clone-perf/git-clone-override-policy",[],"Git Clone Override Policy"," does. Drop a ",[16,128,129],{},".afullhistorycloneoverridepolicy.toml"," file in a repo, and a lightweight Go binary intercepts ",[132,133,134],"em",{},"only"," a bare ",[16,137,138],{},"git clone URL",", the plain, default, full-history request. The moment you add any option yourself (",[16,141,142],{},"--depth 1",", ",[16,145,146],{},"--filter",", anything), the binary assumes you're already optimizing and passes your command straight through untouched. No policy file in the repo at all? Same thing: clean pass-through to a normal clone. The only case it ever touches is the one everyone agrees is a mistake: the unqualified default.",[12,149,150],{},"When it does intercept, here's the sequence: Fetch the policy file, then run a fixed 13-step process that shallow-and-partial-clones the repo, set up sparse checkout to skip binary files (images, archives, media, fonts, and more), and apply the same tuned git config from Git Much Faster, all before a single line of source shows up on disk.",[57,152,154],{"id":153},"what-maximum-optimization-looks-like","What maximum optimization looks like",[12,156,157],{},"Let’s take a look at the commands required to do a maximum optimization of a Git Clone.",[12,159,160],{},[71,161,162,163,165],{},"1. Build the repo shell yourself, instead of ",[16,164,18],{},".",[12,167,168],{},"This allows us to set a broad variety of git configuration settings that set the file scope of the first clone request.",[170,171,176],"pre",{"className":172,"code":173,"language":174,"meta":175,"style":175},"language-shell shiki shiki-themes github-light","mkdir my-repo && cd my-repo\ngit init\ngit remote add origin https://example.com/group/my-repo.git\n","shell","",[16,177,178,202,211],{"__ignoreMap":175},[179,180,183,187,191,195,199],"span",{"class":181,"line":182},"line",1,[179,184,186],{"class":185},"s7eDp","mkdir",[179,188,190],{"class":189},"sYBdl"," my-repo",[179,192,194],{"class":193},"sgsFI"," && ",[179,196,198],{"class":197},"sYu0t","cd",[179,200,201],{"class":189}," my-repo\n",[179,203,205,208],{"class":181,"line":204},2,[179,206,207],{"class":185},"git",[179,209,210],{"class":189}," init\n",[179,212,214,216,219,222,225],{"class":181,"line":213},3,[179,215,207],{"class":185},[179,217,218],{"class":189}," remote",[179,220,221],{"class":189}," add",[179,223,224],{"class":189}," origin",[179,226,227],{"class":189}," https://example.com/group/my-repo.git\n",[12,229,230],{},[71,231,232],{},"2. Tune git config for large-transfer performance, scoped to just this repo.",[170,234,236],{"className":172,"code":235,"language":174,"meta":175,"style":175},"git config --local core.compression 0\ngit config --local http.postBuffer 1024M\ngit config --local http.lowSpeedLimit 1000\ngit config --local http.lowSpeedTime 300\ngit config --local pack.windowMemory 256m\ngit config --local pack.packSizeLimit 256m\ngit config --local pack.threads 4\n",[16,237,238,254,268,282,297,312,326],{"__ignoreMap":175},[179,239,240,242,245,248,251],{"class":181,"line":182},[179,241,207],{"class":185},[179,243,244],{"class":189}," config",[179,246,247],{"class":197}," --local",[179,249,250],{"class":189}," core.compression",[179,252,253],{"class":197}," 0\n",[179,255,256,258,260,262,265],{"class":181,"line":204},[179,257,207],{"class":185},[179,259,244],{"class":189},[179,261,247],{"class":197},[179,263,264],{"class":189}," http.postBuffer",[179,266,267],{"class":189}," 1024M\n",[179,269,270,272,274,276,279],{"class":181,"line":213},[179,271,207],{"class":185},[179,273,244],{"class":189},[179,275,247],{"class":197},[179,277,278],{"class":189}," http.lowSpeedLimit",[179,280,281],{"class":197}," 1000\n",[179,283,285,287,289,291,294],{"class":181,"line":284},4,[179,286,207],{"class":185},[179,288,244],{"class":189},[179,290,247],{"class":197},[179,292,293],{"class":189}," http.lowSpeedTime",[179,295,296],{"class":197}," 300\n",[179,298,300,302,304,306,309],{"class":181,"line":299},5,[179,301,207],{"class":185},[179,303,244],{"class":189},[179,305,247],{"class":197},[179,307,308],{"class":189}," pack.windowMemory",[179,310,311],{"class":189}," 256m\n",[179,313,315,317,319,321,324],{"class":181,"line":314},6,[179,316,207],{"class":185},[179,318,244],{"class":189},[179,320,247],{"class":197},[179,322,323],{"class":189}," pack.packSizeLimit",[179,325,311],{"class":189},[179,327,329,331,333,335,338],{"class":181,"line":328},7,[179,330,207],{"class":185},[179,332,244],{"class":189},[179,334,247],{"class":197},[179,336,337],{"class":189}," pack.threads",[179,339,340],{"class":197}," 4\n",[12,342,343],{},[71,344,345,346,165],{},"3. Turn on partial clone, since you're about to fetch with ",[16,347,146],{},[170,349,351],{"className":172,"code":350,"language":174,"meta":175,"style":175},"git config --local extensions.partialClone origin\ngit config --local remote.origin.promisor true\ngit config --local remote.origin.partialclonefilter blob:none\n",[16,352,353,367,381],{"__ignoreMap":175},[179,354,355,357,359,361,364],{"class":181,"line":182},[179,356,207],{"class":185},[179,358,244],{"class":189},[179,360,247],{"class":197},[179,362,363],{"class":189}," extensions.partialClone",[179,365,366],{"class":189}," origin\n",[179,368,369,371,373,375,378],{"class":181,"line":204},[179,370,207],{"class":185},[179,372,244],{"class":189},[179,374,247],{"class":197},[179,376,377],{"class":189}," remote.origin.promisor",[179,379,380],{"class":197}," true\n",[179,382,383,385,387,389,392],{"class":181,"line":213},[179,384,207],{"class":185},[179,386,244],{"class":189},[179,388,247],{"class":197},[179,390,391],{"class":189}," remote.origin.partialclonefilter",[179,393,394],{"class":189}," blob:none\n",[12,396,397],{},[71,398,399],{},"4. Narrow the fetch refspec to the one ref you actually want, instead of every branch on the remote.",[170,401,403],{"className":172,"code":402,"language":174,"meta":175,"style":175},"git config --local remote.origin.fetch \"+refs/heads/main:refs/remotes/origin/main\"\n",[16,404,405],{"__ignoreMap":175},[179,406,407,409,411,413,416],{"class":181,"line":182},[179,408,207],{"class":185},[179,410,244],{"class":189},[179,412,247],{"class":197},[179,414,415],{"class":189}," remote.origin.fetch",[179,417,418],{"class":189}," \"+refs/heads/main:refs/remotes/origin/main\"\n",[12,420,421,422,425,426,429,430,433],{},"Without this update, ",[16,423,424],{},"remote.origin.fetch"," is automatically set to ",[16,427,428],{},"+refs/heads/*:refs/remotes/origin/*",", meaning every fetch (and the initial clone) pulls down the ref pointers for all branches on origin. Updating this setting allows us to restrict fetch operations to just the ",[16,431,432],{},"main"," branch so that Git will no longer track or update refs for any other remote branch.",[12,435,436],{},"There are fewer refs to negotiate and update which means less overhead per fetch, especially on repos with hundreds of branches.",[12,438,439],{},[71,440,441],{},"5. Fetch shallow, with blob content deferred.",[170,443,445],{"className":172,"code":444,"language":174,"meta":175,"style":175},"git fetch --depth=1 --filter=blob:none origin main\n",[16,446,447],{"__ignoreMap":175},[179,448,449,451,454,457,460,462],{"class":181,"line":182},[179,450,207],{"class":185},[179,452,453],{"class":189}," fetch",[179,455,456],{"class":197}," --depth=1",[179,458,459],{"class":197}," --filter=blob:none",[179,461,224],{"class":189},[179,463,464],{"class":189}," main\n",[12,466,467],{},"This depth and filter combination gets you the smallest possible initial transfer: one commit's worth of tree structure, no blob data at all until you check out files. This benefit comes specifically when you’re working on repositories with large files or a lot of history.",[12,469,470],{},[71,471,472],{},"6. Turn on sparse checkout and exclude every binary file type you don't need for source work.",[170,474,476],{"className":172,"code":475,"language":174,"meta":175,"style":175},"git sparse-checkout init --cone\ncat >> .git/info/sparse-checkout \u003C\u003C'EOF'\n/*\n!*.png\n!*.PNG\n!*.jpg\n!*.JPG\n!*.pdf\n!*.PDF\n!*.zip\n!*.ZIP\n!*.mp4\n!*.MP4\n!*.exe\n!*.EXE\nEOF\n",[16,477,478,491,509,514,519,524,529,534,540,546,552,558,564,570,576,582],{"__ignoreMap":175},[179,479,480,482,485,488],{"class":181,"line":182},[179,481,207],{"class":185},[179,483,484],{"class":189}," sparse-checkout",[179,486,487],{"class":189}," init",[179,489,490],{"class":197}," --cone\n",[179,492,493,496,500,503,506],{"class":181,"line":204},[179,494,495],{"class":185},"cat",[179,497,499],{"class":498},"sD7c4"," >>",[179,501,502],{"class":189}," .git/info/sparse-checkout",[179,504,505],{"class":498}," \u003C\u003C",[179,507,508],{"class":189},"'EOF'\n",[179,510,511],{"class":181,"line":213},[179,512,513],{"class":189},"/*\n",[179,515,516],{"class":181,"line":284},[179,517,518],{"class":189},"!*.png\n",[179,520,521],{"class":181,"line":299},[179,522,523],{"class":189},"!*.PNG\n",[179,525,526],{"class":181,"line":314},[179,527,528],{"class":189},"!*.jpg\n",[179,530,531],{"class":181,"line":328},[179,532,533],{"class":189},"!*.JPG\n",[179,535,537],{"class":181,"line":536},8,[179,538,539],{"class":189},"!*.pdf\n",[179,541,543],{"class":181,"line":542},9,[179,544,545],{"class":189},"!*.PDF\n",[179,547,549],{"class":181,"line":548},10,[179,550,551],{"class":189},"!*.zip\n",[179,553,555],{"class":181,"line":554},11,[179,556,557],{"class":189},"!*.ZIP\n",[179,559,561],{"class":181,"line":560},12,[179,562,563],{"class":189},"!*.mp4\n",[179,565,567],{"class":181,"line":566},13,[179,568,569],{"class":189},"!*.MP4\n",[179,571,573],{"class":181,"line":572},14,[179,574,575],{"class":189},"!*.exe\n",[179,577,579],{"class":181,"line":578},15,[179,580,581],{"class":189},"!*.EXE\n",[179,583,585],{"class":181,"line":584},16,[179,586,587],{"class":189},"EOF\n",[12,589,590],{},"The real policy excludes over 30 extensions across images, documents, archives, media, compiled binaries, and design files, in both cases. That's just a representative slice.",[12,592,593],{},[71,594,595],{},"7. Check out the ref.",[170,597,599],{"className":172,"code":598,"language":174,"meta":175,"style":175},"git checkout main\n",[16,600,601],{"__ignoreMap":175},[179,602,603,605,608],{"class":181,"line":182},[179,604,207],{"class":185},[179,606,607],{"class":189}," checkout",[179,609,464],{"class":189},[12,611,612,613,616],{},"Do all seven stages, in that exact order, against ",[16,614,615],{},"www.gitlab.com",", and you land at the same 110 MB instead of 9.5 GB. Get the order wrong (fetch before narrowing the refspec, sparse-checkout after checkout instead of before) and at best you've wasted the optimization, at worst you've fetched the thing you were trying to avoid fetching. That precision, repeated correctly on every clone, by every person and every pipeline, is exactly the discipline problem from the top of this post. Git Clone Override Policy doesn't invent a new technique here. It just guarantees these seven stages run, in order, every time, without anyone needing to remember them.",[57,618,620],{"id":619},"automation-to-the-rescue","Automation to the rescue",[12,622,623],{},"Git client usage is both highly scaled and distributed, so propagating a precise, purpose-specific set of clone optimization commands to be run by humans or custom coded into every CI job and agent sandbox requires automation to be truly reliable.",[12,625,626,627,629],{},"What if we could enforce that workflow with automatic policies, instead of betting on everyone remembering all seven stages? It turns out there's already a working MVC of exactly that: a TOML policy file that lives in the repository alongside the code, plus a client capable of intercepting every ",[16,628,18],{}," call before it ever reaches the network. Store the policy once, and every clone (human, CI job, or agent) gets the optimized sequence automatically instead of by request. Using a policy settings file also allows for the tuning that will be necessary for various purposes. The default above is for counting lines of code, so we just need a reliable copy of all existing text files. Building the same software might require more files because it compiles some graphics into the UI in the application or some builds may require more of the Git history information in order to locate commit messages for release notes.",[57,631,633],{"id":632},"a-small-portable-go-binary-and-a-repo-stored-policy-configuration-file","A small, portable Go binary and a repo stored policy configuration file",[12,635,636,637,640],{},"The interceptor itself is a single self-contained Go binary, not a shell script held together with ",[16,638,639],{},"sed"," and hope. That choice buys a few things worth calling out.",[12,642,643],{},[644,645],"img",{"alt":646,"src":647},"A small, portable Go binary a repo stored policy configuration file","https://res.cloudinary.com/about-gitlab-com/image/upload/v1787080260/bhz0beczhkffzdweghma.png",[12,649,650,651,653,654,165],{},"It runs on Linux, macOS, and Windows, for both amd64 and arm64: one codebase instead of a bash version and a separate PowerShell version drifting out of sync. It's been tested across every shell you're likely to hit, from CMD and PowerShell to Git Bash and WSL. The only runtime dependency is a real ",[16,652,207],{}," binary already on ",[16,655,656],{},"PATH",[12,658,659],{},"Internally it's organized into six small, independently testable pieces (policy parsing, the fixed-sequence interpreter, git command execution, logging, cross-platform detection, and the entry point handling all four invocation modes) rather than one large function doing all of it at once.",[12,661,662],{},"This example configuration file gives a feel for the things that can currently be tweaked.",[170,664,668],{"className":665,"code":666,"language":667,"meta":175,"style":175},"language-toml shiki shiki-themes github-light","schema_version = 2\n\n[policyinfo]\ndescription = \"The most optimal latest-code-only clone for AI agents (that do not need git history) or counting lines of code.\"\nOptimalForAIAgents = true\n\n[git_config]\n\"core.compression\"   = 0\n\"http.postBuffer\"    = \"1024M\"\n\"http.lowSpeedLimit\" = 1000\n\"http.lowSpeedTime\"  = 300\n\"pack.windowMemory\"  = \"256m\"\n\"pack.packSizeLimit\" = \"256m\"\n\"pack.threads\"       = 4\n\n[fetch]\nflags = [\"--depth=1\", \"--filter=blob:none\"]\n\n[sparse_checkout]\nenabled  = true\n# conemode 'auto' is processed by the solution code to be either 'cone' or 'no-cone' when passed to git\nconemode = \"auto\"\nincludes = [\"/*\"]\nexcludes = []\nexclude_extensions = [\n  \"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"ico\", \"webp\",\n  \"pdf\", \"doc\", \"docx\", \"xls\", \"xlsx\", \"ppt\", \"pptx\",\n  \"zip\", \"tar\", \"gz\", \"jar\",\n  \"mp4\", \"mp3\", \"mov\",\n  \"exe\", \"dll\", \"so\", \"woff\", \"woff2\",\n  \"ttf\", \"otf\", \"psd\", \"sketch\", \"fig\", \"dmg\", \"eps\",\n]\ncase_variants = \"both\"\n","toml",[16,669,670,678,684,695,703,711,715,724,732,740,748,756,764,771,779,783,792,808,813,823,831,838,847,858,864,870,909,947,970,988,1016,1054,1059],{"__ignoreMap":175},[179,671,672,675],{"class":181,"line":182},[179,673,674],{"class":193},"schema_version = ",[179,676,677],{"class":197},"2\n",[179,679,680],{"class":181,"line":204},[179,681,683],{"emptyLinePlaceholder":682},true,"\n",[179,685,686,689,692],{"class":181,"line":213},[179,687,688],{"class":193},"[",[179,690,691],{"class":185},"policyinfo",[179,693,694],{"class":193},"]\n",[179,696,697,700],{"class":181,"line":284},[179,698,699],{"class":193},"description = ",[179,701,702],{"class":189},"\"The most optimal latest-code-only clone for AI agents (that do not need git history) or counting lines of code.\"\n",[179,704,705,708],{"class":181,"line":299},[179,706,707],{"class":193},"OptimalForAIAgents = ",[179,709,710],{"class":197},"true\n",[179,712,713],{"class":181,"line":314},[179,714,683],{"emptyLinePlaceholder":682},[179,716,717,719,722],{"class":181,"line":328},[179,718,688],{"class":193},[179,720,721],{"class":185},"git_config",[179,723,694],{"class":193},[179,725,726,729],{"class":181,"line":536},[179,727,728],{"class":193},"\"core.compression\"   = ",[179,730,731],{"class":197},"0\n",[179,733,734,737],{"class":181,"line":542},[179,735,736],{"class":193},"\"http.postBuffer\"    = ",[179,738,739],{"class":189},"\"1024M\"\n",[179,741,742,745],{"class":181,"line":548},[179,743,744],{"class":193},"\"http.lowSpeedLimit\" = ",[179,746,747],{"class":197},"1000\n",[179,749,750,753],{"class":181,"line":554},[179,751,752],{"class":193},"\"http.lowSpeedTime\"  = ",[179,754,755],{"class":197},"300\n",[179,757,758,761],{"class":181,"line":560},[179,759,760],{"class":193},"\"pack.windowMemory\"  = ",[179,762,763],{"class":189},"\"256m\"\n",[179,765,766,769],{"class":181,"line":566},[179,767,768],{"class":193},"\"pack.packSizeLimit\" = ",[179,770,763],{"class":189},[179,772,773,776],{"class":181,"line":572},[179,774,775],{"class":193},"\"pack.threads\"       = ",[179,777,778],{"class":197},"4\n",[179,780,781],{"class":181,"line":578},[179,782,683],{"emptyLinePlaceholder":682},[179,784,785,787,790],{"class":181,"line":584},[179,786,688],{"class":193},[179,788,789],{"class":185},"fetch",[179,791,694],{"class":193},[179,793,795,798,801,803,806],{"class":181,"line":794},17,[179,796,797],{"class":193},"flags = [",[179,799,800],{"class":189},"\"--depth=1\"",[179,802,143],{"class":193},[179,804,805],{"class":189},"\"--filter=blob:none\"",[179,807,694],{"class":193},[179,809,811],{"class":181,"line":810},18,[179,812,683],{"emptyLinePlaceholder":682},[179,814,816,818,821],{"class":181,"line":815},19,[179,817,688],{"class":193},[179,819,820],{"class":185},"sparse_checkout",[179,822,694],{"class":193},[179,824,826,829],{"class":181,"line":825},20,[179,827,828],{"class":193},"enabled  = ",[179,830,710],{"class":197},[179,832,834],{"class":181,"line":833},21,[179,835,837],{"class":836},"sAwPA","# conemode 'auto' is processed by the solution code to be either 'cone' or 'no-cone' when passed to git\n",[179,839,841,844],{"class":181,"line":840},22,[179,842,843],{"class":193},"conemode = ",[179,845,846],{"class":189},"\"auto\"\n",[179,848,850,853,856],{"class":181,"line":849},23,[179,851,852],{"class":193},"includes = [",[179,854,855],{"class":189},"\"/*\"",[179,857,694],{"class":193},[179,859,861],{"class":181,"line":860},24,[179,862,863],{"class":193},"excludes = []\n",[179,865,867],{"class":181,"line":866},25,[179,868,869],{"class":193},"exclude_extensions = [\n",[179,871,873,876,878,881,883,886,888,891,893,896,898,901,903,906],{"class":181,"line":872},26,[179,874,875],{"class":189},"  \"png\"",[179,877,143],{"class":193},[179,879,880],{"class":189},"\"jpg\"",[179,882,143],{"class":193},[179,884,885],{"class":189},"\"jpeg\"",[179,887,143],{"class":193},[179,889,890],{"class":189},"\"gif\"",[179,892,143],{"class":193},[179,894,895],{"class":189},"\"svg\"",[179,897,143],{"class":193},[179,899,900],{"class":189},"\"ico\"",[179,902,143],{"class":193},[179,904,905],{"class":189},"\"webp\"",[179,907,908],{"class":193},",\n",[179,910,912,915,917,920,922,925,927,930,932,935,937,940,942,945],{"class":181,"line":911},27,[179,913,914],{"class":189},"  \"pdf\"",[179,916,143],{"class":193},[179,918,919],{"class":189},"\"doc\"",[179,921,143],{"class":193},[179,923,924],{"class":189},"\"docx\"",[179,926,143],{"class":193},[179,928,929],{"class":189},"\"xls\"",[179,931,143],{"class":193},[179,933,934],{"class":189},"\"xlsx\"",[179,936,143],{"class":193},[179,938,939],{"class":189},"\"ppt\"",[179,941,143],{"class":193},[179,943,944],{"class":189},"\"pptx\"",[179,946,908],{"class":193},[179,948,950,953,955,958,960,963,965,968],{"class":181,"line":949},28,[179,951,952],{"class":189},"  \"zip\"",[179,954,143],{"class":193},[179,956,957],{"class":189},"\"tar\"",[179,959,143],{"class":193},[179,961,962],{"class":189},"\"gz\"",[179,964,143],{"class":193},[179,966,967],{"class":189},"\"jar\"",[179,969,908],{"class":193},[179,971,973,976,978,981,983,986],{"class":181,"line":972},29,[179,974,975],{"class":189},"  \"mp4\"",[179,977,143],{"class":193},[179,979,980],{"class":189},"\"mp3\"",[179,982,143],{"class":193},[179,984,985],{"class":189},"\"mov\"",[179,987,908],{"class":193},[179,989,991,994,996,999,1001,1004,1006,1009,1011,1014],{"class":181,"line":990},30,[179,992,993],{"class":189},"  \"exe\"",[179,995,143],{"class":193},[179,997,998],{"class":189},"\"dll\"",[179,1000,143],{"class":193},[179,1002,1003],{"class":189},"\"so\"",[179,1005,143],{"class":193},[179,1007,1008],{"class":189},"\"woff\"",[179,1010,143],{"class":193},[179,1012,1013],{"class":189},"\"woff2\"",[179,1015,908],{"class":193},[179,1017,1019,1022,1024,1027,1029,1032,1034,1037,1039,1042,1044,1047,1049,1052],{"class":181,"line":1018},31,[179,1020,1021],{"class":189},"  \"ttf\"",[179,1023,143],{"class":193},[179,1025,1026],{"class":189},"\"otf\"",[179,1028,143],{"class":193},[179,1030,1031],{"class":189},"\"psd\"",[179,1033,143],{"class":193},[179,1035,1036],{"class":189},"\"sketch\"",[179,1038,143],{"class":193},[179,1040,1041],{"class":189},"\"fig\"",[179,1043,143],{"class":193},[179,1045,1046],{"class":189},"\"dmg\"",[179,1048,143],{"class":193},[179,1050,1051],{"class":189},"\"eps\"",[179,1053,908],{"class":193},[179,1055,1057],{"class":181,"line":1056},32,[179,1058,694],{"class":193},[179,1060,1062,1065],{"class":181,"line":1061},33,[179,1063,1064],{"class":193},"case_variants = ",[179,1066,1067],{"class":189},"\"both\"\n",[57,1069,1071],{"id":1070},"declarative-configuration-over-code","Declarative configuration over code",[12,1073,1074],{},"Infrastructure as code successfully reduces complexity and increases standardization and security by boiling down what is usually a sprawl of highly variable team code into a declarative configuration file and an engine that processes it. This very effective pattern is repeated here for all of its benefits including:",[65,1076,1077,1080,1083,1086,1089,1092,1095,1098],{},[68,1078,1079],{},"standardization of unfamiliar processes (exceptionally detailed git commands)",[68,1081,1082],{},"complexity avoidance",[68,1084,1085],{},"easy adoptability by existing specialized clone code (e.g. vs code “clones” that don’t use the git binary)",[68,1087,1088],{},"reduced bugs and edge cases (compared to everyone devising their own)",[68,1090,1091],{},"consistency of implementation across contexts (e.g. CI clones, developer IDEs, AI sandboxes)",[68,1093,1094],{},"improved auditability",[68,1096,1097],{},"configuration file generation and manipulation by other automation",[68,1099,1100],{},"improved security (avoiding many code injection vectors)",[12,1102,1103],{},"The interpreter can only act on configuration: git config key/value pairs, fetch and checkout flags, sparse-checkout include/exclude lists, and a small set of post-clone hooks gated by simple predicates. Any arbitrary additions to the configuration are unknown to the engine and ignored. You can audit exactly what a policy will do just by reading it.",[57,1105,1107],{"id":1106},"three-ways-to-leverage-git-clone-override-policy-least-invasive-to-most","Three ways to leverage Git Clone Override Policy, least invasive to most",[1109,1110,1111,1131],"table",{},[1112,1113,1114],"thead",{},[1115,1116,1117,1122,1125,1128],"tr",{},[1118,1119,1121],"th",{"align":1120},"left","Mode",[1118,1123,1124],{"align":1120},"Command",[1118,1126,1127],{"align":1120},"Needs admin",[1118,1129,1130],{"align":1120},"Best for",[1132,1133,1134,1151,1166],"tbody",{},[1115,1135,1136,1140,1145,1148],{},[1137,1138,1139],"td",{"align":1120},"Zero-footprint CLI",[1137,1141,1142],{"align":1120},[16,1143,1144],{},"./git-clone-override-policy clone URL",[1137,1146,1147],{"align":1120},"No",[1137,1149,1150],{"align":1120},"CI jobs, agents, one-off machines",[1115,1152,1153,1156,1161,1163],{},[1137,1154,1155],{"align":1120},"Git alias",[1137,1157,1158],{"align":1120},[16,1159,1160],{},"git cloneusingpolicy URL",[1137,1162,1147],{"align":1120},[1137,1164,1165],{"align":1120},"Developers opting in individually",[1115,1167,1168,1171,1176,1179],{},[1137,1169,1170],{"align":1120},"OS alias",[1137,1172,1173,1175],{"align":1120},[16,1174,138],{}," (intercepts git binary calls)",[1137,1177,1178],{"align":1120},"Yes",[1137,1180,1181],{"align":1120},"Fleet-wide enforcement without developer awareness",[1183,1184],"br",{},[12,1186,1187,1188,1191,1192,1194,1195,1197],{},"The zero-footprint mode is just the compiled binary: Download it, run it, done. No install, no PATH changes, nothing to clean up, which is exactly what you want when the whole machine is disposable. The git alias mode installs a ",[16,1189,1190],{},"git cloneusingpolicy"," command for a single user, no admin rights required. The OS alias mode goes furthest: It installs itself ahead of the real ",[16,1193,207],{}," on the system PATH, so every ",[16,1196,18],{}," on that machine is policy-aware whether the person running it knows this exists or not.",[57,1199,1201],{"id":1200},"three-example-results-of-git-clone-override-policy-optimization","Three example results of Git Clone Override Policy optimization",[12,1203,1204],{},"The results are the same ones from Git Much Faster, now landing automatically instead of by request:",[1109,1206,1207,1220],{},[1112,1208,1209],{},[1115,1210,1211,1214,1217],{},[1118,1212,1213],{"align":1120},"Repository",[1118,1215,1216],{"align":1120},"Full history clone",[1118,1218,1219],{"align":1120},"Policy-optimized clone",[1132,1221,1222,1236,1247],{},[1115,1223,1224,1230,1233],{},[1137,1225,1226],{"align":1120},[38,1227,615],{"href":1228,"rel":1229},"http://www.gitlab.com",[],[1137,1231,1232],{"align":1120},"9.5 GB",[1137,1234,1235],{"align":1120},"110 MB",[1115,1237,1238,1241,1244],{},[1137,1239,1240],{"align":1120},"Linux kernel",[1137,1242,1243],{"align":1120},"7.5 GB",[1137,1245,1246],{"align":1120},"2 GB",[1115,1248,1249,1252,1255],{},[1137,1250,1251],{"align":1120},"Chromium",[1137,1253,1254],{"align":1120},"60 GB",[1137,1256,1257],{"align":1120},"5 GB",[1183,1259],{},[12,1261,1262,1263,1265,1266,1268,1269,1271],{},"And the safety behavior holds up under a live demo: Install the OS alias, run a plain ",[16,1264,18],{}," against a policy-bearing repo, and you get the 110 MB version. Add ",[16,1267,142],{}," to that same command and it's ignored by the interceptor entirely: pass-through, full stop. Uninstall, and ",[16,1270,18],{}," goes right back to a standard clone, no residue.",[57,1273,1275],{"id":1274},"compounding-git-lfs-benefits","Compounding Git LFS benefits",[12,1277,1278,1279,1282,1283,1286],{},"Git LFS and this policy solve different halves of the same problem: LFS changes how binaries are stored, keeping their history off the packfile, while the clone policy changes what each clone asks for. Because they operate on different layers, they stack rather than compete — on an LFS repo, the policy's shallow depth, single-branch refspec, and transfer tuning still trim everything LFS leaves untouched. And since ",[16,1280,1281],{},"sparse-checkout"," excludes those file types by name, it also skips the smudge download of the current binaries, giving you the on-demand behavior of the standard git configuration variable ",[16,1284,1285],{},"GIT_LFS_SKIP_SMUDGE"," without any client configuration. The result is compounded: LFS shrinks the history, the policy shrinks the request, and a clone that was already lean under LFS gets leaner still.",[57,1288,1290],{"id":1289},"where-this-goes-next","Where this goes next",[12,1292,1293],{},"This tutorial closes the loop on where we started: The problem isn't unique to agents, but agents are the use case that makes \"just tell people the right settings\" fall apart fastest. Policy as code doesn't need anyone, human or agent, to know it's there.",[12,1295,1296,1297,1302,1303,1308],{},"To go deeper, watch the ",[38,1298,1301],{"href":1299,"rel":1300},"https://www.youtube.com/watch?v=Dyl8ICWj3AY",[],"Git Clone Override Policy Solution Architecture Overview"," for the problem-solution fit and design, and the ",[38,1304,1307],{"href":1305,"rel":1306},"https://www.youtube.com/watch?v=2u_z1nXae7U",[],"Git Clone Override Policy Demo"," to see the three runtime modes in action.",[12,1310,1311,1315,1316,1319],{},[38,1312,1314],{"href":123,"rel":1313},[],"Try the Git Clone Override Policy"," against your own large repository. And, if you want the benchmarking behind the defaults, ",[38,1317,48],{"href":46,"rel":1318},[]," is where those numbers came from.",[1321,1322,1323],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":175,"searchDepth":204,"depth":204,"links":1325},[1326,1327,1328,1329,1330,1331,1332,1333,1334,1335],{"id":59,"depth":204,"text":60},{"id":113,"depth":204,"text":114},{"id":153,"depth":204,"text":154},{"id":619,"depth":204,"text":620},{"id":632,"depth":204,"text":633},{"id":1070,"depth":204,"text":1071},{"id":1106,"depth":204,"text":1107},{"id":1200,"depth":204,"text":1201},{"id":1274,"depth":204,"text":1275},{"id":1289,"depth":204,"text":1290},"engineering","2026-08-18","Learn how the Git Clone Override Policy automates repository cloning optimizations (like shallow/partial clones) via a repo-stored TOML file, reducing load and cost.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1777380633/y3bigk0mmmxshmbofrkc.png",{},"/en-us/blog/git-clone-override-policy",{"config":1345,"title":5,"description":1338},{"noIndex":1346},false,"git-clone-override-policy","en-us/blog/git-clone-override-policy",[1350,1351,207],"tutorial","DevSecOps platform","BlogPost","1xygavQ-0C3zj8lT0TS6y-CHH_X8Fqb3h0KvwQrRT1E",{"logo":1355,"freeTrial":1360,"sales":1365,"login":1370,"items":1375,"search":1706,"minimal":1737,"duo":1756,"switchNav":1765,"pricingDeployment":1776},{"config":1356},{"href":1357,"dataGaName":1358,"dataGaLocation":1359},"/","gitlab logo","header",{"text":1361,"config":1362},"Get free trial",{"href":1363,"dataGaName":1364,"dataGaLocation":1359},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1366,"config":1367},"Request a demo",{"href":1368,"dataGaName":1369,"dataGaLocation":1359},"/request-a-demo/","sales",{"text":1371,"config":1372},"Sign in",{"href":1373,"dataGaName":1374,"dataGaLocation":1359},"https://gitlab.com/users/sign_in/","sign in",[1376,1462,1550,1555,1630,1684],{"text":1377,"left":682,"config":1378,"menu":1380},"Platform",{"dataNavLevelOne":1379},"platform",{"type":1381,"link":1382,"columns":1386,"feature":1451},"lists",{"text":1383,"config":1384},"Explore the Platform",{"href":1385,"dataGaName":1379,"dataGaLocation":1359},"/platform/",[1387,1410,1433],{"title":1388,"items":1389},"Execution & Workflows",[1390,1395,1400,1405],{"text":1391,"config":1392},"CI/CD",{"href":1393,"dataGaLocation":1359,"dataGaName":1394},"/solutions/continuous-integration/","ci/cd",{"text":1396,"config":1397},"Source Code Management",{"href":1398,"dataGaLocation":1359,"dataGaName":1399},"/solutions/source-code-management/","source code management",{"text":1401,"config":1402},"Agile Delivery",{"href":1403,"dataGaLocation":1359,"dataGaName":1404},"/solutions/agile-delivery/","agile delivery",{"text":1406,"config":1407},"Artifact Management",{"href":1408,"dataGaLocation":1359,"dataGaName":1409},"/artifact-central/","artifact management",{"title":1411,"items":1412},"Security & Governance",[1413,1418,1423,1428],{"text":1414,"config":1415},"Application Security Testing",{"href":1416,"dataGaLocation":1359,"dataGaName":1417},"/solutions/application-security-testing/","application security testing",{"text":1419,"config":1420},"Governance & Compliance",{"href":1421,"dataGaLocation":1359,"dataGaName":1422},"/solutions/software-compliance/","governance and compliance",{"text":1424,"config":1425},"Secrets Management",{"href":1426,"dataGaLocation":1359,"dataGaName":1427},"/gitlab-secrets-manager/","secrets management",{"text":1429,"config":1430},"Supply Chain Security",{"href":1431,"dataGaLocation":1359,"dataGaName":1432},"/solutions/supply-chain/","supply chain security",{"title":1434,"items":1435},"Context & AI",[1436,1441,1446],{"text":1437,"config":1438},"Agentic Orchestration",{"href":1439,"dataGaLocation":1359,"dataGaName":1440},"/gitlab-duo-agent-platform/","agentic orchestration",{"text":1442,"config":1443},"Context Graph",{"href":1444,"dataGaLocation":1359,"dataGaName":1445},"/gitlab-orbit/","context graph",{"text":1447,"config":1448},"Visibility & Measurement",{"href":1449,"dataGaLocation":1359,"dataGaName":1450},"/solutions/visibility-measurement/","visibility and measurement",{"config":1452,"title":1455,"text":1456,"link":1457},{"background":1453,"textColor":1454},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1790185102/o7dn32anqcb6z8dgd3as.jpg')","#000","Why GitLab","One platform for speed with control across your software lifecycle.",{"text":1458,"config":1459},"Learn more",{"href":1460,"dataGaName":1461,"dataGaLocation":1359},"/why-gitlab/","why gitlab",{"text":1463,"left":682,"config":1464,"menu":1466},"Solutions",{"dataNavLevelOne":1465},"solutions",{"type":1381,"link":1467,"columns":1471,"feature":1541},{"text":1468,"config":1469},"View all Solutions",{"href":1470,"dataGaName":1465,"dataGaLocation":1359},"/solutions/",[1472,1490,1508],{"title":1473,"items":1474},"Outcomes",[1475,1480,1485],{"text":1476,"config":1477},"DevOps Modernization",{"href":1478,"dataGaLocation":1359,"dataGaName":1479},"/assessments/devops-modernization-assessment/","devops modernization",{"text":1481,"config":1482},"Security Modernization",{"href":1483,"dataGaLocation":1359,"dataGaName":1484},"/assessments/security-modernization-assessment/","security modernization",{"text":1486,"config":1487},"AI Modernization",{"href":1488,"dataGaLocation":1359,"dataGaName":1489},"/assessments/ai-modernization-assessment/","ai modernization",{"title":1491,"items":1492},"By size",[1493,1498,1503],{"text":1494,"config":1495},"Enterprise",{"href":1496,"dataGaLocation":1359,"dataGaName":1497},"/enterprise/","enterprise",{"text":1499,"config":1500},"Small Business",{"href":1501,"dataGaLocation":1359,"dataGaName":1502},"/small-business/","small business",{"text":1504,"config":1505},"Startups",{"href":1506,"dataGaLocation":1359,"dataGaName":1507},"/solutions/startups/","startups",{"title":1509,"items":1510},"Industries",[1511,1516,1521,1526,1531,1536],{"text":1512,"config":1513},"Financial Services",{"href":1514,"dataGaLocation":1359,"dataGaName":1515},"/solutions/finance/","financial services",{"text":1517,"config":1518},"Public Sector",{"href":1519,"dataGaLocation":1359,"dataGaName":1520},"/solutions/public-sector/","public sector",{"text":1522,"config":1523},"Telecommunications",{"href":1524,"dataGaLocation":1359,"dataGaName":1525},"/solutions/telecommunications/","telecommunications",{"text":1527,"config":1528},"Automotive",{"href":1529,"dataGaLocation":1359,"dataGaName":1530},"/solutions/automotive/","automotive",{"text":1532,"config":1533},"Education",{"href":1534,"dataGaLocation":1359,"dataGaName":1535},"/solutions/education/","education",{"text":1537,"config":1538},"Aerospace",{"href":1539,"dataGaLocation":1359,"dataGaName":1540},"/solutions/aerospace/","aerospace",{"config":1542,"title":1543,"text":1544,"link":1545},{"background":1453,"textColor":1454},"GitLab Security Standard","Learn how to harden your software factory and let AI agents earn autonomy, without trading away security.",{"text":1546,"config":1547},"Explore the standard",{"href":1548,"dataGaName":1549,"dataGaLocation":1359},"/gitlab-security-standard/","gitlab security standard",{"text":1551,"config":1552},"Pricing",{"href":1553,"dataGaName":1554,"dataGaLocation":1359,"dataNavLevelOne":1554},"/pricing/","pricing",{"text":1556,"config":1557,"menu":1559},"Resources",{"dataNavLevelOne":1558},"resources",{"type":1381,"link":1560,"columns":1564,"feature":1621},{"text":1561,"config":1562},"View all resources",{"href":1563,"dataGaName":1558,"dataGaLocation":1359},"/resources/",[1565,1593],{"title":1566,"items":1567},"Discover",[1568,1573,1578,1583,1588],{"text":1569,"config":1570},"Docs",{"href":1571,"dataGaName":1572,"dataGaLocation":1359},"https://docs.gitlab.com/","docs",{"text":1574,"config":1575},"University",{"href":1576,"dataGaName":1577,"dataGaLocation":1359},"https://university.gitlab.com/","university",{"text":1579,"config":1580},"Demo Series",{"href":1581,"dataGaName":1582,"dataGaLocation":1359},"/gitlab-technical-demo-series/","demo series",{"text":1584,"config":1585},"Demo Hub",{"href":1586,"dataGaName":1587,"dataGaLocation":1359},"/demo-hub/","demo hub",{"text":1589,"config":1590},"Services",{"href":1591,"dataGaName":1592,"dataGaLocation":1359},"/services/","services",{"title":1594,"items":1595},"Connect",[1596,1601,1606,1611,1616],{"text":1597,"config":1598},"Blog",{"href":1599,"dataGaName":1600,"dataGaLocation":1359},"/blog/","blog",{"text":1602,"config":1603},"Community",{"href":1604,"dataGaName":1605,"dataGaLocation":1359},"/community/","community",{"text":1607,"config":1608},"Customers",{"href":1609,"dataGaName":1610,"dataGaLocation":1359},"/customers/","customers",{"text":1612,"config":1613},"Partners",{"href":1614,"dataGaName":1615,"dataGaLocation":1359},"/partners/","partners",{"text":1617,"config":1618},"Events",{"href":1619,"dataGaName":1620,"dataGaLocation":1359},"/events/","events",{"config":1622,"title":1623,"text":1624,"link":1625},{"background":1453,"textColor":1454},"What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1626,"config":1627},"Read the latest",{"href":1628,"dataGaName":1629,"dataGaLocation":1359},"/whats-new/","whats new",{"text":1631,"config":1632,"menu":1634},"Company",{"dataNavLevelOne":1633},"company",{"type":1381,"columns":1635},[1636],{"items":1637},[1638,1643,1649,1654,1659,1664,1669,1674,1679],{"text":1639,"config":1640},"About",{"href":1641,"dataGaName":1642,"dataGaLocation":1359},"/company/","about",{"text":1644,"config":1645,"footerGa":1648},"Jobs",{"href":1646,"dataGaName":1647,"dataGaLocation":1359},"/jobs/","jobs",{"dataGaName":1647},{"text":1650,"config":1651},"Press",{"href":1652,"dataGaName":1653,"dataGaLocation":1359},"/press/","press",{"text":1655,"config":1656},"Handbook",{"href":1657,"dataGaName":1658,"dataGaLocation":1359},"https://handbook.gitlab.com/","handbook",{"text":1660,"config":1661},"Leadership",{"href":1662,"dataGaName":1663,"dataGaLocation":1359},"/company/team/e-group/","leadership",{"text":1665,"config":1666},"Investor relations",{"href":1667,"dataGaName":1668,"dataGaLocation":1359},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1670,"config":1671},"Trust Center",{"href":1672,"dataGaName":1673,"dataGaLocation":1359},"/security/","trust center",{"text":1675,"config":1676},"AI Transparency Center",{"href":1677,"dataGaName":1678,"dataGaLocation":1359},"/ai-transparency-center/","ai transparency center",{"text":1680,"config":1681},"Newsletter",{"href":1682,"dataGaName":1683,"dataGaLocation":1359},"/company/contact/#contact-forms","newsletter",{"text":1685,"config":1686,"menu":1687},"Contact us",{"dataNavLevelOne":1633},{"type":1381,"columns":1688},[1689],{"items":1690},[1691,1696,1701],{"text":1692,"config":1693},"Talk to sales",{"href":1694,"dataGaName":1695,"dataGaLocation":1359},"/sales/","talk to sales",{"text":1697,"config":1698},"Support portal",{"href":1699,"dataGaName":1700,"dataGaLocation":1359},"https://support.gitlab.com/hc/en-us","support portal",{"text":1702,"config":1703},"Customer portal",{"href":1704,"dataGaName":1705,"dataGaLocation":1359},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1707,"login":1708,"suggestions":1715},"Close",{"text":1709,"link":1710},"To search repositories and projects, login to",{"text":1711,"config":1712},"gitlab.com",{"href":1373,"dataGaName":1713,"dataGaLocation":1714},"search login","search",{"text":1716,"default":1717},"Suggestions",[1718,1721,1724,1726,1730,1734],{"text":1719,"config":1720},"GitLab Duo Agent Platform",{"href":1439,"dataGaName":1719,"dataGaLocation":1714},{"text":1722,"config":1723},"Code Suggestions (AI)",{"href":1439,"dataGaName":1722,"dataGaLocation":1714},{"text":1391,"config":1725},{"href":1393,"dataGaName":1391,"dataGaLocation":1714},{"text":1727,"config":1728},"GitLab on AWS",{"href":1729,"dataGaName":1727,"dataGaLocation":1714},"/partners/technology-partners/aws/",{"text":1731,"config":1732},"GitLab on Google Cloud",{"href":1733,"dataGaName":1731,"dataGaLocation":1714},"/partners/technology-partners/google-cloud-platform/",{"text":1735,"config":1736},"Why GitLab?",{"href":1460,"dataGaName":1735,"dataGaLocation":1714},{"freeTrial":1738,"mobileIcon":1743,"desktopIcon":1748,"secondaryButton":1751},{"text":1739,"config":1740},"Start free trial",{"href":1741,"dataGaName":1364,"dataGaLocation":1742},"https://gitlab.com/-/trials/new/","nav",{"altText":1744,"config":1745},"Gitlab Icon",{"src":1746,"dataGaName":1747,"dataGaLocation":1742},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1744,"config":1749},{"src":1750,"dataGaName":1747,"dataGaLocation":1742},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1752,"config":1753},"Get Started",{"href":1754,"dataGaName":1755,"dataGaLocation":1742},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1757,"mobileIcon":1761,"desktopIcon":1763},{"text":1758,"config":1759},"Learn more about GitLab Duo",{"href":1439,"dataGaName":1760,"dataGaLocation":1742},"gitlab duo",{"altText":1744,"config":1762},{"src":1746,"dataGaName":1747,"dataGaLocation":1742},{"altText":1744,"config":1764},{"src":1750,"dataGaName":1747,"dataGaLocation":1742},{"button":1766,"mobileIcon":1771,"desktopIcon":1773},{"text":1767,"config":1768},"/switch",{"href":1769,"dataGaName":1770,"dataGaLocation":1742},"#contact","switch",{"altText":1744,"config":1772},{"src":1746,"dataGaName":1747,"dataGaLocation":1742},{"altText":1744,"config":1774},{"src":1775,"dataGaName":1747,"dataGaLocation":1742},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1777,"mobileIcon":1782,"desktopIcon":1784},{"text":1778,"config":1779},"Back to pricing",{"href":1553,"dataGaName":1780,"dataGaLocation":1742,"icon":1781},"back to pricing","GoBack",{"altText":1744,"config":1783},{"src":1746,"dataGaName":1747,"dataGaLocation":1742},{"altText":1744,"config":1785},{"src":1750,"dataGaName":1747,"dataGaLocation":1742},{"title":1787,"button":1788,"config":1794},"Ship at agent speed. Prove every step. Transcend is here.",{"text":1789,"config":1790},"Watch now",{"href":1791,"dataGaName":1792,"dataGaLocation":1793},"/events/transcend/virtual/#watch-gitlab-transcend","transcend-october-2026-banner","global-banner",{"layout":1795,"disabled":1346},"release",{"data":1797},{"text":1798,"source":1799,"edit":1805,"contribute":1810,"config":1815,"items":1820,"minimal":2046},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1800,"config":1801},"View page source",{"href":1802,"dataGaName":1803,"dataGaLocation":1804},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1806,"config":1807},"Edit this page",{"href":1808,"dataGaName":1809,"dataGaLocation":1804},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1811,"config":1812},"Please contribute",{"href":1813,"dataGaName":1814,"dataGaLocation":1804},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1816,"facebook":1817,"youtube":1818,"linkedin":1819},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1821,1868,1926,1973,2014],{"title":1551,"links":1822,"subMenu":1837},[1823,1827,1832],{"text":1824,"config":1825},"View plans",{"href":1553,"dataGaName":1826,"dataGaLocation":1804},"view plans",{"text":1828,"config":1829},"Why Premium?",{"href":1830,"dataGaName":1831,"dataGaLocation":1804},"/pricing/premium/","why premium",{"text":1833,"config":1834},"Why Ultimate?",{"href":1835,"dataGaName":1836,"dataGaLocation":1804},"/pricing/ultimate/","why ultimate",[1838],{"title":1839,"links":1840},"Contact Us",[1841,1844,1846,1848,1853,1858,1863],{"text":1842,"config":1843},"Contact sales",{"href":1694,"dataGaName":1369,"dataGaLocation":1804},{"text":1697,"config":1845},{"href":1699,"dataGaName":1700,"dataGaLocation":1804},{"text":1702,"config":1847},{"href":1704,"dataGaName":1705,"dataGaLocation":1804},{"text":1849,"config":1850},"Status",{"href":1851,"dataGaName":1852,"dataGaLocation":1804},"https://status.gitlab.com/","status",{"text":1854,"config":1855},"Terms of use",{"href":1856,"dataGaName":1857,"dataGaLocation":1804},"/terms/","terms of use",{"text":1859,"config":1860},"Privacy statement",{"href":1861,"dataGaName":1862,"dataGaLocation":1804},"/privacy/","privacy statement",{"text":1864,"config":1865},"Cookie preferences",{"dataGaName":1866,"dataGaLocation":1804,"id":1867,"isOneTrustButton":682},"cookie preferences","ot-sdk-btn",{"title":1377,"links":1869,"subMenu":1883},[1870,1873,1875,1877,1879,1881],{"text":1871,"config":1872},"Explore the platform",{"href":1385,"dataGaName":1379,"dataGaLocation":1804},{"text":1437,"config":1874},{"href":1439,"dataGaName":1440,"dataGaLocation":1804},{"text":1391,"config":1876},{"href":1393,"dataGaName":1394,"dataGaLocation":1804},{"text":1442,"config":1878},{"href":1444,"dataGaName":1445,"dataGaLocation":1804},{"text":1424,"config":1880},{"href":1426,"dataGaName":1427,"dataGaLocation":1804},{"text":1455,"config":1882},{"href":1460,"dataGaName":1461,"dataGaLocation":1804},[1884],{"title":1885,"links":1886},"Topics",[1887,1891,1896,1901,1906,1911,1916,1921],{"text":1391,"config":1888},{"href":1889,"dataGaName":1890,"dataGaLocation":1804},"/topics/ci-cd/","cicd",{"text":1892,"config":1893},"GitOps",{"href":1894,"dataGaName":1895,"dataGaLocation":1804},"/topics/gitops/","gitops",{"text":1897,"config":1898},"DevOps",{"href":1899,"dataGaName":1900,"dataGaLocation":1804},"/topics/devops/","devops",{"text":1902,"config":1903},"Version Control",{"href":1904,"dataGaName":1905,"dataGaLocation":1804},"/topics/version-control/","version control",{"text":1907,"config":1908},"DevSecOps",{"href":1909,"dataGaName":1910,"dataGaLocation":1804},"/topics/devsecops/","devsecops",{"text":1912,"config":1913},"Cloud Native",{"href":1914,"dataGaName":1915,"dataGaLocation":1804},"/topics/cloud-native/","cloud native",{"text":1917,"config":1918},"AI for Coding",{"href":1919,"dataGaName":1920,"dataGaLocation":1804},"/topics/devops/ai-for-coding/","ai for coding",{"text":1922,"config":1923},"Agentic AI",{"href":1924,"dataGaName":1925,"dataGaLocation":1804},"/topics/agentic-ai/","agentic ai",{"title":1463,"links":1927},[1928,1931,1934,1937,1940,1943,1945,1947,1949,1951,1953,1956,1958,1961,1965,1969],{"text":1929,"config":1930},"DevOps modernization",{"href":1478,"dataGaName":1479,"dataGaLocation":1804},{"text":1932,"config":1933},"Security modernization",{"href":1483,"dataGaName":1484,"dataGaLocation":1804},{"text":1935,"config":1936},"AI modernization",{"href":1488,"dataGaName":1489,"dataGaLocation":1804},{"text":1938,"config":1939},"Financial services",{"href":1514,"dataGaName":1515,"dataGaLocation":1804},{"text":1941,"config":1942},"Public sector",{"href":1519,"dataGaName":1520,"dataGaLocation":1804},{"text":1522,"config":1944},{"href":1524,"dataGaName":1525,"dataGaLocation":1804},{"text":1527,"config":1946},{"href":1529,"dataGaName":1530,"dataGaLocation":1804},{"text":1532,"config":1948},{"href":1534,"dataGaName":1535,"dataGaLocation":1804},{"text":1537,"config":1950},{"href":1539,"dataGaName":1540,"dataGaLocation":1804},{"text":1494,"config":1952},{"href":1496,"dataGaName":1497,"dataGaLocation":1804},{"text":1954,"config":1955},"Small business",{"href":1501,"dataGaName":1502,"dataGaLocation":1804},{"text":1504,"config":1957},{"href":1506,"dataGaName":1507,"dataGaLocation":1804},{"text":1892,"config":1959},{"href":1960,"dataGaName":1895,"dataGaLocation":1804},"/solutions/gitops/",{"text":1962,"config":1963},"Software composition analysis",{"href":1431,"dataGaName":1964,"dataGaLocation":1804},"software composition analysis",{"text":1966,"config":1967},"Value stream management",{"href":1449,"dataGaName":1968,"dataGaLocation":1804},"value stream management",{"text":1970,"config":1971},"All solutions",{"href":1470,"dataGaName":1972,"dataGaLocation":1804},"all solutions",{"title":1556,"links":1974},[1975,1980,1985,1987,1989,1991,1993,1995,1997,1999,2001,2003,2005,2007,2010],{"text":1976,"config":1977},"Install",{"href":1978,"dataGaName":1979,"dataGaLocation":1804},"/install/","install",{"text":1981,"config":1982},"Quick start guides",{"href":1983,"dataGaName":1984,"dataGaLocation":1804},"/get-started/","quick setup checklists",{"text":1569,"config":1986},{"href":1571,"dataGaName":1572,"dataGaLocation":1804},{"text":1574,"config":1988},{"href":1576,"dataGaName":1577,"dataGaLocation":1804},{"text":1579,"config":1990},{"href":1581,"dataGaName":1582,"dataGaLocation":1804},{"text":1584,"config":1992},{"href":1586,"dataGaName":1587,"dataGaLocation":1804},{"text":1589,"config":1994},{"href":1591,"dataGaName":1592,"dataGaLocation":1804},{"text":1597,"config":1996},{"href":1599,"dataGaName":1600,"dataGaLocation":1804},{"text":1602,"config":1998},{"href":1604,"dataGaName":1605,"dataGaLocation":1804},{"text":1607,"config":2000},{"href":1609,"dataGaName":1610,"dataGaLocation":1804},{"text":1612,"config":2002},{"href":1614,"dataGaName":1615,"dataGaLocation":1804},{"text":1617,"config":2004},{"href":1619,"dataGaName":1620,"dataGaLocation":1804},{"text":1680,"config":2006},{"href":1682,"dataGaName":1683,"dataGaLocation":1804},{"text":2008,"config":2009},"What's new",{"href":1628,"dataGaName":1629,"dataGaLocation":1804},{"text":2011,"config":2012},"All resources",{"href":1563,"dataGaName":2013,"dataGaLocation":1804},"all resources",{"title":1631,"links":2015},[2016,2018,2020,2022,2024,2026,2028,2030,2032,2036,2041],{"text":1639,"config":2017},{"href":1641,"dataGaName":1633,"dataGaLocation":1804},{"text":1644,"config":2019},{"href":1646,"dataGaName":1647,"dataGaLocation":1804},{"text":1650,"config":2021},{"href":1652,"dataGaName":1653,"dataGaLocation":1804},{"text":1655,"config":2023},{"href":1657,"dataGaName":1658,"dataGaLocation":1804},{"text":1660,"config":2025},{"href":1662,"dataGaName":1663,"dataGaLocation":1804},{"text":1665,"config":2027},{"href":1667,"dataGaName":1668,"dataGaLocation":1804},{"text":1670,"config":2029},{"href":1672,"dataGaName":1673,"dataGaLocation":1804},{"text":1675,"config":2031},{"href":1677,"dataGaName":1678,"dataGaLocation":1804},{"text":2033,"config":2034},"Sustainability",{"href":2035,"dataGaName":2033,"dataGaLocation":1804},"/sustainability/",{"text":2037,"config":2038},"Diversity, inclusion and belonging (DIB)",{"href":2039,"dataGaName":2040,"dataGaLocation":1804},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2042,"config":2043},"Modern Slavery Transparency Statement",{"href":2044,"dataGaName":2045,"dataGaLocation":1804},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2047},[2048,2051,2054],{"text":2049,"config":2050},"Terms",{"href":1856,"dataGaName":1857,"dataGaLocation":1804},{"text":2052,"config":2053},"Cookies",{"dataGaName":1866,"dataGaLocation":1804,"id":1867,"isOneTrustButton":682},{"text":2055,"config":2056},"Privacy",{"href":1861,"dataGaName":1862,"dataGaLocation":1804},[2058],{"id":2059,"title":7,"body":1340,"config":2060,"content":2062,"description":1340,"extension":2068,"meta":2069,"navigation":682,"path":2070,"seo":2071,"stem":2072,"__hash__":2073},"blogAuthors/en-us/blog/authors/darwin-sanoy.yml",{"template":2061},"BlogAuthor",{"role":2063,"name":7,"config":2064},"Field Chief Cloud Architect",{"headshot":2065,"linkedin":2066,"ctfId":2067},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659751/Blog/Author%20Headshots/Darwin-Sanoy-headshot-395-square-gitlab-teampage-avatar.png","https://linkedin.com/in/darwinsanoy","DarwinJS","yml",{},"/en-us/blog/authors/darwin-sanoy",{},"en-us/blog/authors/darwin-sanoy","UkMMwmU5o2e6Y-wBltA9E_z96LvHuB-bG6VW9DsLzIY",[2075,2083,2091],{"title":2076,"description":2077,"heroImage":2078,"category":1336,"date":2079,"authors":2080,"slug":2082,"externalUrl":1340},"Two front doors: Module-level access in a Django GRC app","A technical deep-dive on restructuring a Django internal tool to support two distinct GitLab teams: Security Compliance and Internal Audit.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097663/Blog/Hero%20Images/Blog/Hero%20Images/Workflow%201800x945_2gQoQIbY9NvjLFpXtsxtXy_1750097663612.png","2026-10-05",[2081],"Donovan Felton","module-level-access-in-a-django-grc-app",{"title":2084,"description":2085,"heroImage":2086,"category":1336,"date":2087,"authors":2088,"slug":2090,"externalUrl":1340},"How GitLab reduced code-per-agentic-flow ratio by 45%","Learn how Flow Registry, a component-based framework that compiles YAML configurations into fully functional LangGraph flows, helped improve scalability and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-09-22",[2089],"Mikolaj Wawrzyniak","how-gitlab-reduced-code-per-agentic-flow-ratio",{"title":2092,"description":2093,"heroImage":2094,"category":1336,"date":2095,"authors":2096,"slug":2098,"externalUrl":1340},"Co-Create: Building GitLab with our users","How GitLab users collaborated with us to build practical product improvements in the first half of 2026.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-09-10",[2097],"Isa Huerga","co-create-h1-2026",{"header":2100,"text":2101,"button":2105,"disclaimer":2108},"Start your free\n\n30-day GitLab trial\n",[2102,2103,2104],"GitLab Duo Agent Platform access","Try our most advanced features","Automate complex tasks with AI",{"text":1361,"config":2106},{"href":2107,"dataGaName":1364,"dataGaLocation":1600},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/blog/","No credit card required.",{"header":2110,"blurb":2111,"button":2112,"secondaryButton":2117},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":2113,"config":2114},"Get your free trial",{"href":2115,"dataGaName":1364,"dataGaLocation":2116},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1842,"config":2118},{"href":1694,"dataGaName":1369,"dataGaLocation":2116},1791944930650]