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

[PATCH v3 2/2] worktree: stop supporting moving worktrees manually

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Jan 22, 2016, 08:35 UTC
Message-ID
<1453451749-10660-3-git-send-email-pclouds@gmail.com>
In-Reply-To
<1453451749-10660-1-git-send-email-pclouds@gmail.com>

The current update_linked_gitdir() has a bug that can create "gitdir" file in non-multi-worktree setup. Worse, sometimes it can write relative path to "gitdir" file, which will not work (e.g. "git worktree list" will display the worktree's location incorrectly)

Instead of fixing this, we step back a bit. The original design was probably not well thought out. For now, if the user manually moves a worktree, they have to fix up "gitdir" file manually or the worktree will get pruned.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 Documentation/git-worktree.txt | 15 ++++++++++-----
 setup.c                        | 12 ------------
 2 files changed, 10 insertions(+), 17 deletions(-)
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index 5b9ad04..62c76c1 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -32,11 +32,9 @@ The working tree's administrative files in the repository (see
 `git worktree prune` in the main or any linked working tree to
 clean up any stale administrative files.
 
-If you move a linked working tree to another file system, or
-within a file system that does not support hard links, you need to run
-at least one git command inside the linked working tree
-(e.g. `git status`) in order to update its administrative files in the
-repository so that they do not get automatically pruned.
+If you move a linked working tree, you need to manually update the
+administrative files so that they do not get pruned automatically. See
+section "DETAILS" for more information.
 
 If a linked working tree is stored on a portable device or network share
 which is not always mounted, you can prevent its administrative files from
@@ -137,6 +135,13 @@ thumb is do not make any assumption about whether a path belongs to
 $GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
 inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.
 
+If you move a linked working tree, you need to update the 'gitdir' file
+in the entry's directory. For example, if a linked working tree is moved
+to `/newpath/test-next` and its `.git` file points to
+`/path/main/.git/worktrees/test-next`, then update
+`/path/main/.git/worktrees/test-next/gitdir` to reference `/newpath/test-next`
+instead.
+
 To prevent a $GIT_DIR/worktrees entry from being pruned (which
 can be useful in some situations, such as when the
 entry's working tree is stored on a portable device), add a file named
diff --git a/setup.c b/setup.c
index d343725..6ee2b23 100644
--- a/setup.c
+++ b/setup.c
@@ -434,17 +434,6 @@ static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
 	return ret;
 }
 
-static void update_linked_gitdir(const char *gitfile, const char *gitdir)
-{
-	struct strbuf path = STRBUF_INIT;
-	struct stat st;
-
-	strbuf_addf(&path, "%s/gitdir", gitdir);
-	if (stat(path.buf, &st) || st.st_mtime + 24 * 3600 < time(NULL))
-		write_file(path.buf, "%s", gitfile);
-	strbuf_release(&path);
-}
-
 /*
  * Try to read the location of the git directory from the .git file,
  * return path to git directory if found.
@@ -514,7 +503,6 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
 		error_code = READ_GITFILE_ERR_NOT_A_REPO;
 		goto cleanup_return;
 	}
-	update_linked_gitdir(path, dir);
 	path = real_path(dir);
 
 cleanup_return:
-- 
2.7.0.125.g9eec362
Previous: Nguyễn Thái Ngọc Duy
Message 15 of 15 in “Kill and replace update_linked_gitdir()”
  1. 0/6 Kill and replace update_linked_gitdir()Nguyễn Thái Ngọc Duy, Jan 18, 2016
  2. 1/6 worktree.c: fix indentationNguyễn Thái Ngọc Duy, Jan 18, 2016
  3. 2/6 worktree: stop supporting moving worktrees manuallyNguyễn Thái Ngọc Duy, Jan 18, 2016
  4. Eric SunshineJan 18, 2016
  5. 3/6 worktree.txt: how to fix up after moving a worktreeNguyễn Thái Ngọc Duy, Jan 18, 2016
  6. Eric SunshineJan 18, 2016
  7. Duy NguyenJan 19, 2016
  8. 4/6 abspath.c: add and use real_path_dup()Nguyễn Thái Ngọc Duy, Jan 18, 2016
  9. 5/6 setup.c: record the location of .git fileNguyễn Thái Ngọc Duy, Jan 18, 2016
  10. 6/6 worktree: new command to fix up worktree's info after movingNguyễn Thái Ngọc Duy, Jan 18, 2016
  11. Philip OakleyJan 18, 2016
  12. Junio C HamanoJan 19, 2016
  13. 0/2 Kill and replace update_linked_gitdir()Nguyễn Thái Ngọc Duy, Jan 22, 2016
  14. 1/2 worktree.c: fix indentationNguyễn Thái Ngọc Duy, Jan 22, 2016
  15. 2/2 worktree: stop supporting moving worktrees manuallyNguyễn Thái Ngọc Duy, Jan 22, 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.