branch: strip refs/heads/ from the --set-upstream-to hint

When git switch fails to write the tracking config, it prints a hint
with the command to set the upstream by hand. For example, if
.git/config.lock exists:

    error: could not lock config file .git/config: File exists
    error: unable to write upstream branch configuration
    hint:
    hint: After fixing the error cause you may try to fix up
    hint: the remote tracking information by invoking:
    hint:   git branch --set-upstream-to=origin/refs/heads/feat

The hint says origin/refs/heads/feat, but the correct name is
origin/feat. Running the command as printed fails, because the full
ref name is not a valid remote-tracking branch name here.

This has been wrong since a3f40ec4b0 (branch: accept multiple upstream
branches for tracking, 2021-12-20).

Strip refs/heads/ from the hint, as the success message in the same
function already does. The git config --add line for multiple upstreams
still needs the full ref name, so it is not changed.

Signed-off-by: tsukasa inoue <inoue.tsukasa.4@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
tsukasa inoue authored and Junio C Hamano committed 2026-10-21 15:31:35 -07:00
1 parent 47fdf2208c
commit 91ef176b8f
2 files changed
+30 -3

No files matched your search

+5 -3
View File
@@ -186,12 +186,14 @@ out_err:
advise(_("\nAfter fixing the error cause you may try to fix up\n"
"the remote tracking information by invoking:"));
if (remotes->nr == 1)
if (remotes->nr == 1) {
shortname = remotes->items[0].string;
skip_prefix(shortname, "refs/heads/", &shortname);
advise(" git branch --set-upstream-to=%s%s%s",
origin ? origin : "",
origin ? "/" : "",
remotes->items[0].string);
else {
shortname);
} else {
advise(" git config --add branch.\"%s\".remote %s",
local, origin ? origin : ".");
for_each_string_list_item(item, remotes)
+25
View File
@@ -1080,6 +1080,31 @@ test_expect_success '--set-upstream-to fails on locked config' '
test_grep "could not lock config file .git/config" err
'
test_expect_success '--set-upstream-to hint uses short remote-tracking branch name on locked config' '
test_when_finished "git branch -D hint-local" &&
test_when_finished "git update-ref -d refs/remotes/hintremote/hintbranch" &&
test_config remote.hintremote.url . &&
test_config remote.hintremote.fetch "+refs/heads/*:refs/remotes/hintremote/*" &&
git update-ref refs/remotes/hintremote/hintbranch HEAD &&
git branch hint-local &&
test_when_finished "rm -f .git/config.lock" &&
>.git/config.lock &&
test_must_fail git -c core.configLockTimeout=0 \
branch --set-upstream-to=hintremote/hintbranch hint-local 2>err &&
cat >expect <<-\EOF &&
hint:
hint: After fixing the error cause you may try to fix up
hint: the remote tracking information by invoking:
hint: git branch --set-upstream-to=hintremote/hintbranch
EOF
grep "^hint:" err >actual &&
test_cmp expect actual &&
rm -f .git/config.lock &&
git branch --set-upstream-to=hintremote/hintbranch hint-local &&
test_cmp_config hintremote branch.hint-local.remote &&
test_cmp_config refs/heads/hintbranch branch.hint-local.merge
'
test_expect_success 'use --set-upstream-to modify HEAD' '
test_config branch.main.remote foo &&
test_config branch.main.merge foo &&