Skip to content

Commit

Permalink
worktree: stop supporting moving worktrees manually
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
pclouds authored and gitster committed Jan 22, 2016
1 parent d4cddd6 commit 618244e
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 17 deletions.
15 changes: 10 additions & 5 deletions Documentation/git-worktree.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
12 changes: 0 additions & 12 deletions setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -401,17 +401,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.
Expand Down Expand Up @@ -481,7 +470,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:
Expand Down

0 comments on commit 618244e

Please sign in to comment.