git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/4] reachable.c: mark reachable detached HEAD from all worktrees

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Jun 1, 2016, 10:45 UTC
Message-ID
<20160601104519.16563-4-pclouds@gmail.com>
In-Reply-To
<20160601104519.16563-1-pclouds@gmail.com>

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@gmail.com>
---
 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
Previous: Duy NguyenNext: Nguyễn Thái Ngọc Duy
Message 18 of 25 in “git gc and worktrees”
  1. Johannes SixtMay 31, 2016
  2. Duy NguyenMay 31, 2016
  3. Jeff KingMay 31, 2016
  4. Johannes SixtJun 1, 2016
  5. Michael HaggertyJun 1, 2016
  6. Junio C HamanoJun 1, 2016
  7. Michael HaggertyJun 1, 2016
  8. Junio C HamanoJun 1, 2016
  9. Michael HaggertyJun 2, 2016
  10. Junio C HamanoJun 3, 2016
  11. 0/4 Fix prune/gc problem with multiple worktreesNguyễn Thái Ngọc Duy, Jun 1, 2016
  12. 1/4 revision.c: move read_cache() out of add_index_objects_to_pending()Nguyễn Thái Ngọc Duy, Jun 1, 2016
  13. 2/4 reachable.c: mark reachable objects in index from all worktreesNguyễn Thái Ngọc Duy, Jun 1, 2016
  14. Eric SunshineJun 1, 2016
  15. Duy NguyenJun 2, 2016
  16. David TurnerJun 1, 2016
  17. Duy NguyenJun 2, 2016
  18. 3/4 reachable.c: mark reachable detached HEAD from all worktreesNguyễn Thái Ngọc Duy, Jun 1, 2016
  19. 4/4 reachable.c: make reachable reflogs for all per-worktree reflogsNguyễn Thái Ngọc Duy, Jun 1, 2016
  20. Michael HaggertyJun 1, 2016
  21. Jeff KingJun 1, 2016
  22. Junio C HamanoJun 1, 2016
  23. Duy NguyenJun 2, 2016
  24. Michael HaggertyJun 2, 2016
  25. Junio C HamanoJun 2, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.