我有一个 git 存储库,里面有很多 PDF 文件。git 存储库的大小正在不断增加,当 Internet 连接受限时,将存储库克隆到新主机变得非常复杂……
我使用了git gc && git gc --aggressive
它,它占用了大量的内存,却没有做任何有用的事情。存储库的大小基本保持不变。
我听说过,git annex
但我不知道这是否是正确的方法,因为我不想每次需要 PDF 时都拉取。当然我可以这样做,并将所有文件留在我的笔记本电脑上,但我想一次性克隆所有内容,而不是两个不同的存储库)
有没有一个好的方法可以减小尺寸并且仍然可以使用 PDF(除了减小 PDF 的大小 - 我的存储库中有些 PDF 的大小超过 100MB)
答案1
Git 和 Mercurial 都不能很好地处理大型二进制文件。它们都假设被跟踪的文件相对较小且易于区分,但 PDF 文件却并非如此。如果您已经运行了git gc
,那么您的存储库不会比现在小很多。
如果您不想使用第三方解决方案,您可以使用 Git 中的子模块来缓解此问题。如果可行,您可以将存储库中的不同文件拆分为子模块,然后分别克隆它们。这样,您可以克隆主项目以获取所有子模块引用,然后根据需要克隆每个子模块。
然而,正如你所怀疑的,git 附件可能是最好的解决方案。它是一个工件存储库,有点像档案对于 Mercurial。这些工件存储库旨在用于大型、二进制、不可区分的文件。它们管理工件的检索;Git 和 Mercurial 仅负责维护引用。这样,当您使用 Git 进行克隆时,您只需克隆引用,工件检索是根据需要执行的单独步骤。
如果您选择其中一种方式,您可能需要考虑重写历史记录以删除所有之前提交的对象并将它们移至子模块或 git 附件中。 如果不这样做,那么您的存储库将始终至少与现在一样大。
顺便提一下,git gc
存储库大小没有减小的原因是 Git 的垃圾收集仅从存储库中删除未引用的对象,并将松散的对象压缩到包文件中。由于您的 PDF 都是引用的,并且它们在包文件中压缩效果不佳,因此存储库不会变小很多。