#!/bin/bash # # Copyright (C) 2014 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Show n largest objects in a git repo's pack files. # # usage: # $ reposize.sh 100 # find and list biggest 100 objects # # derived from # http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/ if [ ! $# == 1 ]; then echo " Usage: $0 if there are loose objects the script will run 'git gc' to move all data to packs " exit fi # find git repository directory gitdir=$(git rev-parse --git-dir 2>.error.log) if [ $? -ne 0 ]; then echo $(cat .error.log) rm .error.log exit fi rm .error.log object_count=$(git count-objects -v | grep count: | cut -f 2 -d ' ') if [ $object_count -gt 1 ]; then echo "-------------------------------------------------------" echo "$object_count loose objects found in repository $gitdir" echo "-> running git gc to move all data to packs" git gc echo "-------------------------------------------------------" fi # set the internal field separator to line break, so that we can iterate easily over the verify-pack output IFS=$'\n'; # list all objects including their size, sort by size, take top $1 biggest blobs objects=$(git verify-pack -v $gitdir/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head -n $1) echo "All sizes are in kiB's. The pack column is the size of the object, compressed, inside the pack file." output="size,pack,SHA,location" for y in $objects do # extract the size in bytes size=$(($(echo $y | cut -f 5 -d ' ') / 1024)) # extract the compressed size in bytes compressedSize=$(($(echo $y | cut -f 6 -d ' ') / 1024)) # extract the SHA sha=$(echo $y | cut -f 1 -d ' ') # find the objects location in the repository tree other=$(git rev-list --all --objects | grep $sha) output="${output}\n${size},${compressedSize},${other}" done echo -e $output | column -t -s ', '