git gc / git repack not removing unused objects?
- From
- Jon Nelson <jnelson@jamponi.net>
- Date
- Feb 5, 2010, 19:45 UTC
- Message-ID
- <cccedfc61002051145q1ff673e7s3db3bd7290be25e1@mail.gmail.com>
[Using git 1.6.4.2]
In one repo I have (136G objects directory, fully packed) I'm having some trouble. I've run git-gc --prune=now, git repack -Adf, and so on a half-dozen times and each time I do so it gets bigger, not smaller. Setting that aside for the moment, however, I've run into a stranger problem.
So I use "git verify-pack -v > gvp.out" and "sort -k3nr < gvp.out | head -n 20" to find the top 20 largest blobs. So I have a blob, b32c3d8e8e24d8d3035cf52f606c2873315fe2b8, and now I want to know what tree (or trees) it is in, so I try this:
for i in $( git branch -a | sed -e 's/\*//g' | grep -v branch ); do if git ls-tree -l -r -t $i | grep b32c3d8e8e24d8d3035cf52f606c2873315fe2b8 > /dev/null; then echo $i; fi; done
The results: no branch or tree appears to contain that blob.
So I tried a different approach:
for i in $( grep tree gvp.out | awk '{ print $1 }' ); do if git ls-tree $i | grep b32c3d8e8e24d8d3035cf52f606c2873315fe2b8 > /dev/null; then echo $i; fi ; done
This time, I find (at least) one tree (d813af1537358496ca34958bbff08b87590607bf) with the blob. But which branches might that tree appear in? None.
For each branch, I ran "git ls-tree -l -r -t" and saved the output in a file (one per branch). Then I grepped each file for the tree ( (d813af1537358496ca34958bbff08b87590607bf) - no luck. I grepped each file for the blob (b32...) - no luck.
The results seem to suggest that I have packed trees which reference blobs, but that the trees themselves are not referenced in any branch and therefore I would expect that they would be pruned.
-- Jon