SORU
18 Kasım 2008, Salı


't don KAFA var O x megabayt, git repo dosyalar

Rastgele şeyler depolamak depoyu Git. Çoğunlukla rastgele komut dosyaları, metin dosyaları, dizayn ve benzeri ettim siteleri.

Revizyon tarihindeki ihtiyacım yok olan depo, boyutunu artırma oturuyor ve bu süre içinde (genellikle 1-5 MB) sildiniz bazı büyük ikili dosyaları vardır.

Temelde.. yapmak mümkün olmak istiyorum

me@host:~$ [magic command or script]
aad29819a908cc1c05c3b1102862746ba29bafc0 : example/blah.psd : 3.8MB : 130 days old
6e73ca29c379b71b4ff8c6b6a5df9c7f0f1f5627 : another/big.file : 1.12MB : 214 days old

..o zaman her sonuç olsa da gitmek mümkün, eğer artık gerekli mi diye kontrol sonra (muhtemelen filter-branch kullanarak) kaldırılıyor

CEVAP
18 Kasım 2008, Salı


Bu the git-find-blob script I posted previously bir adaptasyon

#!/usr/bin/perl
use 5.008;
use strict;
use Memoize;

sub usage { die "usage: git-large-blob <size[b|k|m]> [<git-log arguments ...>]\n" }

@ARGV or usage();
my ( $max_size, $unit ) = ( shift =~ /^(\d )([bkm]?)\z/ ) ? ( $1, $2 ) : usage();

my $exp = 10 * ( $unit eq 'b' ? 0 : $unit eq 'k' ? 1 : 2 );
my $cutoff = $max_size * 2**$exp; 

sub walk_tree {
    my ( $tree, @path ) = @_;
    my @subtree;
    my @r;

    {
        open my $ls_tree, '-|', git => 'ls-tree' => -l => $tree
            or die "Couldn't open pipe to git-ls-tree: $!\n";

        while ( <$ls_tree> ) {
            my ( $type, $sha1, $size, $name ) = /\A[0-7]{6} (\S ) (\S )  (\S )\t(.*)/;
            if ( $type eq 'tree' ) {
                push @subtree, [ $sha1, $name ];
            }
            elsif ( $type eq 'blob' and $size >= $cutoff ) {
                push @r, [ $size, @path, $name ];
            }
        }
    }

    push @r, walk_tree( $_->[0], @path, $_->[1] )
        for @subtree;

    return @r;
}

memoize 'walk_tree';

open my $log, '-|', git => log => @ARGV, '--pretty=format:%T %h %cr'
    or die "Couldn't open pipe to git-log: $!\n";

my %seen;
while ( <$log> ) {
    chomp;
    my ( $tree, $commit, $age ) = split " ", $_, 3;
    my $is_header_printed;
    for ( walk_tree( $tree ) ) {
        my ( $size, @path ) = @$_;
        my $path = join '/', @path;
        next if $seen{ $path }  ;
        print "$commit $age\n" if not $is_header_printed  ;
        print "\t$size\t$path\n";
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
Git

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FPSRussia

    FPSRussia

    19 NİSAN 2010
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006