2009-08-17 14 views
44

Czy można uzyskać informacje o tym, ile miejsca marnuje się przez zmiany w każdym zatwierdzeniu - tak, że mogę znaleźć zatwierdzenia, które dodały duże pliki lub wiele plików. Chodzi o to, aby spróbować zmniejszyć rozmiar repozytorium git (ponowne przesłanie, a może zatwierdzenie filtrowania)git find fat commit

+1

Rozważ prostu działa 'git gc' sporadycznie , prawdopodobnie jako 'git gc --aggressive' – Hasturkun

+0

' git gc' (i 'git gc --prune'); "--aggresive" może nawet dać gorsze wyniki (ale zazwyczaj nie powinno) i zwykle nie jest tego warte. –

+0

Ta odpowiedź jest znacznie lepsza: http://stackoverflow.com/a/10847242/520567 – akostadinov

Odpowiedz

16

Zapomniałem odpowiedzieć, moja odpowiedź brzmi:

git rev-list --all --pretty=format:'%H%n%an%n%s' # get all commits 
git diff-tree -r -c -M -C --no-commit-id #{sha}  # get new blobs for each commit 
git cat-file --batch-check << blob ids    # get size of each blob 
+1

@sschuberth: Jeśli poprawnie odczytam twój skrypt, bierze pod uwagę tylko pliki, które _added_ w konkretnym zatwierdzeniu. Nie wykryje, kiedy plik znacząco się zwiększył podczas zatwierdzania. – kynan

+0

@kynan: Masz rację, ponieważ o to prosił PO (i czego potrzebowałem). Ale łatwo jest zmienić skrypt w celu wykrycia zmodyfikowanych plików: Zasadniczo wystarczy zastąpić "A" przez "M" w wywołaniu grep. To pokaże całkowity rozmiar pliku po modyfikacji (nie liczba dodanych/usuniętych bajtów). Z przyjemnością przyjmuję żądanie ściągnięcia na GitHub, aby skrypt był bardziej ogólny. – sschuberth

+7

Złamany link, skrypt znajduje się teraz [tutaj] (https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke

1

git cat-file -s <object> gdzie <object> może odnosić się do commit, blob, drzewa lub tagu.

21

Można to zrobić:

git ls-tree -r -t -l --full-name HEAD | sort -n -k 4 

To pokaże największe pliki na dole (czwarta kolumna jest plik (blob) wielkość

Jeśli trzeba szukać w różnych gałęziach ty”. .. ll chcesz zmienić udaj się do tych nazw oddział lub umieścić to w pętli na gałęziach, znaczniki lub obroty jesteś zainteresowany

1
#!/bin/bash 
COMMITSHA=$1 

CURRENTSIZE=$(git ls-tree -lrt $COMMITSHA | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc) 
PREVSIZE=$(git ls-tree -lrt $COMMITSHA^ | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc) 
echo "$CURRENTSIZE - $PREVSIZE" | bc 
+0

A także proponuję użyć łatki w formacie git, aby uzyskać rozmiar zatwierdzenia (będzie dodatkowy rozmiar nagłówka poczty, ale w rzeczywistości, jeśli trzeba szybko zatwierdzić, nie jest zbyt duży - to nie jest tak ważne aby uzyskać dokładny rozmiar, + - 1K będzie dobrą dokładnością) –

2

git fat find N gdzie N jest w bajtach zwróci wszystkie pliki w całości historia, która jest większa niż N bajtów.

Możesz dowiedzieć się więcej na temat git-fat tutaj: https://github.com/cyaninc/git-fat

+0

Bummer. Próbowałem go na Git Shell dla Windows, który jest dostarczany z GitHub Desktop i polecenie nie działa, dając mi błąd. – DucRP

3

Wszystkie rozwiązań przewidzianych tu skupić się na rozmiary plików ale oryginalne pytanie zadane było o popełnić rozmiary, które moim zdaniem, w moim przypadku ważniejsze było znalezienie (ponieważ chciałem pozbyć się wielu małych plików binarnych wprowadzonych w pojedynczym zatwierdzeniu, którego suma stanowiła duży rozmiar, ale mały rozmiar, jeśli jest mierzony indywidualnie w pliku).

Rozwiązanie, które skupia się na popełnić rozmiary jest warunkiem here, który jest ten skrypt Perl:

#!/usr/bin/perl 
foreach my $rev (`git rev-list --all --pretty=oneline`) { 
    my $tot = 0; 
    ($sha = $rev) =~ s/\s.*$//; 
    foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) { 
    $blob = (split /\s/, $blob)[3]; 
    next if $blob == "0000000000000000000000000000000000000000"; # Deleted 
    my $size = `echo $blob | git cat-file --batch-check`; 
    $size = (split /\s/, $size)[2]; 
    $tot += int($size); 
    } 
    my $revn = substr($rev, 0, 40); 
# if ($tot > 1000000) { 
    print "$tot $revn " . `git show --pretty="format:" --name-only $revn | wc -l` ; 
# } 
} 

I co ja nazywam to tak:

./git-commit-sizes.pl | sort -n -k 1