#!/usr/bin/env perl use v5.10; use warnings; open my $fh, "-|", "git ls-tree -r HEAD" or die $!; my %fs_sha1_path; while ( my $line= <$fh> ) { chomp $line; if ( $line =~ m{ \A \d+ \s+ \w+ \s+ (\w+) \s+ (.*) \z }x ) { my ( $sha1, $path )= ($1, $2 ); if ( -f $path and !-l $path ) { my $fs= -s $path; $fs and push @{ $fs_sha1_path{ $fs }{ $sha1 } }, $path; }; } } for my $fs ( sort { $a <=> $b } keys %fs_sha1_path ) { for my $sha1 ( sort keys %{ $fs_sha1_path{ $fs } } ) { if ( @{ $fs_sha1_path{ $fs }{ $sha1 } } > 1 ) { for my $path ( sort @{ $fs_sha1_path{ $fs }{ $sha1 } } ) { say sprintf "%10d %s..%s %s", $fs, substr($sha1,0,7), substr($sha1,-3), $path; } say '-', ' -' x 39; } } } exit; __END__