On Sat, Sep 22, 2018 at 11:05 AM Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> wrote: > > One of the problems with multiple worktree is accessing per-worktree > refs of one worktree from another worktree. This was sort of solved by > multiple ref store, where the code can open the ref store of another > worktree and has access to the ref space of that worktree. > > The problem with this is reporting. "HEAD" in another ref space is > also called "HEAD" like in the current ref space. In order to > differentiate them, all the code must somehow carry the ref store > around and print something like "HEAD from this ref store". > > But that is not feasible (or possible with a _lot_ of work). With the > current design, we pass a reference around as a string (so called > "refname"). Extending this design to pass a string _and_ a ref store > is a nightmare, especially when handling extended SHA-1 syntax. > > So we do it another way. Instead of entering a separate ref space, we > make refs from other worktrees available in the current ref space. So > "HEAD" is always HEAD of the current worktree, but then we can have > "worktrees/blah/HEAD" to denote HEAD from a worktree named > "blah". This syntax coincidentally matches the underlying directory > structure which makes implementation a bit easier. > > The main worktree has to be treated specially because well.. it's > special from the beginning. So HEAD from the main worktree is > acccessible via the name "main/HEAD" (we can't use > "worktrees/main/HEAD" because "main" under "worktrees" is not > reserved). > > This patch also makes it possible to specify refs from one worktree in > another one, e.g. > > git log worktrees/foo/HEAD This has strong similarities to remote refs: Locally I may have a branch master, whose (stale local copy of its distributed) counterpart is named origin/master. It is also possible to have a working tree named origin (just I like to name my worktree "git", when working on git.git), how do we differentiate between the neighbor-worktree "origin/master" and the remote-tracking branch "origin/master" ? As the remote tracking branches are shared between all worktree there is no need to differentiate between a local-worktree remote tracking branch and a neighbor-worktree remote tracking branch. Now that you introduce the magic main working tree, we also need to disallow working trees to be named "main", i.e. $ git worktree add main HEAD produces $ ls .git/worktrees/ main How do we deal with that?