モノリポで git worktree と sparse-checkout を組み合わせてみる

アソビュー! Advent Calendar 2024 の11日目です。

エンジニアの村松です🎅<コンチハ

はじめに

アソビューが提供するサービスは多数のアプリケーションで構成されており、これらのアプリケーションはモノリポで管理されています。アソビューのモノリポの取り組みについてはこちらのブログもぜひご覧ください!

tech.asoview.co.jp

以前、モノリポ + git worktree をテーマにテックブログを書きました。モノリポのアプリケーション群を、複数のブランチで同時にローカルで作業したい場合に git worktree を使うと便利ですね!という内容です。

tech.asoview.co.jp

このブログを書いてから3年半ほど経ちましたが、今も git worktree を使っています。

git worktree の課題

さて、そんな便利な git worktree ですが、git worktree add で作業ツリーを追加するたびにリポジトリ全体がローカルに checkout されます。

日々いろいろな機能が追加されていく中で、各アプリケーションのサイズも少しずつ大きくなっていきます。当然、ローカルのディスクも食います。どうしたものか...。

と思ったらこんなブログを見つけました!(弊社のテックブログですが)

tech.asoview.co.jp

さらについ先日こちらのブログの続編が出ました!これは要チェック!!

tech.asoview.co.jp

なるほど、sparse-checkout 便利そうですね!あっ... もしかして git worktree と sparse-checkout を組み合わせたらもっと便利に使えるのでは!?

試してみます。

git worktree + sparse-checkout を試してみた

普段は、フルクローンしたメインのリポジトリから git worktree add で作業ツリーを追加していますが、今回は次のような流れを試してみます。

  1. メインのリポジトリをパーシャルクローン (ブロブレスクローン)
  2. git worktree add で作業ツリー追加
  3. 作業ツリーに対して sparse-checkout を設定

1. メインのリポジトリをパーシャルクローン (ブロブレスクローン)

まずは、メインのリポジトリをクローンします。ここでは、先のブログを参考に git clone のオプションを指定して最低限のファイルだけローカルにダウンロードします。(パーシャルクローンやブロブレスクローンと呼ばれるそうです)

$ git clone --filter=blob:none --no-checkout --sparse <GIT REPO_URL>

2. git worktree add で作業ツリー追加

次に、git worktree add で作業ツリーを追加します。元のリポジトリの状態を引き継いでくれるため、この時点では .git ディレクトリとリポジトリのトップレベルのファイルしか checkout されません。

$ git worktree add ~/worktrees/foo-service -b feature/example-api

3. 作業ツリーに対して sparse-checkout を設定

そして、この作業ツリーに対して sparse-checkout を設定します。これによって、対象アプリケーションのディレクトリが作業ツリーに checkout されます。

$ git sparse-checkout add /path/to/foo-service /path/to/bar-service

比較

これまでの「フルクローン + git worktree」と今回の「パーシャルクローン + git worktree + sparse-checkout」を比較してみました。

フルクローン + git worktree パーシャルクローン + git worktree + sparse-checkout
clone (time) 5分18秒 39秒
worktree add (time) 30秒 2秒
sparse-checkout (time) 2秒
リポジトリサイズ 3.8GB 4.6MB

これだけの差が出ました。リポジトリサイズが減ってディスク使用量を節約できました。また、クローンや git worktree add に掛かる時間もかなり短縮できることが分かります。

もちろん、git worktree の仕組みもこれまでと同様に活用できて、同一ブランチを別ディレクトリに checkout することを防いだり、不要になった作業ツリーを削除するとディレクトリごと削除されてローカルをクリーンに保つことができます。

便利ですね!

おわりに

モノリポのアプリケーション群を、複数のブランチで同時にローカルで作業したいケースにおいて git worktree は便利ですが、sparse-checkout を組み合わせることでさらに便利に使えることが分かりました!

アソビューでは「生きるに、遊びを。」をミッションに、一緒に働くメンバーを募集しています!ご興味がありましたらお気軽にご応募いただければと思います!

www.asoview.co.jp