diff --git a/path-walk.c b/path-walk.c index 341bdd2ba4ef46..88885508f98789 100644 --- a/path-walk.c +++ b/path-walk.c @@ -344,9 +344,11 @@ static int setup_pending_objects(struct path_walk_info *info, struct object *obj = pending->item; /* Commits will be picked up by revision walk. */ - if (obj->type == OBJ_COMMIT) + if (obj->type == OBJ_COMMIT || obj->flags & SEEN) continue; + obj->flags |= SEEN; + /* Navigate annotated tag object chains. */ while (obj->type == OBJ_TAG) { struct tag *tag = lookup_tag(info->revs->repo, &obj->oid); diff --git a/t/t6601-path-walk.sh b/t/t6601-path-walk.sh index c89b0f1e19d9fb..b970700d3fbaac 100755 --- a/t/t6601-path-walk.sh +++ b/t/t6601-path-walk.sh @@ -397,4 +397,26 @@ test_expect_success 'trees are reported exactly once' ' test_line_count = 1 out-filtered ' +test_expect_success 'trees are reported exactly once' ' + test_when_finished "rm -rf unique-trees" && + test_create_repo unique-trees && + ( + cd unique-trees && + mkdir initial && + test_commit initial/file && + + git switch -c move-to-top && + git mv initial/file.t ./ && + test_tick && + git commit -m moved && + + git update-ref refs/heads/other HEAD + ) && + + test-tool -C unique-trees path-walk -- --all >out && + tree=$(git -C unique-trees rev-parse HEAD:) && + grep "$tree" out >out-filtered && + test_line_count = 1 out-filtered +' + test_done