GitoxideLabs/gitoxide · error · anyhow::Error

Participating object was too large

Error message

Participating object was too large

What it means

Thrown by `file` in `gix repo merge file` when `platform.buffer_by_pick(pick)` fails, which happens when a merge input blob exceeded the size limit the merger can handle in memory. The merge of an oversized participating object cannot produce a pick buffer, so the command aborts with this fixed message.

Solutions

  1. Merge the files manually with an external tool (e.g. `git merge-file` or a 3-way merge GUI) and commit the result
  2. Exclude huge files from merges via `.gitattributes` with `merge=ours` or a custom driver
  3. Store large blobs in LFS or split them into smaller chunks so the in-memory merger can handle them

Example fix

// .gitattributes
// before: data.json merge=default
// after
data.json merge=ours -diff  # avoid in-memory merge of huge blob
Defensive patterns

Strategy: fallback

Validate before calling

// guard: refuse huge blobs before invoking the file merger
const MAX_MERGE_BYTES: usize = 64 * 1024 * 1024;
if ours_len.max(theirs_len).max(base_len) > MAX_MERGE_BYTES {
    return Err("input too large for in-memory merge; use external merge tool".into());
}

Try / catch

match merge_file(ours, base, theirs) {
    Err(e) if e.to_string().contains("too large") => {
        // fall back to `git merge-file` or manual resolution
    }
    other => other?,
}

Prevention

When it happens

Trigger: Running `gix repo merge file <ours> <theirs>` (via `file`) where one of the involved blobs is larger than the merger's internal size threshold, causing `buffer_by_pick` to return an `Err` mapped to `anyhow!("Participating object was too large")`.

Common situations: Merging huge generated files, minified bundles, large JSON/CSV data files, or datasets committed to the repo that exceed practical merge limits.

Understand the failure class

Background: payload too large / request exceeds maximum size: why libraries cap bytes and how to fix oversize payloads — this error's family across 50 libraries.

Related errors


AI-assisted analysis of GitoxideLabs/gitoxide@e73179060b (2026-09-08). Data as JSON: /api/errors/a066e7edc4de9704. Report an issue: GitHub.

Appendix: source

Thrown at gitoxide-core/src/repository/merge/file.rs:82

        options.text.conflict = conflict;
        options.resolve_binary_with = match conflict {
            Conflict::Keep { .. } => None,
            Conflict::ResolveWithOurs => Some(binary::ResolveWith::Ours),
            Conflict::ResolveWithTheirs => Some(binary::ResolveWith::Theirs),
            Conflict::ResolveWithUnion => None,
        };
    }
    let platform = cache.prepare_merge(&repo.objects, options)?;
    let labels = gix::merge::blob::builtin_driver::text::Labels {
        ancestor: Some(base.as_ref()),
        current: Some(ours.as_ref()),
        other: Some(theirs.as_ref()),
    };
    let mut buf = repo.empty_reusable_buffer();
    let (pick, resolution) = platform.merge(&mut buf, labels, &repo.command_context()?)?;
    let buf = platform
        .buffer_by_pick(pick)
        .map_err(|_| anyhow!("Participating object was too large"))?
        .unwrap_or(&buf);
    out.write_all(buf)?;

    if resolution == Resolution::Conflict {
        bail!("File conflicted")
    }
    Ok(())
}

fn worktree_roots(
    base: Option<gix::Id<'_>>,
    ours: Option<gix::Id<'_>>,
    theirs: Option<gix::Id<'_>>,
    workdir: Option<&Path>,
) -> anyhow::Result<gix::merge::blob::pipeline::WorktreeRoots> {
    let roots = if base.is_none() || ours.is_none() || theirs.is_none() {
        let workdir = workdir.context("A workdir is required if one of the bases are provided as path.")?;
        gix::merge::blob::pipeline::WorktreeRoots {

View on GitHub (pinned to e73179060b)