はじめに
先日、社内の古参プロジェクトをいじる機会があり、リポジトリをcloneしようとしたら巨大過ぎたので、いじりたい一部分だけcloneできないかと調べると都合の良いコマンドがあったので使ってみました。
git sparse-checkout
昔から存在はしていたコマンドですが、ここ数年で改修も入り使いやすくなってるのではないかと思います。
- ・Git 1.7
- 2010年2月 リリース
- git sparse-checkout 導入
- ・Git 2.25
- 2020年1月 リリース
- git sparse-checkout 機能改善
- Highlights from Git 2.25 - The GitHub Blog
- ・Git 2.26
- 2020年3月 リリース
- git sparse-checkout add 追加
- Highlights from Git 2.26 - The GitHub Blog
使ってみた
試しにphpフレームワーク phalcon
のリポジトリをcloneしようと思います。clone対象は docker/8.0
に絞って行います。gitのバージョンは2.32.0を使用します。
$ git --version
git version 2.32.0
$ mkdir -p qiita
$ cd qiita
$ git init .
$ git config core.sparsecheckout true ### sparsecheckoutを有効にします。
$ cat .git/config ### config確認
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sparsecheckout = true
$ echo "/docker/8.0" > .git/info/sparse-checkout ### 対象ディレクトリ指定
$ cat .git/info/sparse-checkout
/docker/8.0
$ git remote add origin git@github.com:phalcon/cphalcon.git ### リモートリポジトリの追加
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sparsecheckout = true
[remote "origin"]
url = git@github.com:phalcon/cphalcon.git
fetch = +refs/heads/*:refs/remotes/origin/*
$ git pull origin master ### 取り込んでみる
remote: Enumerating objects: 231468, done.
remote: Counting objects: 100% (19901/19901), done.
remote: Compressing objects: 100% (7433/7433), done.
remote: Total 231468 (delta 14489), reused 16454 (delta 12247), pack-reused 211567
Receiving objects: 100% (231468/231468), 185.47 MiB | 2.49 MiB/s, done.
Resolving deltas: 100% (182723/182723), done.
From github.com:phalcon/cphalcon
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
$ tree . ### pullしたディレクトリ構造確認
.
└── docker
└── 8.0
├── Dockerfile
└── extra.ini
2 directories, 2 files
感想
狙い通り特定のディレクトリ配下のみ取り込むことができました。一部のディレクトリが肥大化し、その影響でリポジトリ全体が重くなっているプロジェクトも少なくないと思いますので、使い方次第では有効なツールになると思います。
懸念点としては下記のように .git/objects/
配下のボリュームはそれほど変わらないという点です。git上の歴史はすべて取り込んだうえで、一部ディレクトリのみをpullしているだけのようなので、歴史あるリポジトリに対して行う場合は、pullする際にそれなりの時間がかかると思います。
### 今回のsparse-checkoutを使用した場合
du -sh .git/objects/
198M .git/objects/
### 通常通りフルでcloneした場合
$ du -sh.git/objects/
199M .git/objects/
参考
・Highlights from Git 2.25 - The GitHub Blog
・Highlights from Git 2.26 - The GitHub Blog
・Phalconリポジトリ