Same reason as the previous commit, this prevents potential object deletion that other worktrees need. There is a slight change in behavior. The current implementation always adds HEAD. The new one only adds _detached_ HEAD. But that's fine because all normal refs should be already covered by for_each_ref() in mark_reachable_objects(). Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- reachable.c | 14 +++++++++++--- t/t5304-prune.sh | 12 ++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/reachable.c b/reachable.c index 8f67242..e5f9170 100644 --- a/reachable.c +++ b/reachable.c @@ -170,6 +170,13 @@ static void add_objects_from_worktree(struct rev_info *revs) worktree_git_path(wt, "index")) > 0) add_index_objects_to_pending(revs, 0, &istate); discard_index(&istate); + + if (wt->is_detached) { + struct object *o; + o = parse_object_or_die(wt->head_sha1, "HEAD"); + add_pending_object(revs, o, ""); + } + } free_worktrees(worktrees); @@ -199,13 +206,14 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog, /* Add all external refs */ for_each_ref(add_one_ref, revs); - /* detached HEAD is not included in the list above */ - head_ref(add_one_ref, revs); - /* Add all reflog info */ if (mark_reflog) add_reflogs_to_pending(revs, 0); + /* + * Add all objects from the in-core index file and detached + * HEAD which is not included in the list above + */ add_objects_from_worktree(revs); cp.progress = progress; diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index cba45c7..683bdb0 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -292,4 +292,16 @@ test_expect_success 'prune: handle index in multiple worktrees' ' test_cmp second-worktree/blob actual ' +test_expect_success 'prune: handle HEAD in multiple worktrees' ' + git worktree add --detach third-worktree && + echo "new blob for third-worktree" >third-worktree/blob && + git -C third-worktree add blob && + git -C third-worktree commit -m "third" && + rm .git/worktrees/third-worktree/index && + test_must_fail git -C third-worktree show :blob && + git prune --expire=now && + git -C third-worktree show HEAD:blob >actual && + test_cmp third-worktree/blob actual +' + test_done -- 2.8.2.524.g6ff3d78 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html