git重新打包:按文件类型和;按组配置包?

git重新打包:按文件类型和;按组配置包?,git,git-repack,Git,Git Repack,有没有办法告诉Git根据文件类型创建packfile,并为这些类/类型指定delta和zlib压缩 我有一个相当大的存储库,其中大部分由图像资产和翻译文件(.po)组成,后者实际上是工作副本和存储库数据的最大部分 对于图像资源,delta和zlib压缩都不有用:图像已经被压缩(因此在zlib下它们压缩得不好),而delta压缩在小的更改倾向于通过压缩图像级联时没有任何用处(而且这种情况很少见,通常一旦资产被承诺,它要么永远被搁置,要么被大规模替换) 对于PO文件,虽然它们在技术上是文本文件,但

有没有办法告诉Git根据文件类型创建packfile,并为这些类/类型指定delta和zlib压缩

我有一个相当大的存储库,其中大部分由图像资产和翻译文件(.po)组成,后者实际上是工作副本和存储库数据的最大部分

  • 对于图像资源,delta和zlib压缩都不有用:图像已经被压缩(因此在zlib下它们压缩得不好),而delta压缩在小的更改倾向于通过压缩图像级联时没有任何用处(而且这种情况很少见,通常一旦资产被承诺,它要么永远被搁置,要么被大规模替换)
  • 对于PO文件,虽然它们在技术上是文本文件,但对于这个特定的存储库,我希望它们的增量压缩非常糟糕:历史生成器/导出器将以基本随机的顺序导出翻译,因此从一个导出到下一个导出,就好像整个文件都被重写了一样
因此,当重新打包存储库时,我希望尝试将图像打包在一起—既不进行增量压缩也不进行zlib压缩,也不进行PO文件打包和zlib压缩(以最大可能的级别)这样他们就不应该在无用的压缩工作上浪费周期,并且应该避免污染更多“普通”代码文件的压缩


然而,我以前在packfiles中的实验并不顺利。我错过了对这种隔离和配置的内置支持,或者我需要使用低级命令甚至直接使用libgit2手动构建包吗?

唉,没有:可用的控件只有以下几项:

  • core.bigFileThreshold
    :超过此大小的文件不会打包,只会进行zlib压缩

  • pack.island
    和几个相关设置:这些设置了所谓的delta岛,如中所述


这些内容与您想要的内容相差甚远。(注意:还有
core.compression
和两个相关项,但它们是严格全局的,不是每个对象。)

您可以通过手动驱动
git pack对象来实现这一点

要仅使用PNG文件创建包文件,请执行以下操作:

git rev-list --objects --all | fgrep .png |
    git -c core.compression=0 pack-objects .git/objects/pack/pack-png
这将创建一个包文件,其中仅包含文件名包含
.png
的blob

上一次调用已将SHA1打印到控制台,称之为
$packid
。为避免将来重新打包会破坏您的包,您可以将其标记为保留:

touch .git/objects/pack/pack-png-$packid.keep
后继的

git repack
应将剩余对象收集到不包含任何PNG文件的新包文件中


但是请注意,上面的
git rev list
示例并没有遍历reflogs中保存的提交。也就是说,临时保存的提交中使用的PNG文件(永久提交中没有使用)被视为“您的重新生成对象”。

谢谢,这很遗憾地证实了我的发现(我之前曾尝试过三角洲岛屿,但这并不是我真正想要的轴心)。