Gitで他のリポジトリから一部のファイルのみをcloneする方法

Gitで「あのリポジトリのこのファイルだけをcloneしたい」という場合に、Sparse checkoutという機能があることを知ったのでそのメモです。

Sparse checkoutはGit 1.7.0以降で追加された機能で、マージに関するコマンド(merge, checkoutなど)で任意のファイルのみを対象とする機能です。つまり、厳密には、一部のファイルのみをcloneするわけではなく、他のリポジトリをまるごとcloneした後に任意のファイルのみをチェックアウトする機能なのですが、目的に近い結果を得ることはできそうです。

Sparse checkoutを使用するには、通常通りにcloneした後、「core.sparse-checkout」を「true」に設定します。

git clone clone元のリポジトリ ワーキングディレクトリ
cd ワーキングディレクトリ
git config core.sparse-checkout true

その後、「.git/info/sparse-checkout」へ対象とするファイル(または除外するファイル)を追加し、ツリーを読み込み直せば対象のファイルのみがチェックアウトされます。

echo 対象とするファイル>.git/info/sparse-checkout
echo !除外するファイル>.git/info/sparse-checkout
git read-tree -m -u HEAD

取り込み元のリポジトリに変更があった場合は、pullすれば変更を反映できます。除外しているファイルがある場合でも、それらのファイルはpullでのfetchが行われるため、全てのファイルをclone元のリポジトリに追随させることができます。(push権さえあれば、リモートリポジトリへのpushも通常通りに行えます。)

他のファイルをチェックアウトしたくなった場合は、一時的に「.git/info/core.sparse-checkout」を変更するか、「sparse-checkout」を変更後にgit read-tree -m -u HEADし、git checkout -- ファイルするだけです。

注意点として、ワーキングディレクトリごとにSparse checkoutの設定を行う必要があります。また、リポジトリをまるごとcloneしているため、リポジトリのサイズは普通にcloneした場合とほぼ同様になります。

他の方法でも何とかなりそうな気がするので、あえてSparse checkoutが必要となるような具体例は思い浮かばないのですが、clone元のリポジトリに近い状態を維持しつつ、一部のファイルのみを利用したい場合などには便利なのではないでしょうか。

コメント (1)

× git config core.sparse-checkout true
○ git config core.sparsecheckout true

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/223/trackback/
この記事のURI
http://dxd8.com/archives/223/