mislav/hub · error

could not find a git remote for '%s'

Error message

could not find a git remote for '%s'

What it means

RemoteForProject(project) scans remotes for one whose parsed Project() equals the given Project (SameAs compares owner/name/host). If none matches, it returns this error embedding the project. It is the Project-object counterpart of RemoteForRepo.

Source

Thrown at github/localrepo.go:236

				return &remote, nil
			}
		}
	}
	return nil, fmt.Errorf("could not find a git remote for '%s/%s'", repo.Owner.Login, repo.Name)
}

func (r *GitHubRepo) RemoteForProject(project *Project) (*Remote, error) {
	if err := r.loadRemotes(); err != nil {
		return nil, err
	}

	for _, remote := range r.remotes {
		remoteProject, err := remote.Project()
		if err == nil && remoteProject.SameAs(project) {
			return &remote, nil
		}
	}
	return nil, fmt.Errorf("could not find a git remote for '%s'", project)
}

func (r *GitHubRepo) MainRemote() (*Remote, error) {
	r.loadRemotes()

	if len(r.remotes) > 0 {
		return &r.remotes[0], nil
	}
	return nil, fmt.Errorf("no git remotes found")
}

func (r *GitHubRepo) MainProject() (*Project, error) {
	r.loadRemotes()

	for _, remote := range r.remotes {
		if project, err := remote.Project(); err == nil {
			return project, nil
		}

View on GitHub (pinned to 5c547ed804)

Solutions

  1. Add a remote whose URL matches the project's host/owner/name
  2. Print `git remote -v` and verify URLs resolve to the expected project
  3. If host differs (github.com vs enterprise), fix the remote URL or the host configuration
  4. Fall back to MainRemote()/MainProject() when an exact match isn't required

Example fix

// before
r.RemoteForProject(enterpriseProject) // remote uses github.com URL
// after
// git remote set-url origin git@github.example.com:org/repo.git
r.RemoteForProject(enterpriseProject) // host now matches
Defensive patterns

Strategy: fallback

Validate before calling

u, _ := url.Parse(projectURL)
// u.Path must look like /owner/name[.git]
parts := strings.Split(strings.Trim(u.Path, "/"), "/")
if len(parts) < 2 { /* reject before calling RemoteForProject */ }

Try / catch

remote, err := repo.RemoteForProject(project)
if err != nil {
    if strings.Contains(err.Error(), "could not find a git remote for") {
        return repo.MainRemote() // degrade gracefully
    }
    return nil, err
}

Prevention

When it happens

Trigger: Calling RemoteForProject(project) when no remote URL parses to the same owner/name/host — project derived from an API response or URL while local remotes point elsewhere, or remote URLs fail to parse (project() err) and are silently skipped.

Common situations: Repo cloned over HTTPS but project resolved to an SSH/enterprise host so hosts differ; remote renamed or removed; looking up a project for a repo you haven't cloned; enterprise-vs-github.com host mismatch.

Related errors


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