dagger/dagger · error
resolve latest git release %q: %w
Error message
resolve latest git release %q: %w
What it means
This error wraps a failure to look up the best-matching release ref on the git remote after a release tag was selected. The library throws it because remote.Lookup(bestRef) failed even though the tag name was determined from the remote's tag listing — a race or permission anomaly.
Source
Thrown at core/git.go:129
}
if bestRef == "" && tagPrefix != "" {
bestRef, err = selectLatestGitRelease(remote, "")
if err != nil {
return nil, err
}
}
if bestRef == "" {
ref, err := remote.Lookup("HEAD")
if err != nil {
return nil, fmt.Errorf("resolve git remote HEAD: %w", err)
}
return ref, nil
}
ref, err := remote.Lookup(bestRef)
if err != nil {
return nil, fmt.Errorf("resolve latest git release %q: %w", bestRef, err)
}
return ref, nil
}
func selectLatestGitRelease(
remote *gitutil.Remote,
tagPrefix string,
) (string, error) {
candidates := make([]releaseTagCandidate, 0, len(remote.Tags().Refs))
refs := map[string]string{}
for _, ref := range remote.Tags().Refs {
version := ref.ShortName()
if tagPrefix != "" {
var ok bool
version, ok = strings.CutPrefix(version, tagPrefix)
if !ok {
continue
}View on GitHub (pinned to 82ba2681db)
Solutions
- Retry the operation — often transient (deleted-then-restored tag, network blip)
- Inspect the wrapped error to distinguish auth vs missing-ref
- Verify the tag still exists on the remote: git ls-remote --tags origin <bestRef>
- Check credentials/permissions allow fetching tags, not just listing
Example fix
// before
ref, err := remote.Lookup(bestRef)
if err != nil { return nil, err }
// after
ref, err := remote.Lookup(bestRef)
if err != nil {
return nil, retryOnce(func() (*gitutil.Ref, error) { return remote.Lookup(bestRef) })
} Defensive patterns
Strategy: retry
Validate before calling
out, err := exec.Command("git", "ls-remote", "--tags", remoteURL, bestRef).Output()
if err != nil || len(out) == 0 {
return nil, fmt.Errorf("tag %s missing or unfetchable", bestRef)
} Try / catch
ref, err := SelectLatestGitRef(remote)
if err != nil {
if strings.Contains(err.Error(), "resolve latest git release") {
// tag may have vanished or transient failure; retry once
time.Sleep(time.Second)
ref, err = SelectLatestGitRef(remote)
}
if err != nil { return err }
} Prevention
- Retry transient lookup failures with backoff
- Avoid deleting tags while consumers resolve latest releases
- Ensure credentials permit fetching tags, not just listing
- Prefer immutable release tags in CI pipelines
When it happens
Trigger: SelectLatestGitRefWithTagPrefix picked bestRef from the tag list, then remote.Lookup(bestRef) errored — e.g. the tag was deleted concurrently, or the listing and lookup see different views (auth scopes, shallow fetch).
Common situations: Tag deleted between listing and lookup; credentials allow listing but not fetching a specific ref; transient network failure; mirrored repo missing the ref.
Related errors
- resolve git remote HEAD: %w
- failed to hydrate tags for remote %s: %w
- select latest git ref: nil remote
- invalid git-latest tag %q: not a semantic version
- failed to checkout remote %s: %w
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/d56fe8f1a8b245b9.
Report an issue: GitHub.