2012-11-15 30 views
18

Tôi cần làm cho repo nhỏ hơn. Tôi nghĩ rằng tôi có thể làm cho nó nhỏ hơn bằng cách loại bỏ các tập tin nhị phân có vấn đề từ lịch sử git:Làm cách nào để tìm ra tệp nào chiếm nhiều dung lượng nhất trong git repo?

git filter-branch --index-filter 'git rm --cached --ignore-unmatch BigFile' 

Và sau đó giải phóng các đối tượng:

rm -rf .git/refs/original/ 
git reflog expire --expire=now --all 
git gc --aggressive --prune=now 

(. Hãy bình luận nếu những lệnh là sai)

Sự cố: Cách xác định những tệp lớn đó để tôi có thể xác định xem có xóa chúng khỏi lịch sử git không? Nhiều khả năng họ đang không ở trong cây làm việc nữa - họ đã bị xóa và có lẽ cũng untracked với:

git rm --cached BigFile 

Trả lời

17

Bạn có thể tìm ID hash của các đối tượng lớn như thế này:

git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr 

Sau đó, đối với một SHA cụ thể, bạn có thể thực hiện việc này để lấy tên tệp:

git rev-list --all --objects | grep <SHA> 

Không chắc chắn liệu có cách nào hiệu quả hơn không. Nếu bạn biết chắc chắn rằng mọi thứ nằm trong các tệp gói (không phải là các đối tượng lỏng lẻo), thì git verify-pack -v sẽ tạo ra đầu ra bao gồm kích thước và dường như nhớ một đoạn mã ở đâu đó sẽ phân tích đầu ra đó và khớp với từng đối tượng sao lưu với các tệp gốc.

11

twalberg's answer thực hiện thủ thuật. Tôi đã kết thúc trong một vòng lặp để bạn có thể liệt kê các file theo thứ tự theo kích thước:

while read -r largefile; do 
    echo $largefile | awk '{printf "%s %s ", $1, $3 ; system("git rev-list --all --objects | grep " $1 " | cut -d \" \" -f 2-")}' 
done <<< "$(git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr | head -n 20)" 

head -n 20 hạn chế sản lượng để thay đổi top 20. khi cần thiết.

Khi bạn đã xác định được tệp sự cố, hãy xem câu trả lời this để biết cách xóa chúng.

+0

Tiện lợi hơn nhiều - cảm ơn! – nealmcb

+0

Đơn vị nào có kích thước được trả về? –

+0

Tôi tin rằng đó là các byte – MatrixManAtYrService

0

Tôi đã viết một tập lệnh sẽ cho bạn biết các đối tượng, tệp hoặc thư mục lớn nhất trong câu trả lời của tôi here. Nếu không có đối số, nó sẽ cho bạn biết kích thước của tất cả các đối tượng, được sắp xếp theo kích thước. Bạn có thể cho nó biết --sum hoặc --directories để tổng hợp tất cả các đối tượng cho mỗi tệp và in, hoặc làm tương tự cho tất cả các tệp trong mỗi thư mục. Tôi hy vọng nó hữu ích!

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