From 14eac9118e128c5c36c2b72146cf94b23189349e Mon Sep 17 00:00:00 2001 From: tsukasa inoue Date: Mon, 19 Oct 2026 00:46:03 +0900 Subject: [PATCH] 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 --- branch.c | 8 +++++--- t/t3200-branch.sh | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/branch.c b/branch.c index 22f4f46b96ed3a..bb07846911aee5 100644 --- a/branch.c +++ b/branch.c @@ -186,12 +186,14 @@ static int install_branch_config_multiple_remotes(int flag, const char *local, 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) diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index cdb6c6a6342a0c..ce478d85cb6f37 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -1080,6 +1080,21 @@ 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 && + test_grep "git branch --set-upstream-to=hintremote/hintbranch\$" err && + test_grep ! "refs/heads/" err +' + test_expect_success 'use --set-upstream-to modify HEAD' ' test_config branch.main.remote foo && test_config branch.main.merge foo &&