gastownhall/beads · error

failed to validate git ref name

Error message

failed to validate git ref name %q: %w

What it means

`validateGitRefName` runs a git plumbing check to confirm a candidate ref name is valid. Exit code 1 means 'not a valid ref' (handled), but any other failure from the git subprocess is wrapped in this error with the ref name and underlying error.

Solutions

  1. Confirm the working directory is inside a git repository (`git rev-parse --is-inside-work-tree`)
  2. Run the equivalent `git rev-parse --verify <ref>` manually to see the raw git error
  3. Check that the `git` binary is installed and on PATH and works (`git --version`)
  4. Inspect the wrapped `%w` cause for permissions or signal termination details

Example fix

// before (running from ~/Downloads, outside any repo)
bd worktree remove --merged-into main
// after (cd into the repository first)
cd /path/to/repo && bd worktree remove --merged-into main
Defensive patterns

Strategy: try-catch

Validate before calling

// shell pre-check
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || echo "not a git repository"
git --version >/dev/null 2>&1 || echo "git unavailable"

Try / catch

out, err := run("bd", "worktree", "remove", "--merged-into", ref)
if err != nil && strings.Contains(out, "failed to validate git ref name") {
    // environment problem: verify repo + git install before retrying
}

Prevention

When it happens

Trigger: The `git for-each-ref --verify`-style validation subprocess fails with an unexpected exit code or cannot run at all — broken git installation, non-repository directory, signal-killed process, or permission problems.

Common situations: Running bd outside a git worktree/repository; corrupt `.git` directory; git binary missing or too old; sandbox blocking subprocess execution.

Understand the failure class

Background: "git command failed": what it means when a tool shells out to git and git exits non-zero — this error's family across 21 libraries.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/c52c88ffabea5a71. Report an issue: GitHub.

Appendix: source

Thrown at cmd/bd/worktree_cmd.go:1784

	git *worktreeRemovalGit,
	executionRoot string,
	ref string,
	allowOneLevel bool,
) (bool, error) {
	args := []string{"check-ref-format"}
	if allowOneLevel {
		args = append(args, "--allow-onelevel")
	}
	args = append(args, ref)
	_, err := git.output(ctx, executionRoot, args...)
	if err == nil {
		return true, nil
	}
	var exitError *exec.ExitError
	if errors.As(err, &exitError) && exitError.ExitCode() == 1 {
		return false, nil
	}
	return false, fmt.Errorf("failed to validate git ref name %q: %w", ref, err)
}

func findWorktreeComparatorRefs(
	ctx context.Context,
	git *worktreeRemovalGit,
	executionRoot string,
	selector string,
) ([]string, error) {
	candidates := []string{
		"refs/" + selector,
		"refs/tags/" + selector,
		"refs/heads/" + selector,
		"refs/remotes/" + selector,
		"refs/remotes/" + selector + "/HEAD",
	}
	candidateSet := make(map[string]struct{}, len(candidates))
	for _, candidate := range candidates {
		candidateSet[candidate] = struct{}{}

View on GitHub (pinned to 71377f2769)