Thread (10 messages) 10 messages, 4 authors, 2024-10-04

Re: "git worktree repair" modifies the wrong repository

From: Eric Sunshine <hidden>
Date: 2024-09-19 08:58:38

On Wed, Sep 18, 2024 at 9:27 PM Russell Stuart
[off-list ref] wrote:
What did you do before the bug happened? (Steps to reproduce your issue)
    /tmp/gb/a$ git init r
    /tmp/gb/a/r$ git worktree add ../r.foo
Had you run `git worktree list` at this point in /tmp/gb/a/r/, you
would have seen:

    /tmp/gb/a/r      3699610 [main]
    /tmp/gb/a/r.foo  3699610 [r.foo]
    /tmp/gb/a/r$ cp -a ../* ../../b/.
    /tmp/gb/a/r$ cd ../../b/r
Had you run `git worktree list` at this point in /tmp/gb/b/r/, you
would have seen:

    /tmp/gb/b/r      3699610 [main]
    /tmp/gb/a/r.foo  3699610 [r.foo]

from which it can be seen that /tmp/gb/b/r/.git/worktree/r.foo/gitdir
is pointing at /tmp/gb/a/r.foo, which makes sense since that gitdir
file is an exact copy of /tmp/gb/a/r/.git/worktree/r.foo/gitdir. So
/tmp/gb/a/r.foo is being shared by both repositories, /tmp/gb/a/ and
/tmp/gb/b/, and neither one knows about /tmp/gb/b/r.foo.
    /tmp/gb/b/r$ git worktree repair ../r.foo
    repair: gitdir incorrect: /tmp/gb/a/r/.git/worktrees/r.foo/gitdir
    repair: .git file incorrect: /tmp/gb/a/r.foo
    /tmp/gb/b/r$ cat .git/worktrees/r.foo/gitdir
    /tmp/gb/a/r.foo/.git
    /tmp/gb/b/r$ cat ../r.foo/.git
    gitdir: /tmp/gb/a/r/.git/worktrees/r.foo
    /tmp/gb/b/r$ cat ../../a/r/.git/worktrees/r.foo/gitdir
    /tmp/gb/b/r.foo/.git
    /tmp/gb/b/r$ cat ../../a/r.foo/.git
    gitdir: /tmp/gb/b/r/.git/worktrees/r.foo
The implementation of `git worktree repair` started out (relatively)
simple, handling the most common cases, and has been extended to
handle additional cases when identified and reported. The case of
merely copying a repository and its worktrees (and leaving the
originals intact) is not yet implemented, so the above all makes sense
given the current implementation.
What did you expect to happen? (Expected behavior)
    I expected "/tmp/gb/b/r$ git worktree repair ../r.foo" to alter the
    repositories it was run from, ie those under the directory "/tmp/gb/b".

What happened instead? (Actual behavior)
    "/tmp/gb/b/r$ git worktree repair ../r.foo" modified the repositories
    under the directory "/tmp/gb/a".
I have a tentative fix implemented which seems to handle this case
correctly. Once I've finished polishing it and formalizing the related
test, I'll send out a patch.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help