mislav/hub · error

Invalid GitHub URL

Error message

Invalid GitHub URL: %s

What it means

NewProjectFromURL(url) splits url.Path into at most 4 segments and expects at least 3 ("", owner, name). If the path has 2 or fewer segments it cannot extract owner/name and returns this error. It guards against URLs that are hosts or bare root paths rather than repository URLs.

Solutions

  1. Fix the remote URL to the full form host/owner/repo(.git): git remote set-url origin https://github.com/owner/repo.git
  2. Validate the URL shape before calling: URL.Path must contain /owner/name
  3. If a git config insteadOf rewrite is mangling the URL, correct `git config --get-regexp url`
  4. Re-enter the repository URL from `git remote -v` output to fix truncation

Example fix

// before
git remote add origin https://github.com
p, err := NewProjectFromURL(u) // Invalid GitHub URL
// after
git remote set-url origin https://github.com/owner/repo.git
p, err := NewProjectFromURL(u) // OK
Defensive patterns

Strategy: validation

Validate before calling

func isRepoURL(raw string) bool {
    u, err := url.Parse(raw)
    if err != nil { return false }
    parts := strings.SplitN(u.Path, "/", 4)
    return len(parts) > 2 && parts[1] != "" && parts[2] != ""
}

Try / catch

p, err := github.NewProjectFromURL(u)
if err != nil {
    if strings.Contains(err.Error(), "Invalid GitHub URL") {
        return nil, fmt.Errorf("URL %q lacks owner/name segments", u)
    }
    return nil, err
}

Prevention

When it happens

Trigger: Calling NewProjectFromURL with a URL whose path lacks owner/name, e.g. https://github.com, https://github.com/, or https://github.com/owner (called from findPushTarget, NewProjectFromRepo, Project, ParseURL when a remote URL is malformed or truncated).

Common situations: Remote URL set to just the host (e.g. git remote add origin https://github.com); truncated URL after a bad copy/paste; url.<base>.insteadOf rewrite producing a bare base URL; git:// or ssh URLs with empty path after parsing.

Related errors


AI-assisted analysis of mislav/hub@5c547ed804 (2026-09-01). Data as JSON: /api/errors/a0d4ae8ff80adf49. Report an issue: GitHub.

Appendix: source

Thrown at github/project.go:125

func NewProjectFromRepo(repo *Repository) (p *Project, err error) {
	url, err := url.Parse(repo.HTMLURL)
	if err != nil {
		return
	}

	p, err = NewProjectFromURL(url)
	return
}

func NewProjectFromURL(url *url.URL) (p *Project, err error) {
	if !knownGitHubHostsInclude(url.Host) {
		err = &HostError{url}
		return
	}

	parts := strings.SplitN(url.Path, "/", 4)
	if len(parts) <= 2 {
		err = fmt.Errorf("Invalid GitHub URL: %s", url)
		return
	}

	name := strings.TrimSuffix(parts[2], ".git")
	p = newProject(parts[1], name, url.Host, url.Scheme)

	return
}

func NewProject(owner, name, host string) *Project {
	return newProject(owner, name, host, "")
}

func newProject(owner, name, host, protocol string) *Project {
	if strings.Contains(owner, "/") {
		result := strings.SplitN(owner, "/", 2)
		owner = result[0]
		if name == "" {

View on GitHub (pinned to 5c547ed804)