2009-08-17 26 views
44

Có thể nhận thông tin về số lượng không gian bị lãng phí do thay đổi trong mọi cam kết - vì vậy tôi có thể tìm thấy các cam kết đã thêm tệp lớn hoặc nhiều tệp. Đây là tất cả để cố gắng giảm kích thước git repo (rebasing và có thể lọc cam kết)git tìm thấy chất béo cam kết

+1

xem xét việc chỉ chạy 'git gc' thỉnh thoảng , có thể là 'git gc --aggressive' – Hasturkun

+0

' git gc' (và 'git gc --prune'); '--aggresive' thậm chí có thể cho kết quả tồi tệ hơn (nhưng thường không nên), và thường không đáng giá. –

+0

Câu trả lời này tốt hơn nhiều: http://stackoverflow.com/a/10847242/520567 – akostadinov

Trả lời

16

Quên để trả lời, câu trả lời của tôi là:

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: Nếu tôi đọc kịch bản của bạn một cách chính xác, nó chỉ đưa vào các tệp tài khoản được _added_ trong một cam kết cụ thể. Nó sẽ không phát hiện khi một tập tin tăng đáng kể trong một cam kết. – kynan

+0

@kynan: Bạn nói đúng, vì đó là những gì mà OP yêu cầu (và những gì tôi cần). Nhưng thật dễ dàng để thay đổi tập lệnh để phát hiện các tệp đã sửa đổi: Về cơ bản, bạn chỉ cần thay thế "A" bằng "M" trong lệnh gọi grep. Điều đó sẽ báo cáo tổng kích thước tệp sau khi sửa đổi (không phải số byte được thêm/xóa). Tôi vui vẻ chấp nhận một yêu cầu kéo trên GitHub để làm cho kịch bản chung chung hơn. – sschuberth

+7

Liên kết bị hỏng, tập lệnh hiện được đặt tại [đây] (https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) – Luke

1

git cat-file -s <object> trong đó <object> có thể tham khảo cam kết, blob, cây hoặc thẻ.

21

Bạn có thể làm điều này:

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

này sẽ hiển thị các tập tin lớn nhất ở phía dưới (cột thứ tư là các tập tin (blob) kích thước

Nếu bạn cần phải nhìn vào các chi nhánh khác nhau mà bạn'. .. sẽ muốn thay đổi HEAD để những tên chi nhánh hoặc, đặt điều này trong một vòng lặp qua các chi nhánh, thẻ hoặc vòng quay bạn quan tâm đến

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

Và tôi cũng khuyên bạn nên sử dụng git format-patch để nhận kích thước cam kết (sẽ có kích thước bổ sung cho tiêu đề thư, nhưng thực sự nếu bạn cần cam kết nhanh không quá lớn - không quan trọng lắm để có được kích thước chính xác, + - 1K sẽ là độ chính xác tốt) –

2

git fat find N trong đó N là bằng byte sẽ trả lại tất cả các tập tin trong toàn bộ lịch sử lớn hơn N byte.

Bạn có thể tìm hiểu thêm về git-chất béo ở đây: https://github.com/cyaninc/git-fat

+0

Rất tiếc. Tôi đã thử nó trên Git Shell cho Windows đi kèm với GitHub Desktop và lệnh không hoạt động, cho tôi một lỗi. – DucRP

3

Tất cả các giải pháp cung cấp ở đây tập trung vào tập tin kích thước nhưng câu hỏi ban đầu hỏi là về cam kết kích thước, mà theo ý kiến ​​của tôi, và trong trường hợp của tôi, quan trọng hơn là tìm (vì điều tôi muốn là loại bỏ nhiều tập tin nhị phân nhỏ được giới thiệu trong một cam kết đơn lẻ, tổng cộng chiếm rất nhiều kích thước, nhưng kích thước nhỏ nếu được đo theo từng tệp).

Một giải pháp tập trung vào cam kết kích thước là cung cấp here, đó là này kịch bản 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` ; 
# } 
} 

Và mà tôi gọi là như thế này:

./git-commit-sizes.pl | sort -n -k 1 
Các vấn đề liên quan