Skip to content

fix tag detection in linked worktrees - #467

Open
druckdev wants to merge 1 commit into
romkatv:masterfrom
druckdev:pr467-tags-in-worktrees
Open

fix tag detection in linked worktrees#467
druckdev wants to merge 1 commit into
romkatv:masterfrom
druckdev:pr467-tags-in-worktrees

Conversation

@druckdev

@druckdev druckdev commented Aug 6, 2025

Copy link
Copy Markdown

Previously, tags were not detected when they were checked out in a separate linked worktree. This occurred because gitstatus tried to read from refs/tags relative to the worktree-specific .git directory. However, since tags are shared refs, refs/tags will never exist there, but rather in the global git-dir (see the "REFS" section in git-worktree(1)).

To fix this, remove the worktrees/* suffix from the repository path when needed.


To reproduce this issue:

$ git clone https://github.com/romkatv/gitstatus
$ cd gitstatus
$ worktree="$(mktemp -d)"
$ git worktree add "$worktree" v1.5.5
$ cd "$worktree"
$ typeset -m VCS_STATUS_TAG
VCS_STATUS_TAG=''
$ git describe --tags --exact-match
v1.5.5

Previously, tags were not detected when they were checked out in a
separate linked worktree. This occurred because gitstatus tried to read
from `refs/tags` relative to the worktree-specific `.git` directory.
However, since tags are shared refs, `refs/tags` will never exist there,
but rather in the global git-dir (see the "REFS" section in
git-worktree(1)).

To fix this, remove the `worktrees/*` suffix from the repository path
when needed.
@druckdev
druckdev force-pushed the pr467-tags-in-worktrees branch from eb5e8d9 to a7f654e Compare August 6, 2025 12:47
aauren added a commit to aauren/gitstatus that referenced this pull request Sep 10, 2026
Tags are shared refs, so in a linked worktree both refs/tags/ and
packed-refs live in the common gitdir rather than the per-worktree
.git/worktrees/<name>/ that git_repository_path() returns. Since
gitstatusd was reading from the latter, VCS_STATUS_TAG was always empty
in a linked worktree even when HEAD sat exactly on a tag.

This is PR romkatv#467 by druckdev, but using git_repository_commondir()
instead of stripping the worktrees/* suffix by hand, so it also works
for submodules whose gitdir doesn't end in .git. The fixture covers a
loose tag and a packed tag checked out in linked worktrees, plus the
main worktree as a control.

see: romkatv#467
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant