Cách thu nhỏ thư mục .git


134

Cơ sở hiện tại của tôi có tổng kích thước khoảng. 200 MB.

Nhưng thư mục .git của tôi có kích thước đáng kinh ngạc là 5GB (!). Vì tôi đẩy công việc của mình sang một máy chủ bên ngoài, tôi không cần bất kỳ lịch sử địa phương lớn nào ...

Làm cách nào tôi có thể thu nhỏ thư mục .git để giải phóng không gian trên sổ ghi chép của mình? Tôi có thể xóa tất cả các thay đổi cũ hơn 30 ngày không?

cảm ơn rất nhiều vì sự giúp đỡ :)


2
Bạn có thể gửi đầu ra của git count-objects -v?
CB Bailey

2
Bản sao có thể có của Giảm kích thước kho lưu trữ git
sds

Câu trả lời:


113

bạn không nên xóa tất cả các thay đổi cũ hơn 30 ngày (tôi nghĩ rằng bằng cách nào đó có thể khai thác git, nhưng thực sự không được khuyến khích).

bạn có thể gọi git gc --aggressive --prune, sẽ thực hiện thu gom rác trong kho lưu trữ của bạn và cắt tỉa các đối tượng cũ. Bạn có nhiều tệp nhị phân (lưu trữ, hình ảnh, tệp thực thi) thường thay đổi không? những thứ này thường dẫn đến các thư mục .git khổng lồ (hãy nhớ, git lưu trữ các ảnh chụp nhanh cho mỗi lần sửa đổi và các tệp nhị phân bị nén rất tệ)


32
Trên thực tế, git gc --aggressiveđược coi là thực hành xấu. Nó tốt hơn để sử dụng git repack -a -d --depth=250 --window=250.
Artefact2

18
@knittl: hoàn toàn. Đây là một thông điệp của chính Linus: gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2

3
@ artefact2: cảm ơn vì đường link! Tôi đã đọc nó và linus chỉ ra rằng, - xâm phạm sẽ không sử dụng lại các đồng bằng (tốt) - điều dường như không tồn tại trong câu hỏi này, vì kho lưu trữ rất lớn. đi theo cách repack thực sự sẽ mất nhiều thời gian hơn. git gc --aggressivegọi repack với kích thước cửa sổ là 250 (xem manpage) và độ sâu 250 (xem mã nguồn). - bổ sung thêm công -ftắc, để vứt bỏ và làm lại tất cả các hoạt động delta trước đó (như đã đề cập trong liên kết)
knittl

1
Tôi vừa kiểm tra hg.nginx.org/nginx repo (RELEASE-1.4.0 là mẹo) bằng cách sử dụng git-remote-hg và điều này mang lại một repo khoảng 100MB. Sử dụng git gc --aggressive --pruneđã mang đến 19MB.
Lekensteyn

15
@ Artefact2 Tuyên bố của bạn đã lỗi thời : Lưu ý bài viết đó bao nhiêu tuổi. Trong thực tế, vào cùng ngày nó được đăng, cuộc thảo luận về danh sách gửi thư đã dẫn đến cam kết này: [..] Vì vậy, các tham số đóng gói giống nhau trong những ngày này cho cả hai phương thức. . --prunecũng không cần thiết vì nó đã trở thành mặc định kể từ khi v1.5.5-rc0(cam kết 25ee973 , tháng 3 năm 2008).
Lekensteyn

68

Dưới đây là những gì người tạo ra git Linus nói về cách thu nhỏ repo git của bạn:

Tương đương với "git gc --aguptive" - ​​nhưng được thực hiện * đúng cách * - là thực hiện (qua đêm) một cái gì đó như

   git repack -a -d --depth=250 --window=250

trong đó điều sâu sắc đó chỉ là về độ sâu của chuỗi delta có thể (làm cho chúng dài hơn đối với lịch sử cũ - nó đáng giá trên không gian) và điều cửa sổ là về một cửa sổ đối tượng mà chúng ta muốn mỗi ứng cử viên quét sẽ lớn đến mức nào.

Và ở đây, bạn có thể muốn thêm cờ "-f" (đó là "bỏ tất cả các đồng bằng cũ", vì bây giờ bạn đang thực sự cố gắng đảm bảo rằng cái này thực sự tìm thấy các ứng cử viên tốt.

nguồn: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html

Điều này sẽ thoát khỏi dữ liệu nhị phân mồ côi trong repo của tôi? "git repack" sẽ không loại bỏ hình ảnh hoặc dữ liệu nhị phân mà bạn đã kiểm tra trong repo của mình và sau đó xóa nó. Để xóa những loại dữ liệu đó vĩnh viễn khỏi repo của bạn, bạn phải viết lại lịch sử của mình. Một ví dụ phổ biến đó là khi bạn vô tình kiểm tra mật khẩu của mình trong git. Bạn có thể quay lại và xóa một số tệp nhưng sau đó bạn phải viết lại lịch sử của mình từ đó đến bây giờ và sau đó buộc đẩy sau đó repo mới về nguồn gốc của bạn.


Đối với tôi, thư mục .git khoảng 1,5G. Tôi đã thử điều này, nhưng tôi đã nhận được lỗi followng. fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron

2
Sau khi thực hiện repackcục bộ, thực hiện một cam kết và đẩy, thu nhỏ cũng sẽ được thực hiện từ xa?
Timo

@David Deh Afghanistan: Này, tôi đã thử cái này từ thư mục dự án nhưng kích thước của thư mục .git không thay đổi. Đây có phải là dự kiến, hoặc tôi cần phải đẩy để xem những thay đổi? (xin lỗi không có nhiều kinh nghiệm với git.) Tôi có một hình ảnh / gif trong repo và tôi đã cam kết nhiều lần các phiên bản khác nhau của hình ảnh đó và tôi cho rằng đã tăng kích thước .git.
giorgim

Xin chào, thật không may, bây giờ đó là cách bạn dọn sạch phiên bản nhị phân cũ. Để làm điều đó bạn cần phải viết lại lịch sử của bạn mà thực sự phức tạp. Đây là một số hướng dẫn dành cho bạn: docs.microsoft.com/en-us/azure/devops/articles/ mẹo
David Deh Afghanistan

22

Tôi đã thử những thứ này nhưng kho lưu trữ của tôi vẫn rất lớn. Vấn đề là tôi đã vô tình kiểm tra trong một số tệp lớn được tạo. Sau một số tìm kiếm, tôi tìm thấy một hướng dẫn tuyệt vời giúp dễ dàng xóa các tệp được tạo lớn. Hướng dẫn này cho phép tôi thu nhỏ kho lưu trữ của mình từ 60 MB xuống <1 MB.

Steve Lorek, Làm thế nào để thu nhỏ kho lưu trữ Git


4
Đây là một phiên bản lưu trữ trong trường hợp thối liên kết. Câu trả lời này là / rất hữu ích cho một repo mà tôi đã tìm thấy trong đó các tệp .exe và .zip đã được cam kết làm tăng kích thước của thư mục .git
doubleDown

9

5GB so với 200MB là loại lạ. Cố gắng chạy git gc.

Nhưng không, trừ khi bạn chia kho lưu trữ của mình thành các mô-đun, bạn không thể giảm kích thước của .gitthư mục.

Mỗi bản sao của một git repo là một kho lưu trữ đầy đủ có thể hoạt động như một máy chủ. Đó là nguyên tắc cơ bản của kiểm soát phiên bản phân tán.


3

Tôi đang sử dụng git nhiều hơn như cơ chế đồng bộ hóa cho lịch sử phiên bản. Vì vậy, giải pháp của tôi cho vấn đề này là đảm bảo rằng tôi có tất cả các nguồn hiện tại của mình ở trạng thái thỏa đáng, sau đó chỉ cần xóa .git và khởi tạo lại các repos. Vấn đề không gian đĩa đã được giải quyết. :-) Lịch sử đã biến mất :-( Tôi làm điều này vì repo của tôi nằm trên một khóa USB nhỏ. Tôi không muốn hoặc không cần toàn bộ lịch sử của mình. Nếu tôi có một phương pháp để cắt ngắn lịch sử, tôi sẽ sử dụng nó.

Nếu tôi quan tâm đến việc giữ lịch sử của mình, tôi sẽ lưu trữ kho lưu trữ hiện tại. Tại một số điểm sau đó tôi có thể sao chép kho lưu trữ ban đầu, sao chép tất cả các thay đổi từ repo mới (giả sử tôi chưa thực hiện nhiều (bất kỳ) việc đổi tên hoặc xóa). Và sau đó thực hiện một cam kết lớn sẽ đại diện cho tất cả các thay đổi được thực hiện trong repo mới dưới dạng một cam kết duy nhất trong repo cũ. Có thể hợp nhất các lịch sử? Có lẽ nếu tôi sử dụng một nhánh và sau đó xóa các đối tượng tôi không cần. (Tôi không biết đủ về nội bộ git để bắt đầu đánh lừa như thế).


1
Bạn chỉ có thể sử dụng Dropbox cho trường hợp sử dụng này thay thế. Tôi đã làm trong nhiều năm.
Jonny

0

Đã thử các phương pháp trên, không có gì hoạt động trong trường hợp của tôi (trong đó tôi vô tình giết quá trình git trong quá trình đẩy git) nên cuối cùng tôi phải xóa repo và sao chép lại và bây giờ thư mục .git có kích thước bình thường.


Tôi đã phải sử dụng cùng một giải pháp vì đĩa của tôi đã đầy (thư mục .git> 90 GB) vì vậy tôi thậm chí không thể chạy repack hoặc git gc!
Fl4v
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.