什么是git的瘦身包?

Mau*_*fer 19 git

我没有在薄包装上找到太多东西,而且手册页的信息对此非常神秘.我知道它与慢速连接有关,但什么是"慢速连接"?

它的优点和缺点是什么?我什么时候应该使用它,什么时候不应该使用它?

Von*_*onC 30

对于记录,手册页(index-pack)说明:

可以git-pack-objects构建"瘦"包,它根据包中未包含的对象以分层形式记录对象,以减少网络流量.预计
这些对象将出现在接收端,并且它们必须包含在该包中,以便自包含和可索引.

这将完成git push手册页中的--thin选项:

精简传输会花费额外的周期来最小化要发送的对象的数量,并且意味着在较慢的连接上使用

因此,在这种情况下,"慢速网络"是您希望尽可能发送最少数据量的连接.

有关详细信息,请参阅" 针对高延迟磁盘的Git fetch for many files is slow ".


这个帖子中,JakubNarębski解释了一下(在远程端和本地端使用git gc的上下文中):

Git 在packfiles中进行解除.
但是当你通过SSH推送时,git会生成一个包文件,其中包含另一方没有的提交,并且这些包是瘦包,所以它们也有增量...
但是远程端然后为那些薄包制作添加基础他们独立.

更确切地说:

在本地方面:
git-commit创建松散(压缩但未整理)的对象.git-gc包装和整理.

在远程端(对于智能协议,即git和ssh):
git创建包,分层;
在远程端git要么通过添加基础对象(对象+增量)来使包厚/自包含,要么将包打包到松散对象(对象)中.
你需要在远程服务器上使用git-gc来完全远程控制.但转移是完全令人满意的.

在远程端(对于哑协议,即rsync和http):
git找到所需的包并将它们全部传输.
所以情况就像在本地一样,但是git可能会传输超过真正需要的东西,因为它会完全转移包.


上述问题与使用(或不使用)有关git push --thin:何时使用或不使用?
事实证明,如果您希望git利用这些瘦数据包,您需要仔细管理二进制对象:

  1. 通过复制旧文件创建新文件名(因此使用了旧的blob)
  2. 承诺
  3. 复制真正的新文件
  4. 承诺
  5. 推.

如果在步骤3中省略了中间PUSH,那么" git push"和" git push --thin"都不会意识到这个新文件可以在远程端"逐步构建"(即使git-gc完全压缩它在包中).

事实上,瘦包的工作方式是将delta存储在一个未包含在包中的基础对象中.
那些未包含但用作delta base的对象当前只是文件的先前版本,它是要推送/获取的更新的一部分.
换句话说,必须有一个同名的先前版本才能使用.
如果先前的提交有数千个要测试的文件,则不会进行扩展.

这些瘦包是为同一文件的不同版本而设计的,而不是具有几乎相同内容的不同文件.问题是确定要添加到对象列表的首选delta基数.目前,只考虑与被修改的路径具有相同路径的对象.