git clone –single-branch 包含松散的对象,如何避免?

git clone –single-branch 包含松散的对象,如何避免?

我有一个包含两个分支 dist 和 master 的 repo。当我这样做时

git clone --no-hardlinks -b dist --single-branch test test-dist

那么生成的克隆与原始仓库的大小相同(很大)。一旦我运行

git gc --prune=all

单分支克隆“test-dist”变得更小,即我最初预期的大小。当执行

git pull

之后在单分支存储库中,大小不会再次增加,而是保持在我克隆的分支的大小。

我在克隆单个分支时做错了什么吗?如何避免先复制整个历史记录,然后再使用 git gc 删除其中的大部分内容?

答案1

您正在寻找的选项是--no-local。从git-clone(1)文档选项--local(重点是我的):

当要克隆的存储库位于本地计算机上时,此标志将绕过正常的“Git 感知”传输机制,并通过复制 HEAD 以及对象和引用目录下的所有内容来克隆存储库。.git/objects/目录下的文件将尽可能进行硬链接以节省空间。

如果将存储库指定为本地路径(例如/path/to/repo),则这是默认设置,并且--local本质上是无操作。如果将存储库指定为 URL,则忽略此标志(我们从不使用本地优化)。指定--no-local将覆盖给定时的默认值/path/to/repo,而是使用常规 Git 传输。

当您使用该--local选项时,无论是隐式还是显式,Git 都会复制所有内容,因为这比遍历历史记录并仅复制您请求的对象要快得多。无论如何,您都需要复制大多数包文件,因为在大多数情况下,您请求的对象中至少有一个会位于包文件中。如果您使用硬链接,复制成本极低,并且不会增加磁盘空间使用量,所以没有理由不这样做。

如果您使用--no-local,那么您将获得正常的传输输出,这会告诉您 Git 实际上正在生成一个独立的包并通过正常协议运行它。

请注意,即使使用常规传输机制,Git 也有可能在克隆或提取后解包对象;这取决于传输的对象数量和配置。小型提取通常会解包其对象,因为拥有许多不共享许多对象的小型独立包并不能有效利用空间;最好以后让常规过程git gc更有效地打包它们。

相关内容