upload-pack: send refs' objects despite "filter"
A filter line in a request to upload-pack filters out objects regardless
of whether they are directly referenced by a "want" line or not. This
means that cloning with "--filter=blob:none" (or another filter that
excludes blobs) from a repository with at least one ref pointing to a
blob (for example, the Git repository itself) results in output like the
following:
error: missing object referenced by 'refs/tags/junio-gpg-pub'
and if that particular blob is not referenced by a fetched tree, the
resulting clone fails fsck because there is no object from the remote to
vouch that the missing object is a promisor object.
Update both the protocol and the upload-pack implementation to include
all explicitly specified "want" objects in the packfile regardless of
the filter specification.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
cf1e7c0770
commit
a0c9016abd
@ -47,7 +47,7 @@ static void process_blob(struct rev_info *revs,
|
||||
|
||||
pathlen = path->len;
|
||||
strbuf_addstr(path, name);
|
||||
if (filter_fn)
|
||||
if (!(obj->flags & USER_GIVEN) && filter_fn)
|
||||
r = filter_fn(LOFS_BLOB, obj,
|
||||
path->buf, &path->buf[pathlen],
|
||||
filter_data);
|
||||
@ -132,7 +132,7 @@ static void process_tree(struct rev_info *revs,
|
||||
}
|
||||
|
||||
strbuf_addstr(base, name);
|
||||
if (filter_fn)
|
||||
if (!(obj->flags & USER_GIVEN) && filter_fn)
|
||||
r = filter_fn(LOFS_BEGIN_TREE, obj,
|
||||
base->buf, &base->buf[baselen],
|
||||
filter_data);
|
||||
@ -171,7 +171,7 @@ static void process_tree(struct rev_info *revs,
|
||||
cb_data, filter_fn, filter_data);
|
||||
}
|
||||
|
||||
if (filter_fn) {
|
||||
if (!(obj->flags & USER_GIVEN) && filter_fn) {
|
||||
r = filter_fn(LOFS_END_TREE, obj,
|
||||
base->buf, &base->buf[baselen],
|
||||
filter_data);
|
||||
|
||||
Reference in New Issue
Block a user