jdx/mise · error

source contains machine-local configuration ({entry}); remov

Error message

source contains machine-local configuration ({entry}); remove it from the repository before onboarding

What it means

install_at refuses to onboard source trees containing *.local.toml files (case-insensitive), because those are machine-local configuration that must not be replicated into the global configuration directory. The error names the offending file.

Source

Thrown at src/system/remote_repository.rs:236

        .output()?;
    if !output.status.success() {
        bail!("invalid transferred repository bundle");
    }
    if git(&checkout, &["rev-parse", "HEAD"])? != revision {
        bail!("transferred revision mismatch");
    }
    let entries = git(&checkout, &["ls-tree", "-r", "-z", "--name-only", revision])?;
    for entry in entries.split('\0').filter(|s| !s.is_empty()) {
        let path = Path::new(entry);
        if path
            .components()
            .any(|c| !matches!(c, std::path::Component::Normal(_)))
            || entry.split('/').any(|p| p.eq_ignore_ascii_case(".git"))
        {
            bail!("unsafe source repository path");
        }
        if entry.to_ascii_lowercase().ends_with(".local.toml") {
            bail!(
                "source contains machine-local configuration ({entry}); remove it from the repository before onboarding"
            );
        }
    }
    git(&checkout, &["remote", "set-url", "origin", origin])?;
    let branch = git(&checkout, &["symbolic-ref", "--short", "HEAD"])?;
    git(
        &checkout,
        &["-c", "core.hooksPath=/dev/null", "checkout", &branch],
    )?;
    if destination.join(".git").exists() {
        if git(destination, &["remote", "get-url", "origin"])? != origin {
            bail!("global configuration origin does not match");
        }
        if !git(
            destination,
            &["status", "--porcelain", "--untracked-files=no"],
        )?

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Delete the offending *.local.toml files from the repository and commit
  2. Add *.local.toml to .gitignore to prevent recurrence
  3. Push the fix, re-fetch, and install a new pinned revision

Example fix

# before
$ git ls-files | grep '.local.toml'
settings.local.toml
# after
$ git rm settings.local.toml && echo '*.local.toml' >> .gitignore && git commit
Defensive patterns

Strategy: validation

Validate before calling

fn repo_has_local_configs(entries: &[String]) -> Vec<String> {
    entries.iter()
        .filter(|e| e.to_ascii_lowercase().ends_with(".local.toml"))
        .cloned()
        .collect()
}

Prevention

When it happens

Trigger: Repository tree (at the pinned revision) contains any entry ending in .local.toml, e.g. settings.local.toml or env.local.toml discovered via git ls-tree during install_at.

Common situations: Developers committing their local override files (conventionally *.local.toml) into the shared config repo, then onboarding from it on another machine.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/442c2b12492da929. Report an issue: GitHub.