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

[PATCH v3 20/22] worktree: avoid resolving HEAD unnecessarily

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Jul 17, 2015, 23:00 UTC
Message-ID
<1437174017-81687-21-git-send-email-sunshine@sunshineco.com>
In-Reply-To
<1437174017-81687-1-git-send-email-sunshine@sunshineco.com>

Now that git-worktree sets HEAD explicitly to its final value via either git-symbolic-ref or git-update-ref, rather than relying upon git-checkout to do so, the "hack" for pacifying is_git_directory() with a temporary HEAD, though still necessary, can be simplified.

Since the real HEAD is now populated with its proper final value, the value of the temporary HEAD truly no longer matters, and any value which looks like an object ID is good enough to satisfy is_git_directory(). Therefore, just set the temporary HEAD to a literal value rather than going through the effort of resolving the current branch's HEAD.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
---
No changes since v2.
 builtin/worktree.c | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 79d088c..4619308 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -192,7 +192,6 @@ static int add_worktree(const char *path, const char *refname,
 	int counter = 0, len, ret;
 	struct strbuf symref = STRBUF_INIT;
 	struct commit *commit = NULL;
-	unsigned char rev[20];
 
 	if (file_exists(path) && !is_empty_dir(path))
 		die(_("'%s' already exists"), path);
@@ -253,20 +252,14 @@ static int add_worktree(const char *path, const char *refname,
 		   real_path(get_git_common_dir()), name);
 	/*
 	 * This is to keep resolve_ref() happy. We need a valid HEAD
-	 * or is_git_directory() will reject the directory. Moreover, HEAD
-	 * in the new worktree must resolve to the same value as HEAD in
-	 * the current tree since the command invoked to populate the new
-	 * worktree will be handed the branch/ref specified by the user.
-	 * For instance, if the user asks for the new worktree to be based
-	 * at HEAD~5, then the resolved HEAD~5 in the new worktree must
-	 * match the resolved HEAD~5 in the current tree in order to match
-	 * the user's expectation.
+	 * or is_git_directory() will reject the directory. Any value which
+	 * looks like an object ID will do since it will be immediately
+	 * replaced by the symbolic-ref or update-ref invocation in the new
+	 * worktree.
 	 */
-	if (!resolve_ref_unsafe("HEAD", 0, rev, NULL))
-		die(_("unable to resolve HEAD"));
 	strbuf_reset(&sb);
 	strbuf_addf(&sb, "%s/HEAD", sb_repo.buf);
-	write_file(sb.buf, 1, "%s\n", sha1_to_hex(rev));
+	write_file(sb.buf, 1, "0000000000000000000000000000000000000000\n");
 	strbuf_reset(&sb);
 	strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
 	write_file(sb.buf, 1, "../..\n");
-- 
2.5.0.rc2.378.g0af52e8
Previous: Eric SunshineNext: Eric Sunshine
Message 22 of 24 in “rid git-checkout of too-intimate knowledge of new worktree”
  1. 00/22 rid git-checkout of too-intimate knowledge of new worktreeEric Sunshine, Jul 17, 2015
  2. 01/22 checkout: avoid resolving HEAD unnecessarilyEric Sunshine, Jul 17, 2015
  3. 02/22 checkout: name check_linked_checkouts() more meaningfullyEric Sunshine, Jul 17, 2015
  4. 03/22 checkout: improve die_if_checked_out() robustnessEric Sunshine, Jul 17, 2015
  5. 04/22 checkout: die_if_checked_out: simplify strbuf managementEric Sunshine, Jul 17, 2015
  6. 05/22 checkout: generalize die_if_checked_out() branch name argumentEric Sunshine, Jul 17, 2015
  7. 06/22 checkout: check_linked_checkout: improve "already checked out" aestheticEric Sunshine, Jul 17, 2015
  8. 07/22 checkout: check_linked_checkout: simplify symref parsingEric Sunshine, Jul 17, 2015
  9. 08/22 checkout: teach check_linked_checkout() about symbolic link HEADEric Sunshine, Jul 17, 2015
  10. 09/22 branch: publish die_if_checked_out()Eric Sunshine, Jul 17, 2015
  11. 10/22 worktree: improve worktree setup messageEric Sunshine, Jul 17, 2015
  12. 11/22 worktree: simplify new branch (-b/-B) option checkingEric Sunshine, Jul 17, 2015
  13. 12/22 worktree: introduce options containerEric Sunshine, Jul 17, 2015
  14. 13/22 worktree: make --detach mutually exclusive with -b/-BEric Sunshine, Jul 17, 2015
  15. 14/22 worktree: add: suppress auto-vivication with --detach and no <branch>Eric Sunshine, Jul 17, 2015
  16. Eric SunshineJul 17, 2015
  17. 15/22 worktree: make branch creation distinct from worktree populationEric Sunshine, Jul 17, 2015
  18. 16/22 worktree: elucidate environment variables intended for child processesEric Sunshine, Jul 17, 2015
  19. 17/22 worktree: add_worktree: construct worktree-population command locallyEric Sunshine, Jul 17, 2015
  20. 18/22 worktree: detect branch-name/detached and error conditions locallyEric Sunshine, Jul 17, 2015
  21. 19/22 worktree: make setup of new HEAD distinct from worktree populationEric Sunshine, Jul 17, 2015
  22. 20/22 worktree: avoid resolving HEAD unnecessarilyEric Sunshine, Jul 17, 2015
  23. 21/22 worktree: populate via "git reset --hard" rather than "git checkout"Eric Sunshine, Jul 17, 2015
  24. 22/22 checkout: drop intimate knowledge of newly created worktreeEric Sunshine, Jul 17, 2015

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.