`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
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 52/100
Hướng nghiên cứu
Bắt đầu bằng cách lần theo quá trình phân giải repository từ các điểm vào gh stack init và gh stack submit, bao gồm --remote, GH_REPO, gh-resolved và trường repository trong .git/gh-stack. So sánh repository đã chọn với push remote và xác minh rằng các luồng tương tác và --auto либо nhắm đến repository dự kiến hoặc thất bại một cách rõ ràng khi quá trình phân giải không rõ ràng.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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.
- Ngôn ngữ chính
- Go
- Star
- 1.5k
- Fork
- 73
- Merge trung bình
- 1 ngày 8 giờ
- Pull request đã merge (30 ngày)
- 7
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của github/gh-stack
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
-
feature request topic: cli - general
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
-
feature request topic: auto-merge
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
-
bug topic: docs
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 68/100
Tất cả issue của github/gh-stack
Issue tương tự
-
textual definition
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
geneontology/go-ontology#32653 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 75/100
-
needs design
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
Priority/High ready-for-agent Severity/Major Type/Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100