{"record":{"id":"493c23acec399086","repo":"GitoxideLabs/gitoxide","slug":"operation-aborted-without-changes-refusing-to-m","errorCode":null,"errorMessage":"{operation} aborted without changes: refusing to materialize a conflict without a continuation output file","messagePattern":"(.+?) aborted without changes: refusing to materialize a conflict without a continuation output file","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gix-tix/src/command/rebase.rs","lineNumber":262,"sourceCode":"        }\n    }\n}\n\npub(super) fn handle_plan_conflict(\n    repo: &gix::Repository,\n    mut conflict: rebase::PlanConflict,\n    materialize_conflicts: Option<&Path>,\n    tips: &[ObjectId],\n    operation: &str,\n) -> Result<()> {\n    let Some(destination) = materialize_conflicts else {\n        anyhow::bail!(\n            \"{operation} aborted without changes: conflict while applying {}; pass --materialize-conflicts to opt in\",\n            conflict.original().to_hex_with_len(7)\n        );\n    };\n    if destination == Path::new(\"-\") && std::io::stdout().is_terminal() {\n        anyhow::bail!(\n            \"{operation} aborted without changes: refusing to materialize a conflict without a continuation output file\"\n        );\n    }\n    conflict.persist_objects()?;\n    let plan = conflict.continuation_plan();\n    let mapped_tips = tips.iter().filter_map(|id| conflict.map(*id)).collect();\n    let continuation = todo::prepare_continuation(conflict.repository(), &plan, mapped_tips, true)?.document;\n    let revisions = mapped_revisions(tips, |id| conflict.map(id));\n    if destination == Path::new(\"-\") {\n        let mut stdout = std::io::stdout().lock();\n        stdout\n            .write_all(&continuation)\n            .and_then(|_| stdout.flush())\n            .context(\"could not write the continuation rebase todo\")?;\n    } else {\n        let mut output = std::fs::OpenOptions::new()\n            .write(true)\n            .create_new(true)","sourceCodeStart":244,"sourceCodeEnd":280,"githubUrl":"https://github.com/GitoxideLabs/gitoxide/blob/e73179060badf27222d790981fac3f84c1830a7e/gix-tix/src/command/rebase.rs#L244-L280","documentation":"When conflict materialization is requested with destination '-' (stdout), tix refuses to proceed if stdout is a terminal, because conflict markers piped to an interactive terminal cannot serve as a continuation file. The operation aborts without changes. A real output file is required to continue the rebase later.","triggerScenarios":"Calling `tix rebase apply --materialize-conflicts -` from an interactive shell (stdout is a TTY) while a plan conflict occurs in handle_plan_conflict.","commonSituations":"Developer runs the command directly in a terminal instead of redirecting output to a file; scripts accidentally inherit a TTY; confusion between '-' (stdout) and a real path.","solutions":["Redirect stdout to a file: `tix rebase apply ... --materialize-conflicts - > continuation.out`, or run non-interactively","Pass a concrete file path instead of '-': `--materialize-conflicts ./rebase-continuation`","Resolve the conflict upstream so no materialization is needed"],"exampleFix":"// before\ntix rebase apply plan --materialize-conflicts -\n// after\ntix rebase apply plan --materialize-conflicts continuation.txt","handlingStrategy":"validation","validationCode":"if dest == Path::new(\"-\") && std::io::stdout().is_terminal() {\n    return Err(anyhow!(\"use a file path for --materialize-conflicts in interactive shells\"));\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = cmd.status() {\n    if format!(\"{e}\").contains(\"refusing to materialize\") {\n        eprintln!(\"redirect stdout or pass a file path\");\n    }\n}","preventionTips":["Never use '-' for --materialize-conflicts in interactive terminals","Redirect to a file: `... --materialize-conflicts - > out.txt`","Prefer explicit paths over '-' for auditability"],"tags":["cli","rebase","conflict","tty"],"backgroundTag":"invalid-cli-argument","analyzedSha":"e73179060badf27222d790981fac3f84c1830a7e","analyzedAt":"2026-09-08T11:26:50.865Z","contentChangedAt":"2026-09-08T11:26:50.865Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}