From: Michael Rappazzo <rappazzo@xxxxxxxxx> On a worktree which is not the primary, using the symbolic-ref 'head' was incorrectly pointing to the main worktree's HEAD. The same was true for any other case of the word 'Head'. Signed-off-by: Michael Rappazzo <rappazzo@xxxxxxxxx> --- refs.c | 8 ++++---- t/t1415-worktree-refs.sh | 9 +++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/refs.c b/refs.c index f9936355cd..963e786458 100644 --- a/refs.c +++ b/refs.c @@ -579,7 +579,7 @@ int expand_ref(const char *str, int len, struct object_id *oid, char **ref) *ref = xstrdup(r); if (!warn_ambiguous_refs) break; - } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) { + } else if ((flag & REF_ISSYMREF) && strcasecmp(fullref.buf, "HEAD")) { warning(_("ignoring dangling symref %s"), fullref.buf); } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) { warning(_("ignoring broken ref %s"), fullref.buf); @@ -627,7 +627,7 @@ int dwim_log(const char *str, int len, struct object_id *oid, char **log) static int is_per_worktree_ref(const char *refname) { - return !strcmp(refname, "HEAD") || + return !strcasecmp(refname, "HEAD") || starts_with(refname, "refs/worktree/") || starts_with(refname, "refs/bisect/") || starts_with(refname, "refs/rewritten/"); @@ -847,7 +847,7 @@ int should_autocreate_reflog(const char *refname) return starts_with(refname, "refs/heads/") || starts_with(refname, "refs/remotes/") || starts_with(refname, "refs/notes/") || - !strcmp(refname, "HEAD"); + !strcasecmp(refname, "HEAD"); default: return 0; } @@ -855,7 +855,7 @@ int should_autocreate_reflog(const char *refname) int is_branch(const char *refname) { - return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/"); + return !strcasecmp(refname, "HEAD") || starts_with(refname, "refs/heads/"); } struct read_ref_at_cb { diff --git a/t/t1415-worktree-refs.sh b/t/t1415-worktree-refs.sh index b664e51250..e7f8a129fd 100755 --- a/t/t1415-worktree-refs.sh +++ b/t/t1415-worktree-refs.sh @@ -76,4 +76,13 @@ test_expect_success 'reflog of worktrees/xx/HEAD' ' test_cmp expected actual.wt2 ' +test_expect_success 'head, Head, and HEAD are the same in worktree' ' + test_cmp_rev worktree/foo initial && + git -C wt1 rev-parse HEAD >uc_ref.wt1 && + git -C wt1 rev-parse Head >mc_ref.wt1 && + git -C wt1 rev-parse head >lc_ref.wt1 && + test_cmp uc_ref.wt1 lc_ref.wt1 && + test_cmp uc_ref.wt1 mc_ref.wt1 +' + test_done -- gitgitgadget