From: "tsukasa-ino via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Harald Nordgren <haraldnordgren@gmail.com>,
tsukasa-ino <inoue.tsukasa.4@gmail.com>
Subject: [PATCH v2 0/3] checkout: finish switch when tracking config cannot be written
Date: Wed, 21 Oct 2026 21:35:15 +0000 [thread overview]
Message-ID: <pull.2268.v2.git.1792618518.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2268.git.1792458904027.gitgitgadget@gmail.com>
When the tracking config cannot be written (for example, because
.git/config.lock exists), git switch -c and checkout -b stop halfway. The
worktree, the index and the new branch ref are already updated, but HEAD
stays on the old branch, and the changes are left staged. The hint printed
at that point was also wrong: it suggested origin/refs/heads/.
1/3 strips refs/heads/ from the hint. 2/3 makes setup_tracking() return an
error instead of calling exit(). No behavior change yet. 3/3 makes switch
and checkout finish the switch and exit with status 0, as push -u, clone and
fetch already do. git branch still fails.
Changes since v1:
* 1/3: the test now compares the whole hint message, as suggested by Harald
Nordgren. It also checks that the command in the hint works once the lock
is removed, as suggested by Junio
(https://lore.kernel.org/git/xmqq7bjcup46.fsf@gitster.g/).
* 2/3 and 3/3 are new. They implement the direction agreed on the bug
report thread (https://lore.kernel.org/git/xmqqecdjsryk.fsf@gitster.g/).
Making the switch fully atomic, so that a failure undoes the worktree, the
index, the ref and the config, is left for a separate topic.
tsukasa inoue (3):
branch: strip refs/heads/ from the --set-upstream-to hint
branch: return an error from setup_tracking()
checkout: finish switching when the tracking config cannot be written
branch.c | 43 +++++++++++++++++++++++----------------
branch.h | 21 +++++++++++--------
builtin/branch.c | 17 +++++++++++-----
builtin/checkout.c | 6 ++++++
t/t2027-checkout-track.sh | 20 ++++++++++++++++++
t/t2060-switch.sh | 20 ++++++++++++++++++
t/t3200-branch.sh | 38 ++++++++++++++++++++++++++++++++++
7 files changed, 135 insertions(+), 30 deletions(-)
base-commit: a018953688f1b10bddf91bff8747068f5f4746a4
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2268%2FtsukasaI%2Ffix%2Fbranch-upstream-hint-shortname-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2268/tsukasaI/fix/branch-upstream-hint-shortname-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2268
Range-diff vs v1:
1: 14eac9118e ! 1: e705918378 branch: strip refs/heads/ from the --set-upstream-to hint
@@ t/t3200-branch.sh: test_expect_success '--set-upstream-to fails on locked config
+ >.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
++ 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' '
-: ---------- > 2: 4d2cbaf170 branch: return an error from setup_tracking()
-: ---------- > 3: be94ac75bf checkout: finish switching when the tracking config cannot be written
--
gitgitgadget
next prev parent reply other threads:[~2026-10-21 21:35 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-20 1:15 [PATCH] branch: strip refs/heads/ from the --set-upstream-to hint tsukasa-ino via GitGitGadget
2026-10-20 19:51 ` Junio C Hamano
2026-10-21 7:05 ` Harald Nordgren
2026-10-21 21:35 ` tsukasa-ino via GitGitGadget [this message]
2026-10-21 21:35 ` [PATCH v2 1/3] " tsukasa inoue via GitGitGadget
2026-10-21 21:35 ` [PATCH v2 2/3] branch: return an error from setup_tracking() tsukasa inoue via GitGitGadget
2026-10-21 21:35 ` [PATCH v2 3/3] checkout: finish switching when the tracking config cannot be written tsukasa inoue via GitGitGadget
2026-10-21 22:20 ` [PATCH v2 0/3] checkout: finish switch when " Junio C Hamano
2026-10-22 2:17 ` 井上司
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2268.v2.git.1792618518.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=haraldnordgren@gmail.com \
--cc=inoue.tsukasa.4@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox