2012-02-26 22 views
23

Tôi muốn tìm 10 tệp lớn nhất trong kho lưu trữ của mình. Kịch bản tôi đưa ra là như sau:Cách tìm N tệp lớn nhất trong kho lưu trữ git?

REP_HOME_DIR=<top level git directory> 
max_huge_files=10 

cd ${REP_HOME_DIR} 
git verify-pack -v ${REP_HOME_DIR}/.git/objects/pack/pack-*.idx | \ 
    grep blob | \ 
    sort -r -k 3 -n | \ 
    head -${max_huge_files} | \ 
    awk '{ system("printf \"%-80s \" `git rev-list --objects --all | grep " $1 " | cut -d\" \" -f2`"); printf "Size:%5d MB Size in pack file:%5d MB\n", $3/1048576, $4/1048576; }' 
cd - 

Có cách nào tốt hơn/thanh lịch hơn để làm tương tự không?

Bởi "tệp", tôi có nghĩa là các tệp đã được kiểm tra trong kho lưu trữ.

+0

Đây có phải là thực sự đối với bất kỳ thư mục, hoặc là có một cái gì đó cụ thể về git bạn đang cố gắng tìm ra? Bởi bạn ống, tôi giả sử bất kỳ lệnh unix là ok? –

+0

Bạn có nghĩa là các tệp đang được theo dõi hoặc tệp trên đĩa không? Chúng có thể không tương quan theo cách bạn mong đợi. – Daenyth

+0

Các tệp đã được kiểm tra vào kho lưu trữ. – Sumit

Trả lời

1

Bạn cũng có thể sử dụng du - Ví dụ: du -ah objects | sort -n -r | head -n 10. du để lấy kích thước của các đối tượng, sort chúng và sau đó chọn top 10 bằng cách sử dụng head.

+0

chỉ cho đối tượng không phải là tên của tệp. Sẽ yêu cầu thủ thuật để bỏ qua các tập tin gói là tốt. – Sumit

13

Làm thế nào về

git ls-files | xargs ls -l | sort -nrk5 | head -n 10 

git ls-files: List all the files in the repo 
xargs ls -l: perform ls -l on all the files returned in git ls-files 
sort -nrk5: Numerically reverse sort the lines based on 5th column 
head -n 10: Print the top 10 lines 
+1

Điều này được dựa trên các tệp trong phiên bản thanh toán hiện tại của tôi. Nếu một tệp 10MB đã được cam kết và sau đó nó bị ghi đè bởi một phiên bản 1KB khác, lệnh này sẽ không liệt kê tệp đó. – Sumit

+2

Câu trả lời này không thành công khi bạn có khoảng trống trong tên tệp/thư mục (mặc dù bạn nhận được ** một số kết quả **). Thay đổi nhỏ này khắc phục vấn đề đó: 'git ls-files -z | xargs -0 ls -l | sắp xếp -nrk5 | đầu -n 10' –

+0

Tôi sẽ sử dụng một dạng đơn giản hơn: 'git ls-files -z | xargs -0 ls -l -h -S -r'. Điều này sẽ giúp bạn có được danh sách tất cả các tệp trong repo được đặt hàng từ nhỏ nhất đến lớn nhất với kích thước có thể đọc được của con người. Nếu bạn muốn cắt bớt danh sách, bạn có thể sử dụng 'head' hoặc' tail' để trợ giúp. 5 xu của tôi có giá trị ... – Hans

31

tôi tìm thấy một cách khác để làm điều đó:

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

Trích dẫn từ: SO: git find fat commit

+9

Câu trả lời hay - tôi sẽ đổi nó thành 'git ls-tree -r -l --abbrev - tên đầy đủ HEAD | sắp xếp -n -r -k 4 | head -n 10': bạn không cần '-t' vì bạn không quan tâm đến danh sách cây (không cho kích thước),' --abbrev' làm cho hàm băm dễ đọc hơn và 'đầu' thay vì' đuôi' cho danh sách theo thứ tự kích thước giảm dần – dumbledad

0

Bạn có thể sử dụng find để tìm file lớn hơn một cho trước ngưỡng, sau đó chuyển chúng đến git ls-files để loại trừ các tệp không được theo dõi (ví dụ: xây dựng đầu ra):

find * -type f -size +100M -print0 | xargs -0 git ls-files 

Điều chỉnh 100M (100 megabyte) khi cần thiết cho đến khi bạn nhận được kết quả.

Thông báo nhỏ: thao tác này sẽ không tìm kiếm các tệp và thư mục "ẩn" cấp cao nhất (nghĩa là những tên có tên bắt đầu bằng .). Điều này là do tôi đã sử dụng find * thay vì chỉ find để tránh tìm kiếm cơ sở dữ liệu .git.

Tôi gặp sự cố khi nhận các giải pháp sort -n hoạt động (trên Windows dưới Git Bash). Tôi đoán đó là do sự khác biệt thụt lề khi xargs lô đối số, trong đó xargs -0 có vẻ tự động làm việc xung quanh giới hạn độ dài dòng lệnh của Windows là 32767.

6

bash "one-liner" này hiển thị 10 đốm lớn nhất trong kho lưu trữ, được sắp xếp từ nhỏ nhất đến lớn nhất. Ngược lại với các câu trả lời khác, số này bao gồm tất cả tệp được theo dõi bởi kho lưu trữ, ngay cả những tệp không có trong bất kỳ mẹo chi nhánh nào.

Đó là rất nhanh, dễ dàng sao chép & dán và chỉ yêu cầu tiện ích GNU tiêu chuẩn.

git rev-list --objects --all \ 
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \ 
| awk '/^blob/ {print substr($0,6)}' \ 
| sort --numeric-sort --key=2 \ 
| tail \ 
| cut --complement --characters=13-40 \ 
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest 

Bốn dòng đầu tiên thực hiện các chức năng cốt lõi, thứ năm giới hạn số lượng kết quả, trong khi hai dòng cuối cùng cung cấp thoải mái con người có thể đọc được đầu ra trông như thế này:

... 
0d99bb931299 530KiB path/to/some-image.jpg 
2ba44098e28f 12MiB path/to/hires-image.png 
bd1741ddce0d 63MiB path/to/some-video-1080p.mp4 

Để biết thêm thông tin, bao gồm các trường hợp sử dụng bộ lọc tiếp theo và định dạng đầu ra phù hợp hơn để xử lý tập lệnh, hãy xem original answer của tôi cho một câu hỏi tương tự.

+1

bạn không đùa đâu, nhanh quá! – LeoR

1

Một cải tiến để đáp raphinesse của, sắp xếp theo kích thước với lớn đầu tiên:

git rev-list --objects --all \ 
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \ 
| awk '/^blob/ {print substr($0,6)}' \ 
| sort --numeric-sort --key=2 --reverse \ 
| head \ 
| cut --complement --characters=13-40 \ 
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest 
+0

Tôi hầu như không gọi đó là cải tiến. Đó là một vấn đề ưu tiên hơn. Thêm vào đó, nếu ai đó chỉ muốn đảo ngược thứ tự dòng, họ có thể chỉ đơn giản là viết đầu ra của tập lệnh gốc của tôi thông qua 'tac'. – raphinesse

Các vấn đề liên quan