git clone --filter 来自Git 2.19
此选项实际上将跳过从服务器获取不需要的对象:git clone --depth 1 --no-checkout --filter=blob:none \
"file://$(pwd)/server_repo" local_repocd local_repogit checkout master -- mydir/
服务器应配置为:git config --local uploadpack.allowfilter 1git config --local uploadpack.allowanysha1inwant 1
扩展了Git远程协议以支持v2.19.0中的此功能,但当时没有服务器支持。但它已经可以在本地测试了。
TODO:--filter=blob:none跳过所有blob,但仍然获取所有树对象。但是在正常的回购中,与文件本身相比,这应该很小,所以这已经足够了。询问:https://www.spinics.net/lists/git/msg342006.html Devs回复了一个--filter=tree:0正在开展的工作。
请记住,--depth 1已经暗示--single-branch,另请参阅:如何在Git中克隆单个分支?
file://$(path)需要克服git clone协议恶作剧:如何使用相对路径浅层克隆本地git存储库?
格式--filter记录在上面man git-rev-list。
Git树上的文档:
测试一下#!/usr/bin/env bashset -eulist-objects() (
git rev-list --all --objects
echo "master commit SHA: $(git log -1 --format="%H")"
echo "mybranch commit SHA: $(git log -1 --format="%H")"
git ls-tree master
git ls-tree mybranch | grep mybranch
git ls-tree master~ | grep root)# Reproducibility.export GIT_CO