{"record":{"id":"a08bbe1ae4a077e0","repo":"jdx/mise","slug":"target-raw-tracked-in-place-pass-mode-copy-after-mise-dot","errorCode":null,"errorMessage":"{target_raw}: tracked in place; pass `--mode copy` after `mise dot untrack {target_raw}` to seed a source instead","messagePattern":"(.+?): tracked in place; pass `--mode copy` after `mise dot untrack (.+?)` to seed a source instead","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/dotfiles/add.rs","lineNumber":170,"sourceCode":"            cwd: None,\n            prefer_toml: true,\n            prevent_home_local: true,\n        })?;\n\n        let mut planned = vec![];\n        let managed_edits = system::edits::edits_from_config(&config)?;\n        for target_raw in &self.targets {\n            let target = system::files::resolve_target_arg(target_raw)\n                .components()\n                .collect::<PathBuf>();\n            if target.is_relative() {\n                bail!(\"{target_raw}: target must be absolute or start with ~/\");\n            }\n            if managed\n                .iter()\n                .any(|req| req.mode == FileMode::Track && req.target == target)\n            {\n                bail!(\n                    \"{target_raw}: tracked in place; pass `--mode copy` after `mise dot untrack {target_raw}` to seed a source instead\"\n                );\n            }\n            if managed_edits.iter().any(|req| {\n                system::files::matches_target(\n                    &req.path,\n                    &req.path_raw,\n                    std::slice::from_ref(target_raw),\n                )\n            }) {\n                bail!(\n                    \"{target_raw}: target is already managed by [dotfiles] edits; remove or rename those entries before adding a whole-file dotfile\"\n                );\n            }\n            let existing = managed.iter().find(|req| {\n                system::files::matches_target(\n                    &req.target,\n                    &req.target_raw,","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/cli/dotfiles/add.rs#L152-L188","documentation":"`mise dot add` refuses to add a target path that is already managed as a tracked (symlink) dotfile entry. Tracking in place means mise already owns a symlink at the target, so adding it again would create conflicting management. The message tells the user how to convert it: untrack it, then re-add with `--mode copy` to seed a real source file.","triggerScenarios":"Running `mise dot add <path>` where `<path>` already appears in `[dotfiles]` config as a `FileMode::Track` entry with the same target; i.e. the target is already symlink-tracked by mise.","commonSituations":"User forgot they already tracked the file; re-running a scripted `mise dot add` invocation; converting a tracked entry to a copied one without first untracking.","solutions":["Untrack the target first: `mise dot untrack <target>`, then re-add with `mise dot add <target> --mode copy`","Edit the `[dotfiles]` section in your mise config and remove or rename the existing track entry before re-adding","Check current management with `mise dot list` (or inspect `[dotfiles]` in the config) before adding"],"exampleFix":"// before: fails, target already tracked\n$ mise dot add ~/.gitconfig --mode copy\n// after\n$ mise dot untrack ~/.gitconfig\n$ mise dot add ~/.gitconfig --mode copy","handlingStrategy":"validation","validationCode":"if managed.iter().any(|req| req.mode == FileMode::Track && req.target == target) {\n    eprintln!(\"{target} already tracked; run `mise dot untrack {target}` first\");\n    return;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run `mise dot list` before adding a target","Treat `mise dot add` as non-idempotent; script around it with an existence check"],"tags":["dotfiles","cli","duplicate-management"],"backgroundTag":"file-already-exists","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}