Có cách nào để giảm kích thước của thư mục git không?


156

Có vẻ như dự án của tôi ngày càng lớn hơn với mỗi git commit/push . Có cách nào để dọn sạch thư mục git của tôi không?

Câu trả lời:


214

Tôi không chắc chắn những gì bạn muốn. Trước hết, tất nhiên mỗi lần bạn cam kết / đẩy thư mục sẽ lớn hơn một chút, vì nó phải lưu trữ từng cam kết bổ sung đó.

Tuy nhiên, có lẽ bạn muốn git gc"dọn sạch các tệp không cần thiết và tối ưu hóa kho lưu trữ cục bộ" ( trang thủ công ).

Một lệnh có thể có liên quan khác là git cleansẽ xóa các tệp không bị theo dõi khỏi cây của bạn ( trang thủ công ).


30
git clean -d -f -x xóa các tệp được liệt kê trong .gitignore và như vậy. Ví dụ: không gian làm việc không thuộc git, thư mục Pods, v.v.
Kalle

102
WARNINGLệnh như được viết ở trên bởi @Kalle sẽ xóa MỌI > KHÔNG GIỚI HẠN <TẬP TIN VÀ TRỰC TIẾP TRONG ROOT GIT CỦA BẠN , không chỉ là "các tệp được liệt kê trong .gitignore". Bất cứ điều gì không được theo dõi bởi Git, bất kể nó có được liệt kê hay không .gitignoresẽ bị xóa. git clean -dfX(lưu ý trường hợp trên X) sẽ chỉ xóa các mục có quy tắc áp dụng trong .gitignore. Vui lòng lưu ý cảnh báo này: Không bao giờ chạy git cleanmà không chạy trong chế độ tương tác, -ithay vì -fhoặc ít nhất là chạy khô trước - -nvà sau đó chạy lại với -f.
Adrian Günter

5
Hoặc tạo bản sao lưu :-)
Mateen Ulhaq

61

Chạy:

git remote prune origin

Xóa tất cả các nhánh theo dõi cũ đã bị xóa originnhưng vẫn có sẵn tại địa phương remotes/origin.

git gc --auto

' G arbage C ollection ' - chạy các nhiệm vụ vệ sinh (nén các bản sửa đổi, loại bỏ các vật thể lỏng lẻo / không thể tiếp cận). Các --autolá cờ đầu tiên xác định xem có bất kỳ công việc là cần thiết, và lối thoát hiểm mà không làm bất cứ điều gì nếu không muốn nói.


4
Một số giải thích về những gì làm? Tôi biết rằng chúng tôi có thể Google và tìm kiếm tài liệu của họ, nhưng đó là một cách phổ biến để cung cấp mô tả ngắn về câu trả lời của bạn khi nó chỉ liên quan đến mã hoặc lệnh.
Dzhuneyt

28

Một kịch bản trong đó repo git của bạn sẽ trở nên nghiêm trọng hơn với mỗi lần xác nhận là một trường hợp bạn đang cam kết các tệp nhị phân mà bạn tạo thường xuyên. Lưu trữ của họ sẽ không hiệu quả hơn tập tin văn bản .

Một cái khác là một trong đó bạn có một số lượng lớn các tệp trong một repo ( giới hạn của git ) thay vì một số thay thế ( được quản lý như các mô hình con ).

Trong bài viết này về không gian git , AlBlue đề cập:

Lưu ý rằng Git (và Hg và các DVCS khác) gặp phải sự cố khi các tệp nhị phân (lớn) được kiểm tra, sau đó bị xóa, vì chúng vẫn sẽ hiển thị trong kho lưu trữ và chiếm dung lượng, ngay cả khi chúng không hiện tại .

Nếu bạn có các tệp nhị phân lớn được lưu trữ trong repo git của mình, bạn có thể xem xét:

Như tôi đã đề cập trong " là gì các giới hạn tập tin trong Git (số lượng và kích thước)? ", Gần đây hơn (năm 2015, 5 năm sau khi câu trả lời này) Git LFS từ GitHub là một cách để quản lý các tập tin lớn (bằng cách lưu trữ chúng bên ngoài các Kho Git).


1
git hỗ trợ tệp lớn rất hữu ích nếu bạn có các tệp nhị phân lớn (như hình ảnh) thường xuyên được thêm / cập nhật. Xem git-lfs.github.com . Siêu dễ thực hiện, được hỗ trợ bởi github. Tất cả các thành viên trong nhóm cần cài đặt nó để sử dụng hợp tác.
Eric Woods

@EricWoods Đúng. Tôi đã đề cập đến Git-LFS trước đây (64 lần: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Tôi đã chỉnh sửa câu trả lời cũ này cho phù hợp.
VonC

Hà, thật đấy! Thật buồn cười là một câu trả lời trên 9 tuổi vẫn có liên quan (và bây giờ thậm chí còn hơn thế với thông tin LFS).
Eric Woods

22

vâng vâng, git gclà giải pháp, một cách tự nhiên,

và cục bộ - bạn chỉ có thể xóa kho lưu trữ cục bộ và sao chép lại,

nhưng có một thứ quan trọng hơn ở đây ...

những giây bạn chờ đợi để xử lý git & bên ngoài khổng lồ đó được thu thập thành những phút dài trong đó được thu thập đến hàng giờ không hiệu quả,

Tạo một kho lưu trữ mới (hoàn toàn, không chỉ là một nhánh) từ đầu , bao gồm cả phiên bản tệp gần đây, tự nhiên bạn sẽ mất tất cả lịch sử,

nhưng khi ở trong thế giới mã không phải là lúc để có được tình cảm, không có điểm nào kéo theo toàn bộ 5 năm mã mỗi cam kết hoặc khác biệt, bạn vẫn có thể lưu trữ git & externals cũ ở đâu đó, nếu bạn hoài cổ:]

nhưng, đến một lúc nào đó bạn thực sự phải di chuyển theo:]

nhóm của bạn sẽ cảm ơn bạn!


12
Hoàn toàn đồng ý, gần đây chúng tôi đã thực hiện phương pháp này với một kho lưu trữ cũ và không nhìn lại; tốt, chủ yếu là vì chúng tôi không thể, nhưng bạn biết ý tôi là gì :)
WhatIsHeDaging

13

Chạy lệnh này cực kỳ nguy hiểm, nhưng sẽ thu nhỏ kho lưu trữ của bạn bằng cách xóa tất cả các tệp sao lưu / sao lưu git của bạn:

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

Nó sẽ xóa tất cả các tệp git sử dụng để khôi phục kho lưu trữ của bạn khỏi một số lệnh xấu, ví dụ: nếu bạn đã làm git reset --hard, bạn thường có thể khôi phục các tệp bị mất. Nhưng nếu bạn làm git reset --hardtrước git reflog expire...lệnh thì bạn sẽ mất tất cả. Bây giờ, hy vọng duy nhất của bạn là sử dụng một số công cụ phân tích hệ thống tệp của bạn và cố gắng khôi phục các tệp đã bị xóa, nếu chúng không bị ghi đè.


3
Tôi thực sự sẽ không gọi điều này là cực kỳ nguy hiểm . Tôi chỉ cần dán nhãn cho nó một cái gì đó bạn phải cẩn thận . Theo kinh nghiệm của tôi, rất ít người thực sự từng chạm vào reflog hoặc các vật thể không thể truy cập mà hầu hết họ không biết họ đang ở đó hoặc làm thế nào để tương tác với họ, và vì vậy bị mắc kẹt trong các tình huống có ích, hoặc làm những việc khủng khiếp cách không hiệu quả. Tôi sẽ đi xa hơn để nói rằng nếu bạn không biết và không thể biết những lệnh này sẽ làm gì, thì bạn có thể chạy chúng một cách an toàn!
Chris Morgan

10

git clean -d -f -i là cách tốt nhất để làm điều đó

Điều này sẽ giúp làm sạch một cách kiểm soát hơn.

-i là viết tắt của tương tác.


3
Mặc dù câu hỏi của OP rất mơ hồ và đây là một câu trả lời tốt trong khía cạnh đó, tôi muốn chỉ ra rằng đó git cleankhông phải là để làm sạch repo nhiều như làm sạch thư mục. Đối với người dùng sao chép / dán một cách mù quáng, hãy cẩn thận; điều này loại bỏ các tập tin / thư mục không bị theo dõi mà bạn thực sự có thể muốn cục bộ.
sraboy

git clean -d -x -f hoạt động độc đáo nếu bạn muốn làm sạch sâu
Rishabh Jain

2

Không biết nó có thu nhỏ nó không, nhưng sau khi tôi chạy git clean, tôi cũng thường làm git repack -adnhư vậy, điều này làm giảm số lượng tệp gói.


5
repack là một phần của git gcquy trình, vì vậy không cần phải chạy riêng
artkoshelev
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.