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
- Install git (or fix PATH so `git` is available) and re-run the command
- Re-initialize the dotfiles history store (e.g. re-run `mise dot` history sync commands so the repo is created)
- 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
- Install git in containers/CI images that run mise dot commands
- Verify the history store is a git repo if history was restored from backup
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
- comparing checkpoints requires git
- listing snapshot files requires git
- cannot determine dotfile Git ancestry
- cannot determine whether
- cannot merge dotfile Git history
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)