5

我处于不得不在 git 中存储一些二进制文件的不幸情况,

但是我可以选择数据在磁盘上的存储方式——在 Git 中(以我们自己的格式,只有构建系统需要读取)。

我想避免过多地谈论细节,因为我认为它不那么重要 - 但为了提供一些上下文,这些是许多图标文件,但同样的问题也适用于许多小型声音文件或 3d 模型。

将这些文件转换为一个大图像将是一个构建步骤,因此可以将图像存储在 git 中。

  • 二进制压缩(例如,PNG(图像)、FLAC(声音))
  • 二进制未压缩(例如,PPM(图像)、未压缩 WAV(声音))
  • 二进制数据的 ASCII 表示(例如,mime 编码、XPM(图像))

让我们假设某些文件偶尔会发生变化——因此避免为像素的每一个小变化存储一个新的二进制 blob——会很好。

我有兴趣知道:

  • 每次二进制文件更改(甚至几个字节)时,哪些选项将存储一个全新的二进制 blob。
  • git diff 未压缩二进制数据是否比压缩数据更好(即使对未压缩数据进行少量编辑,也可能会发生很大变化)。
  • 与一个大型二进制文件相比,我会假设长期存储许多小型二进制文件的开销较小,假设只有一些文件被定期修改,git 可以有效地处理对大型二进制文件的小更改吗?

假设无法完全避免使用二进制文件,所有事情都考虑了避免大型 git repo(因为对二进制文件进行编辑)的最佳选择是什么?

4

1 回答 1

5

每次二进制文件更改(甚至几个字节)时,哪些选项将存储一个全新的二进制 blob。

他们全部。每当它们是“松散的对象”时,所有 blob(实际上,repo 中的所有对象)都会“完整地”(或多或少地)存储。对它们唯一要做的就是给它们一个标题并使用 deflate 压缩来压缩它们。

但与此同时,松散的物体最终会组合成“包”。Git 对包中的文件进行增量压缩:请参阅git 二进制差异算法(增量存储)是否标准化?. 根据那里的答案,最好不要“预压缩”二进制文件,以便打包文件增量算法可以找到匹配二进制数据的长字符串。

git diff 未压缩二进制数据是否比压缩数据更好(即使对未压缩数据进行少量编辑,也可能会发生很大变化)。

我没有尝试过,但总体而言,答案应该是“是”。

与一个大型二进制文件相比,我会假设长期存储许多小型二进制文件的开销较小,假设只有一些文件被定期修改,git 可以有效地处理对大型二进制文件的小更改吗?

当然,所有完全未更改的文件都将立即存储大量“重复数据删除”,因为它们的 SHA-1 校验和在所有提交中都是相同的,因此每棵树在存储库中命名相同的 blob。如果foo.icon在数千个提交中都相同,则只foo.icon存储一个 blob(无论 SHA-1 是什么)。


我建议尝试一下:使用建议的二进制文件创建一些虚拟测试存储库,进行建议的更改,并查看运行git gc以重新打包松散对象之前和之后存储库的大小。请注意,有很多可调参数;特别是,您可能想对window,depthwindow-memorysettings 大惊小怪(可以在命令行或 git config 条目中设置)。

于 2013-12-19T19:43:06.410 回答