LoginSignup
5
3

More than 1 year has passed since last update.

Gitでリモートから特定のパスのみを取得する方法

Last updated at Posted at 2022-02-21

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 clonepartial 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オプションを指定することで取得対象を限定できる。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3