]> git.ipfire.org Git - thirdparty/git.git/commit - fetch-pack.c
fetch-pack: exclude blobs when lazy-fetching trees
authorJonathan Tan <jonathantanmy@google.com>
Wed, 3 Oct 2018 23:04:53 +0000 (16:04 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 4 Oct 2018 13:03:49 +0000 (06:03 -0700)
commit4c7f9567ea2628451a0f4ad52599a25d34657bae
tree369478542893baef3d5695698abcb0a272acc006
parent12f19a9825686e3641803580bda4e2ab2abd44ed
fetch-pack: exclude blobs when lazy-fetching trees

A partial clone with missing trees can be obtained using "git clone
--filter=tree:none <repo>". In such a repository, when a tree needs to
be lazily fetched, any tree or blob it directly or indirectly references
is fetched as well, regardless of whether the original command required
those objects, or if the local repository already had some of them.

This is because the fetch protocol, which the lazy fetch uses, does not
allow clients to request that only the wanted objects be sent, which
would be the ideal solution. This patch implements a partial solution:
specify the "blob:none" filter, somewhat reducing the fetch payload.

This change has no effect when lazily fetching blobs (due to how filters
work). And if lazily fetching a commit (such repositories are difficult
to construct and is not a use case we support very well, but it is
possible), referenced commits and trees are still fetched - only the
blobs are not fetched.

The necessary code change is done in fetch_pack() instead of somewhere
closer to where the "filter" instruction is written to the wire so that
only one part of the code needs to be changed in order for users of all
protocol versions to benefit from this optimization.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
fetch-pack.c
fetch-pack.h
t/t0410-partial-clone.sh