Vim の自動ビルドスクリプトを書いていたんですが、vim の clone が遅すぎるので対策を調べました
TL;DR
Gitのshallow clone
の機能を使いましょう。
-b branchname --single-branch --depth=1
とやればよさそう
検証
普通にgit clone
した場合
$ time git clone https://github.com/vim-jp/vim.git vim0
Cloning into 'vim0'...
remote: Counting objects: 56064, done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 56064 (delta 76), reused 0 (delta 0), pack-reused 55933
Receiving objects: 100% (56064/56064), 157.80 MiB | 333.00 KiB/s, done.
Resolving deltas: 100% (35750/35750), done.
Checking connectivity... done.
real 8m12.556s
user 0m29.880s
sys 0m42.800s
ネット環境の影響もあるが遅い・・・
-b master --single-branch
を使用する
$ time git clone -b master --single-branch https://github.com/vim-jp/vim.git vim1
Cloning into 'vim1'...
remote: Counting objects: 56063, done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 56063 (delta 76), reused 0 (delta 0), pack-reused 55932
Receiving objects: 100% (56063/56063), 157.80 MiB | 325.00 KiB/s, done.
Resolving deltas: 100% (35750/35750), done.
Checking connectivity... done.
real 8m24.252s
user 0m31.904s
sys 0m43.812s
オブジェクト数は1減っているものの、時間は通信速度の影響下むしろ増加
ある程度歴史のあるリポジトリで、プランチが多く生存してる場合は効果がありそう。
--depth=1
を使用する
$ time git clone --depth=1 https://github.com/vim-jp/vim.git vim2
Cloning into 'vim2'...
remote: Counting objects: 2663, done.
remote: Compressing objects: 100% (2548/2548), done.
remote: Total 2663 (delta 137), reused 1762 (delta 53), pack-reused 0
Receiving objects: 100% (2663/2663), 11.81 MiB | 319.00 KiB/s, done.
Resolving deltas: 100% (137/137), done.
Checking connectivity... done.
real 0m43.275s
user 0m2.500s
sys 0m3.020s
とても速い・・・!!
-b master --single-branch --depth=1
を使用する
$ time git clone -b master --single-branch --depth=1 https://github.com/vim-jp/vim.git vim3
Cloning into 'vim3'...
remote: Counting objects: 2663, done.
remote: Compressing objects: 100% (2548/2548), done.
Receiving objects: 100% (2663/2663), 11.81 MiB | 322.00 KiB/s, done.
remote: Total 2663 (delta 137), reused 1762 (delta 53), pack-reused 0
Resolving deltas: 100% (137/137), done.
Checking connectivity... done.
real 0m42.486s
user 0m2.956s
sys 0m2.808s
--depth=1
とさほどかわらず
結論
-b branchname --single-branch --depth=1
とやればよさそう
git submodule の場合
以下のようにすれば良さそうです
$ git submodule update --init --depth=1
ちなみに
$ git clone --recursive --depth=1 https://github.com/davidhalter/jedi-vim.git
とした場合、submodule の方には--depth=1
が適用されませんでした (git v1.9.1)
追記(git 2.9 ~)
--shallow-submodules
というオプションが追加されたようです。
$ git clone --recursive --depth=1 --shallow-submodules https://github.com/davidhalter/jedi-vim.git
追記(git 2.10 ~)
Git 2.10から以下のオプションが使えるようになったようです。(未検証)
$ git config -f .gitmodules submodule.<name>.shallow true
Git shallow submodules - Stack Overflow