Is there a better way of getting a raw list of SHA1s for ALL objects in a repository than:ls .git/objects/??/\*
andcat .git/objects/pack/*.idx | git show-index
I know about git rev-list --all
but that only lists commit objects that are referenced by .git/refs
, and I'm looking for everything, including unreferenced objects that are created by git-hash-object
, git-mktree
etc.
There are 3 main types of objects that git stores: Blob: This object as we have seen above stores the original content. Tree: This object is used to store directories present in our project. Commit: This object is created whenever a commit is made and abstracts all the information for that particular commit.
The most important folder we will be looking at is the . git folder. This folder is where Git stores all its data that is project specific.
Try
git rev-list --objects --all
Edit Josh made a good point:
git rev-list --objects -g --no-walk --all
list objects reachable from the ref-logs.
To see all objects in unreachable commits as well:
git rev-list --objects --no-walk \ $(git fsck --unreachable | grep '^unreachable commit' | cut -d' ' -f3)
Putting it all together, to really get all objects in the output format of rev-list --objects
, you need something like
{ git rev-list --objects --all git rev-list --objects -g --no-walk --all git rev-list --objects --no-walk \ $(git fsck --unreachable | grep '^unreachable commit' | cut -d' ' -f3) } | sort | uniq
To sort the output in slightly more useful way (by path for tree/blobs, commits first) use an additional | sort -k2
which will group all different blobs (revisions) for identical paths.
I don’t know since when this option exists but you can
git cat-file --batch-check --batch-all-objects
This gives you, according to the man page,
all objects in the repository and any alternate object stores (not just reachable objects)
(emphasis mine).
By default this yields the object type and it’s size together with each hash but you can easily remove this information, e.g. with
git cat-file --batch-check --batch-all-objects | cut -d' ' -f1
or by giving a custom format to --batch-check
.
Edit: If you don't care about the order you can (since Git 2.19) add the flag --unordered
to speed things up. See VonC's answer for more details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With