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

Re: workdirs: cannot clone a local workdir directory

From
Duy Nguyen <pclouds@gmail.com>
Date
Jul 15, 2015, 13:25 UTC
Message-ID
<20150715132552.GA28574@lanh>
In-Reply-To
<CA+cck7GR1Gs+OvhweQZFs0=5uKu=RwEgY=0_0CZSCDqtDWrR2A@mail.gmail.com>
On Wed, Jul 15, 2015 at 11:40:18AM +0200, Bjørnar Snoksrud wrote:
> I reported this before, but now I have a nice topic to hang it on -
> 
> I have re-reproduced the bug using a build from master as of today,
> using the new worktree commands.
Something like the following patch should work if you need it now.

Because this may conflict (in the test cases) with Eric's series to move "git checkout --to" to "git worktree add", and because the next release is already delayed to let "git worktree add" in, I think we could keep this patch out of tree for now. I will split it up, add tests and resubmit once the release is out. Please remind me if you see nothing from me for too long.

Note to self, "git clone --reference" remains broken.
-- 8< --
diff --git a/builtin/clone.c b/builtin/clone.c
index 00535d0..0e594f1 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -373,8 +373,10 @@ static void clone_local(const char *src_repo, const char *dest_repo)
 	} else {
 		struct strbuf src = STRBUF_INIT;
 		struct strbuf dest = STRBUF_INIT;
-		strbuf_addf(&src, "%s/objects", src_repo);
-		strbuf_addf(&dest, "%s/objects", dest_repo);
+		get_common_dir(&src, src_repo);
+		get_common_dir(&dest, dest_repo);
+		strbuf_addstr(&src, "/objects");
+		strbuf_addf(&dest, "/objects");
 		copy_or_link_directory(&src, &dest, src_repo, src.len);
 		strbuf_release(&src);
 		strbuf_release(&dest);
diff --git a/path.c b/path.c
index 10f4cbf..7f7b56f 100644
--- a/path.c
+++ b/path.c
@@ -416,18 +416,22 @@ const char *enter_repo(const char *path, int strict)
 		}
 		if (!suffix[i])
 			return NULL;
-		gitfile = read_gitfile(used_path) ;
+		gitfile = read_gitfile(used_path);
 		if (gitfile)
 			strcpy(used_path, gitfile);
 		if (chdir(used_path))
 			return NULL;
 		path = validated_path;
 	}
-	else if (chdir(path))
-		return NULL;
+	else {
+		const char *gitfile = read_gitfile(used_path);
+		if (gitfile)
+			path = gitfile;
+		if (chdir(path))
+			return NULL;
+	}
 
-	if (access("objects", X_OK) == 0 && access("refs", X_OK) == 0 &&
-	    validate_headref("HEAD") == 0) {
+	if (is_git_directory(".")) {
 		set_git_dir(".");
 		check_repository_format();
 		return path;
-- 8< --
Previous: Bjørnar SnoksrudNext: Nguyễn Thái Ngọc Duy
Message 2 of 28 in “workdirs: cannot clone a local workdir directory”
  1. Bjørnar SnoksrudJul 15, 2015
  2. Duy NguyenJul 15, 2015
  3. 0/5 fix local clone from a linked checkoutNguyễn Thái Ngọc Duy, Aug 22, 2015
  4. 1/5 path.c: delete an extra spaceNguyễn Thái Ngọc Duy, Aug 22, 2015
  5. 2/5 enter_repo: avoid duplicating logic, use is_git_directory() insteadNguyễn Thái Ngọc Duy, Aug 22, 2015
  6. Junio C HamanoSep 7, 2015
  7. Duy NguyenSep 13, 2015
  8. Junio C HamanoSep 13, 2015
  9. Duy NguyenSep 14, 2015
  10. Junio C HamanoSep 21, 2015
  11. 3/5 enter_repo: allow .git files in strict modeNguyễn Thái Ngọc Duy, Aug 22, 2015
  12. 4/5 clone: allow --local from a linked checkoutNguyễn Thái Ngọc Duy, Aug 22, 2015
  13. Junio C HamanoSep 7, 2015
  14. 5/5 clone: better error when --reference is a linked checkoutNguyễn Thái Ngọc Duy, Aug 22, 2015
  15. 0/5 fix local clone from a linked checkoutNguyễn Thái Ngọc Duy, Sep 13, 2015
  16. 1/5 path.c: delete an extra spaceNguyễn Thái Ngọc Duy, Sep 13, 2015
  17. 2/5 enter_repo: avoid duplicating logic, use is_git_directory() insteadNguyễn Thái Ngọc Duy, Sep 13, 2015
  18. 3/5 enter_repo: allow .git files in strict modeNguyễn Thái Ngọc Duy, Sep 13, 2015
  19. Junio C HamanoSep 25, 2015
  20. 4/5 clone: allow --local from a linked checkoutNguyễn Thái Ngọc Duy, Sep 13, 2015
  21. 5/5 clone: better error when --reference is a linked checkoutNguyễn Thái Ngọc Duy, Sep 13, 2015
  22. 0/6 fix local clone from a linked checkoutNguyễn Thái Ngọc Duy, Sep 28, 2015
  23. 1/6 path.c: delete an extra spaceNguyễn Thái Ngọc Duy, Sep 28, 2015
  24. 2/6 t0002: add test for enter_repo(), non-strict modeNguyễn Thái Ngọc Duy, Sep 28, 2015
  25. 3/6 enter_repo: avoid duplicating logic, use is_git_directory() insteadNguyễn Thái Ngọc Duy, Sep 28, 2015
  26. 4/6 enter_repo: allow .git files in strict modeNguyễn Thái Ngọc Duy, Sep 28, 2015
  27. 5/6 clone: allow --local from a linked checkoutNguyễn Thái Ngọc Duy, Sep 28, 2015
  28. 6/6 clone: better error when --reference is a linked checkoutNguyễn Thái Ngọc Duy, Sep 28, 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.