2009-09-21 25 views
7

Có ai cho tôi biết lý do tại sao các nhà phát triển git đưa ra quyết định thiết kế để lưu trữ nội dung của tệp (blobs) hay không, vì vậy khi nội dung thay đổi blob mới cần phải được tạo?Git quyết định thiết kế lưu trữ nội dung thay vì khác biệt

Tôi tin rằng các cửa hàng lật đổ sửa đổi thay vì nội dung, vì vậy khi nội dung thay đổi, nó chỉ đơn giản theo dõi sự khác biệt giữa hai nội dung. Không thể git đã làm nó như thế này là tốt? Lợi ích của việc lưu trữ nội dung thay vì nội dung sửa đổi là gì?

+0

"nhà phát triển git" đã đưa ra quyết định thiết kế về định dạng 'lỏng lẻo' là Linus Torvalds. Không phải nhà phát triển ** s **. –

Trả lời

11

Tôi không thể tìm thấy câu trả lời bằng google nhanh chóng, nhưng tôi tin rằng nó chỉ đơn giản là "không quan trọng" vì không gian đĩa có giá rẻ ".

Lưu trữ các bản sửa đổi trong công cụ quản lý mã nguồn là khó khăn. Nếu bạn chỉ lưu trữ sự khác biệt giữa bản sửa đổi trước đó và hiện tại, bạn sẽ gặp phải hai vấn đề sau:

  1. Trả lại bản sửa đổi mới nhất (trường hợp phổ biến) yêu cầu công việc nhiều nhất, vì mã cần phải lắp ráp bản sửa đổi đó bằng cách kết hợp mọi bản sửa đổi lại với nhau.
  2. Bất kỳ lỗi nào (nói, lỗi đĩa) đối với một bản sửa đổi sẽ làm hỏng quyền truy cập vào mọi bản sửa đổi sau này.

Tôi tin rằng VCS hiện đại nhất thực sự lưu trữ bản sửa đổi mới nhất (vì lý do hiệu suất) và sự khác biệt, nếu sử dụng, được sử dụng để quay ngược thời gian, không chuyển tiếp.

+0

Cảm ơn bạn! Hãy làm cho nó thêm ý nghĩa hơn. – chibicode

+0

Git cũng có định dạng 'đóng gói', nơi nó lưu trữ hầu hết các đối tượng ở dạng deltaified. Thứ tự gần đây (các đối tượng gần đây nhất làm cơ số delta) được ưu tiên (nhưng không được thực thi). –

5

Bài viết giải quyết vấn đề này (và có liên quan) là Repository Formats Matter. Đây là một trong những bài viết ảnh hưởng đến quyết định chuyển đến Git vài năm trước. Dưới đây là một đoạn trích:

Với lý lẽ này, rõ ràng là tôi nghĩ cấu trúc kho của git tốt hơn các cấu trúc khác, ít nhất là cho mô hình sử dụng của X.org. Dường như giữ một số thuộc tính thú vị:

  1. Tệp có chứa dữ liệu đối tượng không bao giờ được sửa đổi. Khi được viết, mọi tệp đều chỉ đọc từ điểm đó trở đi.

  2. Nén được thực hiện ngoại tuyến và có thể bị trì hoãn cho đến sau khi các đối tượng chính được lưu vào phương tiện dự phòng. Phương pháp này cung cấp khả năng nén tốt hơn bất kỳ phương pháp gia tăng nào, cho phép dữ liệu được sắp xếp lại trên đĩa để phù hợp với các mẫu sử dụng.

  3. Dữ liệu đối tượng vốn đã tự kiểm tra; bạn không thể sửa đổi một đối tượng trong kho và phát hiện thoát lần đầu tiên đối tượng được tham chiếu.

4

Hãy để tôi rõ ràng lên quan niệm sai lầm của bạn:

bất cứ ai có thể cho tôi một số ý tưởng tại sao các nhà phát triển git đưa ra quyết định thiết kế để lưu trữ nội dung của file (blobs), vì vậy khi nội dung thay đổi một blob mới cần phải được tạo ra?

giải thích Khá tốt của (ban đầu) thiết kế Git có thể được tìm thấy trong The Git Parable bài luận Tom Preston-Werner của (ngoài một liên kết đến trong Greg Hewgill answer).

Ý tưởng đằng sau thường là (trong dự án đủ lớn) trong bản sửa đổi mới chỉ một vài tệp trong số lượng lớn tệp trong một thay đổi dự án, vì vậy chỉ lưu trữ các phiên bản khác nhau của nội dung tệp. Đây là cùng một ý tưởng rằng Subversion sử dụng trong kỹ thuật 'bản sao giá rẻ' của nó (nó sử dụng hardlinking, IIRC).

Ngoài nội dung của tệp là zlib (deflate) nén (hoặc chính xác hơn mỗi đối tượng trong cơ sở dữ liệu kho git được nén, bao gồm các đối tượng comit).

Tôi tin rằng các cửa hàng Subversion sửa đổi chứ không phải là nội dung, vì vậy khi thay đổi nội dung, nó chỉ đơn giản là theo dõi những khác biệt giữa hai người. Không thể git đã làm nó như thế này là tốt? Lợi ích của việc lưu trữ nội dung thay vì nội dung sửa đổi là gì?

Tôi không hiểu bạn muốn nói gì ở đây.

Nếu lưu trữ chênh lệch tiết kiệm dung lượng, thì tôi muốn nói với bạn rằng ngoài định dạng 'lỏng lẻo' (mỗi đốm màu, tức là mỗi nội dung khác nhau của một tệp được lưu trữ trong tệp riêng biệt bên trong .git) cũng có định dạng 'được đóng gói', nơi nhiều đối tượng được lưu trữ ở dạng deltaified, sử dụng đồng bằng nhị phân từ thư viện LibXDiff.

Định dạng này được tạo để chuyển mạng (dung lượng ổ đĩa lớn có thể rẻ, nhưng không phải băng thông) và được điều chỉnh theo định dạng trên đĩa. Định dạng này rất hiệu quả, một trong những định dạng hệ thống kiểm soát phiên bản hiệu quả hơn, không hiệu quả nhất, làm cho kho lưu trữ git nhỏ hơn hoặc một trong những nhỏ nhất trong số các hệ thống kiểm soát phiên bản khác nhau. Tùy thuộc vào hoàn cảnh toàn bộ bản sao kho lưu trữ git (có chứa lịch sử đầy đủ) có thể nhỏ hơn Subversion tương đương checkout (có chứa bản sao thay đổi nguyên sơ để svn diffsvn status hoạt động mà không cần chuyển mạng).

Thiết kế này ('lỏng' và định dạng 'đóng gói') có lợi thế là đóng gói rất hiệu quả, nhưng có những bất lợi mà bạn phải đóng gói lại bằng tay sử dụng "git gc" (không phải cho không gian đĩa, nhưng đối với hiệu suất - đĩa I/O); ngày nay hầu hết lệnh git repack repository (an toàn) khi cần thiết.

+0

Rất thú vị. +1 – VonC

+0

Cảm ơn, tôi nghĩ rằng tôi có hiểu biết kém về kỹ thuật 'bản sao giá rẻ' của công nghệ lật đổ. Để làm rõ, hãy nói một thư mục dưới điều khiển svn có các tệp A, B, C. Bây giờ, giả sử tôi sao chép thư mục này và đặt thư mục mới này dưới svn. Bây giờ hãy nói tôi thay đổi A thành A '. Tôi tin rằng subversion bây giờ sẽ lưu trữ nội dung của A 'trong repo. Điều này có đúng không? (Tôi đã suy nghĩ trước rằng lật đổ sẽ lưu trữ A và "diff A A" ". Tôi không nghĩ rằng điều này là đúng ...) – chibicode

+0

Thực ra, subversion dường như lưu trữ A và AA khác '(http://subversion.tigris.org/design.html). Vì vậy, không bao giờ tâm trí về các bình luận trước đó ... – chibicode

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