rust-lang/cargo · error
unstable 'gitoxide' only takes `fetch` and `checkout` as…
Error message
unstable 'gitoxide' only takes `fetch` and `checkout` as valid inputs, for shallow fetches see `-Zgit=shallow-index,shallow-deps`
What it means
`GitoxideFeatures::parse_gitoxide` validates the values given to the unstable `-Zgit` flag (via `visit_str`/`add`). Only `fetch` and `checkout` are accepted; any other token causes this bail. The message also points to `-Zgit=shallow-index,shallow-deps` for shallow-fetch related options.
Solutions
- Use only `-Zgit=fetch` and/or `-Zgit=checkout` (e.g. `-Zgit=fetch,checkout`).
- For shallow clones of git dependencies, use `-Zgit=shallow-index,shallow-deps` instead.
- Check `cargo -Z help` / current nightly docs for the valid token list, as unstable flags change between releases.
- Remove the `-Zgit` flag entirely on stable Rust, where it is not accepted anyway.
Example fix
// before cargo +nightly build -Zgit=shallow // after cargo +nightly build -Zgit=fetch,checkout -Zgit=shallow-index,shallow-deps
Defensive patterns
Strategy: validation
Validate before calling
let valid = ["fetch", "checkout"];
for tok in std::env::args().filter(|a| a.starts_with("-Zgit=")) {
for v in tok.trim_start_matches("-Zgit=").split(',') {
assert!(valid.contains(&v) || v.starts_with("shallow"), "invalid -Zgit value: {v}");
}
} Prevention
- Keep -Z flags in a cargo config alias (e.g. `[alias] nightly = \"-Zgit=fetch,checkout\"`) maintained against current nightly docs.
- Re-check unstable flag syntax after every Rust nightly upgrade.
- Consult `cargo -Z help` rather than stale blog posts or old issue threads.
When it happens
Trigger: Invoking cargo with a nightly `-Zgit` value other than `fetch` or `checkout`, e.g. `-Zgit=shallow` or `-Zgit=fetch,shallow`, or RUSTC_BOOTSTRAP-based `-Zgit` in RUSTFLAGS/config env.
Common situations: Following outdated blog posts/issues that reference renamed or removed gitoxide feature tokens; typos like `fech`; confusing the shallow-fetch flags with the gitoxide feature list.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- argument for --color must be auto, always, or never, but…
- argument for --color must be auto, always, or never, but…
- found build scripts with duplicate file stems, but all…
- Found duplicate binary artifact
- found duplicate name , but all targets must have a unique…
AI-assisted analysis of rust-lang/cargo@98a09e7e7d (2026-09-08).
Data as JSON: /api/errors/2b9f5b934c36ffa8.
Report an issue: GitHub.
Appendix: source
Thrown at src/workspace/features.rs:1238
Ok(Some(GitoxideFeatures::deserialize(mvd)?))
}
}
deserializer.deserialize_any(GitoxideFeaturesVisitor)
}
fn parse_gitoxide(
it: impl Iterator<Item = impl AsRef<str>>,
) -> CargoResult<Option<GitoxideFeatures>> {
let mut out = GitoxideFeatures::default();
let GitoxideFeatures { fetch, checkout } = &mut out;
for e in it {
match e.as_ref() {
"fetch" => *fetch = true,
"checkout" => *checkout = true,
_ => {
bail!(GitoxideFeatures::expecting())
}
}
}
Ok(Some(out))
}
impl CliUnstable {
/// Parses `-Z` flags from the command line, and returns messages that warn
/// if any flag has already been stabilized.
pub fn parse(
&mut self,
flags: &[String],
nightly_features_allowed: bool,
) -> CargoResult<Vec<String>> {
if !flags.is_empty() && !nightly_features_allowed {
bail!(
"the `-Z` flag is only accepted on the nightly channel of Cargo, \
but this is the `{}` channel\n\View on GitHub (pinned to 98a09e7e7d)