Skip to content
  • Eric Sunshine's avatar
    worktree: make "move" refuse to move atop missing registered worktree · 810382ed
    Eric Sunshine authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    "git worktree add" takes special care to avoid creating a new worktree
    at a location already registered to an existing worktree even if that
    worktree is missing (which can happen, for instance, if the worktree
    resides on removable media). "git worktree move", however, is not so
    careful when validating the destination location and will happily move
    the source worktree atop the location of a missing worktree. This leads
    to the anomalous situation of multiple worktrees being associated with
    the same path, which is expressly forbidden by design. For example:
    
        $ git clone foo.git
        $ cd foo
        $ git worktree add ../bar
        $ git worktree add ../baz
        $ rm -rf ../bar
        $ git worktree move ../baz ../bar
        $ git worktree list
        .../foo beefd00f [master]
        .../bar beefd00f [bar]
        .../bar beefd00f [baz]
        $ git worktree remove ../bar
        fatal: validation failed, cannot remove working tree:
            '.../bar' does not point back to '.git/worktrees/bar'
    
    Fix this shortcoming by enhancing "git worktree move" to perform the
    same additional validation of the destination directory as done by "git
    worktree add".
    
    While at it, add a test to verify that "git worktree move" won't move a
    worktree atop an existing (non-worktree) path -- a restriction which has
    always been in place but was never tested.
    
    Signed-off-by: default avatarEric Sunshine <sunshine@sunshineco.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    810382ed