Re: [PATCH 3/8] refs: new ref types to make per-worktree refs visible to all worktrees
- From
Stefan Beller <sbeller@google.com>
- Date
- Sep 25, 2018, 02:48 UTC
- Message-ID
- <CAGZ79kYTzs=Xx-K-ghUa=as7Q0tiw-z1h7_D2=6zaO3fpWMrWg@mail.gmail.com>
- In-Reply-To
- <20180922180500.4689-4-pclouds@gmail.com>
On Sat, Sep 22, 2018 at 11:05 AM Nguyễn Thái Ngọc Duy <pclouds@gmail.com> wrote:
Show 33 quoted lines
> > 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 HEADproduces
$ ls .git/worktrees/ main
How do we deal with that?