2013-05-31 24 views
8

Có cách nào để giảm kích thước repo bằng cách xóa bản sao dữ liệu cục bộ về các cam kết cũ không?Compact repo bằng cách xóa các cam kết cũ

Tương tự như cách git clone --depth 5 tạo bản sao cục bộ nhỏ chỉ với dữ liệu cam kết gần đây.

Repo chứa gigabyte tài sản trò chơi đã bị ghi đè nhiều lần trong quá khứ.

Chỉnh sửa: Tôi không muốn chỉ thanh lọc lịch sử quá khứ; Tôi muốn lịch sử vẫn phù hợp với điều khiển từ xa, nhưng tôi không muốn các cam kết cũ được lưu trữ cục bộ và có sẵn.

+0

Khi bạn nói "cam kết cũ", tôi đoán bạn không có nghĩa là treo lủng lẳng cam kết rằng không còn có thể truy cập từ một con trỏ nhánh, chỉ là những cam kết cũ thực sự trong lịch sử của bạn mà bạn sẽ không bao giờ ghé thăm lần nữa trong tương lai gần, điều đó có đúng không? –

+0

@TheShadow phải, tôi sẽ cập nhật câu hỏi –

+1

@Hardex: để trả lời câu hỏi được cập nhật của bạn: KHÔNG THỂ chỉ giữ lại các cam kết gần đây nhất trong lịch sử và có kho lưu trữ đầy đủ. bản sao nông không hoàn toàn có thể sử dụng được - nó không thể được cam kết. – mvp

Trả lời

7

Thật không may, KHÔNG THỂ chỉ giữ lại các cam kết gần đây nhất trong lịch sử và có kho lưu trữ hoàn toàn có thể sử dụng được. Bản sao nông không hoàn toàn có thể sử dụng được vì không thể cam kết.

Nói cách khác, vì cách git giữ dữ liệu trong kho đối tượng, bạn không có nhiều tùy chọn khác ngoài viết lại lịch sử từ đầu.

Có lẽ cách tiếp cận dễ nhất là tạo bản sao của tất cả các tệp nội dung trò chơi hiện tại ở đâu đó bên ngoài kho lưu trữ git, sau đó sử dụng git filter-branch để xóa tài sản của bạn khỏi lịch sử, như chưa từng tồn tại. Cuối cùng, sao chép tài sản trở lại vào vị trí hợp pháp của họ và cam kết lại một lần nữa. Thao tác này sẽ ghi lại lịch sử của bạn theo cách mà nội dung trò chơi chỉ xuất hiện trong lần commit gần đây nhất.

Tuy nhiên, nó sẽ vẫn không lấy lại không gian đĩa mặc dù cho đến khi bạn làm:

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

git gc --prune=<date> nên làm những gì bạn muốn. Hãy xem vào tài liệu: https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

Update1: Tôi đề nghị bạn đọc bài viết trên blog này về git gc cũng như: http://gitfu.wordpress.com/2008/04/02/git-gc-cleaning-up-after-yourself/

Update2: @mvp là đúng, sau khi một nghiên cứu sâu git gc sẽ chỉ loại bỏ các đối tượng không được theo dõi. Để loại bỏ các đối tượng, một trong các giải pháp là sử dụng git filter-branch. Tôi khuyên bạn nên đọc chủ đề này về removing objects và tài liệu git filter-branch. Cảm ơn những người đứng đầu lên @mvp.

+1

bạn hoàn toàn sai. 'git gc --prune' sẽ KHÔNG làm những gì OP muốn – mvp

+0

bạn đúng @mvp, tôi đã cập nhật câu trả lời của mình. Tks cho người đứng đầu lên. –

+0

@danielcsgomes cho những gì nó có giá trị, nếu poster gốc ** là ** quan tâm đến việc loại bỏ cam kết lơ lửng, 'git gc' thực sự sẽ là công cụ thích hợp để sử dụng. –

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