สคริปต์ git-fatfiles จากคำตอบของ Vi นั้นน่ารักถ้าคุณต้องการดูขนาดของ blobs ทั้งหมดของคุณ แต่มันช้ามากจนใช้ไม่ได้ ฉันลบขีด จำกัด เอาต์พุต 40 บรรทัดและพยายามใช้ RAM ของคอมพิวเตอร์ทั้งหมดแทนการทำจนจบ ดังนั้นฉันจึงเขียนใหม่: เร็วกว่าเป็นพันเท่าเพิ่มคุณสมบัติ (ตัวเลือก) และข้อผิดพลาดบางอย่างที่ถูกลบออก - เวอร์ชันเก่าจะนับไม่ถูกต้องหากคุณรวมเอาท์พุทเพื่อดูพื้นที่ทั้งหมดที่ใช้โดยไฟล์
#!/usr/bin/perl
use warnings;
use strict;
use IPC::Open2;
use v5.14;
# Try to get the "format_bytes" function:
my $canFormat = eval {
require Number::Bytes::Human;
Number::Bytes::Human->import('format_bytes');
1;
};
my $format_bytes;
if ($canFormat) {
$format_bytes = \&format_bytes;
}
else {
$format_bytes = sub { return shift; };
}
# parse arguments:
my ($directories, $sum);
{
my $arg = $ARGV[0] // "";
if ($arg eq "--sum" || $arg eq "-s") {
$sum = 1;
}
elsif ($arg eq "--directories" || $arg eq "-d") {
$directories = 1;
$sum = 1;
}
elsif ($arg) {
print "Usage: $0 [ --sum, -s | --directories, -d ]\n";
exit 1;
}
}
# the format is [hash, file]
my %revList = map { (split(' ', $_))[0 => 1]; } qx(git rev-list --all --objects);
my $pid = open2(my $childOut, my $childIn, "git cat-file --batch-check");
# The format is (hash => size)
my %hashSizes = map {
print $childIn $_ . "\n";
my @blobData = split(' ', <$childOut>);
if ($blobData[1] eq 'blob') {
# [hash, size]
$blobData[0] => $blobData[2];
}
else {
();
}
} keys %revList;
close($childIn);
waitpid($pid, 0);
# Need to filter because some aren't files--there are useless directories in this list.
# Format is name => size.
my %fileSizes =
map { exists($hashSizes{$_}) ? ($revList{$_} => $hashSizes{$_}) : () } keys %revList;
my @sortedSizes;
if ($sum) {
my %fileSizeSums;
if ($directories) {
while (my ($name, $size) = each %fileSizes) {
# strip off the trailing part of the filename:
$fileSizeSums{$name =~ s|/[^/]*$||r} += $size;
}
}
else {
while (my ($name, $size) = each %fileSizes) {
$fileSizeSums{$name} += $size;
}
}
@sortedSizes = map { [$_, $fileSizeSums{$_}] }
sort { $fileSizeSums{$a} <=> $fileSizeSums{$b} } keys %fileSizeSums;
}
else {
# Print the space taken by each file/blob, sorted by size
@sortedSizes = map { [$_, $fileSizes{$_}] }
sort { $fileSizes{$a} <=> $fileSizes{$b} } keys %fileSizes;
}
for my $fileSize (@sortedSizes) {
printf "%s\t%s\n", $format_bytes->($fileSize->[1]), $fileSize->[0];
}
ตั้งชื่อ git-fatfiles.pl นี้และเรียกใช้ หากต้องการดูพื้นที่ดิสก์ที่ใช้โดยการแก้ไขไฟล์ทั้งหมดให้ใช้--sumตัวเลือก หากต้องการดูสิ่งเดียวกัน แต่สำหรับไฟล์ภายในแต่ละไดเรกทอรีให้ใช้--directoriesตัวเลือก หากคุณติดตั้งโมดูลNumber :: Bytes :: Human cpan (รัน "cpan Number :: Bytes :: Human") ขนาดจะถูกจัดรูปแบบ: "21M /path/to/file.mp4"