Gitの一部のディレクトリだけ取得する方法

Gitのリポジトリの一部のディレクトリしか使わない時にを全部取得するとすごくたくさんファイルがあるから嫌な時の方法

- 環境
    - Windows10 64bit
    - git version 2.18.0.windows.1
- 参考: [git sparse checkout で clone せずに一部のサブディレクトリだけを pull/checkout する](https://mseeeen.msen.jp/git-sparse-checkout/)

# 1.空ディレクトリを作る

```bash
# 空ディレクトリを作る
$ mkdir sub-directory-name

# 作ったディレクトリに移動する
$ cd sub-directory-name
```

# 2.空リポジトリを作って初期化

```bash
# 空リポジトリを初期化する
$ git init
Initialized empty Git repository in C:/path/to/sub-directory-name/.git/

# 初期化した状態でのconfig
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
```

# 3.一部だけ取得できるように`sparsecheckout`を設定する

```bash
$ git config core.sparsecheckout true

# sparsecheckoutを設定した状態のconfig
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        sparsecheckout = true
```

# 4.取得元のリポジトリを設定する

```bash
# 取得元のリポジトリを設定する
$ git remote add origin https://github.com/username/all.git

# リポジトリを設定した状態のconfig
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        sparsecheckout = true
[remote "origin"]
        url = https://github.com/username/all.git
        fetch = +refs/heads/*:refs/remotes/origin/*
```

# 5.取得したいディレクトリを`sparse-checkout`に設定する
```bash
# 取得したいディレクトリをsparse-checkoutに設定する
$ echo sub-directory-name > .git/info/sparse-checkout
```

# 6.`pull`する

```bash
# pullする
$ git pull origin master
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 7172 (delta 6), reused 7 (delta 4), pack-reused 7159
Receiving objects: 100% (7172/7172), 280.58 MiB | 5.91 MiB/s, done.
Resolving deltas: 100% (2559/2559), done.
From https://github.com/username/all
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
Checking out files: 100% (2021/2021), done.
```

```bash:使いたいブランチを指定したい場合
$ git pull origin {ブランチ名}
```

# 特定のファイルだけpullすることもできます


```bash:README.mdだけ取得する
# 1.空ディレクトリを作る
$ mkdir repo-name
$ cd repo-name

# 2.空リポジトリを作って初期化
$ git init
Initialized empty Git repository in C:/git/repo-name/.git/

# 3.一部だけ取得できるようにsparsecheckoutを設定する
$ git config core.sparsecheckout true

# 4.取得元のリポジトリを設定する
$ git remote add origin https://github.com/username/repo-name.git

# 5.README.mdをsparse-checkoutに設定する
echo path/to/README.md > .git/info/sparse-checkout

# 6.pullする
$ git pull origin master
From https://github.com/username/repo-name
 * branch            master     -> FETCH_HEAD

# 7. README.mdだけ取得できた
$ find path/
path/
path/to
path/to/README.md
```

# 一度設定した後に追加でほかのディレクトリを取得したい場合
`sparse-checkout`に改行区切りで追加したいディレクトリを追加できる。

- 参考
    - [【Git】特定のフォルダのみを操作対象にする - ちょっと厨二っぽいSEのブログ](http://ryokwkm2.hatenadiary.jp/entry/2017/12/29/150755)
    - [read-tree - [Reference/Git] ぺんたん info](https://pentan.info/doc/git/docs/git-read-tree.html)


```bash
# 追加したいディレクトリを追記する
$ echo add-sub-directory >> .git/info/sparse-checkout

# ツリー情報を更新する
$ git read-tree -m -u HEAD
```