Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to list ALL git objects in the database?

Is there a better way of getting a raw list of SHA1s for ALL objects in a repository than:
ls .git/objects/??/\*
and
cat .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.

like image 384
kbro Avatar asked Sep 08 '11 13:09

kbro


People also ask

What are the git objects?

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.

Where is the object database located in a git repository?

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.


2 Answers

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.

like image 129
sehe Avatar answered Oct 12 '22 21:10

sehe


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.

like image 40
Erki der Loony Avatar answered Oct 12 '22 23:10

Erki der Loony