Jonathan Tan <jonathantanmy@xxxxxxxxxx> writes: > In 7fbbcb21b1 ("diff: batch fetching of missing blobs", 2019-04-08), > diff was taught to batch the fetching of missing objects when operating > on a partial clone, but was not taught to refrain from fetching > GITLINKs. Teach diff to check if an object is a GITLINK before including > it in the set to be fetched. OK, so in a lazy repository, running "git diff" (or "git log") could have resulted in "git fetch" of a history of a submodule, which may likely have failed? > (As stated in the commit message of that commit, unpack-trees was also > taught a similar thing prior, but unpack-trees correctly checks for > GITLINK before including objects in the set to be fetched.) > --- Sign-off? > One of my colleagues noticed this when switching branches in a > superproject with a dirty working tree (hence triggering the diff > mechanism). The test I included in this commit tests a simpler use case, > but I've verified that this solves my colleague's case too. > --- > diff.c | 1 + > t/t4067-diff-partial-clone.sh | 31 +++++++++++++++++++++++++++++++ > 2 files changed, 32 insertions(+) > > diff --git a/diff.c b/diff.c > index efe42b341a..e28b463f57 100644 > --- a/diff.c > +++ b/diff.c > @@ -6512,6 +6512,7 @@ static void add_if_missing(struct repository *r, > const struct diff_filespec *filespec) > { > if (filespec && filespec->oid_valid && > + !S_ISGITLINK(filespec->mode) && > oid_object_info_extended(r, &filespec->oid, NULL, > OBJECT_INFO_FOR_PREFETCH)) > oid_array_append(to_fetch, &filespec->oid); Makes sense. Thanks.