Git mã hóa đồng bằng là sao chép/chèn dựa.
Điều này có nghĩa là tệp dẫn xuất được mã hóa dưới dạng chuỗi mã có thể đại diện cho các hướng dẫn sao chép (ví dụ: sao chép từ byte cơ sở y byte bắt đầu từ offset x vào bộ đệm đích) hoặc chèn hướng dẫn (ví dụ: chèn x byte tiếp theo vào bộ đệm đích).
Như một ví dụ rất đơn giản (lấy từ 'Hỗ trợ File System cho Delta Compression' giấy), hãy xem xét mà chúng tôi muốn tạo ra một bộ đệm đồng bằng để chuyển đổi văn bản "proxy bộ nhớ cache" vào "bộ nhớ cache Proxy ". Các hướng dẫn kết quả nên là:
- Sao chép 5 byte từ bù đắp 7 ('Cache' bản sao từ đệm cơ sở)
- Chèn hai không gian
- Sao chép 5 byte từ offset 0 (bản sao 'proxy' từ cơ sở đệm)
nào dịch sang của git mã hóa trở thành:
(byte 1-3 đại diện cho hướng dẫn đầu tiên)
- 0x91 (10.010.001), được chia thành
- 0x80 (10000000) (bit thiết lập quan trọng nhất làm cho điều này 'bản sao từ cơ sở để đầu ra' hướng dẫn)
- 0x01 (00000001) (có nghĩa là 'trước một byte và sử dụng nó như là cơ sở bù đắp)
- 0x10 (00.010.000) (trước một byte và sử dụng nó như chiều dài)
- 0x07 (offset)
- 0x05 (chiều dài)
(byte 4-6 đại diện cho hướng dẫn thứ hai)
- 0x02 (từ MSB không được thiết lập, điều này có nghĩa 'chèn hai byte tiếp theo vào đầu ra')
- 0x20 (không gian)
- 0x20 (không gian)
(byte 7-8 đại diện cho hướng dẫn cuối cùng)
- 0x90 (10010000), được chia thành
- 0x80 (10000000) (có nghĩa là 'bản sao')
- 0x10 (00.010.000) (trước một byte và sử dụng nó như chiều dài)
- 0x05 (chiều dài)
Chú ý rằng trong hướng dẫn bản sao cuối cùng không chỉ định một bù đắp có nghĩa là bù đắp 0. bit khác trong opcode bản cũng có thể được thiết lập khi offsets lớn hơn/độ dài là cần thiết.Bộ đệm delta kết quả có trong ví dụ này có 8 byte, không nhiều nén vì bộ đệm đích có 12 byte, nhưng khi mã hóa này áp dụng cho tệp văn bản lớn, nó có thể tạo sự khác biệt lớn.
Gần đây tôi đã đẩy node.js library vào github thực hiện cả hai chức năng diff/patch sử dụng mã hóa git delta. code phải dễ đọc hơn và được nhận xét hơn so với mã nguồn git, được tối ưu hóa nhiều.
Tôi cũng đã viết một số tests giải thích các opcodes đầu ra được sử dụng trong mỗi ví dụ có định dạng tương tự như trên.
Nguồn
2013-01-13 13:30:54
Các algo thức có thể là một tùy chỉnh một, khi tôi đọc một chủ đề 2011 như http: //git.661346.n2.nabble.com/diff-ing-files-td6446460.html – VonC
Trong năm 2008, libXDiff đã được sử dụng rõ ràng: http://git.661346.n2.nabble.com/libxdiff-and-patience- diff-td1452272.html – VonC
Chủ đề năm 2011 là một liên kết tốt. Trích dẫn lựa chọn: "Vì vậy, nghiêm túc nói, mã hiện tại trong Git không có bất kỳ sự tương đồng nào với mã libxdiff cả. Tuy nhiên, thuật toán cơ bản đằng sau cả hai triển khai đều giống nhau." – Thilo