Trong bản sao đầu tiên của kho lưu trữ, git trước tiên nhận các đối tượng (đủ rõ ràng), sau đó dành khoảng thời gian tương tự để "giải quyết deltas". Điều gì thực sự xảy ra trong giai đoạn này của bản sao?
Trong bản sao đầu tiên của kho lưu trữ, git trước tiên nhận các đối tượng (đủ rõ ràng), sau đó dành khoảng thời gian tương tự để "giải quyết deltas". Điều gì thực sự xảy ra trong giai đoạn này của bản sao?
Câu trả lời:
Git sử dụng mã hóa delta để lưu trữ một số đối tượng trong packfiles. Tuy nhiên, bạn không muốn phải phát lại mọi thay đổi từng có trên một tệp đã cho để có phiên bản hiện tại, do đó, Git cũng thỉnh thoảng có ảnh chụp nhanh nội dung tệp được lưu trữ. "Giải quyết đồng bằng" là bước liên quan đến việc đảm bảo tất cả những điều đó vẫn nhất quán.
Đây là một chương trong phần "Git Internals" của cuốn sách Pro Git, có sẵn trực tuyến, nói về điều này.
git gc
hoặc bất cứ khi nào Git xác định cần thiết) Git sẽ nén tất cả các tệp "lỏng" vào một gói để tiết kiệm dung lượng và một tệp chỉ mục vào gói đó sẽ được tạo. Vì vậy, zlib sẽ nén bằng thuật toán delta của riêng mình nhưng Git không sử dụng mã hóa delta để lưu trữ các phiên bản trước. Vì truy cập phổ biến và thường xuyên nhất là phiên bản mới nhất, được lưu trữ dưới dạng ảnh chụp nhanh.
Các giai đoạn git clone
là:
"Giải quyết deltas" là thông báo được hiển thị cho giai đoạn thứ hai, lập chỉ mục tệp gói ("git index-pack").
Các tệp gói không có ID đối tượng thực tế trong đó, chỉ có nội dung đối tượng. Vì vậy, để xác định ID đối tượng là gì, git phải thực hiện giải nén + SHA1 của từng đối tượng trong gói để tạo ID đối tượng, sau đó được ghi vào tệp chỉ mục.
Một đối tượng trong tệp gói có thể được lưu trữ dưới dạng delta tức là một chuỗi các thay đổi để thực hiện đối với một số đối tượng khác. Trong trường hợp này, git cần truy xuất đối tượng cơ sở, áp dụng các lệnh và SHA1 kết quả. Bản thân đối tượng cơ sở có thể phải được bắt nguồn bằng cách áp dụng một chuỗi các lệnh delta. (Mặc dù trong trường hợp nhân bản, đối tượng cơ sở sẽ đã gặp phải, nhưng có giới hạn đối với số lượng đối tượng được sản xuất được lưu trong bộ nhớ).
Tóm lại, giai đoạn "giải quyết deltas" liên quan đến việc giải nén và kiểm tra toàn bộ cơ sở dữ liệu repo, điều này không gây ngạc nhiên khi mất khá nhiều thời gian. Có lẽ việc giải nén và tính toán SHA1 thực sự tốn nhiều thời gian hơn so với việc áp dụng các lệnh delta.
Trong trường hợp tìm nạp tiếp theo, tệp gói nhận được có thể chứa các tham chiếu (dưới dạng cơ sở đối tượng delta) đến các đối tượng khác mà git nhận được dự kiến sẽ có. Trong trường hợp này, git nhận thực sự viết lại tệp gói đã nhận để bao gồm mọi đối tượng được tham chiếu như vậy, sao cho mọi tệp gói được lưu trữ là tự cung cấp. Đây có thể là nơi thông điệp "giải quyết deltas" bắt nguồn.
Amber dường như đang mô tả mô hình đối tượng mà Mercurial hoặc sử dụng tương tự. Git không lưu trữ đồng bằng giữa các phiên bản tiếp theo của một đối tượng, mà là các ảnh chụp nhanh đầy đủ của đối tượng, mọi lúc. Sau đó, nó nén các ảnh chụp nhanh này bằng cách sử dụng nén delta, cố gắng tìm các đồng bằng tốt để sử dụng, bất kể chúng tồn tại ở đâu trong lịch sử.