2011-08-06 33 views
13

Tôi đã chuyển đổi một kho lưu trữ Mercurial sang Git, sử dụng xuất nhanh. Nhưng kho Git là rất lớn: 18 GB cho Git so với 3,4 GB cho Mercurial. Không có bước dọn dẹp nào của tôi đã giúp.Tại sao kho lưu trữ Git của tôi lớn hơn nhiều so với phiên bản Mercurial?

Kho lưu trữ Mercurial của tôi bị chi phối bởi một tệp 65 MB (thẻ nhớ Anki ở định dạng SQLite) được cập nhật hàng ngày. Lịch sử của nó đã tăng lên 2,9 GB, dưới .hg/store/data.

Tôi đã hy vọng Git có thể nén lịch sử tốt hơn một chút, nhưng tôi không thể thu nhỏ kho lưu trữ dưới 18 GB!

Tôi đã thử git prune, git gc và các loại khác, không có kết quả. Tôi thậm chí đã thử nén thư mục .git, và nó vẫn xuất hiện chính xác 18 GB.

Tôi có thiếu gì đó không?

Cập nhật: Tôi đã thử Bazaar (bzr) và nó đã nén kho của tôi chỉ còn 2,3 GB. Tốt đẹp!

+0

Tôi không biết tại sao điều này lại bị bỏ phiếu ... – Omnifarious

+1

Bạn đã thử 'git gc --aggressive' chưa? – cdhowie

+0

Tôi đã thử 'git gc --aggressive', nhưng nó đã chết sau một thời gian với một lỗi bộ nhớ. Nhưng vào thời điểm đó, tập tin gói tạm thời mà nó đã tạo ra đã vượt quá 5 GB ... nó đã không tìm kiếm bất kỳ tốt hơn so với 'git gc' tôi đã chạy trước đó. – slattery

Trả lời

7

Nếu số git gc không thành công, hãy thử chạy theo cách thủ công git repack và sau đó git gc.


quan sát của tôi với SVN, Git và Hg:

Tôi đã luôn luôn quan sát thấy rằng SVN và Hg kho là nhỏ hơn nhiều so với kho git tương ứng. Điều này là do mỗi thay đổi đối với một tệp - văn bản hoặc nhị phân, thêm một đối tượng đầy đủ mới cho nó. Trong SVN, chỉ có diff được thêm vào, ngay cả trong trường hợp nhị phân và nhị phân khác biệt trong SVN cũng rất tốt.

Nhưng đây là nơi các tệp gói đến, vì chúng chỉ lưu trữ diff (delta) giữa các đối tượng tương tự và thậm chí được nén. Ngay cả khi đóng gói, tôi đã quan sát thấy kho Git, tùy thuộc vào loại tệp và số lượng thay đổi mà các tệp đó trải qua, có xu hướng lớn hơn. Đây là điều mà tôi đã chấp nhận với Git và đó là một sự thỏa hiệp tôi sẵn sàng đưa ra tốc độ hoạt động khác nhau với Git.

+3

Kinh nghiệm của tôi giữa SVN và git hoàn toàn ngược lại. Trong kho tôi đã so sánh, repo git là một cái gì đó giống như 3-5 lần nhỏ hơn so với SVN một. –

+1

@ Ryan Stewart - Như tôi đã nói, nó sẽ tùy thuộc vào loại tệp và số lượng thay đổi. Một repo với trung bình đến lớn nhị phân mà thay đổi thường xuyên sẽ lớn hơn trong Git hơn trong SVN, ngay cả khi đóng gói. – manojlds

+0

Cảm ơn @manojlds .. Thật đáng thất vọng khi thấy Git chiếm nhiều không gian hơn, nhưng tôi đoán tôi phải chấp nhận nó. Tôi sẽ giữ kho này trong Mercurial ngay bây giờ. Có lẽ trong tương lai, Git sẽ có thể lưu trữ kho này hiệu quả như Mercurial. – slattery

9

Một lý do có thể là Mercurial có định dạng lưu trữ rất nhỏ gọn có liên quan đến diff, ngay cả đối với tệp nhị phân. Và kể từ khi sử dụng diffs để tái tạo các phiên bản có thể rất tốn thời gian, nó sẽ lưu trữ một snapshot đầy đủ ngay khi diffs + old original vượt quá gấp đôi kích thước của một snapshot đầy đủ.

Cá nhân, tôi sẽ thử lưu trữ một bãi chứa cơ sở dữ liệu sqlite của bạn thay vì tệp cơ sở dữ liệu chính nó và xem nơi mà bạn nhận được. Nó có thể hiệu quả hơn nhiều.

Tôi không biết định dạng lưu trữ của git là gì. Nhưng tôi đoán nó không liên quan đến sự khác biệt giống như cách Mercurial làm.

+3

Git cũng thực hiện nén vi sai, sau đó là vượt qua zlib trên gói. – cdhowie

+0

Cảm ơn thông tin. Tôi chỉ thất vọng rằng tôi đã không thể thoải mái chuyển kho này sang Git. – slattery

+6

+1 để đề xuất một bãi chứa sqlite thay vì tự phiên bản chính db đó. Git (và Mercurial quá thực sự) chủ yếu được dự định là hệ thống kiểm soát * nguồn *, không phải là hệ thống điều khiển phiên bản cho tất cả các loại dữ liệu. Tất nhiên nó chắc chắn có thể xử lý bất cứ điều gì bạn ném vào nó; nó chỉ có thể chiếm một tấn không gian. – MatrixFrog

0

Chạy git gc --aggressive trên kho lưu trữ được di chuyển từ Mercurial đã hoạt động cho tôi. Nó giảm từ 500 MB xuống còn 150 MB.

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