jdx/mise · error

inspecting conflicts requires git

Error message

inspecting conflicts requires git

What it means

The conflicts command uses the dotfiles history git repository to compute local/remote sides of a conflict. When the history store has no git repo backing it (git is unavailable or the store isn't a git repo), the command bails, since conflict inspection cannot proceed without git.

Solutions

  1. Install git (or fix PATH so `git` is available) and re-run the command
  2. Re-initialize the dotfiles history store (e.g. re-run `mise dot` history sync commands so the repo is created)
  3. Check that the history directory exists and is a git repo (`git -C <history-dir> status`)

Example fix

// before (git missing in container)
$ mise dot conflicts
error: inspecting conflicts requires git
// after
$ apt-get install -y git
$ mise dot conflicts
Defensive patterns

Strategy: validation

Validate before calling

command -v git >/dev/null || echo "git is required for mise dot conflicts"

Prevention

When it happens

Trigger: `mise dot conflicts` runs, history is enabled, but `store.repo()` returns None — typically git is not installed/on PATH or the history directory lacks a git repository.

Common situations: Git not installed in the environment (containers, CI images); history directory corrupted or created without git; PATH stripped so `git` is missing.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/c2ca3f6bd930a98c. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/dotfiles/conflicts.rs:43

    paths: Vec<PathBuf>,

    /// Open the comparison in Git's configured diff or merge tool
    #[usage(long)]
    difftool: bool,

    /// Use this Git diff tool instead of the configured default
    #[usage(long, value_name = "TOOL", requires = "difftool")]
    tool: Option<String>,
}

impl DotfilesConflicts {
    pub(crate) async fn run(self) -> Result<()> {
        if !crate::config::Settings::get().history.enabled {
            bail!("history is disabled (history.enabled = false)");
        }
        let (store, tracked, _) = super::history::open().await?;
        let Some(repo) = store.repo() else {
            bail!("inspecting conflicts requires git");
        };
        let sync_lock = run::lock(&store)?;
        let mut status = run::read_status(store.state_dir())?;
        run::refresh_with_interaction(
            &store,
            &tracked,
            &mut status,
            console::user_attended_stderr(),
        )?;
        // Keep the conflict objects stable while encrypted blobs are refreshed,
        // then release the sync lock before an interactive difftool can block.
        drop(sync_lock);
        let selected = select(&status.conflicts, &self.paths)?;
        if selected.is_empty() {
            info!("no sharing conflicts");
            return Ok(());
        }
        for (path, conflict) in selected {

View on GitHub (pinned to 533346cc37)