fix(workflow): wt-new branches with --no-track (no inherited origin/main upstream)
ci / manifests (push) Successful in 4s
ci / gate (push) Successful in 2m6s
ci / gate (pull_request) Successful in 2m3s
ci / manifests (pull_request) Successful in 4s

Branching off origin/main set the new branch's upstream to origin/main, so a
bare `git push` failed with a name-mismatch and suggested the dangerous
`git push origin HEAD:main`. Add --no-track so the branch carries no upstream
until the first `git push -u origin <branch>` sets the right one — keeping the
fresh-from-origin/main base without the tracking side-effect.

Add a test-wt.sh assertion that a new branch has no upstream, and note the
behaviour + first-push form in ADR-0059 / CLAUDE.md.
This commit is contained in:
claude@clouddev1
2026-06-23 21:36:26 +00:00
parent 4570c4e1ea
commit 279ef98ab8
4 changed files with 17 additions and 3 deletions
+2 -1
View File
@@ -284,7 +284,8 @@ operational rules an agent must follow:
chore/ refactor/ test/ ci/`) matching the commit type. chore/ refactor/ test/ ci/`) matching the commit type.
- **One worktree per branch — never switch the primary checkout.** Start a - **One worktree per branch — never switch the primary checkout.** Start a
branch with `scripts/wt-new.sh <branch>` (creates branch off `origin/main` branch with `scripts/wt-new.sh <branch>` (creates branch off `origin/main`
+ a sibling `<repo>-worktree-<segment>` worktree); remove a finished one with `--no-track` + a sibling `<repo>-worktree-<segment>` worktree; first
push is `git push -u origin <branch>`); remove a finished one
with `scripts/wt-rm.sh <branch>` (removes only the *named* worktree — it with `scripts/wt-rm.sh <branch>` (removes only the *named* worktree — it
never scans or auto-removes, so long-lived branches like `website`/`ci` never scans or auto-removes, so long-lived branches like `website`/`ci`
are never at risk). This prevents the same-directory clobber hazard. are never at risk). This prevents the same-directory clobber hazard.
+4 -1
View File
@@ -74,7 +74,10 @@ directory is how work gets clobbered — worktrees make that impossible.
Helpers: Helpers:
- **`scripts/wt-new.sh <branch>`** — fetch `main`, create the branch off - **`scripts/wt-new.sh <branch>`** — fetch `main`, create the branch off
`origin/main`, and add the sibling worktree; prints its path. `origin/main` (with `--no-track`, so it doesn't inherit `origin/main` as
upstream — otherwise a bare `git push` errors on the name mismatch and
suggests the dangerous `HEAD:main`), and add the sibling worktree; prints
its path. First push is `git push -u origin <branch>`.
- **`scripts/wt-rm.sh <branch>`** — remove the worktree for the **named** - **`scripts/wt-rm.sh <branch>`** — remove the worktree for the **named**
branch, and nothing else. It does **not** scan for "merged" worktrees to branch, and nothing else. It does **not** scan for "merged" worktrees to
auto-remove: long-lived branches (`website`, the `ci` line) are merged auto-remove: long-lived branches (`website`, the `ci` line) are merged
+4
View File
@@ -37,6 +37,10 @@ out="$(run bash "$WT_NEW" feat/thing-one 2>/dev/null)"
check "prints target path" "$target1" "$out" check "prints target path" "$target1" "$out"
check "worktree dir exists" "yes" "$(exists "$target1")" check "worktree dir exists" "yes" "$(exists "$target1")"
check "worktree on the new branch" "feat/thing-one" "$(git -C "$target1" rev-parse --abbrev-ref HEAD)" check "worktree on the new branch" "feat/thing-one" "$(git -C "$target1" rev-parse --abbrev-ref HEAD)"
# It must NOT inherit origin/main as upstream (else a bare `git push` errors
# with a name-mismatch and suggests the dangerous `HEAD:main`). No upstream
# until the first `git push -u` sets the right one.
check "new branch has no upstream" "none" "$(git -C "$target1" rev-parse --abbrev-ref '@{upstream}' 2>/dev/null || echo none)"
echo "--- wt-new refuses to clobber an existing branch ---" echo "--- wt-new refuses to clobber an existing branch ---"
set +e; run bash "$WT_NEW" feat/thing-one >/dev/null 2>&1; rc=$?; set -e set +e; run bash "$WT_NEW" feat/thing-one >/dev/null 2>&1; rc=$?; set -e
+7 -1
View File
@@ -47,7 +47,13 @@ log "fetching origin/main"
git fetch --quiet origin main || die "git fetch origin main failed" git fetch --quiet origin main || die "git fetch origin main failed"
log "creating branch '$branch' + worktree at $target" log "creating branch '$branch' + worktree at $target"
git worktree add --quiet -b "$branch" "$target" origin/main \ # `--no-track`: branch off origin/main for a fresh base, but DON'T inherit
# origin/main as the upstream. Without this, branching off a remote-tracking
# ref makes git set the new branch's upstream to origin/main, so a later bare
# `git push` fails with a name-mismatch and suggests the dangerous
# `git push origin HEAD:main`. With no upstream, the first `git push -u origin
# <branch>` sets the correct one.
git worktree add --quiet --no-track -b "$branch" "$target" origin/main \
|| die "git worktree add failed" || die "git worktree add failed"
log "ready — cd into it:" log "ready — cd into it:"