jdx/mise · error

bootstrap from repository failed with

Error message

bootstrap from repository failed with {status}

What it means

mise's `mise bootstrap` command re-executes itself (or another bootstrap binary) as a child process to run repository hooks with a prepared environment. This error is thrown when that spawned child process exits with a non-zero status code, meaning the inner bootstrap run failed. It propagates the child's exit status into the parent's error message.

Solutions

  1. Rerun the bootstrap command directly (without the wrapper) to see the real underlying error from the child process
  2. Check that the checkout directory is trusted (`mise trust <path>`) since MISE_TRUSTED_CONFIG_PATHS is set to include it
  3. Inspect hook scripts and repo config for failures that would make the child exit non-zero
  4. Set MISE_DEBUG=1 to see the child's full output
Defensive patterns

Strategy: try-catch

Validate before calling

mise bootstrap --dry-run # or run the inner bootstrap step directly first

Try / catch

match result { Err(e) if e.contains("bootstrap from repository failed") => inspect child logs, Ok(_) => continue }

Prevention

When it happens

Trigger: Running `mise bootstrap` from a checkout: `command.status()` returns a non-success ExitStatus from the re-invoked bootstrap process, so `bail!` fires in the bootstrap-from-repository path.

Common situations: The inner mise run hits a trust error, a failing hook script, a bad config file, or any of the usual bootstrap failures — the parent just surfaces the exit code. Also occurs when git/hooks fail inside the child (e.g. untrusted checkout paths).

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 jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/af227d82f6b997dd. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/bootstrap.rs:1993

                if let Some(file_name) = crate::env::MISE_GLOBAL_CONFIG_FILE
                    .as_deref()
                    .and_then(Path::file_name)
                {
                    command.env("MISE_GLOBAL_CONFIG_FILE", checkout.join(file_name));
                }
            }
        }

        let mut trusted = std::env::split_paths(
            &std::env::var_os("MISE_TRUSTED_CONFIG_PATHS").unwrap_or_default(),
        )
        .collect::<Vec<_>>();
        trusted.push(checkout);
        command.env("MISE_TRUSTED_CONFIG_PATHS", std::env::join_paths(trusted)?);
        let status = command.status()?;
        if !status.success() {
            bail!("bootstrap from repository failed with {status}");
        }
        Ok(())
    }

    async fn run_hooks(
        &self,
        config: &Config,
        hooks: &[hooks::BootstrapHook],
        phase: BootstrapHookPhase,
    ) -> Result<()> {
        // Recorded before the hooks run: a hook that fails may still have
        // changed the machine.
        run_bootstrap_hooks(config, hooks, phase, self.dry_run).await
    }

    fn skip_parts(&self) -> HashSet<BootstrapPart> {
        if self.only.is_empty() {
            self.skip.iter().copied().collect()

View on GitHub (pinned to 533346cc37)