tags:

views:

1055

answers:

5

145M = .git/objects/pack/

I wrote a script to add up the sizes of differences of each commit and the commit before it going backwards from the tip of each branch. I get 129 megs. That's without compression and without accounting for same files across branches and common history among branches. Git takes all those things into account so I would expect much much smaller repository. So why is .git so big?

i've done:

git fsck --full
git gc --prune=today --aggressive
git repack

To answer about how many files/commits, I have 19 branches about 40 files in each. 287 commits, found using

git log --oneline --all|wc -l

It should not be taking 10's of megabytes to store information about this.

+1  A: 

Did you try using git repack?

docgnome
Good question. I did, I also got the impression that git gc does that also?
Ian Kelling
It does with git gc --auto Not sure about what you used.
docgnome
+2  A: 

Other git objects stored in .git include trees, commits, and tags. Commits and tags are small, but trees can get big particularly if you have a very large number of small files in your repository. How many files and how many commits do you have?

Greg Hewgill
Good question. 19 branches with about 40 files in each. git count-objects -v says "in-pack: 1570". Not sure exactly what that means or how to count how many commits I have. A few hundred I'd guess.
Ian Kelling
Ok, it doesn't sound like that is the answer then. A few hundred will be insignificant compared to 145 MB.
Greg Hewgill
+3  A: 
CesarB
+3  A: 

I recently pulled the wrong remote repository into the local one (git remote add ... and git remote update). After deleting the unwanted remote ref, branches and tags I still had 1.4GB (!) of wasted space in my repository. I was only able to get rid of this by cloning it with git clone file:///path/to/repository. Note that the file:// makes a world of difference when cloning a local repository - only the referenced objects are copied across, not the whole directory structure.

Edit: Here's Ian's one liner:

d1=#original repo
d2=#new repo
cd $d1
for b in $(git branch | cut -c 3-)
do
    git checkout $b
    x=$(git rev-parse HEAD)
    cd $d2
    git checkout -b $b $x
    cd $d1
done
pgs
wow. THANK YOU. .git = 15M now!! after cloning, here is a little 1 liner for preserving your previous branches. d1=#original repo; d2=#new repo; cd $d1; for b in $(git branch | cut -c 3-); do git checkout $b; x=$(git rev-parse HEAD); cd $d2; git checkout -b $b $x; cd $d1; done
Ian Kelling
if you check this, you could add the 1 liner to your answer so its formatted as code.
Ian Kelling
+3  A: 

git gc already does a git repack so there is no sense in manually repacking unless you are going to be passing some special options to it.

The first step is to see whether the majority of space is (as would normally be the case) your object database.

git count-objects -v

This should give a report of how many unpacked objects there are in your repository, how much space they take up, how many pack files you have and how much space they take up.

Ideally, after a repack, you would have no unpacked objects and one pack file but it's perfectly normal to have some objects which aren't directly reference by current branches still present and unpacked.

If you have a single large pack and you want to know what is taking up the space then you can list the objects which make up the pack along with how they are stored.

git verify-pack -v .git/objects/pack/pack-*.idx

Note that verify-pack takes an index file and not the pack file itself. This give a report of every object in the pack, its true size and its packed size as well as information about whether it's been 'deltified' and if so the origin of delta chain.

To see if there are any unusally large objects in your repository you can sort the output numerically on the third of fourth columns (e.g. | sort -k3n).

From this output you will be able to see the contents of any object using the git show command, although it is not possible to see exactly where in the commit history of the repository the object is referenced. If you need to do this, try something from this question.

Charles Bailey
This found the big objects great. The accepted answer got rid of them.
Ian Kelling