大きなリポジトリを扱うときにリポジトリの一部だけcloneしたい時があります。そんなときに使えるコマンドがgit sparse-checkoutです。Partial Cloneとgit sparse-checkoutコマンドを使うとリポジトリの一部ディレクトリだけcheckoutできます。
Partial Clone機能を使うと不要なオブジェクトを除外してダウンロードできるので、大きなリポジトリもサイズを抑えて素早くcloneできます。
git-scm.com
Partial Cloneしたリポジトリに対してgit sparse-checkoutを使って必要なファイルだけcheckoutします。Git 2.26でgit sparse-checkoutにadd
が追加され使いやすくなっています。
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
とした場合、ワーキングツリーにはDocumentationとciディレクトリがcheckoutされます。
3. 指定しているパターンを確認する
git sparse-checkout list
でsparseCheckoutに設定しているパターンが確認できます。
補足
sparse-checkoutを使っている場合でもコミットやプッシュ、ブランチの切り替えは可能です。
まとめ
一部だけclone(checkout)したい場合に便利なgit sparse-checkoutを調べました。大きなリポジトリを扱う場合に効果があります。過去に紹介した取得するコミット数を減らしてclone するshallow cloneと合わせて知っていると状況に合わせた使い分けができます。
iucstscui.hatenablog.com
参考URL
おまけ
読み方(調べるまで分からなかったので)
sparse-checkout:スパース チェックアウト
Partial Clone:パーシャル クローン
*1:blobオブジェクトはファイルの内容が格納されたデータです