Git “Did Not Send All Necessary Objects”: What the Error Means
“Did not send all necessary objects” is one of those Git errors that sounds alarming and usually isn’t. It shows up during a push when your local repository can’t hand over everything it needs to for the remote to accept your history: an interrupted clone, a disk that filled up mid-operation, or a bit of local corruption. Here’s how I work through it, in order, from “probably nothing” to “time to clone again.”
What Causes “Did Not Send All Necessary Objects”
“Did not send all necessary objects” is a Git push error that occurs when your local object database can’t supply every object your new commits depend on — either because a reference points at a hash Git can’t resolve, or because an object is genuinely missing from local storage. Git pushes work by sending the remote every object your commits depend on that it doesn’t already have; when local history is broken or incomplete, Git refuses to push rather than hand the remote a broken history. The error is a symptom of local inconsistency, not something wrong with the remote.
The two failure modes behind this error look different in git fsck --full output and need different fixes:
Symptom in git fsck --full output |
What it means |
Risk |
Fix |
invalid sha1 pointer |
A ref points at a commit hash that doesn’t exist locally |
Push-blocking — must repair |
Rebuild the ref from a healthy remote copy (see Fixing Git’s “Invalid SHA-1 Pointer” Error) |
dangling blob / dangling commit |
An object exists but nothing currently references it |
Harmless clutter |
Inspect with git show, then prune with git gc --prune=now (see Git Dangling Blobs) |
Git Refs and Objects: A Warehouse Analogy for Push Failures
Picture your local object database as a warehouse full of numbered boxes — commits, trees, and blobs — each one addressed by its SHA-1 hash. A ref, such as refs/heads/master, is just an index card taped to the door saying “start at box 4f2a91b3, then follow the chain.” A push doesn’t hand the remote the whole warehouse: it walks the chain your index card points to, skips any box the remote’s own cards already cover, and ships the rest. “Did not send all necessary objects” means that walk hit a box that should be there and isn’t — either your index card points at an empty slot (an invalid pointer), or the chain leads somewhere your warehouse never actually stocked (a missing object). Dangling blobs are the opposite problem: real boxes sitting on the shelf with no index card pointing at them at all. Harmless, just unfiled.
Step 1: Verify Repository Integrity with git fsck
Before changing anything, check what state your repository is actually in with git fsck, Git’s built-in consistency-checking command that walks every object in your local database and reports anything broken, missing, or unreachable:
A clean repository just says “done.” A repository with the problem we’re chasing will show something like this:
Checking object directories: 100% (256/256), done.
Checking objects: 100% (23440/23440), done.
error: refs/heads/master: invalid sha1 pointer 0000000000000000000000000000000000000000
error: refs/remotes/origin/master: invalid sha1 pointer 0000000000000000000000000000000000000000
dangling blob d00180601a9f471a35ee4a57e4ad7e2fd66875a4
dangling commit f5adcb948b48769770bdfaab9da4b7c01ea5c559
Verifying commits in commit graph: 100% (4874/4874), done.
Two things to look out for in that output: invalid sha1 pointer lines, which mean a reference is broken, and dangling objects, which are usually harmless. I cover both below — see Git fsck.
Step 2: Rule Out a Shallow Clone
If this clone was made with git clone --depth 1 (or similar), it never had the full history to begin with — a common default in CI pipelines. Check with:
git rev-parse --is-shallow-repository
If that prints true and you’re pushing to a remote other than the one you shallow-cloned from, fetch the missing history before doing anything else:
If you’re pushing back to the same remote you cloned from, a shallow clone usually isn’t the culprit here — that remote already holds the deeper history and has no need for you to resend it (see Git rev-parse and Git fetch).
Step 3: Fetch the Latest Changes with git fetch
Sometimes the fix really is this dull: your local view of the remote is just out of date, and re-syncing clears the inconsistency.
Replace origin with the name of your remote if it’s different — see Git fetch.
Step 4: Find and Recover Missing Objects with git rev-list
If fetching doesn’t help, find out exactly what your push needs but doesn’t have:
git rev-list --objects --missing=print HEAD
That command lists every object reachable from HEAD, flagging the ones Git can’t find locally (see Git rev-list).
If those specific objects exist in another clone of the same repository — a colleague’s machine, a CI checkout, an old backup — you can push them into the remote from there, giving your broken clone something to fetch back:
# run this from the OTHER clone that actually has the object
git push <remote-name> <SHA-of-missing-object>:refs/heads/tmp-recovery
Running that git push command sends the commit (and everything it depends on) to a throwaway branch on the remote. Once it’s there, fetch it back into your original repository, delete the temporary branch on the remote when you’re done, and try your real push again. This only works if a healthy copy of the object exists somewhere else — you can’t push what nothing has (see Git push).
One catch: refs/heads/tmp-recovery is a branch ref, and a branch ref can only point at a commit. If git rev-list flagged a tree or a blob rather than a commit, pushing its raw SHA straight to a branch ref will be rejected. Push the commit that references it instead — any commit from the healthy clone whose history includes that object will pull the missing tree or blob along with it.
Fixing Git’s “Invalid SHA-1 Pointer” Error
🔒 Subscribe to keep reading.
Git Dangling Blobs: Identify, Inspect, and Clean Up
🔒 Subscribe to keep reading.
Checklist: Recovering from “Did Not Send All Necessary Objects”
🔒 Subscribe to keep reading.
Conclusion: Resolving “Did Not Send All Necessary Objects” in Git
🔒 Subscribe to keep reading.
References
🔒 Subscribe to keep reading.