Giảm kích thước kho git


290

Tôi đã cố gắng tìm kiếm một hướng dẫn tốt về giảm kích thước repo, nhưng không tìm thấy. Làm cách nào để giảm kích thước repo của tôi ... khoảng 10 MB, nhưng điều là Heroku chỉ cho phép 50 MB và tôi không có nơi nào hoàn thành việc phát triển ứng dụng của mình.

Tôi đã thêm các nghi phạm thông thường (log, nhà cung cấp, doc, v.v.) vào .gitignore rồi. Mặc dù tôi chỉ thêm .gitignore gần đây.

Bất kỳ đề xuất?


1
Tôi vừa mới làm và nó đã giảm xuống còn 2,2 mb ... cảm ơn rất nhiều! Mặc dù điều đó dường như không làm giảm kích thước repo trên Heroku..hmm
sent-hil

11
Đẩy nó bằng cách sử dụng - lực lượng. Nó sẽ ghi đè lên nội dung ngay cả khi không có thay đổi (không có cam kết mới, v.v.)
Marcin Gil

1
@MarcinGil - Dưới đây, VonC nói rằng bạn cần truy cập vào máy chủ để dọn sạch máy chủ từ xa (nếu tôi phân tích cú pháp chính xác).
jww

1
Chỉ cần một bình luận để giúp những người đọc khác nếu họ không biết thêm gì vào .gitignoređó, có một dịch vụ hay tại gitignore.io sẽ giúp bạn thiết lập tốt .gitignoredựa trên môi trường dev của bạn.
Blairg23

Câu trả lời:


351

git gc --aggressivelà một cách để buộc quá trình cắt tỉa diễn ra (để chắc chắn git gc --aggressive --prune=now:). Bạn có các lệnh khác để làm sạch repo quá. Đừng quên, đôi khi git gcmột mình có thể tăng kích thước của repo !

Nó cũng có thể được sử dụng sau một filter-branch, để đánh dấu một số thư mục sẽ bị xóa khỏi lịch sử (với mức tăng thêm dung lượng); thấy ở đây . Nhưng điều đó có nghĩa là không ai rút khỏi repo công khai của bạn. filter-branchcó thể giữ các ref dự phòng trong.git/refs/original , để thư mục cũng có thể được làm sạch.

Cuối cùng, như đã đề cập trong bình luận nàycâu hỏi này ; làm sạch reflog có thể giúp:

git reflog expire --all --expire=now
git gc --prune=now --aggressive

Một giải pháp thậm chí đầy đủ hơn và có thể nguy hiểm hơn là xóa các đối tượng không sử dụng khỏi kho git


Trong một kịch bản khác, xem thêm stackoverflow.com/questions/1029969/ từ
VonC

1
Lưu ý đến bản thân: đừng quên các chi nhánh từ xa: stackoverflow.com/questions/11255802/ trên
VonC

1
Lưu ý đến bản thân: đừng quên các thẻ từ xa
saiyancoder

1
Ngoài các tài liệu tham khảo từ xa, reflog là một thứ khác có thể gây ra các tài liệu tham khảo mà bạn đang cố gắng loại bỏ để được lưu giữ. stackoverflow.com/q/27361761/1072626
vossad01

1
@jww Tôi xác nhận đây hoàn toàn là một hoạt động địa phương. Nó không có liên quan đến kích thước của repo từ xa. Bạn sẽ cần truy cập trực tiếp vào máy chủ của repo từ xa đó để làm điều tương tự.
VonC

94

Cảm ơn bạn đã trả lời. Đây là những gì tôi đã làm:

git gc
git gc --aggressive
git prune

Điều đó dường như đã thực hiện các mẹo. Tôi đã bắt đầu với khoảng 10,5 MB và bây giờ chỉ còn hơn 980KB.


8
pruneluôn được chạy bởi gc(với 2 tuần trước mặc định).
Cas

117
Bạn có thể chạy cả 3 với prune cho đến bây giờ bằng cách sử dụnggit gc --aggressive --prune=now
rahul286

1
Nhưng, khi tôi xóa repo rồi sao chép lại, kích thước vẫn lớn. Làm thế nào để bạn xử lý đó?
cwtuan

2

Trong trường hợp của tôi, tôi đã đẩy một số tệp lớn (> 100Mb) và sau đó tiến hành xóa chúng. Nhưng chúng vẫn còn trong lịch sử repo của tôi, vì vậy tôi cũng phải loại bỏ chúng khỏi nó.

Bí quyết là gì:

bfg -b 100M  # To remove all blobs from history, whose size is superior to 100Mb
git reflog expire --expire=now --all
git gc --prune=now --aggressive

Sau đó, bạn cần phải đẩy lực lượng lên chi nhánh của bạn:

git push origin <your_branch_name> --force

bfg là một công cụ có thể được cài đặt trên Linux và macOS bằng cách sử dụng brew:

brew install bfg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.