[{"data":1,"prerenderedAt":2082},["ShallowReactive",2],{"/ja-jp/blog/git-clone-override-policy":3,"navigation-ja-jp":1326,"banner-ja-jp":1759,"footer-ja-jp":1767,"blog-post-authors-ja-jp-Darwin Sanoy":2021,"blog-related-posts-ja-jp-git-clone-override-policy":2038,"blog-share-wrapper-ja-jp":2063,"next-steps-ja-jp":2073},{"id":4,"title":5,"authors":6,"body":8,"category":1307,"date":1308,"description":1309,"extension":1310,"externalUrl":1311,"faq":1311,"featured":678,"heroImage":1312,"meta":1313,"navigation":678,"path":1314,"seo":1315,"slug":1318,"stem":1319,"tags":1320,"template":1323,"updatedDate":1324,"__hash__":1325},"blogPosts/ja-jp/blog/git-clone-override-policy.md","履歴をすべて取得するクローンが、開発基盤全体にコストを課している",[7],"Darwin Sanoy",{"type":9,"value":10,"toc":1295},"minimark",[11,19,22,33,49,52,55,59,62,109,112,115,145,148,151,154,162,165,224,229,337,345,392,397,416,431,434,439,462,465,470,585,588,593,607,614,617,620,626,630,637,643,653,656,659,1065,1068,1071,1097,1100,1104,1178,1181,1185,1188,1241,1243,1247,1258,1261,1264,1279,1291],[12,13,14,18],"p",{},[15,16,17],"code",{},"git clone"," はクライアント側の操作だと思われがちですが、その設定はサーバー側と、その間にあるすべてのネットワークにまで影響します。デフォルトのフル履歴クローン（履歴をすべて取得する通常のクローン）を実行すると、サーバーは履歴全体をたどってパックファイルを構築し（「counting objects」が実際に行っているのはこの処理です）、ネットワーク越しに送り出します。クライアント側はそれをすべて展開し、完全なワークツリーをチェックアウト。クライアントのCPU、ネットワーク、Gitサーバーのパック構築処理、ディスクと、あらゆるレイヤーがそのリクエストの大きさに応じたコストを負担しています。逆に言えば、リクエストを小さくすれば、手元のノートPCだけでなくスタック全体のコストが一度に下がるということです。",[12,20,21],{},"エージェント型AIは、通常の開発ワークフローとは比べものにならない負荷をこの部分にかけます。リポジトリを扱うエージェントは、人間よりもはるかに高い頻度で、しかも予測しにくいタイミングでクローンを実行。デフォルトがフル履歴クローンのままなら、そのコストをエージェントの規模で払い続けることになるのです。",[12,23,24,25,28,29,32],{},"GitLabは、大規模リポジトリをより高速に配信できるよう、バックエンドの改善に力を入れています。一方で、リクエストする側の内容を変えるという手もあります。シャロークローン（",[15,26,27],{},"--depth=1","）、単一ブランチのクローン、部分クローン（",[15,30,31],{},"--filter=blob:none","）を使えば、ジョブが実際に必要とするものだけを取得可能。リクエストを絞り込むだけで、ピーク時の負荷、不安定さ、待ち時間、コストがその場で下がります。しかも今後のバックエンド改善は、この軽量化されたリクエストの上に積み重なっていくのです。",[12,34,35,36,42,43,48],{},"以前の記事「",[37,38,41],"a",{"href":39,"rel":40},"https://about.gitlab.com/ja-jp/blog/supercharge-your-git-workflows/",[],"Gitワークフローを高速化","」では、",[37,44,47],{"href":45,"rel":46},"https://gitlab.com/gitlab-accelerates-embedded/git-clone-perf/git-much-faster",[],"Git Much Faster"," がどのようにベンチマークを行い、クローン時間を最大93%、ディスク使用量を最大98%削減する設定を割り出したかを解説しました。圧縮の無効化、HTTPバッファの拡大、シャロークローンと部分クローン、バイナリをスキップするスパースチェックアウト。数字としては申し分ありません。ただし、落とし穴がひとつ。リポジトリをクローンするすべての場所に、何行もの最適化コードを漏れなく反映させる必要があるのです。デベロッパーのノートPC、CIジョブ、サンドボックスを立ち上げるエージェント。そのどれもが、設定を忘れる機会になり得ます。",[12,50,51],{},"これは自動化ではありません。ただの願望です。",[12,53,54],{},"本記事では、リポジトリのクローン最適化を自動的に適用し、コストを最小化するGit Clone Override Policyの導入方法を解説します。",[56,57,58],"h2",{"id":58},"クローンのコストが最も重くのしかかる場所",[12,60,61],{},"エージェント型AIは最も新しく、最も急速に拡大している圧力ですが、デフォルトのフル履歴クローンがソフトウェア業界に大きな代償を強いている場面は、ほかにもあります。",[63,64,65,73,79,85,91,97,103],"ul",{},[66,67,68,72],"li",{},[69,70,71],"strong",{},"モノレポ："," 多数のプロジェクトを1つのリポジトリに集約すると、クローンのたびに、個々のチームが実際に必要とする量をはるかに超えるデータを取得することになります。",[66,74,75,78],{},[69,76,77],{},"複雑で長期にわたるGit履歴："," 現在のツリーが小さくても、何年分ものコミットが積み重なることでリポジトリ全体のサイズは膨らみます。",[66,80,81,84],{},[69,82,83],{},"メディア、バイナリ、組み込みプロジェクト："," ファームウェアイメージ、ベンダー提供のSDK、デザインアセットをバージョン管理に直接格納すると、ソースコードだけでは起こり得ない規模でリポジトリが肥大化します。",[66,86,87,90],{},[69,88,89],{},"CI/CDパイプライン："," ジョブごとに新規クローンが走り、それが1日に数千回繰り返されれば、1回あたりのわずかな非効率が大きな継続コストに変わります。",[66,92,93,96],{},[69,94,95],{},"データサイエンスと機械学習のデータセット："," Gitで管理される大きなデータファイルも、サイズの大きいほかのblobと同じコストを抱えています。",[66,98,99,102],{},[69,100,101],{},"リモート開発環境："," クラウド上の環境や一時的な開発環境は、高速で軽量な起動を求めながら、実際にはリポジトリ全体の複製がデフォルトのままです。",[66,104,105,108],{},[69,106,107],{},"エージェント型AI："," クローン要求の数は大幅に増え、しかも人間主導のワークフローよりはるかに予測しにくくなります。",[56,110,111],{"id":111},"最適化をスキップできない仕組みにする",[12,113,114],{},"解決策は、どのフラグを設定すべきかを説明するREADMEを充実させることではありません。判断そのものを個人の手から完全に切り離すこと。つまり、ポリシーをコードとしてリポジトリ自体にコミットし、小さなプログラムに強制させるという方法です。",[12,116,117,118,123,124,127,128,131,132,136,137,140,141,144],{},"それを実現するのが ",[37,119,122],{"href":120,"rel":121},"https://gitlab.com/gitlab-accelerates-embedded/git-clone-perf/git-clone-override-policy",[],"Git Clone Override Policy"," です。リポジトリに ",[15,125,126],{},".afullhistorycloneoverridepolicy.toml"," ファイルを置くと、軽量なGoバイナリが、オプションを一切付けない ",[15,129,130],{},"git clone URL","（素のまま、デフォルトのフル履歴リクエスト）",[133,134,135],"em",{},"だけ","を横取りします。ユーザー自身が何らかのオプション（",[15,138,139],{},"--depth 1","、",[15,142,143],{},"--filter"," など）を付けた時点で、バイナリは「すでに最適化している」と判断し、コマンドをそのまま素通し。リポジトリにポリシーファイルがない場合も同じで、通常のクローンへのクリーンなパススルーとなります。介入するのは、誰もが間違いだと認める唯一のケース、つまり条件を何も指定しないデフォルトの場合だけです。",[12,146,147],{},"実際に介入する場合の流れはこうです。まずポリシーファイルを取得し、続いて13ステップの固定処理を実行します。この処理では、リポジトリをシャロークローンかつ部分クローンで取得し、バイナリファイル（画像、アーカイブ、メディア、フォントなど）をスキップするスパースチェックアウトを設定し、Git Much Fasterと同じチューニング済みgit configを適用。これらはすべて、ソースコードが1行でもディスクに現れる前に完了します。",[56,149,150],{"id":150},"最大限に最適化するとどうなるか",[12,152,153],{},"Gitのクローンを最大限に最適化するために必要なコマンドを見ていきましょう。",[12,155,156],{},[69,157,158,159,161],{},"1. ",[15,160,17],{}," を使わず、リポジトリの器を自分で作る",[12,163,164],{},"こうすることで、最初のクローンリクエストのファイル範囲を決める、さまざまなgit設定を適用できます。",[166,167,172],"pre",{"className":168,"code":169,"language":170,"meta":171,"style":171},"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","",[15,173,174,198,207],{"__ignoreMap":171},[175,176,179,183,187,191,195],"span",{"class":177,"line":178},"line",1,[175,180,182],{"class":181},"s7eDp","mkdir",[175,184,186],{"class":185},"sYBdl"," my-repo",[175,188,190],{"class":189},"sgsFI"," && ",[175,192,194],{"class":193},"sYu0t","cd",[175,196,197],{"class":185}," my-repo\n",[175,199,201,204],{"class":177,"line":200},2,[175,202,203],{"class":181},"git",[175,205,206],{"class":185}," init\n",[175,208,210,212,215,218,221],{"class":177,"line":209},3,[175,211,203],{"class":181},[175,213,214],{"class":185}," remote",[175,216,217],{"class":185}," add",[175,219,220],{"class":185}," origin",[175,222,223],{"class":185}," https://example.com/group/my-repo.git\n",[12,225,226],{},[69,227,228],{},"2. このリポジトリだけにスコープを限定し、大容量転送向けにgit configをチューニングする",[166,230,232],{"className":168,"code":231,"language":170,"meta":171,"style":171},"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",[15,233,234,250,264,278,293,308,322],{"__ignoreMap":171},[175,235,236,238,241,244,247],{"class":177,"line":178},[175,237,203],{"class":181},[175,239,240],{"class":185}," config",[175,242,243],{"class":193}," --local",[175,245,246],{"class":185}," core.compression",[175,248,249],{"class":193}," 0\n",[175,251,252,254,256,258,261],{"class":177,"line":200},[175,253,203],{"class":181},[175,255,240],{"class":185},[175,257,243],{"class":193},[175,259,260],{"class":185}," http.postBuffer",[175,262,263],{"class":185}," 1024M\n",[175,265,266,268,270,272,275],{"class":177,"line":209},[175,267,203],{"class":181},[175,269,240],{"class":185},[175,271,243],{"class":193},[175,273,274],{"class":185}," http.lowSpeedLimit",[175,276,277],{"class":193}," 1000\n",[175,279,281,283,285,287,290],{"class":177,"line":280},4,[175,282,203],{"class":181},[175,284,240],{"class":185},[175,286,243],{"class":193},[175,288,289],{"class":185}," http.lowSpeedTime",[175,291,292],{"class":193}," 300\n",[175,294,296,298,300,302,305],{"class":177,"line":295},5,[175,297,203],{"class":181},[175,299,240],{"class":185},[175,301,243],{"class":193},[175,303,304],{"class":185}," pack.windowMemory",[175,306,307],{"class":185}," 256m\n",[175,309,311,313,315,317,320],{"class":177,"line":310},6,[175,312,203],{"class":181},[175,314,240],{"class":185},[175,316,243],{"class":193},[175,318,319],{"class":185}," pack.packSizeLimit",[175,321,307],{"class":185},[175,323,325,327,329,331,334],{"class":177,"line":324},7,[175,326,203],{"class":181},[175,328,240],{"class":185},[175,330,243],{"class":193},[175,332,333],{"class":185}," pack.threads",[175,335,336],{"class":193}," 4\n",[12,338,339],{},[69,340,341,342,344],{},"3. ",[15,343,143],{}," でフェッチするため、部分クローンを有効にする",[166,346,348],{"className":168,"code":347,"language":170,"meta":171,"style":171},"git config --local extensions.partialClone origin\ngit config --local remote.origin.promisor true\ngit config --local remote.origin.partialclonefilter blob:none\n",[15,349,350,364,378],{"__ignoreMap":171},[175,351,352,354,356,358,361],{"class":177,"line":178},[175,353,203],{"class":181},[175,355,240],{"class":185},[175,357,243],{"class":193},[175,359,360],{"class":185}," extensions.partialClone",[175,362,363],{"class":185}," origin\n",[175,365,366,368,370,372,375],{"class":177,"line":200},[175,367,203],{"class":181},[175,369,240],{"class":185},[175,371,243],{"class":193},[175,373,374],{"class":185}," remote.origin.promisor",[175,376,377],{"class":193}," true\n",[175,379,380,382,384,386,389],{"class":177,"line":209},[175,381,203],{"class":181},[175,383,240],{"class":185},[175,385,243],{"class":193},[175,387,388],{"class":185}," remote.origin.partialclonefilter",[175,390,391],{"class":185}," blob:none\n",[12,393,394],{},[69,395,396],{},"4. リモートの全ブランチではなく、実際に必要な1つのrefだけにフェッチのrefspecを絞り込む",[166,398,400],{"className":168,"code":399,"language":170,"meta":171,"style":171},"git config --local remote.origin.fetch \"+refs/heads/main:refs/remotes/origin/main\"\n",[15,401,402],{"__ignoreMap":171},[175,403,404,406,408,410,413],{"class":177,"line":178},[175,405,203],{"class":181},[175,407,240],{"class":185},[175,409,243],{"class":193},[175,411,412],{"class":185}," remote.origin.fetch",[175,414,415],{"class":185}," \"+refs/heads/main:refs/remotes/origin/main\"\n",[12,417,418,419,422,423,426,427,430],{},"この設定を変更しない場合、",[15,420,421],{},"remote.origin.fetch"," には自動的に ",[15,424,425],{},"+refs/heads/*:refs/remotes/origin/*"," が設定されます。つまり、フェッチのたびに（そして最初のクローン時にも）originにあるすべてのブランチのrefポインタを取得することになるわけです。この設定を書き換えれば、フェッチ対象を ",[15,428,429],{},"main"," ブランチだけに限定でき、Gitはそれ以外のリモートブランチのrefを追跡も更新もしなくなります。",[12,432,433],{},"ネゴシエーションと更新の対象となるrefが減るため、フェッチ1回あたりのオーバーヘッドも小さくなります。ブランチが数百に及ぶリポジトリでは、その差は特に顕著です。",[12,435,436],{},[69,437,438],{},"5. blobの取得を先送りしつつ、シャローにフェッチする",[166,440,442],{"className":168,"code":441,"language":170,"meta":171,"style":171},"git fetch --depth=1 --filter=blob:none origin main\n",[15,443,444],{"__ignoreMap":171},[175,445,446,448,451,454,457,459],{"class":177,"line":178},[175,447,203],{"class":181},[175,449,450],{"class":185}," fetch",[175,452,453],{"class":193}," --depth=1",[175,455,456],{"class":193}," --filter=blob:none",[175,458,220],{"class":185},[175,460,461],{"class":185}," main\n",[12,463,464],{},"depthとfilterのこの組み合わせにより、初回転送を最小限に抑えられます。取得されるのはコミット1つ分のツリー構造だけで、ファイルをチェックアウトするまでblobデータは一切ダウンロードされません。この効果が特に大きいのは、大きなファイルや長い履歴を抱えるリポジトリを扱う場合です。",[12,466,467],{},[69,468,469],{},"6. スパースチェックアウトを有効にし、ソース作業に不要なバイナリファイル形式をすべて除外する",[166,471,473],{"className":168,"code":472,"language":170,"meta":171,"style":171},"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",[15,474,475,488,506,511,516,521,526,531,537,543,549,555,561,567,573,579],{"__ignoreMap":171},[175,476,477,479,482,485],{"class":177,"line":178},[175,478,203],{"class":181},[175,480,481],{"class":185}," sparse-checkout",[175,483,484],{"class":185}," init",[175,486,487],{"class":193}," --cone\n",[175,489,490,493,497,500,503],{"class":177,"line":200},[175,491,492],{"class":181},"cat",[175,494,496],{"class":495},"sD7c4"," >>",[175,498,499],{"class":185}," .git/info/sparse-checkout",[175,501,502],{"class":495}," \u003C\u003C",[175,504,505],{"class":185},"'EOF'\n",[175,507,508],{"class":177,"line":209},[175,509,510],{"class":185},"/*\n",[175,512,513],{"class":177,"line":280},[175,514,515],{"class":185},"!*.png\n",[175,517,518],{"class":177,"line":295},[175,519,520],{"class":185},"!*.PNG\n",[175,522,523],{"class":177,"line":310},[175,524,525],{"class":185},"!*.jpg\n",[175,527,528],{"class":177,"line":324},[175,529,530],{"class":185},"!*.JPG\n",[175,532,534],{"class":177,"line":533},8,[175,535,536],{"class":185},"!*.pdf\n",[175,538,540],{"class":177,"line":539},9,[175,541,542],{"class":185},"!*.PDF\n",[175,544,546],{"class":177,"line":545},10,[175,547,548],{"class":185},"!*.zip\n",[175,550,552],{"class":177,"line":551},11,[175,553,554],{"class":185},"!*.ZIP\n",[175,556,558],{"class":177,"line":557},12,[175,559,560],{"class":185},"!*.mp4\n",[175,562,564],{"class":177,"line":563},13,[175,565,566],{"class":185},"!*.MP4\n",[175,568,570],{"class":177,"line":569},14,[175,571,572],{"class":185},"!*.exe\n",[175,574,576],{"class":177,"line":575},15,[175,577,578],{"class":185},"!*.EXE\n",[175,580,582],{"class":177,"line":581},16,[175,583,584],{"class":185},"EOF\n",[12,586,587],{},"実際のポリシーでは、画像、ドキュメント、アーカイブ、メディア、コンパイル済みバイナリ、デザインファイルにわたる30種類以上の拡張子を、大文字・小文字の両方で除外しています。上記はその一部を抜き出したものにすぎません。",[12,589,590],{},[69,591,592],{},"7. refをチェックアウトする",[166,594,596],{"className":168,"code":595,"language":170,"meta":171,"style":171},"git checkout main\n",[15,597,598],{"__ignoreMap":171},[175,599,600,602,605],{"class":177,"line":178},[175,601,203],{"class":181},[175,603,604],{"class":185}," checkout",[175,606,461],{"class":185},[12,608,609,610,613],{},"この7段階をこの順番どおりに ",[15,611,612],{},"www.gitlab.com"," に対して実行すれば、9.5GBではなく110MBに収まります。順番を間違えると（refspecを絞る前にフェッチする、スパースチェックアウトをチェックアウトの前ではなく後に行う、など）、よくて最適化が無駄になり、最悪の場合は取得を避けようとしていたものをそのまま取得してしまいます。この正確さを、すべての人とすべてのパイプラインが、クローンのたびに正しく繰り返す。冒頭で触れた規律の問題とは、まさにこれです。Git Clone Override Policyは、ここで新しい技術を発明しているわけではありません。誰も手順を覚えていなくても、この7段階が毎回同じ順序で確実に実行されることを保証する。それがこのツールの役割です。",[56,615,616],{"id":616},"自動化という解決策",[12,618,619],{},"Gitクライアントの利用は規模が大きく、しかも分散しています。そのため、目的に応じた正確なクローン最適化コマンド一式を、人が手で実行したり、CIジョブやエージェントのサンドボックスごとに個別実装したりする方法では、真の信頼性は得られません。ここで必要になるのが自動化です。",[12,621,622,623,625],{},"全員が7つの段階を記憶していることに賭けるのではなく、自動的なポリシーでこのワークフローを強制できるとしたらどうでしょうか。実は、それをそのまま実現する実装がすでに存在します。コードと並んでリポジトリに置かれるTOMLポリシーファイルと、すべての ",[15,624,17],{}," 呼び出しをネットワークに届く前に横取りできるクライアントの組み合わせです。ポリシーを一度保存しておけば、人間、CIジョブ、エージェントを問わず、あらゆるクローンが依頼ベースではなく自動的に最適化された手順を通ります。ポリシー設定ファイルを使えば、用途ごとに必要なチューニングも可能。上記のデフォルトはコード行数のカウントを想定したもので、既存のテキストファイルを確実に取得できれば十分です。一方、同じソフトウェアをビルドする場合は、アプリケーションのUIに一部のグラフィックを組み込むためにより多くのファイルが必要になることもあります。リリースノート用のコミットメッセージを探すために、より多くのGit履歴情報を要するビルドもあるでしょう。",[56,627,629],{"id":628},"小さくポータブルなgoバイナリとリポジトリに置くポリシー設定ファイル","小さくポータブルなGoバイナリと、リポジトリに置くポリシー設定ファイル",[12,631,632,633,636],{},"インターセプター本体は、自己完結型のGoバイナリ1つです。",[15,634,635],{},"sed"," と願望でつなぎ合わせたシェルスクリプトではありません。この選択には、いくつか注目すべき利点があります。",[12,638,639],{},[640,641],"img",{"alt":629,"src":642},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1787080260/bhz0beczhkffzdweghma.png",[12,644,645,646,649,650,652],{},"Linux、macOS、Windowsで動作し、amd64とarm64の両方に対応。bash版とPowerShell版が別々に存在して互いにずれていく、といった事態は起こりません。コードベースは1つだけです。CMDやPowerShellからGit Bash、WSLまで、遭遇しそうなシェルはひととおりテスト済み。実行時の依存は、",[15,647,648],{},"PATH"," 上にある本物の ",[15,651,203],{}," バイナリだけです。",[12,654,655],{},"内部構造も、すべてを1つの大きな関数で処理するのではなく、独立してテストできる6つの小さな部品に分かれています。ポリシーの解析、固定シーケンスのインタープリター、gitコマンドの実行、ロギング、クロスプラットフォーム判定、そして4つの呼び出しモードすべてを扱うエントリーポイントです。",[12,657,658],{},"現時点で調整できる項目の感覚をつかむには、次の設定ファイル例が参考になります。",[166,660,664],{"className":661,"code":662,"language":663,"meta":171,"style":171},"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",[15,665,666,674,680,691,699,707,711,720,728,736,744,752,760,767,775,779,788,805,810,820,828,835,844,855,861,867,906,944,967,985,1013,1051,1056],{"__ignoreMap":171},[175,667,668,671],{"class":177,"line":178},[175,669,670],{"class":189},"schema_version = ",[175,672,673],{"class":193},"2\n",[175,675,676],{"class":177,"line":200},[175,677,679],{"emptyLinePlaceholder":678},true,"\n",[175,681,682,685,688],{"class":177,"line":209},[175,683,684],{"class":189},"[",[175,686,687],{"class":181},"policyinfo",[175,689,690],{"class":189},"]\n",[175,692,693,696],{"class":177,"line":280},[175,694,695],{"class":189},"description = ",[175,697,698],{"class":185},"\"The most optimal latest-code-only clone for AI agents (that do not need git history) or counting lines of code.\"\n",[175,700,701,704],{"class":177,"line":295},[175,702,703],{"class":189},"OptimalForAIAgents = ",[175,705,706],{"class":193},"true\n",[175,708,709],{"class":177,"line":310},[175,710,679],{"emptyLinePlaceholder":678},[175,712,713,715,718],{"class":177,"line":324},[175,714,684],{"class":189},[175,716,717],{"class":181},"git_config",[175,719,690],{"class":189},[175,721,722,725],{"class":177,"line":533},[175,723,724],{"class":189},"\"core.compression\"   = ",[175,726,727],{"class":193},"0\n",[175,729,730,733],{"class":177,"line":539},[175,731,732],{"class":189},"\"http.postBuffer\"    = ",[175,734,735],{"class":185},"\"1024M\"\n",[175,737,738,741],{"class":177,"line":545},[175,739,740],{"class":189},"\"http.lowSpeedLimit\" = ",[175,742,743],{"class":193},"1000\n",[175,745,746,749],{"class":177,"line":551},[175,747,748],{"class":189},"\"http.lowSpeedTime\"  = ",[175,750,751],{"class":193},"300\n",[175,753,754,757],{"class":177,"line":557},[175,755,756],{"class":189},"\"pack.windowMemory\"  = ",[175,758,759],{"class":185},"\"256m\"\n",[175,761,762,765],{"class":177,"line":563},[175,763,764],{"class":189},"\"pack.packSizeLimit\" = ",[175,766,759],{"class":185},[175,768,769,772],{"class":177,"line":569},[175,770,771],{"class":189},"\"pack.threads\"       = ",[175,773,774],{"class":193},"4\n",[175,776,777],{"class":177,"line":575},[175,778,679],{"emptyLinePlaceholder":678},[175,780,781,783,786],{"class":177,"line":581},[175,782,684],{"class":189},[175,784,785],{"class":181},"fetch",[175,787,690],{"class":189},[175,789,791,794,797,800,803],{"class":177,"line":790},17,[175,792,793],{"class":189},"flags = [",[175,795,796],{"class":185},"\"--depth=1\"",[175,798,799],{"class":189},", ",[175,801,802],{"class":185},"\"--filter=blob:none\"",[175,804,690],{"class":189},[175,806,808],{"class":177,"line":807},18,[175,809,679],{"emptyLinePlaceholder":678},[175,811,813,815,818],{"class":177,"line":812},19,[175,814,684],{"class":189},[175,816,817],{"class":181},"sparse_checkout",[175,819,690],{"class":189},[175,821,823,826],{"class":177,"line":822},20,[175,824,825],{"class":189},"enabled  = ",[175,827,706],{"class":193},[175,829,831],{"class":177,"line":830},21,[175,832,834],{"class":833},"sAwPA","# conemode 'auto' is processed by the solution code to be either 'cone' or 'no-cone' when passed to git\n",[175,836,838,841],{"class":177,"line":837},22,[175,839,840],{"class":189},"conemode = ",[175,842,843],{"class":185},"\"auto\"\n",[175,845,847,850,853],{"class":177,"line":846},23,[175,848,849],{"class":189},"includes = [",[175,851,852],{"class":185},"\"/*\"",[175,854,690],{"class":189},[175,856,858],{"class":177,"line":857},24,[175,859,860],{"class":189},"excludes = []\n",[175,862,864],{"class":177,"line":863},25,[175,865,866],{"class":189},"exclude_extensions = [\n",[175,868,870,873,875,878,880,883,885,888,890,893,895,898,900,903],{"class":177,"line":869},26,[175,871,872],{"class":185},"  \"png\"",[175,874,799],{"class":189},[175,876,877],{"class":185},"\"jpg\"",[175,879,799],{"class":189},[175,881,882],{"class":185},"\"jpeg\"",[175,884,799],{"class":189},[175,886,887],{"class":185},"\"gif\"",[175,889,799],{"class":189},[175,891,892],{"class":185},"\"svg\"",[175,894,799],{"class":189},[175,896,897],{"class":185},"\"ico\"",[175,899,799],{"class":189},[175,901,902],{"class":185},"\"webp\"",[175,904,905],{"class":189},",\n",[175,907,909,912,914,917,919,922,924,927,929,932,934,937,939,942],{"class":177,"line":908},27,[175,910,911],{"class":185},"  \"pdf\"",[175,913,799],{"class":189},[175,915,916],{"class":185},"\"doc\"",[175,918,799],{"class":189},[175,920,921],{"class":185},"\"docx\"",[175,923,799],{"class":189},[175,925,926],{"class":185},"\"xls\"",[175,928,799],{"class":189},[175,930,931],{"class":185},"\"xlsx\"",[175,933,799],{"class":189},[175,935,936],{"class":185},"\"ppt\"",[175,938,799],{"class":189},[175,940,941],{"class":185},"\"pptx\"",[175,943,905],{"class":189},[175,945,947,950,952,955,957,960,962,965],{"class":177,"line":946},28,[175,948,949],{"class":185},"  \"zip\"",[175,951,799],{"class":189},[175,953,954],{"class":185},"\"tar\"",[175,956,799],{"class":189},[175,958,959],{"class":185},"\"gz\"",[175,961,799],{"class":189},[175,963,964],{"class":185},"\"jar\"",[175,966,905],{"class":189},[175,968,970,973,975,978,980,983],{"class":177,"line":969},29,[175,971,972],{"class":185},"  \"mp4\"",[175,974,799],{"class":189},[175,976,977],{"class":185},"\"mp3\"",[175,979,799],{"class":189},[175,981,982],{"class":185},"\"mov\"",[175,984,905],{"class":189},[175,986,988,991,993,996,998,1001,1003,1006,1008,1011],{"class":177,"line":987},30,[175,989,990],{"class":185},"  \"exe\"",[175,992,799],{"class":189},[175,994,995],{"class":185},"\"dll\"",[175,997,799],{"class":189},[175,999,1000],{"class":185},"\"so\"",[175,1002,799],{"class":189},[175,1004,1005],{"class":185},"\"woff\"",[175,1007,799],{"class":189},[175,1009,1010],{"class":185},"\"woff2\"",[175,1012,905],{"class":189},[175,1014,1016,1019,1021,1024,1026,1029,1031,1034,1036,1039,1041,1044,1046,1049],{"class":177,"line":1015},31,[175,1017,1018],{"class":185},"  \"ttf\"",[175,1020,799],{"class":189},[175,1022,1023],{"class":185},"\"otf\"",[175,1025,799],{"class":189},[175,1027,1028],{"class":185},"\"psd\"",[175,1030,799],{"class":189},[175,1032,1033],{"class":185},"\"sketch\"",[175,1035,799],{"class":189},[175,1037,1038],{"class":185},"\"fig\"",[175,1040,799],{"class":189},[175,1042,1043],{"class":185},"\"dmg\"",[175,1045,799],{"class":189},[175,1047,1048],{"class":185},"\"eps\"",[175,1050,905],{"class":189},[175,1052,1054],{"class":177,"line":1053},32,[175,1055,690],{"class":189},[175,1057,1059,1062],{"class":177,"line":1058},33,[175,1060,1061],{"class":189},"case_variants = ",[175,1063,1064],{"class":185},"\"both\"\n",[56,1066,1067],{"id":1067},"コードよりも宣言型の設定を",[12,1069,1070],{},"Infrastructure as Codeは、チームごとにばらつきがちな膨大なコードを、宣言型の設定ファイルとそれを処理するエンジンに落とし込むことで、複雑さを減らし、標準化とセキュリティを高めてきました。ここでも同じく効果的なこのパターンを踏襲しており、次のような利点が得られます。",[63,1072,1073,1076,1079,1082,1085,1088,1091,1094],{},[66,1074,1075],{},"馴染みのない処理（極めて詳細なgitコマンド）の標準化",[66,1077,1078],{},"複雑さの回避",[66,1080,1081],{},"既存の特殊なクローン処理への適用しやすさ（例：gitバイナリを使わないVS Codeの「クローン」）",[66,1083,1084],{},"バグやエッジケースの削減（各自が独自に工夫する場合と比較して）",[66,1086,1087],{},"実行コンテキストをまたいだ実装の一貫性（例：CIのクローン、デベロッパーのIDE、AIサンドボックス）",[66,1089,1090],{},"監査のしやすさの向上",[66,1092,1093],{},"他の自動化による設定ファイルの生成・操作",[66,1095,1096],{},"セキュリティの向上（多くのコードインジェクション経路の排除）",[12,1098,1099],{},"インタープリターが扱えるのは設定だけです。git configのキー/値ペア、fetchとcheckoutのフラグ、スパースチェックアウトのinclude/excludeリスト、そして単純な条件で制御される少数のクローン後フックに限られます。設定に任意の項目を追加しても、エンジンはそれを認識せず無視。ポリシーが何をするのかは、ファイルを読むだけで正確に監査できます。",[56,1101,1103],{"id":1102},"git-clone-override-policyの3つの活用方法影響の小さい順","Git Clone Override Policyの3つの活用方法：影響の小さい順",[1105,1106,1107,1127],"table",{},[1108,1109,1110],"thead",{},[1111,1112,1113,1118,1121,1124],"tr",{},[1114,1115,1117],"th",{"align":1116},"left","モード",[1114,1119,1120],{"align":1116},"コマンド",[1114,1122,1123],{"align":1116},"管理者権限",[1114,1125,1126],{"align":1116},"適した用途",[1128,1129,1130,1147,1162],"tbody",{},[1111,1131,1132,1136,1141,1144],{},[1133,1134,1135],"td",{"align":1116},"ゼロフットプリントCLI",[1133,1137,1138],{"align":1116},[15,1139,1140],{},"./git-clone-override-policy clone URL",[1133,1142,1143],{"align":1116},"不要",[1133,1145,1146],{"align":1116},"CIジョブ、エージェント、単発のマシン",[1111,1148,1149,1152,1157,1159],{},[1133,1150,1151],{"align":1116},"Gitエイリアス",[1133,1153,1154],{"align":1116},[15,1155,1156],{},"git cloneusingpolicy URL",[1133,1158,1143],{"align":1116},[1133,1160,1161],{"align":1116},"個別に導入するデベロッパー",[1111,1163,1164,1167,1172,1175],{},[1133,1165,1166],{"align":1116},"OSエイリアス",[1133,1168,1169,1171],{"align":1116},[15,1170,130],{},"（gitバイナリの呼び出しを横取り）",[1133,1173,1174],{"align":1116},"必要",[1133,1176,1177],{"align":1116},"デベロッパーに意識させないフリート全体への適用",[1179,1180],"br",{},[56,1182,1184],{"id":1183},"git-clone-override-policyによる最適化結果の例","Git Clone Override Policyによる最適化結果の例",[12,1186,1187],{},"結果はGit Much Fasterで示したものと同じですが、今回は依頼ベースではなく自動的に得られます。",[1105,1189,1190,1203],{},[1108,1191,1192],{},[1111,1193,1194,1197,1200],{},[1114,1195,1196],{"align":1116},"リポジトリ",[1114,1198,1199],{"align":1116},"フル履歴クローン",[1114,1201,1202],{"align":1116},"ポリシー最適化後のクローン",[1128,1204,1205,1219,1230],{},[1111,1206,1207,1213,1216],{},[1133,1208,1209],{"align":1116},[37,1210,612],{"href":1211,"rel":1212},"http://www.gitlab.com",[],[1133,1214,1215],{"align":1116},"9.5 GB",[1133,1217,1218],{"align":1116},"110 MB",[1111,1220,1221,1224,1227],{},[1133,1222,1223],{"align":1116},"Linuxカーネル",[1133,1225,1226],{"align":1116},"7.5 GB",[1133,1228,1229],{"align":1116},"2 GB",[1111,1231,1232,1235,1238],{},[1133,1233,1234],{"align":1116},"Chromium",[1133,1236,1237],{"align":1116},"60 GB",[1133,1239,1240],{"align":1116},"5 GB",[1179,1242],{},[56,1244,1246],{"id":1245},"git-lfsとの相乗効果","Git LFSとの相乗効果",[12,1248,1249,1250,1253,1254,1257],{},"Git LFSとこのポリシーは、同じ問題の異なる半分を解決します。LFSはバイナリの保存方法を変え、その履歴をパックファイルから切り離すもの。一方、クローンポリシーは各クローンが何を要求するかを変えるものです。動作するレイヤーが違うため、両者は競合せずに積み重なります。LFSを使うリポジトリでも、ポリシーによるシャローなdepth、単一ブランチのrefspec、転送チューニングは、LFSが手を付けない部分を確実に削ります。さらに ",[15,1251,1252],{},"sparse-checkout"," が対象のファイル形式を名前で除外するため、現在のバイナリのsmudgeダウンロードもスキップされます。クライアント側の設定なしで、標準のgit設定変数 ",[15,1255,1256],{},"GIT_LFS_SKIP_SMUDGE"," と同じオンデマンドの挙動が得られるということです。結果は相乗的で、LFSが履歴を縮め、ポリシーがリクエストを縮める。LFSによってすでに軽量だったクローンが、さらに軽くなります。",[56,1259,1260],{"id":1260},"この先の展開",[12,1262,1263],{},"このチュートリアルは、冒頭の話に立ち返って締めくくります。この問題はエージェント特有のものではありませんが、「正しい設定を周知すればよい」という前提が最も速く崩れるユースケースがエージェントです。ポリシーをコードとして扱えば、人間であれエージェントであれ、その存在を知っている必要はありません。",[12,1265,1266,1267,1272,1273,1278],{},"さらに詳しく知りたい方は、課題と解決策の適合性および設計について解説した ",[37,1268,1271],{"href":1269,"rel":1270},"https://www.youtube.com/watch?v=Dyl8ICWj3AY",[],"Git Clone Override Policy Solution Architecture Overview","、3つの実行モードの実際の動作を紹介する ",[37,1274,1277],{"href":1275,"rel":1276},"https://www.youtube.com/watch?v=2u_z1nXae7U",[],"Git Clone Override Policy Demo"," をご覧ください。",[12,1280,1281,1282,1286,1287,1290],{},"ぜひ、ご自身の大規模リポジトリで ",[37,1283,1285],{"href":120,"rel":1284},[],"Git Clone Override Policyをお試しください","。デフォルト値の根拠となったベンチマークについては、",[37,1288,47],{"href":45,"rel":1289},[]," をご参照ください。",[1292,1293,1294],"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":171,"searchDepth":200,"depth":200,"links":1296},[1297,1298,1299,1300,1301,1302,1303,1304,1305,1306],{"id":58,"depth":200,"text":58},{"id":111,"depth":200,"text":111},{"id":150,"depth":200,"text":150},{"id":616,"depth":200,"text":616},{"id":628,"depth":200,"text":629},{"id":1067,"depth":200,"text":1067},{"id":1102,"depth":200,"text":1103},{"id":1183,"depth":200,"text":1184},{"id":1245,"depth":200,"text":1246},{"id":1260,"depth":200,"text":1260},"engineering","2026-08-18","リポジトリに置いたTOMLファイルだけで、シャロークローンや部分クローンといった最適化を自動適用。Git Clone Override Policyがサーバー負荷とコストを削減する仕組みを解説します。","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1777380633/y3bigk0mmmxshmbofrkc.png",{},"/ja-jp/blog/git-clone-override-policy",{"config":1316,"title":5,"description":1309},{"noIndex":1317},false,"git-clone-override-policy","ja-jp/blog/git-clone-override-policy",[1321,1322,203],"tutorial","DevSecOps platform","BlogPost","2026-08-19","NjxzfmyVp2k5Xe2S-BdxrRnvwm1VfchkxxgX1cnUPAE",{"logo":1327,"freeTrial":1332,"sales":1337,"login":1342,"items":1347,"search":1678,"minimal":1711,"duo":1729,"switchNav":1738,"pricingDeployment":1749},{"config":1328},{"href":1329,"dataGaName":1330,"dataGaLocation":1331},"/ja-jp/","gitlab logo","header",{"text":1333,"config":1334},"無料トライアルを開始",{"href":1335,"dataGaName":1336,"dataGaLocation":1331},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":1338,"config":1339},"デモをリクエスト",{"href":1340,"dataGaName":1341,"dataGaLocation":1331},"/request-a-demo/","sales",{"text":1343,"config":1344},"サインイン",{"href":1345,"dataGaName":1346,"dataGaLocation":1331},"https://gitlab.com/users/sign_in/","sign in",[1348,1434,1522,1527,1602,1656],{"text":1349,"left":678,"config":1350,"menu":1352},"プラットフォーム",{"dataNavLevelOne":1351},"platform",{"type":1353,"link":1354,"columns":1358,"feature":1423},"lists",{"text":1355,"config":1356},"プラットフォームを詳しく見る",{"href":1357,"dataGaName":1351,"dataGaLocation":1331},"/ja-jp/platform/",[1359,1382,1405],{"title":1360,"items":1361},"実行とワークフロー",[1362,1367,1372,1377],{"text":1363,"config":1364},"CI/CD",{"href":1365,"dataGaLocation":1331,"dataGaName":1366},"/ja-jp/solutions/continuous-integration/","ci/cd",{"text":1368,"config":1369},"ソースコード管理",{"href":1370,"dataGaLocation":1331,"dataGaName":1371},"/ja-jp/solutions/source-code-management/","source code management",{"text":1373,"config":1374},"アジャイルデリバリー",{"href":1375,"dataGaLocation":1331,"dataGaName":1376},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":1378,"config":1379},"アーティファクト管理",{"href":1380,"dataGaLocation":1331,"dataGaName":1381},"/ja-jp/artifact-central/","artifact management",{"title":1383,"items":1384},"セキュリティとガバナンス",[1385,1390,1395,1400],{"text":1386,"config":1387},"アプリケーションセキュリティテスト",{"href":1388,"dataGaLocation":1331,"dataGaName":1389},"/ja-jp/solutions/application-security-testing/","application security testing",{"text":1391,"config":1392},"ガバナンスとコンプライアンス",{"href":1393,"dataGaLocation":1331,"dataGaName":1394},"/ja-jp/solutions/software-compliance/","governance and compliance",{"text":1396,"config":1397},"シークレット管理",{"href":1398,"dataGaLocation":1331,"dataGaName":1399},"/ja-jp/gitlab-secrets-manager/","secrets management",{"text":1401,"config":1402},"サプライチェーンセキュリティ",{"href":1403,"dataGaLocation":1331,"dataGaName":1404},"/ja-jp/solutions/supply-chain/","supply chain security",{"title":1406,"items":1407},"コンテキストとAI",[1408,1413,1418],{"text":1409,"config":1410},"エージェント型オーケストレーション",{"href":1411,"dataGaLocation":1331,"dataGaName":1412},"/ja-jp/gitlab-duo-agent-platform/","agentic orchestration",{"text":1414,"config":1415},"コンテキストグラフ",{"href":1416,"dataGaLocation":1331,"dataGaName":1417},"/ja-jp/gitlab-orbit/","context graph",{"text":1419,"config":1420},"可視性と測定",{"href":1421,"dataGaLocation":1331,"dataGaName":1422},"/ja-jp/solutions/visibility-measurement/","visibility and measurement",{"config":1424,"title":1427,"text":1428,"link":1429},{"background":1425,"textColor":1426},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1790185102/o7dn32anqcb6z8dgd3as.jpg')","#000","GitLabが選ばれる理由","ひとつのプラットフォームで、ソフトウェアライフサイクル全体を通じてスピードと制御を両立できます。",{"text":1430,"config":1431},"詳細はこちら",{"href":1432,"dataGaName":1433,"dataGaLocation":1331},"/ja-jp/why-gitlab/","why gitlab",{"text":1435,"left":678,"config":1436,"menu":1438},"ソリューション",{"dataNavLevelOne":1437},"solutions",{"type":1353,"link":1439,"columns":1443,"feature":1513},{"text":1440,"config":1441},"すべてのソリューションを表示",{"href":1442,"dataGaName":1437,"dataGaLocation":1331},"/ja-jp/solutions/",[1444,1462,1480],{"title":1445,"items":1446},"成果",[1447,1452,1457],{"text":1448,"config":1449},"DevOpsモダナイゼーション",{"href":1450,"dataGaLocation":1331,"dataGaName":1451},"/ja-jp/assessments/devops-modernization-assessment/","devops modernization",{"text":1453,"config":1454},"セキュリティモダナイゼーション",{"href":1455,"dataGaLocation":1331,"dataGaName":1456},"/ja-jp/assessments/security-modernization-assessment/","security modernization",{"text":1458,"config":1459},"AIモダナイゼーション",{"href":1460,"dataGaLocation":1331,"dataGaName":1461},"/ja-jp/assessments/ai-modernization-assessment/","ai modernization",{"title":1463,"items":1464},"規模別",[1465,1470,1475],{"text":1466,"config":1467},"エンタープライズ",{"href":1468,"dataGaLocation":1331,"dataGaName":1469},"/ja-jp/enterprise/","enterprise",{"text":1471,"config":1472},"スモールビジネス",{"href":1473,"dataGaLocation":1331,"dataGaName":1474},"/ja-jp/small-business/","small business",{"text":1476,"config":1477},"スタートアップ",{"href":1478,"dataGaLocation":1331,"dataGaName":1479},"/ja-jp/solutions/startups/","startups",{"title":1481,"items":1482},"業界",[1483,1488,1493,1498,1503,1508],{"text":1484,"config":1485},"金融サービス",{"href":1486,"dataGaLocation":1331,"dataGaName":1487},"/ja-jp/solutions/finance/","financial services",{"text":1489,"config":1490},"公共部門",{"href":1491,"dataGaLocation":1331,"dataGaName":1492},"/ja-jp/solutions/public-sector/","public sector",{"text":1494,"config":1495},"通信",{"href":1496,"dataGaLocation":1331,"dataGaName":1497},"/ja-jp/solutions/telecommunications/","telecommunications",{"text":1499,"config":1500},"自動車",{"href":1501,"dataGaLocation":1331,"dataGaName":1502},"/ja-jp/solutions/automotive/","automotive",{"text":1504,"config":1505},"教育",{"href":1506,"dataGaLocation":1331,"dataGaName":1507},"/ja-jp/solutions/education/","education",{"text":1509,"config":1510},"航空宇宙",{"href":1511,"dataGaLocation":1331,"dataGaName":1512},"/ja-jp/solutions/aerospace/","aerospace",{"config":1514,"title":1515,"text":1516,"link":1517},{"background":1425,"textColor":1426},"GitLabのセキュリティ標準","セキュリティを犠牲にすることなく、ソフトウェアファクトリーを強化し、自律的なAIエージェントを実現する方法をご覧ください。",{"text":1518,"config":1519},"標準を見る",{"href":1520,"dataGaName":1521,"dataGaLocation":1331},"/ja-jp/gitlab-security-standard/","gitlab security standard",{"text":1523,"config":1524},"価格",{"href":1525,"dataGaName":1526,"dataGaLocation":1331,"dataNavLevelOne":1526},"/ja-jp/pricing/","pricing",{"text":1528,"config":1529,"menu":1531},"関連リソース",{"dataNavLevelOne":1530},"resources",{"type":1353,"link":1532,"columns":1536,"feature":1593},{"text":1533,"config":1534},"すべてのリソースを表示",{"href":1535,"dataGaName":1530,"dataGaLocation":1331},"/ja-jp/resources/",[1537,1565],{"title":1538,"items":1539},"検索する",[1540,1545,1550,1555,1560],{"text":1541,"config":1542},"製品ドキュメント",{"href":1543,"dataGaName":1544,"dataGaLocation":1331},"https://docs.gitlab.com/ja-jp/","docs",{"text":1546,"config":1547},"GitLab University",{"href":1548,"dataGaName":1549,"dataGaLocation":1331},"https://university.gitlab.com/","university",{"text":1551,"config":1552},"技術デモ",{"href":1553,"dataGaName":1554,"dataGaLocation":1331},"/ja-jp/gitlab-technical-demo-series/","demo series",{"text":1556,"config":1557},"インタラクティブデモ",{"href":1558,"dataGaName":1559,"dataGaLocation":1331},"/ja-jp/demo-hub/","demo hub",{"text":1561,"config":1562},"GitLabサービス",{"href":1563,"dataGaName":1564,"dataGaLocation":1331},"/ja-jp/services/","services",{"title":1566,"items":1567},"つなげる",[1568,1573,1578,1583,1588],{"text":1569,"config":1570},"ブログ",{"href":1571,"dataGaName":1572,"dataGaLocation":1331},"/ja-jp/blog/","blog",{"text":1574,"config":1575},"コミュニティ",{"href":1576,"dataGaName":1577,"dataGaLocation":1331},"/community/","community",{"text":1579,"config":1580},"お客様事例",{"href":1581,"dataGaName":1582,"dataGaLocation":1331},"/ja-jp/customers/","customers",{"text":1584,"config":1585},"パートナー",{"href":1586,"dataGaName":1587,"dataGaLocation":1331},"/ja-jp/partners/","partners",{"text":1589,"config":1590},"イベント",{"href":1591,"dataGaName":1592,"dataGaLocation":1331},"/events/","events",{"config":1594,"title":1595,"text":1596,"link":1597},{"background":1425,"textColor":1426},"GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":1598,"config":1599},"最新情報を読む",{"href":1600,"dataGaName":1601,"dataGaLocation":1331},"/ja-jp/whats-new/","whats new",{"text":1603,"config":1604,"menu":1606},"企業情報",{"dataNavLevelOne":1605},"company",{"type":1353,"columns":1607},[1608],{"items":1609},[1610,1615,1621,1626,1631,1636,1641,1646,1651],{"text":1611,"config":1612},"GitLabについて",{"href":1613,"dataGaName":1614,"dataGaLocation":1331},"/ja-jp/company/","about",{"text":1616,"config":1617,"footerGa":1620},"採用情報",{"href":1618,"dataGaName":1619,"dataGaLocation":1331},"/jobs/","jobs",{"dataGaName":1619},{"text":1622,"config":1623},"プレス",{"href":1624,"dataGaName":1625,"dataGaLocation":1331},"/press/","press",{"text":1627,"config":1628},"ハンドブック",{"href":1629,"dataGaName":1630,"dataGaLocation":1331},"https://handbook.gitlab.com/","handbook",{"text":1632,"config":1633},"経営陣",{"href":1634,"dataGaName":1635,"dataGaLocation":1331},"/company/team/e-group/","leadership",{"text":1637,"config":1638},"投資家向け情報",{"href":1639,"dataGaName":1640,"dataGaLocation":1331},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1642,"config":1643},"トラストセンター",{"href":1644,"dataGaName":1645,"dataGaLocation":1331},"/ja-jp/security/","trust center",{"text":1647,"config":1648},"AI Transparency Center",{"href":1649,"dataGaName":1650,"dataGaLocation":1331},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":1652,"config":1653},"ニュースレター",{"href":1654,"dataGaName":1655,"dataGaLocation":1331},"/company/contact/#contact-forms","newsletter",{"text":1657,"config":1658,"menu":1659},"お問い合わせ",{"dataNavLevelOne":1605},{"type":1353,"columns":1660},[1661],{"items":1662},[1663,1668,1673],{"text":1664,"config":1665},"お問い合わせはこちら",{"href":1666,"dataGaName":1667,"dataGaLocation":1331},"/ja-jp/sales/","talk to sales",{"text":1669,"config":1670},"サポートポータル",{"href":1671,"dataGaName":1672,"dataGaLocation":1331},"https://support.gitlab.com/hc/en-us","support portal",{"text":1674,"config":1675},"カスタマーポータル",{"href":1676,"dataGaName":1677,"dataGaLocation":1331},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1679,"login":1680,"suggestions":1687},"閉じる",{"text":1681,"link":1682},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":1683,"config":1684},"GitLab.com",{"href":1345,"dataGaName":1685,"dataGaLocation":1686},"search login","search",{"text":1688,"default":1689},"提案",[1690,1693,1697,1699,1703,1707],{"text":1691,"config":1692},"GitLab Duo Agent Platform",{"href":1411,"dataGaName":1691,"dataGaLocation":1686},{"text":1694,"config":1695},"コード提案（AI）",{"href":1411,"dataGaName":1696,"dataGaLocation":1686},"Code Suggestions (AI)",{"text":1363,"config":1698},{"href":1365,"dataGaName":1363,"dataGaLocation":1686},{"text":1700,"config":1701},"GitLab on AWS",{"href":1702,"dataGaName":1700,"dataGaLocation":1686},"/ja-jp/partners/technology-partners/aws/",{"text":1704,"config":1705},"GitLab on Google Cloud",{"href":1706,"dataGaName":1704,"dataGaLocation":1686},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":1708,"config":1709},"GitLabを選ぶ理由",{"href":1432,"dataGaName":1710,"dataGaLocation":1686},"Why GitLab?",{"freeTrial":1712,"mobileIcon":1716,"desktopIcon":1721,"secondaryButton":1724},{"text":1333,"config":1713},{"href":1714,"dataGaName":1336,"dataGaLocation":1715},"https://gitlab.com/-/trials/new/","nav",{"altText":1717,"config":1718},"GitLabアイコン",{"src":1719,"dataGaName":1720,"dataGaLocation":1715},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1717,"config":1722},{"src":1723,"dataGaName":1720,"dataGaLocation":1715},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1725,"config":1726},"はじめに",{"href":1727,"dataGaName":1728,"dataGaLocation":1715},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":1730,"mobileIcon":1734,"desktopIcon":1736},{"text":1731,"config":1732},"GitLab Duoの詳細はこちら",{"href":1411,"dataGaName":1733,"dataGaLocation":1715},"gitlab duo",{"altText":1717,"config":1735},{"src":1719,"dataGaName":1720,"dataGaLocation":1715},{"altText":1717,"config":1737},{"src":1723,"dataGaName":1720,"dataGaLocation":1715},{"button":1739,"mobileIcon":1744,"desktopIcon":1746},{"text":1740,"config":1741},"/switch",{"href":1742,"dataGaName":1743,"dataGaLocation":1715},"#contact","switch",{"altText":1717,"config":1745},{"src":1719,"dataGaName":1720,"dataGaLocation":1715},{"altText":1717,"config":1747},{"src":1748,"dataGaName":1720,"dataGaLocation":1715},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1750,"mobileIcon":1755,"desktopIcon":1757},{"text":1751,"config":1752},"料金ページに戻る",{"href":1525,"dataGaName":1753,"dataGaLocation":1715,"icon":1754},"back to pricing","GoBack",{"altText":1717,"config":1756},{"src":1719,"dataGaName":1720,"dataGaLocation":1715},{"altText":1717,"config":1758},{"src":1723,"dataGaName":1720,"dataGaLocation":1715},{"title":1760,"titleMobile":1761,"button":1762,"config":1765},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー","GitLab Orbitが登場",{"text":1430,"config":1763},{"href":1416,"dataGaName":1764,"dataGaLocation":1331},"orbit",{"layout":1766,"disabled":1317},"release",{"data":1768},{"text":1769,"source":1770,"edit":1776,"contribute":1781,"config":1786,"items":1791,"minimal":2013},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":1771,"config":1772},"ページのソースを表示",{"href":1773,"dataGaName":1774,"dataGaLocation":1775},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1777,"config":1778},"このページを編集",{"href":1779,"dataGaName":1780,"dataGaLocation":1775},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1782,"config":1783},"ご協力をお願いします",{"href":1784,"dataGaName":1785,"dataGaLocation":1775},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1787,"facebook":1788,"youtube":1789,"linkedin":1790},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1792,1838,1895,1937,1980],{"title":1523,"links":1793,"subMenu":1808},[1794,1798,1803],{"text":1795,"config":1796},"プランの表示",{"href":1525,"dataGaName":1797,"dataGaLocation":1775},"view plans",{"text":1799,"config":1800},"Premiumを選ぶ理由",{"href":1801,"dataGaName":1802,"dataGaLocation":1775},"/ja-jp/pricing/premium/","why premium",{"text":1804,"config":1805},"Ultimateを選ぶ理由",{"href":1806,"dataGaName":1807,"dataGaLocation":1775},"/ja-jp/pricing/ultimate/","why ultimate",[1809],{"title":1657,"links":1810},[1811,1814,1816,1818,1823,1828,1833],{"text":1812,"config":1813},"営業担当へのお問い合わせ",{"href":1666,"dataGaName":1341,"dataGaLocation":1775},{"text":1669,"config":1815},{"href":1671,"dataGaName":1672,"dataGaLocation":1775},{"text":1674,"config":1817},{"href":1676,"dataGaName":1677,"dataGaLocation":1775},{"text":1819,"config":1820},"ステータス",{"href":1821,"dataGaName":1822,"dataGaLocation":1775},"https://status.gitlab.com/","status",{"text":1824,"config":1825},"利用規約",{"href":1826,"dataGaName":1827,"dataGaLocation":1775},"/terms/","terms of use",{"text":1829,"config":1830},"プライバシーに関する声明",{"href":1831,"dataGaName":1832,"dataGaLocation":1775},"/ja-jp/privacy/","privacy statement",{"text":1834,"config":1835},"Cookie設定",{"dataGaName":1836,"dataGaLocation":1775,"id":1837,"isOneTrustButton":678},"cookie preferences","ot-sdk-btn",{"title":1349,"links":1839,"subMenu":1852},[1840,1842,1844,1846,1848,1850],{"text":1355,"config":1841},{"href":1357,"dataGaName":1351,"dataGaLocation":1775},{"text":1409,"config":1843},{"href":1411,"dataGaName":1412,"dataGaLocation":1775},{"text":1363,"config":1845},{"href":1365,"dataGaName":1366,"dataGaLocation":1775},{"text":1414,"config":1847},{"href":1416,"dataGaName":1417,"dataGaLocation":1775},{"text":1396,"config":1849},{"href":1398,"dataGaName":1399,"dataGaLocation":1775},{"text":1427,"config":1851},{"href":1432,"dataGaName":1433,"dataGaLocation":1775},[1853],{"title":1854,"links":1855},"トピック",[1856,1860,1865,1870,1875,1880,1885,1890],{"text":1363,"config":1857},{"href":1858,"dataGaName":1859,"dataGaLocation":1775},"/ja-jp/topics/ci-cd/","cicd",{"text":1861,"config":1862},"GitOps",{"href":1863,"dataGaName":1864,"dataGaLocation":1775},"/ja-jp/topics/gitops/","gitops",{"text":1866,"config":1867},"DevOps",{"href":1868,"dataGaName":1869,"dataGaLocation":1775},"/ja-jp/topics/devops/","devops",{"text":1871,"config":1872},"バージョン管理",{"href":1873,"dataGaName":1874,"dataGaLocation":1775},"/ja-jp/topics/version-control/","version control",{"text":1876,"config":1877},"DevSecOps",{"href":1878,"dataGaName":1879,"dataGaLocation":1775},"/ja-jp/topics/devsecops/","devsecops",{"text":1881,"config":1882},"クラウドネイティブ",{"href":1883,"dataGaName":1884,"dataGaLocation":1775},"/ja-jp/topics/cloud-native/","cloud native",{"text":1886,"config":1887},"コーディングのためのAI",{"href":1888,"dataGaName":1889,"dataGaLocation":1775},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":1891,"config":1892},"エージェント型AI",{"href":1893,"dataGaName":1894,"dataGaLocation":1775},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":1435,"links":1896},[1897,1899,1901,1903,1905,1908,1910,1912,1914,1916,1918,1920,1922,1925,1929,1933],{"text":1448,"config":1898},{"href":1450,"dataGaName":1451,"dataGaLocation":1775},{"text":1453,"config":1900},{"href":1455,"dataGaName":1456,"dataGaLocation":1775},{"text":1458,"config":1902},{"href":1460,"dataGaName":1461,"dataGaLocation":1775},{"text":1484,"config":1904},{"href":1486,"dataGaName":1487,"dataGaLocation":1775},{"text":1906,"config":1907},"公共機関",{"href":1491,"dataGaName":1492,"dataGaLocation":1775},{"text":1494,"config":1909},{"href":1496,"dataGaName":1497,"dataGaLocation":1775},{"text":1499,"config":1911},{"href":1501,"dataGaName":1502,"dataGaLocation":1775},{"text":1504,"config":1913},{"href":1506,"dataGaName":1507,"dataGaLocation":1775},{"text":1509,"config":1915},{"href":1511,"dataGaName":1512,"dataGaLocation":1775},{"text":1466,"config":1917},{"href":1468,"dataGaName":1469,"dataGaLocation":1775},{"text":1471,"config":1919},{"href":1473,"dataGaName":1474,"dataGaLocation":1775},{"text":1476,"config":1921},{"href":1478,"dataGaName":1479,"dataGaLocation":1775},{"text":1861,"config":1923},{"href":1924,"dataGaName":1864,"dataGaLocation":1775},"/ja-jp/solutions/gitops/",{"text":1926,"config":1927},"ソフトウェアコンポジション解析",{"href":1403,"dataGaName":1928,"dataGaLocation":1775},"software composition analysis",{"text":1930,"config":1931},"バリューストリーム管理",{"href":1421,"dataGaName":1932,"dataGaLocation":1775},"value stream management",{"text":1934,"config":1935},"すべてのソリューション",{"href":1442,"dataGaName":1936,"dataGaLocation":1775},"all solutions",{"title":1938,"links":1939},"リソース",[1940,1945,1950,1953,1955,1957,1959,1961,1963,1965,1967,1969,1971,1973,1976],{"text":1941,"config":1942},"インストール",{"href":1943,"dataGaName":1944,"dataGaLocation":1775},"/ja-jp/install/","install",{"text":1946,"config":1947},"クイックスタートガイド",{"href":1948,"dataGaName":1949,"dataGaLocation":1775},"/ja-jp/get-started/","quick setup checklists",{"text":1541,"config":1951},{"href":1952,"dataGaName":1544,"dataGaLocation":1775},"https://docs.gitlab.com/ja-jp",{"text":1546,"config":1954},{"href":1548,"dataGaName":1549,"dataGaLocation":1775},{"text":1551,"config":1956},{"href":1553,"dataGaName":1554,"dataGaLocation":1775},{"text":1556,"config":1958},{"href":1558,"dataGaName":1559,"dataGaLocation":1775},{"text":1561,"config":1960},{"href":1563,"dataGaName":1564,"dataGaLocation":1775},{"text":1569,"config":1962},{"href":1571,"dataGaName":1572,"dataGaLocation":1775},{"text":1574,"config":1964},{"href":1576,"dataGaName":1577,"dataGaLocation":1775},{"text":1579,"config":1966},{"href":1581,"dataGaName":1582,"dataGaLocation":1775},{"text":1584,"config":1968},{"href":1586,"dataGaName":1587,"dataGaLocation":1775},{"text":1589,"config":1970},{"href":1591,"dataGaName":1592,"dataGaLocation":1775},{"text":1652,"config":1972},{"href":1654,"dataGaName":1655,"dataGaLocation":1775},{"text":1974,"config":1975},"最新リリース",{"href":1600,"dataGaName":1601,"dataGaLocation":1775},{"text":1977,"config":1978},"すべてのリソース",{"href":1535,"dataGaName":1979,"dataGaLocation":1775},"all resources",{"title":1981,"links":1982},"会社情報",[1983,1985,1987,1989,1991,1993,1995,1997,1999,2003,2008],{"text":1611,"config":1984},{"href":1613,"dataGaName":1605,"dataGaLocation":1775},{"text":1616,"config":1986},{"href":1618,"dataGaName":1619,"dataGaLocation":1775},{"text":1622,"config":1988},{"href":1624,"dataGaName":1625,"dataGaLocation":1775},{"text":1627,"config":1990},{"href":1629,"dataGaName":1630,"dataGaLocation":1775},{"text":1632,"config":1992},{"href":1634,"dataGaName":1635,"dataGaLocation":1775},{"text":1637,"config":1994},{"href":1639,"dataGaName":1640,"dataGaLocation":1775},{"text":1642,"config":1996},{"href":1644,"dataGaName":1645,"dataGaLocation":1775},{"text":1647,"config":1998},{"href":1649,"dataGaName":1650,"dataGaLocation":1775},{"text":2000,"config":2001},"Sustainability",{"href":2002,"dataGaName":2000,"dataGaLocation":1775},"/sustainability/",{"text":2004,"config":2005},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":2006,"dataGaName":2007,"dataGaLocation":1775},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2009,"config":2010},"現代奴隷制の透明性に関する声明",{"href":2011,"dataGaName":2012,"dataGaLocation":1775},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2014},[2015,2017,2019],{"text":1824,"config":2016},{"href":1826,"dataGaName":1827,"dataGaLocation":1775},{"text":1834,"config":2018},{"dataGaName":1836,"dataGaLocation":1775,"id":1837,"isOneTrustButton":678},{"text":1829,"config":2020},{"href":1831,"dataGaName":1832,"dataGaLocation":1775},[2022],{"id":2023,"title":7,"body":1311,"config":2024,"content":2026,"description":1311,"extension":2032,"meta":2033,"navigation":678,"path":2034,"seo":2035,"stem":2036,"__hash__":2037},"blogAuthors/en-us/blog/authors/darwin-sanoy.yml",{"template":2025},"BlogAuthor",{"role":2027,"name":7,"config":2028},"Field Chief Cloud Architect",{"headshot":2029,"linkedin":2030,"ctfId":2031},"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",[2039,2047,2055],{"title":2040,"description":2041,"heroImage":2042,"category":1307,"date":2043,"authors":2044,"slug":2046,"externalUrl":1311},"Django製GRCツールにモジュール単位のアクセス制御を実装する","GitLabのセキュリティコンプライアンスチームと内部監査チームという性質の異なる2つのチームを1つの基盤で支えるために、Django製の社内ツールをどう再構築したのか。その技術的な詳細を解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097663/Blog/Hero%20Images/Blog/Hero%20Images/Workflow%201800x945_2gQoQIbY9NvjLFpXtsxtXy_1750097663612.png","2026-10-05",[2045],"Donovan Felton","module-level-access-in-a-django-grc-app",{"title":2048,"description":2049,"heroImage":2050,"category":1307,"date":2051,"authors":2052,"slug":2054,"externalUrl":1311},"GitLabがエージェント型フローあたりのコード量を45%削減した方法","YAML設定を完全に機能するLangGraphフローへコンパイルするコンポーネントベースのフレームワーク「Flow Registry」によって、GitLabはエージェント型フロー1つあたりのコード量を45%削減し、スケーラビリティや信頼性を高めました。その設計原則と得られた教訓を詳しく解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-09-22",[2053],"Mikolaj Wawrzyniak","how-gitlab-reduced-code-per-agentic-flow-ratio",{"title":2056,"description":2057,"heroImage":2058,"category":1307,"date":2059,"authors":2060,"slug":2062,"externalUrl":1311},"650人超が生んだ4,874件の改善、GitLab Co-Createの半年","GitLabユーザーが開発チームと共同で、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",[2061],"Isa Huerga","co-create-h1-2026",{"header":2064,"text":2065,"button":2069,"disclaimer":2072},"無料の\n\n30日間のGitLabトライアルを開始\n",[2066,2067,2068],"GitLab Duo Agent Platformへのアクセス","GitLabの最も高度な機能を試す","AIで複雑なタスクを自動化する",{"text":1333,"config":2070},{"href":2071,"dataGaName":1336,"dataGaLocation":1572},"https://gitlab.com/-/trials/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/blog/","クレジットカードなしでご登録いただけます。",{"header":2074,"blurb":2075,"button":2076,"secondaryButton":2080},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":1333,"config":2077},{"href":2078,"dataGaName":1336,"dataGaLocation":2079},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":1657,"config":2081},{"href":1666,"dataGaName":1341,"dataGaLocation":2079},1791952280239]