Gitのリポジトリの一部分だけを取得(同期)したい（スパースチェックアウト[sparse-checkout]）

:::note info
（2025年5月15日 修正）
コメントでアイデアを頂いたのですが、単純に
「git remote add origin https://gitfub.com/TestProj/abcde.git 」のような感じでリポジトリを指定してpullするだけでは、「.git」内に（キャッシュのような）情報が取得されているようで、
「git clone --filter=tree:0 ～」という方法を用いれば、より効率よく（無駄を無くして）運用できるようでしたので、そちらの方向で記事を修正しました。
:::

## はじめに

gitを使っていて不便だと感じた点と その解決方法に関して、忘れないようにメモも兼ねて残しておきます。

## gitで一部分だけ取得したい

開発する上で、一機能だけの差分でブランチを作成することがあったのですが、その都度リポジトリ全体を取得してくるのは、ハードディスクの容量を圧迫したり、更新時の通信が多くなってしまって無駄だと感じてしまっていました。

SVNなどではリポジトリ上の一部分だけを取ってくる事も可能なのですが、gitでは そのような機能がないらしく、下記のようなケースに対応ができないようです。

* プロジェクト全体の規模が大きく、担当の部分だけを持ってきたい
* 編集するモジュールの差分だけブランチを切って扱いたい

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/ea49cf17-9929-479b-9ca6-afe8e2e58fc3.png" width=50%>

## スパースチェックアウト[sparse-checkout]とは

sparse checkoutとは、gitで取得するディレクトリを限定し、一部分だけ持ってくることができる機能のことです。

これを利用して、リポジトリの一部だけを同期する対象とすることで、
疑似的に 必要な部分だけを取得することが可能となります。

これによって、必要なパッケージのみダウンロードすることが可能となり、
これによって全体として扱う領域も減り

* 通信量
* ディスク容量
* 処理・通信にかかる時間

等の効率化が期待できます。

## やり方

例として、下記のようなリポジトリから取得する手順で説明します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/ea49cf17-9929-479b-9ca6-afe8e2e58fc3.png" width=300>

まず任意の場所で、以下コマンドを実行します。
（※ 例では、コマンドの最後にリポジトリと同様「_Base」を指定していますが、名前は任意の別のものでも構いません）

```
git clone --filter=tree:0 --no-checkout https://gitfub.com/TestProj/dog.git _Base
（※ 実行したフォルダ以下に、コマンド末尾の「_Base」というフォルダが作成されます（名前は別のものでも構いません））
```

:::note info
「.git」ファイルの場所

上記コマンドで指定するURLは、gitで同期する対象の下記場所に表記されている「.git」ファイルのURLです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/cea80601-049b-4c1b-9b3d-40d5e0784650.png" width=600>
:::


これで、下記のようなフォルダが作成されたと思いますので、フォルダに移動します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/e66e2258-cfac-4d1e-9d9e-2f907899ecae.png" width=150>

```
cd _Base
```

この時点で以下のような感じでフォルダやファイルが作成されている思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/b1d0b36b-5c16-4031-84f8-a7e758065065.png" width=300>

（なお、「.git」はwindowsの隠しファイルの設定上見えないかもしれないですが、その場合は下記設定で隠しファイルを見えるようにして下さい）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/93094772-3ec8-43a2-947e-f3b21d759874.png" width=600>

その上で、sparse-checkout の有効化を行います。

```
git config core.sparsecheckout true
```

次に、「sparse checkout」の設定ファイルを作成します。
（ここではgitリポジトリ上で対象にする「/SubProject_Cat」をしていしています）

```
echo /SubProject_Cat > .git/info/sparse-checkout
（※ここでは、「/SubProject_Cat」を指定していますが、
　　奥の階層のフォルダを指定する場合は「/aaa/bbb/ccc」のようにして下さい）
```
これで、以下ファイルが作成されたと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/f80404aa-2545-42d9-bfba-d26184c329c1.png" width=300>

ちなみに同ファイル（「sparse-checkout」(拡張子なし)）をテキストエディタ等で作成しても良いです。
その場合、ファイルの中身は

> /SubProject_Cat

のように記載してください。

:::note info
複数フォルダを対象とする場合
ちなみに複数フォルダを指定する場合、

コマンドなら以下のように対象フォルダ分コマンドを実行してください
```
echo /MainProject > .git/info/sparse-checkout
echo /SubProject_Cat > .git/info/sparse-checkout
echo /Tools/UtilityScripts > .git/info/sparse-checkout
```

テキストファイルを編集（作成）する場合は、以下のように記載してください
> /MainProject
> /SubProject_Cat
> /Tools/UtilityScripts
:::

これで、準備ができましたので
gitからファイルを取得します。

```
git checkout master
```

これで、以下のように必要な部分だけを取得できていると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4070642/dbfa4d6e-6485-4eb6-931e-cc57e21ac1ae.png" width=200>