`gh stack push` resolves an empty remote and silently pushes nothing when `branch.<name>.remote` is `.`
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 55/100
Piste de recherche
Commencez par l’auto-détection des remotes et les chemins de push utilisés par gh stack push, puis comparez leur gestion de branch.<name>.remote = . avec les cas d’un remote unique et de remote.pushDefault. Reproduisez le problème à l’aide des commandes et du dépôt décrits ci-dessus, et vérifiez que les remotes non résolus échouent explicitement, que les déplacements effectifs de refs sont signalés et que le statut de sortie est différent de zéro lorsqu’aucun push n’a été effectué.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
When a stack branch's branch.<name>.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.<name>.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.<name>.remote, find ., and yield an empty remote name rather than falling back to the single remote / origin.
Isolated by toggling it:
branch.autoSetupMerge |
branch.<name>.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
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 branchesunless refs actually moved — report per-branch results, and exit non-zero when nothing was pushed. - Treat
branch.<name>.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
gh2.97.0gh-stackv0.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.
- Langage dominant
- Go
- Étoiles
- 1.5k
- Forks
- 73
- Merge moyen
- 1 j 8 h
- PR mergées (30 j)
- 7
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de github/gh-stack
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
-
feature request topic: cli - general
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
-
feature request topic: auto-merge
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
-
bug topic: docs
Difficulté 1/5 Moins d'une heure Accessibilité débutants 68/100
Toutes les issues de github/gh-stack
Issues similaires
-
textual definition
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
geneontology/go-ontology#32653 ·
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 75/100
-
needs design
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
Priority/High ready-for-agent Severity/Major Type/Bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100