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
Trả lời
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
@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
@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
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
git cat-file -s <object>
trong đó <object>
có thể tham khảo cam kết, blob, cây hoặc thẻ.
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
Cá nhân, tôi tìm thấy câu trả lời này là hữu ích nhất khi cố gắng tìm file lớn trong lịch sử của một repo git: Find files in git repo over x megabytes, that don't exist in HEAD
#!/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
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) –
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
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
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
- 1. Thư viện chất béo trong XCode 5
- 2. Xấu cam kết Git
- 3. Làm cách nào để tìm thấy cam kết git gần đây nhất đã sửa đổi tệp?
- 4. Git cam kết từ python
- 5. Nhúng Tomcat với Ứng dụng trong Một Thùng Chất béo
- 6. Git cố gắng tìm nạp cam kết Null khi đẩy
- 7. Tìm kiếm các cam kết git Sử dụng Regex
- 8. tìm cam kết đầu tiên của một tệp trong git
- 9. Git tìm hiểu cam kết cuối cùng tôi đã đẩy
- 10. git look cam kết đăng nhập cho cam kết id
- 11. git add/rm (cam kết)
- 12. Hợp nhất Git cam kết
- 13. Xóa git cũ cam kết
- 14. Tách cam kết đầu tiên trong git
- 15. Khôi phục cam kết git trước đó?
- 16. Git rebase cam kết lựa chọn
- 17. Cam kết trong một gói git
- 18. Xem một Git cụ thể cam kết
- 19. Làm thế nào để bạn tìm thấy ai đã sáp nhập một cam kết git vào một chi nhánh?
- 20. Cách tìm số lượng tệp đã thay đổi từ một cam kết này sang cam kết khác trong git
- 21. Git-Repo tìm kiếm chuỗi trong tất cả các tệp đã cam kết (chi nhánh chưa biết và cam kết)
- 22. xóa cam kết git đầu tiên
- 23. nhận thẻ cam kết trong git
- 24. Rollback để git cam kết cuối cùng
- 25. git: squash/fixup trước đó cam kết
- 26. vô tình đã cam kết trong git
- 27. Rác thu thập cam kết trong git
- 28. git không thể chỉnh sửa cam kết
- 29. Git ký tắt cam kết trước đó?
- 30. Git: truy xuất cam kết cụ thể
xem xét việc chỉ chạy 'git gc' thỉnh thoảng , có thể là 'git gc --aggressive' – Hasturkun
' 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á. –
Câu trả lời này tốt hơn nhiều: http://stackoverflow.com/a/10847242/520567 – akostadinov