Ideally, you would:
- move the main worktree elsewhere
- add a symlink in the "specific directory" to the main worktree or any other worktrees.
The latter can be moved too, but if you do, make sure to use Git 2.28 (Q3 2020): the same worktree directory must be registered only once, but "git worktree
move" allowed this invariant to be violated, which has been corrected with Git 2.28.
See commit 810382e, commit d179af6, commit 916133e, commit 4a3ce47, commit dd9609a, commit 1b14d40 (10 Jun 2020), and commit c9b77f2 (08 Jun 2020) by Eric Sunshine (sunshineco
).
(Merged by Junio C Hamano -- gitster
-- in commit 9740ef8, 22 Jun 2020)
worktree
: make "move" refuse to move atop missing registered worktree
Signed-off-by: Eric Sunshine
"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.