我尝试使用 LFS 在 Github 服务器上上传一个 1GB 的大文件。一切顺利。我认为,由于大型二进制文件不像源代码文件那样可跟踪,所以即使是很小的修改也应该在推送后花费整个上传时间,因此每次推送会占用 1 GB 的带宽。但是,一旦推送,我注意到它被视为源代码文件,因此由于微小的更改,提交是在瞬间完成的。这怎么可能?Git LFS 如何在大文件上如此优化?
我尝试使用 LFS 在 Github 服务器上上传一个 1GB 的大文件。一切顺利。我认为,由于大型二进制文件不像源代码文件那样可跟踪,所以即使是很小的修改也应该在推送后花费整个上传时间,因此每次推送会占用 1 GB 的带宽。但是,一旦推送,我注意到它被视为源代码文件,因此由于微小的更改,提交是在瞬间完成的。这怎么可能?Git LFS 如何在大文件上如此优化?
二进制 blob 仍然可以分解成任意数量的块,散列,然后与“已知良好”副本进行比较。
因此,大文件内或附加到大文件的微小修改完全有可能导致更改量等于散列块大小。
它是一种类似于 BitTorrent 使用的系统的技术,并且与任何需要在双方可能已经拥有文件的某些部分时以最小带宽使用量通过网络传输未知大小的文件的系统相关。