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

Re: [PATCH v2 6/6] worktree: new command to fix up worktree's info after moving

From
Philip Oakley <philipoakley@iee.org>
Date
Jan 18, 2016, 11:21 UTC
Message-ID
<9356A7868C16468A804C30EBD6E4A307@PhilipOakley>
In-Reply-To
<1453116094-4987-7-git-send-email-pclouds@gmail.com>
From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Show 48 quoted lines
> This is a low-level command that can be used to correct worktree
> information after a worktree is moved. The idea is like 'index refresh'.
> In future we may do "worktree refresh" automatically to keep it from
> being pruned.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> Documentation/git-worktree.txt |  8 +++++++-
> builtin/worktree.c             | 18 ++++++++++++++++++
> t/t1501-worktree.sh            |  9 +++++++++
> 3 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/git-worktree.txt 
> b/Documentation/git-worktree.txt
> index 62c76c1..306aeec 100644
> --- a/Documentation/git-worktree.txt
> +++ b/Documentation/git-worktree.txt
> @@ -12,6 +12,7 @@ SYNOPSIS
> 'git worktree add' [-f] [--detach] [-b <new-branch>] <path> [<branch>]
> 'git worktree prune' [-n] [-v] [--expire <expire>]
> 'git worktree list' [--porcelain]
> +'git worktree refresh'
>
> DESCRIPTION
> -----------
> @@ -65,6 +66,11 @@ each of the linked worktrees.  The output details 
> include if the worktree is
> bare, the revision currently checked out, and the branch currently checked 
> out
> (or 'detached HEAD' if none).
>
> +refresh::
> +
> +This command is required to update worktree's information after it's 
> moved.
> +Executed from inside the moved worktree.
> +
> OPTIONS
> -------
>
> @@ -140,7 +146,7 @@ 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.
> +instead. Alternatively you can run "git worktree refresh".
Shouldn't this note also include the caveat about the run location?
...run "git worktree refresh" from inside the moved worktree.
Show 62 quoted lines
>
> To prevent a $GIT_DIR/worktrees entry from being pruned (which
> can be useful in some situations, such as when the
> diff --git a/builtin/worktree.c b/builtin/worktree.c
> index 475b958..0183ce0 100644
> --- a/builtin/worktree.c
> +++ b/builtin/worktree.c
> @@ -445,6 +445,22 @@ static int list(int ac, const char **av, const char 
> *prefix)
>  return 0;
> }
>
> +static int refresh(int ac, const char **av, const char *prefix)
> +{
> + const char *gitdir;
> +
> + if (ac != 1)
> + die(_("Arguments not expected"));
> +
> + gitdir = git_pathdup("gitdir");
> + if (access(gitdir, F_OK))
> + return 0;
> + if (!startup_info->first_gitfile)
> + die("BUG: .git file's location not found");
> + write_file(gitdir, "%s", startup_info->first_gitfile);
> + return 0;
> +}
> +
> int cmd_worktree(int ac, const char **av, const char *prefix)
> {
>  struct option options[] = {
> @@ -459,5 +475,7 @@ int cmd_worktree(int ac, const char **av, const char 
> *prefix)
>  return prune(ac - 1, av + 1, prefix);
>  if (!strcmp(av[1], "list"))
>  return list(ac - 1, av + 1, prefix);
> + if (!strcmp(av[1], "refresh"))
> + return refresh(ac - 1, av + 1, prefix);
>  usage_with_options(worktree_usage, options);
> }
> diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh
> index cc5b870..821831b 100755
> --- a/t/t1501-worktree.sh
> +++ b/t/t1501-worktree.sh
> @@ -423,4 +423,13 @@ test_expect_success '$GIT_WORK_TREE overrides 
> $GIT_DIR/common' '
>  )
> '
>
> +test_expect_success 'worktree refresh corrects gitdir file' '
> + git worktree add test-refresh &&
> + P=repo.git/worktrees/test-refresh/gitdir &&
> + echo corrupt >$P &&
> + git -C test-refresh worktree refresh &&
> + echo "$TRASH_DIRECTORY/test-refresh/.git" >expected &&
> + test_cmp expected $P
> +'
> +
> test_done
> -- 
> 2.7.0.96.g5373197
>

-- Philip

Previous: Nguyễn Thái Ngọc DuyNext: Junio C Hamano
Message 11 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.