On Thu, Jun 18, 2020 at 12:48 PM Henré Botha <henrebotha@xxxxxxxxx> wrote: > I have identified two potential problems when using git init > --separate-git-dir with a repo that has linked working trees (created > using git worktree add). > > 1. Moving the gitdir of a main working tree doesn't inform linked > working trees that their gitdir has moved. It seems to me that if I do > cd main-worktree && git init --separate-git-dir=.git_repo, the git > init command should go to all the linked working trees and change > their Git links to point at main-worktree/.git_repo. But perhaps > there's some use case I'm not aware of where you'd want to change only > the gitdir path of the main working tree, and not those of linked > working trees. This is almost certainly an oversight in the implementation; the --separate-git-dir option wasn't mentioned during development of git-worktree as far as I recall. As this relocation of the repository is entirely under Git's control (as opposed to the user mucking around as with "mv .git ../foo), it does indeed seem reasonable that --separate-git-dir should update the worktree meta-information files. As far as I know, there is no existing machinery to perform this sort of update, though, so it would have to be implemented from scratch. > 2. Attempting to move the gitdir of a linked working tree breaks the > linked working tree entirely. > It seems to me that if I do cd linked-worktree && git init > --separate-git-dir=.git_repo, it should fail, or warn, or do something > other than break the linked working tree. (I note that > linked-worktree/{.git,.git_repo/commondir,.git_repo/gitdir} all point > at the wrong thing after this operation; manually fixing them restores > functionality, though it loses the link to the main working tree.) Again, an oversight; --separate-git-dir wasn't on anyone's mind during development. This is just utterly broken, as far as I can tell; it doesn't move the repository out of the main worktree to the new location but instead seems to make a copy of it (minus the .git/worktrees directory) and drops entries from the original .git/worktrees directory, thus breaking everything. I suppose it could error out, though friendlier would be for it to behave correctly.