{"record":{"id":"4a97aa9f6c772f8b","repo":"gitbutlerapp/gitbutler","slug":"but-land-does-not-yet-support-triangular-remotes","errorCode":null,"errorMessage":"`but land` does not yet support triangular remotes (fetch `{fetch_remote_name}`, push `{push_remote_name}`). Land via a pull request instead, or configure a single remote for the target branch.","messagePattern":"`but land` does not yet support triangular remotes \\(fetch `(.+?)`, push `(.+?)`\\)\\. Land via a pull request instead, or configure a single remote for the target branch\\.","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/but-api/src/land/mod.rs","lineNumber":213,"sourceCode":"    let target_branch_name = base_branch.short_name.clone();\n    if target_branch_name.is_empty() {\n        bail!(\"Configured target branch has no branch name\");\n    }\n    let fetch_remote_name = base_branch.remote_name.clone();\n    let push_remote_name = if base_branch.push_remote_name.is_empty() {\n        fetch_remote_name.clone()\n    } else {\n        base_branch.push_remote_name.clone()\n    };\n    if push_remote_name.is_empty() {\n        bail!(\"Configured target branch has no push remote\");\n    }\n\n    // Triangular remotes (fetch remote != push remote) are out of scope for now: the post-land\n    // reconcile reads the fetch remote's tracking ref, so a push to a different remote would not\n    // advance it and the reconcile would silently no-op. Refuse before mutating anything.\n    if push_remote_name != fetch_remote_name {\n        bail!(\n            \"`but land` does not yet support triangular remotes (fetch `{fetch_remote_name}`, \\\n             push `{push_remote_name}`). Land via a pull request instead, or configure a single \\\n             remote for the target branch.\"\n        );\n    }\n\n    let target_display = format!(\"{push_remote_name}/{target_branch_name}\");\n    let push_remote_url = if base_branch.push_remote_url.is_empty() {\n        &base_branch.remote_url\n    } else {\n        &base_branch.push_remote_url\n    };\n    let update_target_locally = {\n        let repo = ctx.repo.get()?;\n        remote_points_at_current_repo(&repo, push_remote_url)?\n    };\n\n    // Safety guards a non-CLI caller must not be able to bypass: never publish lower stack segments","sourceCodeStart":195,"sourceCodeEnd":231,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/caf1f223d3cfb94488c9198ad34487c6006c648f/crates/but-api/src/land/mod.rs#L195-L231","documentation":"Error \"`but land` does not yet support triangular remotes (fetch `{fetch_remote_name}`, push `{push_remote_name}`). Land via a pull request instead, or configure a single remote for the target branch.\" thrown in gitbutlerapp/gitbutler.","triggerScenarios":"Thrown at crates/but-api/src/land/mod.rs:213 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"caf1f223d3cfb94488c9198ad34487c6006c648f","analyzedAt":"2026-08-20T07:55:40.983Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}