unixorn/git-extra-commands

View on GitHub
bin/git-big-file

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby
# Author: Mislav Marohnić  <mislav.marohnic@gmail.com>
# https://github.com/mislav/dotfiles
#
## Usage: git big-file [HEAD [treshold]]
#
# Treshold is in MB (default: 0.1)

head, treshold = ARGV
head ||= 'HEAD'
Megabyte = 1000 ** 2
treshold = (treshold || 0.1).to_f * Megabyte

big_files = {}

IO.popen("git rev-list #{head}", 'r') do |rev_list|
  rev_list.each_line do |commit|
    commit.chomp!
    for object in `git ls-tree -zrl #{commit}`.split("\0")
      bits, type, sha, size, path = object.split(/\s+/, 5)
      size = size.to_i
      big_files[sha] = [path, size, commit] if size >= treshold
    end
  end
end

big_files.each do |sha, (path, size, commit)|
  where = `git show -s #{commit} --format='%h: %cr'`.chomp
  puts "%4.1fM\t%s\t(%s)" % [size.to_f / Megabyte, path, where]
end