`gh stack` resolves the API repository from the `origin` remote, ignoring `--remote`, `gh repo set-default`, and its own state file — silently operating on the wrong repository in multi-remote clones
還沒有人認領這個 Issue。
評估
研究方向
首先從 gh stack init 和 gh stack submit 進入點開始追蹤儲存庫解析,包括 --remote、GH_REPO、gh-resolved 以及 .git/gh-stack 中的 repository 欄位。將選取的儲存庫與 push remote 進行比較,並驗證互動流程和 --auto 流程要麼指向預期的儲存庫,要麼在解析存在歧義時明確失敗。
由索引模型根據 Issue 內容生成。
描述
Summary
In a clone with multiple remotes, every gh stack PR/stack API operation is bound to the repository of the origin remote, regardless of:
- the
--remoteflag (which only changes the push target), gh repo set-default/remote.<name>.gh-resolved(the standard gh CLI repo resolution),- the
repositoryfield in.git/gh-stack(editing it has no effect on subsequent runs).
If origin points at a different repository than the one your branches and PRs live in — the completely standard fork workflow where origin is upstream and you push to your fork — gh stack submit pushes to the right remote but then tries to create PRs and stacks on the wrong repository. In --auto / non-interactive mode this happens silently: there is no "Multiple remotes found" prompt (the interactive path in #219 at least shows one).
In my case the only reason no PRs were actually opened against the upstream project is that my branches don't exist there, so every createPullRequest failed. If upstream had happened to contain same-named branches, gh stack submit --auto would have opened a pile of PRs against a repository I never pointed it at. For agent/scripted use this is a dangerous default.
Environment
- gh version 2.96.0
- gh-stack v0.1.0
- Clone with 7 remotes;
origin=github.com/argoproj/argo-workflows(upstream),joibel=github.com/Joibel/argo-workflows(fork, where all stack branches and 8 open PRs live) gh repo set-default Joibel/argo-workflowsis set (remote.joibel.gh-resolved = base)
Steps to reproduce
- Clone a repo with
originpointing at upstream and a second remote pointing at your fork. - Create branches with open PRs on the fork (head and base both on the fork).
gh stack init --base <trunk> <branch1> ... <branchN>— adopts the branches fine, but records"repository": "github.com:<origin-owner>/<repo>"in.git/gh-stack.gh stack submit --remote <fork-remote> --auto
Observed
-
Push goes to the fork remote correctly ("Pushing to joibel... ✓ Pushed and synced 8 branches").
-
All PR operations target the
originrepository: existing fork PRs are not detected, and the extension attemptscreatePullRequestagainst upstream, failing with:⚠ failed to create PR for <branch>: creating PR: GraphQL: Head sha can't be blank, Base sha can't be blank, No commits between <base> and <branch>, Head ref must be a branch, Base ref must be a branch (createPullRequest)(Same error signature as #219, different root cause — here the refs genuinely don't exist because it's querying the wrong repository.)
-
The interactive TUI confirms it: the header shows
Repo: argoproj/argo-workflowseven when invoked with--remote joibel. -
None of the following change the target repository:
--remote,gh repo set-default, editing therepositoryfield in.git/gh-stack.
Workaround
GH_REPO=<fork-owner>/<repo> gh stack submit --remote <fork-remote> --auto works perfectly — existing PRs are detected ("PR #NN for is up to date") and the stack is created.
Expected
- Repo resolution should follow the standard gh CLI rules (
GH_REPO, thengh-resolved/gh repo set-default, then remote heuristics), or at minimum follow the remote selected with--remote, since a stack's branches and PRs must by definition (#46) live in the repository the branches are pushed to. - If resolution is ambiguous in non-interactive mode, fail with an explicit "multiple remotes, specify GH_REPO or --remote" error rather than silently picking
origin. gh stack initshould surface/validate which repository it bound the stack to.
Related
- #219 — same GraphQL error signature via a different resolution failure; its interactive run at least got a "Multiple remotes found" prompt, which
--autoskips. - #45, #337 — same code area (deriving the API repo from remote URLs) tripping on SSH aliases / hostname remaps.
- #46 — cross-fork stacks; confirms head+base must be one repository, which makes binding to
origindoubly wrong when pushes go elsewhere.
- 主要語言
- Go
- 星號
- 1.5k
- 分支
- 73
- 平均合併
- 1 天 8 小時
- 30 天內合併 PR
- 7
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
github/gh-stack 的其他 Issue
-
難度 2/5 1-3 小時 新手友好度 85/100
-
難度 1/5 1 小時以內 新手友好度 92/100
-
feature request topic: cli - general
難度 2/5 1-3 小時 新手友好度 68/100
-
feature request topic: auto-merge
難度 2/5 1-3 小時 新手友好度 68/100
-
bug topic: docs
難度 1/5 1 小時以內 新手友好度 68/100
相似的 Issue
-
難度 1/5 1 小時以內 新手友好度 60/100
github/gh-aw-mcpg#13748 ·
-
agentic-workflows
難度 2/5 1-3 小時 新手友好度 65/100
-
needs-triage
難度 2/5 1-3 小時 新手友好度 75/100
-
難度 2/5 1-3 小時 新手友好度 65/100
-
難度 2/5 1-3 小時 新手友好度 75/100
googleapis/librarian#7670 · 2 則留言 ·