Jonathan Tan <jonathantanmy@xxxxxxxxxx> writes: > When doing a partial clone or fetch with transfer.fsckobjects=1, use the > --fsck-objects instead of the --strict flag when invoking index-pack so > that links are not checked, only objects. This is because incomplete > links are expected when doing a partial clone or fetch. It is expected that _some_ links are missing, but this makes me wonder if we can do better than disabling the connectivity check altogether. Does "git fetch" lack sufficient information to attempt the connectivity check, and when (and only when) it hits a broken link, see if that is because the connectivity check traversal is crossing a "partial" fetch boundary, or something along that line? > > Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> > --- > fetch-pack.c | 13 +++++++++++-- > t/t5616-partial-clone.sh | 11 +++++++++++ > 2 files changed, 22 insertions(+), 2 deletions(-) > > diff --git a/fetch-pack.c b/fetch-pack.c > index d97461296..1d6117565 100644 > --- a/fetch-pack.c > +++ b/fetch-pack.c > @@ -886,8 +886,17 @@ static int get_pack(struct fetch_pack_args *args, > ? fetch_fsck_objects > : transfer_fsck_objects >= 0 > ? transfer_fsck_objects > - : 0) > - argv_array_push(&cmd.args, "--strict"); > + : 0) { > + if (args->from_promisor) > + /* > + * We cannot use --strict in index-pack because it > + * checks both broken objects and links, but we only > + * want to check for broken objects. > + */ > + argv_array_push(&cmd.args, "--fsck-objects"); > + else > + argv_array_push(&cmd.args, "--strict"); > + } > > cmd.in = demux.out; > cmd.git_cmd = 1; > diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh > index 29d863118..cee556536 100755 > --- a/t/t5616-partial-clone.sh > +++ b/t/t5616-partial-clone.sh > @@ -143,4 +143,15 @@ test_expect_success 'manual prefetch of missing objects' ' > test_line_count = 0 observed.oids > ' > > +test_expect_success 'partial clone with transfer.fsckobjects=1 uses index-pack --fsck-objects' ' > + git init src && > + test_commit -C src x && > + test_config -C src uploadpack.allowfilter 1 && > + test_config -C src uploadpack.allowanysha1inwant 1 && > + > + GIT_TRACE="$(pwd)/trace" git -c transfer.fsckobjects=1 \ > + clone --filter="blob:none" "file://$(pwd)/src" dst && > + grep "git index-pack.*--fsck-objects" trace > +' > + > test_done