dagger/dagger · error
invalid git-latest tag %q: not a semantic version
Error message
invalid git-latest tag %q: not a semantic version
What it means
This error is returned by ValidateGitLatestRef when the ref is a tag but its version portion is not a valid semantic version. The library throws it because the git-latest machinery requires the latest ref to be a clean semver release tag so it can compare and validate releases.
Source
Thrown at core/git.go:180
return "", nil
}
return refs[selected.Name], nil
}
// ValidateGitLatestRef validates a ref selected by git-latest.
func ValidateGitLatestRef(refName string, tagPrefix string) error {
if tag, ok := strings.CutPrefix(refName, "refs/tags/"); ok {
version := tag
tagPrefix = strings.Trim(tagPrefix, "/")
if tagPrefix != "" {
version, _ = strings.CutPrefix(version, tagPrefix+"/")
}
parsed, ok := parseReleaseTag(releaseTagCandidate{
Name: tag,
Version: version,
})
if !ok {
return fmt.Errorf("invalid git-latest tag %q: not a semantic version", tag)
}
if parsed.Semver.Prerelease != "" {
return fmt.Errorf("invalid git-latest tag %q: prerelease tags are not supported", tag)
}
return nil
}
if branch, ok := strings.CutPrefix(refName, "refs/heads/"); ok && branch != "" {
return nil
}
return fmt.Errorf("invalid git-latest ref %q", refName)
}
var _ dagql.PersistedObject = (*GitRepository)(nil)
var _ dagql.PersistedObjectDecoder = (*GitRepository)(nil)
var _ dagql.OnReleaser = (*GitRepository)(nil)
var _ dagql.HasDependencyResults = (*GitRepository)(nil)
var _ dagql.PersistedObject = (*GitRef)(nil)View on GitHub (pinned to 82ba2681db)
Solutions
- Retag with a valid semantic version, e.g. v1.2.3 instead of v1.2
- Point the latest ref at an existing valid semver release tag
- Adjust the tag prefix so it only matches semver release tags
- Strip or rename legacy non-semver tags if they must not be selected
Example fix
// before git tag v1.2 // after git tag v1.2.0 && git push origin v1.2.0
Defensive patterns
Strategy: validation
Validate before calling
func isStableSemverTag(tag string) bool {
v, err := semver.StrictNewVersion(strings.TrimPrefix(tag, "v"))
return err == nil && v.String() != ""
}
if !isStableSemverTag(candidate) { skip() } Type guard
func looksLikeSemver(s string) bool {
_, err := semver.NewVersion(s)
return err == nil
} Try / catch
if err := ValidateGitLatestRef(ctx, repo, ref); err != nil {
if strings.Contains(err.Error(), "not a semantic version") {
return nil, fmt.Errorf("latest ref must be a semver tag like v1.2.3; got %s", ref)
}
return err
} Prevention
- Adopt strict semver (MAJOR.MINOR.PATCH) tagging conventions
- Validate tags in CI before pushing
- Avoid tags like v1.2 or v1.2.3.4
- Document the tag prefix and format expected by git-latest
When it happens
Trigger: Calling ValidateGitLatestRef with a tag ref (refs/tags/<name>) where parsing parseReleaseTag fails — e.g. tags like v1.2, release-2024, or v01.2.3 with malformed formatting.
Common situations: Repositories using non-semver tagging conventions; tag typos; a tag prefix matched but the remaining version string isn't semver (e.g. v1.2.3.4).
Related errors
- invalid git-latest tag %q: prerelease tags are not supported
- invalid git-latest ref %q
- select latest git ref: nil remote
- resolve latest git release %q: %w
- git log: missing ref
AI-assisted analysis of dagger/dagger@82ba2681db (2026-09-05).
Data as JSON: /api/errors/758133650e4bb78a.
Report an issue: GitHub.