Git Sparse Checkout: 数GB規模のMonorepoを効率的に扱う秘策

Git tutorial - IT technology blog
Git tutorial - IT technology blog

悪夢の待ち時間:終わらないgit cloneからの解放

巨大なMonorepoプロジェクトで、作業途中の問題に直面した時、たった1行のCSSを修正するためだけに20分間待ち続けたことはありませんか?それは非常にストレスの溜まる経験です。READMEファイルを更新したいだけなのに、5〜10GBものソースコードをすべてダウンロードしなければならず、愛用のMacbookのSSDは容量不足で常に警告が出ている状態…

50以上のマイクロサービスを抱えるプロジェクトに参加した際、私も同じような状況に陥りました。すべての部署のコードが含まれるリポジトリに対し、私が担当していたのはわずか2つのバックエンドサービスだけ。コードをプルするたびに、PCのファンはジェットエンジンのような音を立てていました。そんなフラストレーションの中で見つけたのが、この問題を根本から解決するGitの強力な機能、Sparse Checkoutです。

Sparse Checkoutを使用すると、自分が必要なディレクトリだけを取得できます。また、複数のブランチを同時に作業する必要がある場合には、Git Worktreeとの併用も検討に値します。残りの部分はGitによって非表示にされ、データはローカルにダウンロードされません。これは単にリポジトリ全体をクローンした後に不要なフォルダを手動で削除するのとは全く違います。

Sparse Checkoutとは?

実用的な観点から言うと、Sparse Checkout(疎なチェックアウト)は、表示させたいディレクトリの「ホワイトリスト」を定義できる機能です。このリストに含まれないものは、ワーキングディレクトリから消えます。しかし、それらはGitHubやGitLabなどのサーバー上には安全に保持されたままです。

Git 2.25以降、専用のgit sparse-checkoutコマンドが登場しました。この新しいアプローチは、以前のようにシステム設定ファイルを直接編集するよりもはるかに簡単です。

知っておくべき2つのモードがあります:

  • Cone mode(デフォルト): 特定のディレクトリのみを選択できます。非常に高速で安定しており、推奨されるモードです。
  • Non-cone mode: 正規表現などのパターンを使用してファイルをフィルタリングできます。柔軟性は高いですが、パフォーマンスが低下しやすく、設定ミスも起こりやすいです。

ディレクトリの一部のみをクローンする手順(プロの技)

最初にすべてをクローンしてからSparse Checkoutを有効にしないでください。それでは「ゴミ」をダウンロードするために帯域を無駄にしてしまいます。以下の最適化された4つのステップを適用しましょう。

ステップ1:Blobless Cloneでリポジトリを初期化する

通常のgit cloneの代わりに、--filter--no-checkoutフラグを使用します。このコマンドはコミットのメタデータのみをダウンロードし、ファイルの内容(blobs)はダウンロードしません。

# URLを実際のリポジトリに置き換えてください
git clone --filter=blob:none --no-checkout https://github.com/example/monorepo-khong-lo.git
cd monorepo-khong-lo

この時点ではディレクトリは空ですが、心配いりません。正しい手順です。

ステップ2:節約モードを有効にする

最高のパフォーマンスを得るために、Cone modeでSparse Checkoutを有効にします:

git sparse-checkout init --cone

ステップ3:作業ディレクトリを選択する

例えば、apps/api-gatewaylibs/shared-authだけで作業する必要があるとします。Gitに次のように命じます:

git sparse-checkout set apps/api-gateway libs/shared-auth

Gitはこのリストを記録し、データをダウンロードする準備を整えます。

ステップ4:データをチェックアウトする

最後に、必要なブランチのコードを取得します:

git checkout main

結果は驚くべきものです。プロジェクトディレクトリには選択した2つのフォルダだけが表示されます。プロジェクトのサイズは5GBから約150MBに減少し、作業スピードが明らかに向上します。

6ヶ月間の実戦投入で得た経験

企業環境でSparse Checkoutを導入すると大きな効果が得られますが、以下の3つの重要なポイントに注意してください。

1. 常にPartial Cloneと組み合わせる

すでにフルクローンされたリポジトリでSparse Checkoutを使っても、「見た目がスッキリする」という問題しか解決しません。実際にディスク容量を節約するには、ステップ1のように--filter=blob:noneを使用する必要があります。

2. 依存関係を賢く管理する

これは最もよくあるミスです。Monorepo内のサービスは、通常commonutilsといった共通ディレクトリに依存しています。これらが欠けていると、IDEがエラーを出し、コードをビルドできません。

ヒント:package.jsongo.modをチェックして、必要なローカルパッケージを確認してください。その後、addコマンドでディレクトリを追加します:

git sparse-checkout add common/utils

3. CI/CDパイプラインの最適化

この手法をJenkinsやGitHub Actionsに適用し、さらにワークフロー自動化設定を組み合わせることで、パイプラインの実行時間が4分から45秒に短縮されました。ランナーがネットワーク経由で何千もの不要なファイルをプルする必要がなくなり、帯域コストも大幅に削減できます。

通常の状態に戻す方法

グローバル検索やプロジェクト全体のリファクタリングが必要になった場合は、いつでもこの機能を無効にできます:

git sparse-checkout disable

このコマンドにより、リポジトリはフルクローンの状態に戻ります。非常に柔軟で安全です。

おわりに

Git Sparse Checkoutは単なるテクニックではありません。最も重要な部分に集中するための実践的なGit Workflowの考え方です。何千もの無関係なファイルを排除し、隔離された開発環境を構築することで、PCの動作は軽くなり、集中力も高まります。

もしあなたのチームがMonorepoに苦労しているなら、今すぐ試してみてください。ディスク容量 pillar と帯域幅が、きっとあなたに感謝することでしょう!

Share: