Git本来の使い方にはそぐわないが、リモートリポジトリの一部のデータのみが必要で、かつ取得したデータを1度しか使わない場面(ビルドプロセスなど)において、このデータ取得を高速に行う方法について調査した。
前提
要約
shallow (--depth 1
) + tree less (--filter=tree:0
) cloneを行った後に、必要なディレクトリをsparse checkoutで取得すればよい。
URL=https://example.com/repository.git
BRANCH=main
CLONE_DIR=repository
TARGET_DIR="/abc /xyz"
git clone --depth 1 --filter=tree:0 --no-checkout -b ${BRANCH} ${URL} ${CLONE_DIR}
cd ${CLONE_DIR}
git sparse-checkout set --CONE ${TARGET_DIR}
git checkout
補足1:shallow cloneとpartial clone
前提としてGitのオブジェクト構造について理解しておく必要がある。詳細は参考資料のドキュメントにわかりやすく解説されているが、今回は下記の図のcommit, tree, blobの関係性が掴めていれば問題ない。
参考資料
shallow cloneとpartial cloneは、Gitリポジトリから一部のオブジェクトのみをクローンする方法となる。shallow cloneは指定した深さまでのcommitに繋がるオブジェクトのみを取得するのに対し、partial cloneはblobのみもしくはtreeのみを取得するものとなる。これらの詳細はパーシャルクローンとシャロークローンを活用しよう - GitHubブログにて詳しく説明されている。図で表現すると以下のようになる。
また、partial cloneを1つのブランチのみを対象とすることや、shallow cloneとpartial cloneを組み合わせること(これが要約で使われている一番薄くcloneする方法となる)もできる。なお、shallow cloneの場合はデフォルトで1つのブランチのみが対象(--single-branchが指定された状態)となる。
補足2:sparse checkout
sparse checkoutは一部のファイルのみをworking directoryにチェックアウトする方法である。要約のコマンドでは、--CONE
オプションを指定して、CONE PATTERN SET形式でチェックアウト対象を設定している。通常のFULL PATTERN SET形式よりもマッチングの効率が良い。
参考
補足3:git archive
対応しているリモートリポジトリは少ないが、git archive --remoteを使う方法もある。pathオプションを指定することで取得対象を限定できる。