Tại sao các kho Git / Mercurial sử dụng ít không gian hơn?


15

Tôi đã đọc về một số cuộc thảo luận ở đây và trên SO rằng các kho lưu trữ DVCS sử dụng cùng một hoặc ít không gian hơn các phần đối tác tập trung của chúng. Tôi có thể đã bỏ lỡ nó, nhưng tôi đã không tìm thấy một lời giải thích tốt về lý do đó là. Có ai biết không?


5
Các bài viết của followinfg có phải là bài bạn đọc không? stackoverflow.com/questions/7727791/... hoặc stackoverflow.com/questions/8657710/... hoặc stackoverflow.com/questions/456336/...
VonC

1
Tôi chưa, cảm ơn bạn! Vì vậy, tôi hiểu từ những người có hai câu trả lời: nén bằng zlib và lưu các đối tượng dưới dạng packfiles khi có thể. Các ví dụ từ Mozilla cũng rất tuyệt!
Alex Florescu

1
@Alex Không, đó là lý do chính. SVN lưu các ảnh chụp nhanh hoàn chỉnh, Git và Mercurial chỉ lưu bản sửa đổi CHÍNH và khác. Sử dụng nén thông thường có thể cung cấp cho bạn tỷ lệ nén tốt nhất trong khoảng 60 608080%. Sử dụng diffs có thể cung cấp cho bạn tới 99%. Những con số này được rút ra khỏi mông tôi - những con số thực có thể khác nhau; các xu hướng sẽ là mặc dù cùng.
Konrad Rudolph

@KonradRudolph, không phải đó là tất cả những gì về packfiles sao?
Alex Florescu

@Alex Không hẳn. Theo như tôi biết thì packfile đang đóng gói nhiều tệp thành một. Điều này không nhất thiết liên quan.
Konrad Rudolph

Câu trả lời:


18

Từ kinh nghiệm của riêng tôi, các tuyên bố sau đây đều đúng:

  • Git rất hiệu quả trong việc lưu trữ các tệp văn bản và chỉ lưu trữ các tệp này đã được thay đổi. Vì vậy, khi so sánh SVN và Git để so sánh kích thước kho lưu trữ, chúng có thể giống nhau hoặc thậm chí có thể có một lợi thế nhỏ cho Git.
  • Điều này là hoàn toàn sai nếu bạn so sánh kích thước của kho lưu trữ trong đó một lượng đáng kể các tệp là các tệp văn phòng (như MS word, excel, powerpoint, ...). Ở đây Git cũng lưu trữ các bản sao hoàn chỉnh, điều đó có nghĩa là 10 thay đổi nhỏ trên ngăn xếp slide powerpoint tạo ra 10 bản sao hoàn chỉnh, trong đó Subversion chỉ lưu trữ một khác biệt nhị phân, có thể là một hệ số nhỏ hơn 100.

Nếu bạn so sánh vị trí thanh toán (bản thân nó là một kho lưu trữ với Git), câu chuyện hoàn toàn khác:

  • Subversion lưu trữ cho mỗi tệp một bản sao hoàn chỉnh, vì vậy kích thước của vị trí thanh toán của bạn thường gấp 2 lần kích thước của các tệp.
  • Git lưu trữ toàn bộ lịch sử của kho lưu trữ cục bộ, do đó tùy thuộc vào kích thước của lịch sử, số này có thể nhỏ hơn hoặc lớn hơn nhiều so với bản sao kiểm tra Subversion.

Nếu bạn so sánh số lượng byte bạn phải tải xuống hoặc tải lên, thì nó lại khác.

  • Subversion thường gửi hoặc nhận ít byte hơn, bởi vì nó chỉ gửi sự khác biệt. Nó phải làm điều đó trên mỗi cam kết và cập nhật.
  • Git phải lấy toàn bộ kho lưu trữ (ban đầu), sau đó gửi các tệp hoàn chỉnh (đã nén?) Không khác nhau đối với các tệp văn bản, nhưng có thể khác với các tệp nhị phân. Và vâng, Git chỉ làm điều đó khi bạn đẩy hoặc kéo thứ gì đó vào kho lưu trữ từ xa.

Vì vậy, cuối cùng, bạn so sánh táo với cam và tùy thuộc vào những gì bạn muốn làm với Subversion hoặc Git, kết quả có thể khác nhau.


@jk hỏi về bản sao hoàn chỉnh hoặc khác biệt nhị phân, và tôi không thể trả lời câu hỏi đó. Tôi đã hỏi Matthew McCullough đã tổ chức một hội thảo Git gần đây tại Jax 2012 (mà tôi đã đến thăm). Anh ấy đã dành thời gian (cảm ơn rất nhiều cho anh ấy) để giải thích với một ý chính chi tiết về hoạt động bên trong của Git. Vì vậy, có, có một nén hoạt động ở đó (và tôi cũng sẽ thực hiện một thử nghiệm với tệp văn phòng microsoft và sẽ so sánh với ý chính của mình), nhưng không, việc nén được thực hiện trên toàn bộ tệp. Trích dẫn từ ý chính của mình:

Các đối tượng lỏng lẻo được viết ở dạng nén, nhưng không phải là đồng bằng tại thời điểm của mỗi lần xác nhận.


1
Bạn có chắc chắn rằng git lưu trữ các bản sao đầy đủ của các tệp văn phòng? Tôi nghĩ rằng nó cũng lưu trữ khác biệt nhị phân. tất nhiên vấn đề thực sự với các loại tệp này là chúng thường được nén nên một thay đổi nhỏ có thể khiến toàn bộ tệp thay đổi
jk.

2
Đã hỏi ai đó (qua email), người biết nhiều hơn tôi, và sẽ bao gồm câu trả lời của anh ấy trong câu trả lời của tôi sau đó.
mliebelt

6
Git xử lý các tệp văn bản và tệp nhị phân chính xác theo cùng một cách trong tất cả và mọi vấn đề liên quan đến lưu trữ. Các đối tượng lỏng lẻo so với đóng gói không liên quan đến văn bản so với nhị phân. Lý do các tệp nhị phân thường dẫn đến chênh lệch lớn hơn nhiều so với tệp văn bản là vì nhiều định dạng nhị phân (bao gồm tất cả các định dạng văn phòng mới) đã được nén và do đó, ngay cả một thay đổi nhỏ trong nội dung cũng gây ra thay đổi lớn trong blob nhị phân kết quả. Điều này cũng không kém phần quan tâm đối với git và lật đổ, nhưng lật đổ chỉ bị phạt trên máy chủ, trong khi git ở khắp mọi nơi.
Jan Hudec

4
Các đối tượng lỏng lẻo so với đóng gói không liên quan gì đến văn bản so với nhị phân. Đó là khấu hao công việc khó khăn trong việc tìm kiếm các khác biệt nhị phân. Tốc độ là tính năng quan trọng của git, vì vậy trong quá trình hoạt động thường xuyên, git chỉ nén dữ liệu mới và tát chúng vào kho lưu trữ. Đây là đối tượng lỏng lẻo. Hơn khi bạn yêu cầu nó bằng cách gọi git gchoặc tích lũy quá nhiều vật thể lỏng lẻo, nó tìm thấy các ứng cử viên tốt để nén chúng lại (git có thể khác với phiên bản trước), lưu trữ deltas trong một "gói" và loại bỏ các vật thể lỏng lẻo.
Jan Hudec

3
Đối với những người quan tâm đến các số trong thế giới thực: Tôi chỉ so sánh hai bản sao làm việc từ cùng một repo. Bản sao làm việc của SVN là khoảng 2,9 GB, bản sao làm việc của GIT khoảng 0,8 GB.
JensG
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.