Repository navigation
[Bug]: Partial-clone remote annotations break repository detection and hide linked PRs #12764
Description
Activity
Thanks for the unusually complete report — this is a real parser bug, still present on current
main, and it is not Azure DevOps-specific.What we confirmed
Git really does append a filter annotation on promisor remotes. On this machine (Git 2.43.0):
origin https://example.visualstudio.com/DefaultCollection/Project/_git/repo (fetch) [blob:none] origin https://example.visualstudio.com/DefaultCollection/Project/_git/repo (push)The same end-anchored regex still appears in three places:
RepositoryIdentityResolver.ts—git remote -v→ primary fetch URL →repositoryIdentityGitVcsDriver.ts—listRemotes→ source-control provider detectionGitVcsDriverCore.ts—ensureRemote
A fetch line that ends with
[blob:none]is discarded. The push line still parses, but listing only keeps remotes that have a fetch URL, so the remote disappears entirely.That matches the two symptoms you saw:
- PR view empty, thread pill still present.
PullRequestServiceskips any project whoserepositoryIdentityis missing. The thread→PR row is stored separately, so the number can still show beside the thread whilesnapshot_jsonstays null. Source control provider unknown failed in listChangeRequests/pull request sync skipped.SourceControlProviderRegistrydetects the host fromlistRemotes. With no fetch URL it falls through to the unregisteredunknownstub — the exact error in your logs — andPullRequestSyncReactorthen skips the snapshot write. That happens before anyaz reposcall, which is why Azure CLI succeeding does not help.
Existing tests only feed unannotated
origin … (fetch)lines, so this never failed CI.Related, not duplicates
- Azure DevOps PR details fail from chat with "The change request does not belong to the selected project" #7647 is a different ADO bug (client vs server repository-name mismatch when opening PR details from chat).
- Unknown-provider PR polling still floods server logs; closed PR #5831 had a tested fix #9170 / fix(server): skip PR polling for unknown providers #9212 hit the same unknown provider error for a custom GitLab SSH hostname, not this parser.
- fix(server): clarify source control errors for unknown providers #11131 only rewords that error.
Existing PR is incomplete
#7499 already proposes the identity-resolver change (
(?:\s+\[[^\]]+\])*after(fetch|push)) plus a promisor-config test. It does not update the twoGitVcsDriver*copies. Landing it as-is would restorerepositoryIdentity(and therefore PR-list grouping) but provider detection vialistRemotes— the path behind your log line — would still fail.Next step
Extend #7499 (or a follow-up) so all three parsers share one suffix-tolerant helper. Prefer a synthetic-stdout unit case for
… (fetch) [blob:none]; a livegit config remotes.origin.partialclonefiltertest can pass on a Git that never prints the annotation. No repository-side workaround is required once those parsers accept Git’s optional filter suffix.Accepting as a bug.
- addedbugSomething is broken or behaving incorrectly.Something is broken or behaving incorrectly.acceptedfeature request acceptedfeature request acceptedvia-triageFiled through npx t3 triageFiled through npx t3 triage
on Sep 20, 2026 stepping back — #12776 already covers this
Confirmed another user-visible consequence of this parser bug: the same repository appears as separate sidebar projects across two environments.
The two checkouts have identical origin URLs. One is a partial clone whose fetch line ends in
(fetch) [blob:none]; the other has a plain(fetch)line. Inspection of the running WSL server binary confirmed that its repository-identity parser still uses the end-anchored regex described above.The partial-clone checkout therefore loses its repository identity. The shared client grouping logic in
packages/client-runtime/src/state/projectGrouping.tsusesrepositoryIdentity.canonicalKeyto merge repositories across environments, but falls back to an environment-and-workspace-path key when the identity is missing. That fallback keeps the two checkouts separate. Another repository with ordinary remote output groups correctly in the same client.This is another consequence of the existing bug, rather than a separate grouping defect. Verification of the parser fix should include a partial clone and an ordinary clone of the same repository on different environments appearing in one sidebar project group.
The local source checkout contains the shared suffix-tolerant parser fix, but the affected running binary still contains the old identity parser. No repository settings or live state were changed during diagnosis.
Investigated with GPT-6 Astra through OpenCode in T3 Code.
- added a commit that references this issue
on Sep 23, 2026
Before submitting
Area
apps/server
Steps to reproduce
git remote -voutput includes a filter annotation after the fetch direction. The affected checkout hasremote.origin.promisor=trueandremote.origin.partialclonefilter=blob:none.Actual remote output, with the private repository replaced by an example:
The parser failure can be reproduced without credentials or a private repository:
Expected behavior
T3 recognizes the fetch remote and its source-control provider even when Git appends a partial-clone filter annotation. PR listing and linked-PR synchronization work for this checkout.
Actual behavior
The parser discards the fetch line because it anchors the end of the line immediately after
(fetch)or(push). The repository identity resolver then has no fetch remote from which to build an identity. PR listing skips projects without that identity.The saved thread link exists independently of repository discovery, which explains why the PR number can appear beside the thread while the PR view cannot list it.
Verified on the affected environment:
az repos pr show --detect true --id <id>succeeds.az repos pr list --detect true --repository <repo> --status active --creator <author>returns the PR.snapshot_jsonis null.The same end-anchored regex appears in three parsers at commit
c14f6015bfe479d313355cb234af1a5c16dbb15f:The repository identity parser is also present in current upstream source at the time of filing. The rejection happens before host-specific PR calls, so the parser defect is not specific to Azure DevOps. End-to-end symptoms were observed with Azure DevOps.
Impact
Major degradation or frequent failure. PR integration fails for the affected partial-clone checkout while ordinary Git and Azure CLI access still work.
Version or commit
Desktop version reported in logs:
0.0.43-nightly.20260920.2005.Source inspected:
c14f6015bfe479d313355cb234af1a5c16dbb15f.Environment
Windows desktop app connected to its Linux/WSL server runtime. Git
2.52.0.vfs.0.5. Azure DevOps repository with ablob:nonepartial-clone filter.Logs or stack traces
Workaround
Use the provider website or Azure CLI to inspect the PR. No repository configuration changes were made during diagnosis.
Related issues
#7647 concerns a different Azure DevOps repository-name mismatch when opening PR details from chat. This report concerns fetch-remote parsing and repository discovery before PR listing.
Investigation
Investigated and filed with GPT-6 Astra through OpenCode in T3 Code. Private repository names, PR identifiers, account details, and local paths have been omitted.