{"record":{"id":"2967004d98e346fe","repo":"jdx/mise","slug":"incoming-history-origin-is-machine-local-configura","errorCode":null,"errorMessage":"incoming history.origin is machine-local configuration; remove it from the shared setup and use `mise bootstrap dotfiles origin set` on this machine ({})","messagePattern":"incoming history\\.origin is machine-local configuration; remove it from the shared setup and use `mise bootstrap dotfiles origin set` on this machine \\((.+?)\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/history/sync/preflight.rs","lineNumber":62,"sourceCode":"        {\n            continue;\n        }\n        let Some((mode, oid)) = object else {\n            continue;\n        };\n        if mode != \"100644\" && mode != \"100755\" {\n            bail!(\n                \"incoming configuration must be a regular file: {}\",\n                path.display()\n            );\n        }\n        let body = String::from_utf8(repo.cat_object(oid)?)?;\n        let parsed = MiseToml::for_history_preflight(&body, path)?;\n        if parsed\n            .history_config()\n            .is_some_and(|history| history.origin.is_some())\n        {\n            bail!(\n                \"incoming history.origin is machine-local configuration; remove it from the shared setup and use `mise bootstrap dotfiles origin set` on this machine ({})\",\n                path.display()\n            );\n        }\n        incoming_files.insert(\n            path.clone(),\n            Arc::new(parsed) as Arc<dyn crate::config::config_file::ConfigFile>,\n        );\n    }\n    crate::system::files::validate_incoming_files(&incoming_files)?;\n    let global = match &*crate::env::MISE_GLOBAL_CONFIG_FILE {\n        Some(path) => vec![path.clone()].into_iter().collect(),\n        None => candidates,\n    };\n    let mut files = ConfigMap::new();\n    let mut excludes = vec![];\n    for path in crate::config::system_config_files()\n        .into_iter()","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/history/sync/preflight.rs#L44-L80","documentation":"mise treats `[history] origin` as machine-local state (where THIS machine stores its saved history), not as shareable configuration. During preflight of incoming shared configuration, if any incoming TOML declares `history.origin`, mise aborts because one machine's local path/state must never be distributed through the shared setup. The fix is to remove it from the shared file and set the origin per machine with `mise bootstrap dotfiles origin set`.","triggerScenarios":"A committed config file in the shared repository contains a `[history]` section with an `origin` key. Raised in `prospective` after `MiseToml::for_history_preflight` parses the incoming body and `parsed.history_config().origin.is_some()`.","commonSituations":"A user ran `mise bootstrap dotfiles origin set` and the setting got written into a tracked/shared config file instead of a machine-local one; the origin line was copy-pasted from another machine's config into the repo.","solutions":["Edit the shared config file in the repository and delete the `origin` key under `[history]` (or the whole machine-local section), then commit and pull.","On each machine, set the origin locally instead: run `mise bootstrap dotfiles origin set <origin>`.","Keep machine-local history settings in an untracked/machine-specific config file that is not committed to the shared repo."],"exampleFix":"// before (shared mise.toml)\n[history]\norigin = \"ssh://git@example.com/team/history.git\"\n\n// after (shared mise.toml — key removed)\n# per machine instead:\n# mise bootstrap dotfiles origin set ssh://git@example.com/team/history.git","handlingStrategy":"validation","validationCode":"const body = await readTrackedConfig(path);\nif (/^\\s*\\[history\\][\\s\\S]*?^\\s*origin\\s*=/m.test(body)) {\n  throw new Error(`remove machine-local [history] origin from shared config: ${path}`);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await syncPull();\n} catch (e) {\n  if (String(e.message).includes(\"history.origin is machine-local\")) {\n    console.error(\"Move origin to per-machine config: mise bootstrap dotfiles origin set\");\n  } else throw e;\n}","preventionTips":["Keep `[history] origin` only in machine-local, untracked config files.","Review shared config diffs for machine-specific keys before pushing.","Use a repo hook or CI check that greps tracked TOML for `history.origin`."],"tags":["config","git","machine-local","sync"],"backgroundTag":"invalid-config-value","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}