我有一个带有两个分支 dist 和 master 的仓库。当我做
git clone --no-hardlinks -b dist --single-branch test test-dist
然后生成的克隆具有与原始存储库相同(大)的大小。一旦我跑
git gc --prune=all
单分支克隆“test-dist”变得更小,即我最初期望的大小。做的时候
git pull
在之后的单分支回购中,大小不会再次被放大,它保持在我克隆的分支的大小。
克隆单个分支时我做错了什么吗?如何避免先复制整个历史记录,然后使用 git gc 删除大部分历史记录?
您正在寻找的选项是
--no-local
. 从(强调我的)的git-clone(1)
文档选项中:--local
当您使用该
--local
选项时,无论是隐式还是显式,Git 都会复制所有内容,因为它比遍历历史记录并仅复制您要求的对象要快得多。无论如何,您都需要复制大部分包文件,因为在大多数情况下,您请求的至少一个对象将位于包文件中。如果您使用硬链接,则副本非常便宜,并且不会增加磁盘空间使用量,因此没有理由不这样做。如果您使用
--no-local
,您将获得正常的传输输出,它告诉您 Git 确实在生成一个独立的包并通过正常的协议运行它。请注意,即使使用正常的传输机制,Git 也有可能在克隆或获取后解包对象;这取决于传输的对象数量和配置。小提取通常会将其对象解包,因为拥有许多不共享许多对象的小型独立包并不能有效地利用空间;将来最好让正常
git gc
流程更有效地打包它们。