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.md
と docker-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リポジトリにおいて、特定のファイルやディレクトリだけローカルに持ってきて作業がしたい場合に便利な git sparse-checkout
の使い方について紹介しました
これでどんな大きいgitリポジトリを扱う場合でも大丈夫!←