mislav/hub · error
No valid remote URLs
Error message
No valid remote URLs
What it means
newRemote builds a Remote from a name plus fetch/push URL strings. Both URLs are passed through git.ParseURL; if BOTH fail to parse, the remote has no usable URL and this error is returned. Remotes() skips such entries, so malformed remotes are silently dropped from the list.
Source
Thrown at github/remote.go:89
// the rest of the remotes
for n, u := range remotesMap {
r, err := newRemote(n, u)
if err == nil {
remotes = append(remotes, r)
}
}
return
}
func newRemote(name string, urlMap map[string]string) (Remote, error) {
r := Remote{}
fetchURL, ferr := git.ParseURL(urlMap["fetch"])
pushURL, perr := git.ParseURL(urlMap["push"])
if ferr != nil && perr != nil {
return r, fmt.Errorf("No valid remote URLs")
}
r.Name = name
if ferr == nil {
r.URL = fetchURL
}
if perr == nil {
r.PushURL = pushURL
}
return r, nil
}
View on GitHub (pinned to 5c547ed804)
Solutions
- Fix the malformed remote URL: git remote set-url <name> <valid-url> (e.g. https://github.com/owner/repo.git or git@github.com:owner/repo.git)
- Inspect the raw entry: git remote -v and git config --get-regexp 'remote\..*\.url'
- Remove broken remotes: git remote remove <name>, then re-add correctly
- If using an exotic transport, ensure the URL matches formats git.ParseURL supports (https, ssh, git, scp-like)
Example fix
// before git remote add origin "" // after git remote remove origin git remote add origin git@github.com:owner/repo.git
Defensive patterns
Strategy: validation
Validate before calling
for _, u := range remoteURLs {
if u == "" { continue }
if _, err := url.Parse(u); err != nil { /* malformed remote URL */ }
} Try / catch
remotes, err := github.Remotes()
if err != nil {
if strings.Contains(err.Error(), "No valid remote URLs") {
return fmt.Errorf("a remote has an unparseable URL; run git remote -v and fix it with git remote set-url")
}
return err
} Prevention
- Never add remotes with empty or placeholder URLs
- Use standard URL schemes: https://, ssh (git@host:path), or git://
- Audit git config remote.*.url entries after hand-editing .git/config
- Note Remotes() silently drops unparseable remotes — verify expected remotes appear in output
When it happens
Trigger: A remote entry in `git remote -v` whose URL string cannot be parsed by git.ParseURL — e.g. empty URL, unsupported scheme, or a malformed scp-like syntax (called from Remotes during loadRemotes).
Common situations: Remote added with an empty or whitespace URL; exotic schemes (e.g. custom helper:// remotes); scp-style URLs with unusual formatting like user@host::path; git config hand-edited with invalid URLs.
Related errors
- Aborted: could not find any git remote pointing to a GitHub
- No git remote with name %s
- could not find a git remote for '%s/%s'
- could not find a git remote for '%s'
- no git remotes found
AI-assisted analysis of mislav/hub@5c547ed804 (2026-09-01).
Data as JSON: /api/errors/9e1e3bfaed5c6dc5.
Report an issue: GitHub.