はんなりと、ゆるやかに

アジャイル、スクラムが好きなITエンジニアが日々から学んだことをアウトプット

リポジトリの一部だけcheckoutするGitコマンド:sparse-checkout

大きなリポジトリを扱うときにリポジトリの一部だけcloneしたい時があります。そんなときに使えるコマンドがgit sparse-checkoutです。Partial Clonegit sparse-checkoutコマンドを使うとリポジトリの一部ディレクトリだけcheckoutできます。


Partial Clone機能を使うと不要なオブジェクトを除外してダウンロードできるので、大きなリポジトリもサイズを抑えて素早くcloneできます。
git-scm.com

Partial Cloneしたリポジトリに対してgit sparse-checkoutを使って必要なファイルだけcheckoutします。Git 2.26でgit sparse-checkoutaddが追加され使いやすくなっています。
git-scm.com

今回の検証に使ったgit version は 2.26.2 です。

2020/08/29 追記
git 2.27以降は同じ手順が使えないので注意です。
iucstscui.hatenablog.com

概要

リポジトリの一部だけcheckoutするにはPartial Cloneで最小限のデータをcloneし、sparse-checkoutで必要な部分だけcheckoutします。

使い方

Partial Cloneで最小限のデータをcloneする

Partial Cloneはcloneコマンドのオプションを使って実現します。
git clone --filter=blob:none --no-checkout <リポジトリ名> <ディレクトリ名>

--filter=blob:noneオプションはblobオブジェクト*1のダウンロードを除外します。--no-checkoutはclone完了後のcheckoutを行いません。これによりファイルをダウンロードせずにcloneできるためサイズが抑えられます。

以下は同じリポジトリに対してオプションを変えてcloneした場合のサイズの違いです。--filter=blob:none --no-checkoutを使った場合にサイズが節約されていることがわかります。

git clone https://github.com/git/git.git
→185 MB
git clone --no-checkout https://github.com/git/git.git
→144 MB
git clone --filter=blob:none --no-checkout https://github.com/git/git.git
→65 MB

sparse-checkoutで必要なディレクトリだけチェックアウト

--filter=blob:none --no-checkoutを使ってcloneした場合、ディレクトリ内は空の状態です。sparse-checkoutコマンドで必要なディレクトリをcheckoutします。

1. sparseCheckoutを有効にする

git sparse-checkout init --coneコマンドでsparseCheckoutを有効にします。

ルートディレクトリのファイルが展開され、サブモジュールが初期化された状態になります。ディレクトリ関連はcheckoutされません。

2. パターンを指定してディレクトリをcheckoutする

パターンの指定は2種類あります。

git sparse-checkout set <パターン>

指定したパターンに一致したディレクトリがcheckoutされます。例えば、git sparse-checkout set DocumentationでDocumentationディレクトリがcheckoutされます。

git sparse-checkout add <パターン>(Git 2.26 で追加)

指定したパターンが追加され、一致したディレクトリがcheckoutされます。例えば、git sparse-checkout set Documentationのあとgit sparse-checkout set ciとした場合、ワーキングツリーにはciディレクトリだけcheckoutされています。同じ条件でgit sparse-checkout add ciとした場合、ワーキングツリーにはDocumentationciディレクトリがcheckoutされます。

3. 指定しているパターンを確認する

git sparse-checkout listでsparseCheckoutに設定しているパターンが確認できます。

4. sparseCheckoutを無効にする

git sparse-checkout disableでsparseCheckoutが無効になり、リポジトリの全ディレクトリがcheckoutされます。

補足

sparse-checkoutを使っている場合でもコミットやプッシュ、ブランチの切り替えは可能です。

まとめ

一部だけclone(checkout)したい場合に便利なgit sparse-checkoutを調べました。大きなリポジトリを扱う場合に効果があります。過去に紹介した取得するコミット数を減らしてclone するshallow cloneと合わせて知っていると状況に合わせた使い分けができます。
iucstscui.hatenablog.com

おまけ

読み方(調べるまで分からなかったので)
sparse-checkout:スパース チェックアウト
Partial Clone:パーシャル クローン

*1:blobオブジェクトはファイルの内容が格納されたデータです