github / github/gh-stack

`gh stack push` resolves an empty remote and silently pushes nothing when `branch.<name>.remote` is `.`

Đang mở
#412 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug topic: cli - push
Ngôn ngữ chính
Go
Star
1.5k
Fork
70
Merge trung bình
1 ngày 8 giờ
Pull request đã merge (30 ngày)
7

Mô tả

## Summary

When a stack branch's `branch..remote` is `.` (the local repository), `gh stack push` resolves the push remote to an **empty string**, pushes nothing, and reports success:

```
$ gh stack push
Pushing 2 branches to ....
✓ Pushed 2 branches
To create PRs for this stack, run `gh stack submit`

$ git ls-remote --heads origin | grep probe
# nothing — no ref was created
```

Note the blank remote name between "to" and the ellipsis. Exit status is 0.

`gh stack submit` then fails PR creation, but the error describes a *state* problem rather than the push failure that caused it, and the run still ends on a success line:

```
$ gh stack submit --auto
Checking stack state...
Pushing to ....
⚠ failed to create PR for probe-one: creating PR: GraphQL: Head sha can't be blank,
Base sha can't be blank, No commits between main and probe-one,
Head ref must be a branch (createPullRequest)
✓ Pushed and synced 2 branches
```

This is a single-remote repository. `origin` is the only remote, and it is correct.

## Root cause

`branch..remote = .` is a normal git configuration meaning "the upstream is a local branch". Anyone with **`branch.autoSetupMerge = always`** in their git config gets it automatically on every `git switch -c` from a local branch — which is exactly how a stack is built, so every branch in the stack has it.

Remote auto-detection appears to read `branch..remote`, find `.`, and yield an empty remote name rather than falling back to the single remote / `origin`.

Isolated by toggling it:

| `branch.autoSetupMerge` | `branch..remote` | `gh stack push` | branches pushed |
|---|---|---|---|
| `always` | `.` | `Pushing 2 branches to ....` | **0** |
| unset | unset | `Pushing 2 branches to origin...` | 2 |

Also fixed by setting `remote.pushDefault = origin`; unsetting it reproduces the failure again, deterministically.

## Reproduction

```bash
git config --global branch.autoSetupMerge always # or set it locally

git switch main
git switch -c probe-one && echo p1 > p1.txt && git add . && git commit -m "p1"
git switch -c probe-two && echo p2 > p2.txt && git add . && git commit -m "p2"
git switch probe-one

git config --get branch.probe-one.remote # -> .
gh stack init probe-one probe-two
gh stack push # "Pushing 2 branches to ...." / "✓ Pushed 2 branches"
git ls-remote --heads origin | grep probe # -> nothing
```

Public repo with two stacks set up for this: https://github.com/xn/gh-stack-repro

## Expected

- Fail loudly when the push remote cannot be resolved, rather than pushing to an empty remote name.
- Never print `✓ Pushed N branches` unless refs actually moved — report per-branch results, and exit non-zero when nothing was pushed.
- Treat `branch..remote = .` as "no usable remote for this branch" and fall back to the single remote / `origin` / `remote.pushDefault`.

## Workaround

`gh stack push --remote origin`, or `git config remote.pushDefault origin`.

## Environment

- `gh` 2.97.0
- `gh-stack` v0.1.0
- git 2.50.1
- macOS 26.4.1, darwin/arm64

## Related

Same GraphQL error signature as #219 and #381, but a different root cause — those are about which *repository* the API calls target in multi-remote/fork clones. This one is a single-remote clone where the *push target itself* resolves to empty and no ref is ever created. #45 is a third variant (SSH host alias); ruled out here — the failure reproduces with a plain `https://` remote and a pristine global config.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu từ quá trình tự động phát hiện remote và các đường dẫn push được `gh stack push` sử dụng, sau đó so sánh cách chúng xử lý `branch..remote = .` với các trường hợp chỉ có một remote và `remote.pushDefault`. Tái hiện vấn đề bằng các lệnh và repository được mô tả ở trên, đồng thời xác minh rằng các remote không thể phân giải sẽ thất bại một cách rõ ràng, việc di chuyển ref thực tế được báo cáo và trạng thái thoát khác không khi không có gì được push.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
git, github, go
Lĩnh vực
cli
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
55/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.