#!/usr/bin/env perl use strict; use warnings; use Cwd qw/chdir getcwd/; sub dir_size { my $dir = shift; return (split(/\s+/,qx/du -sb $dir/))[0]; } my $orig_dir = getcwd(); my @dirs = grep { -d $_ && ( -d "$_/.git" || $_ =~ /\.git$/ ) } glob('*'); print "Will do: @dirs\n"; my %size_before = map { $_ => dir_size($_)} @dirs; my $total_size_before = do { my $tot = 0; map { $tot += $size_before{$_} } keys %size_before; $tot; }; # show them from the smallest length to longest so \r works fine foreach my $dir ( map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [$_,length $_] } @dirs ) { chdir $dir; print "\rGit gc'ing $dir.."; qx{git gc >/dev/null 2<&1}; qx{git repack -a >/dev/null 2<&1}; chdir $orig_dir; } print "\nDone\n"; my %size_after = map { $_ => dir_size($_) } @dirs; my $total_size_after = do { my $tot = 0; map { $tot += $size_after{$_} } keys %size_after; $tot; }; my @tots = ( $total_size_before, $total_size_after ); my $longest_dir = -( sort { $b <=> $a } map { length $_ } @dirs )[0]; my $longest_size_before = - length $total_size_before; my $longest_size_after = - length $total_size_after; printf("%${longest_dir}s %${longest_size_before}s %${longest_size_after}s %s\n", 'directory', 'before', 'after', 'difference' ); print '-'x72, "\n"; foreach my $dir (keys %size_after) { printf("%${longest_dir}s %${longest_size_before}s %${longest_size_after}s %s\n", $dir, $size_before{$dir} // '', $size_after{$dir} // '', ($size_before{$dir} // 0) - ($size_after{$dir} // 00), ); } print '-'x72, "\n"; printf("%${longest_dir}s %${longest_size_before}s %${longest_size_after}s %s\n", 'Totals', $total_size_before, $total_size_after, $total_size_before - $total_size_after );