gitのsparse-checkoutで大規模リポジトリから特定のリポジトリだけローカルに持ってくる

はじめに

モノレポや巨大なファイルを管理しているgitリポジトリなどをcloneする場合、時間がかかりすぎるだけでなく不必要なファイルもダウンロードしてしまう場合がありますよね

そんな時に便利なのが git sparse-checkout というgitコマンド

対象のディレクトリやファイルのパターンを指定するだけで、対象のファイルだけローカルに持ってくることができます。

それでは具体的な使い方について見ていきましょう

前提条件

今回扱うgitリポジトリがモノレポだとして下記のような構成だったとします

$  tree . -L 2
.
├── README.md
├── backend
│   ├── api
│   └── functions
├── docker-compose.yaml
└── frontend
    ├── serviceA
    └── serviceB

このリポジトリにはbackendとfrontendの両方のコンポーネントが含まれていて、docker-composeでバックエンド・フロントエンドが起動されるような形になっています。

ここでは、backendの開発のみをやりたいため、backendのディレクトリをローカルに持ってくることを考えます。

sparse-checkoutの使い方

まずは空のディレクトリを用意し、sparse-checkoutで初期化を行います

# サンプル用のディレクトリ作成
$ mkdir example-sparse-checkout
$ cd example-sparse-checkout

# gitの初期化
$ git init
Initialized empty Git repository in /Users/hoge/example-sparse-checkout/.git/

# リポジトリの登録
$ git remote add origin git@github.com:hoge/example-sparse-checkout.git

# sparse-checkoutを有効化
$ git sparse-checkout init

# sparse-checkoutの対象ファイルの確認
$ git sparse-checkout list
/*
!/*/

git sparse-checkout init で初期化された場合対象ファイルは第一階層にあるファイルのみになるので、この状態でpullを行うと README.mddocker-compose.yml のファイルだけ取得できます

# git履歴の同期と対象ファイルをローカルに持ってくる
$  git pull origin master

# ローカルファイルの確認
$ tree . -L 2
.
├── README.md
└── docker-compose.yaml

0 directories, 2 files

対象ファイルの変更 git sparse-checkout set

backendのファイルでのみ作業を行いたい場合、setを使うことで対象ファイル・ディレクトリを絞ることができます

この時、対象ファイルはsetされたファイルに上書きされ、同期時に対象外のファイルは削除されます

# backendを対象ファイルとする
$ git sparse-checkout set backend
$ git sparse-checkout list
backend

# ファイルの同期
$ git pull origin master

# ローカルファイルの確認(対象外のファイルは削除される)
$ tree . -L 2
.
└── backend
    ├── api
    └── functions

対象ファイル・ディレクトリを追加する git sparse-checkout add

backendだけでなくfrontendの作業も行いたい場合、対象ファイルを増やした場合があります

そういう時は git sparse-checkout add を使いましょう

# frontendも対象ディレクトリとして追加
$ git sparse-checkout add frontend

# 対象ファイルの確認
$ git sparse-checkout list
backend
frontend

# 同期して、ローカルファイルの確認
$ git pull origin master
$ tree . -L 2
.
├── backend
│   ├── api
│   └── functions
└── frontend
    ├── serviceA
    └── serviceB

これで、frontendもローカルに持ってこれることを確認しました

その他、詳しいことは公式のドキュメントを参考にしてみてください

git-scm.com

まとめ

一つのgitリポジトリにおいて、特定のファイルやディレクトリだけローカルに持ってきて作業がしたい場合に便利な git sparse-checkout の使い方について紹介しました

これでどんな大きいgitリポジトリを扱う場合でも大丈夫!←