Git保留哪些类型的二进制文件增量?

时间:2018-01-17 13:06:56

标签: git git-lfs

我们正在处理需要迁移到Git的大型项目。不幸的是,它包含大量的二进制文件,其中一些是zip-s,dll-s等等。目前,无法从版本控制系统中删除这些二进制文件。

我想了解更多关于Git如何保留二进制文件的增量以及是否以及它不具备哪些内容的更多信息。我知道这可以通过.gitattributes文件进行配置,但是文件类型是否需要明确列出,或者是否有一个预先定义的默认设置,它可以识别并自动处理......?

3 个答案:

答案 0 :(得分:6)

首先,让我们先了解一些术语。文件存储为 blob对象。这些是四种对象类型之一,另外三种是提交带注释的标记

Git的模型是所有对象在逻辑上是独立的。一切都由其哈希ID密钥存储在数据库中。要检索任何对象,首先要知道它从某些东西或其他人那里得到的哈希ID。 1 您将该哈希ID提供给对象 - 获取器,它要么查找它所在的对象直接存储,根本没有机会进行增量压缩 - 这就是Git称之为松散对象 - 或者失败,Git查看包文件,包含多个将对象分开并提供增量压缩的机会。 2

然后,您要查找的是有关哪些blob对象Git选择对这些包文件中的其他blob对象进行增量压缩的信息。随着时间的推移,答案有所改变,所以没有一个正确的答案 - 但是有一些控制旋钮,包括你提到的.gitattributes

实际的增量格式是modificationxdelta。从字面上看,它可以压缩(或者#34; deltify")任何二进制数据与任何其他二进制数据 - 但除非输入被精心选择,否则结果将很差。它的输入选择是真正的关键。 Git也有一个technical documentation file describing how objects are chosen for deltification。这会考虑文件路径名,尤其是最终路径组件名称。

请注意,如果deltification无法使对象变小,则对象不会被delta压缩。对象的原始文件大小也是这里的输入,而core.bigFileThreshold(在Git 1.7.6中引入)设置了一个大小值:高于此级别的文件永远不会被完成

因此,您可以通过以下两种方式之一阻止Git考虑文件(对象,真的)进行分类:

  • 设置core.bigFileThreshold以使对象太大或
  • 使对象的路径名与指定.gitattributes的{​​{1}}行匹配。

请注意,使用Git-LFS时,大文件根本不存储在Git中。而是通过间接名称替换(在-delta时间)大文件(由Git-LFS设置定义)。然后Git将此间接名称存储为blob对象(使用原始文件的路径)。当Git提取对象时,Git-LFS会在允许它进入您的工作树之前对其进行检查。 Git-LFS检测到对象的数据被间接名称替换,并检索" real"来自另一个(单独的,不是Git-at-all)服务器的数据使用间接名称。所以Git从来没有看到大文件的数据:相反,它只看到这些间接名称。

1 例如,我们可以从像git add这样的分支名称开始,它会获取最新的(或 tip )提交哈希ID。该哈希ID使我们能够访问提交对象。提交列出了树的哈希ID。一旦我们获得它,树就会列出某个blob的哈希ID以及文件的名称。因此,现在我们知道master提示中README版本的哈希ID,如果这是我们正在寻找的内容。或者,我们使用提交数据来查找较旧的提交,我们用它来查找另一个更旧的提交,依此类推,直到我们到达我们想要的提交为止;然后然后我们使用树来查找文件的blob ID(和名称)。

2 通常情况下,对象只能是" deltified"对抗同一包中的其他对象。出于传输目的,Git提供了所谓的瘦包,其中对象可以针对省略的其他对象进行增量压缩,但假设在传输机制的另一侧可用。另一个Git必须"肥胖"薄包。

答案 1 :(得分:1)

git会将您提供的每个文件存储在存储库中,无论是否为二进制文件,都是任何大小的文件。它将神奇地知道如何压缩增量,也适用于二进制文件(我认为你无法控制它)。如果你不使用git-lfs,这甚至是正确的。这不是推荐的做法,因为它会使您的存储库变大。由于git工作副本总是包含整个历史记录,因此它将永远保持很大。如果你使用git-lfs,至少你的工作副本中只有最新版本的大文件(对于你需要连接到服务器以进行更多操作的缺点,就像subversion一样)。

是否可以选择将二进制文件拆分为自己的存储库并将其作为模块嵌入?

答案 2 :(得分:1)

<块引用>

因此,您可以通过以下两种方式之一阻止 Git 考虑文件(实际上是对象)进行删除:

  • 设置 core.bigFileThreshold 使对象过大,或者
  • 使对象的路径名与指定了 -delta 的 .gitattributes 行匹配。

现在在 Git 2.31(2021 年第一季度)中清楚地记录了 torekanswer 中的那部分:

请参阅 commit 3a837b5Christian Walther (cwalther)(2021 年 2 月 21 日)。
(2021 年 2 月 25 日在 Junio C Hamano -- gitster --commit ccf6861 合并)

<块引用>

doc:提及用于打包的 bigFileThreshold

签字人:Christian Walther

<块引用>

了解 core.bigFileThreshold 配置变量有助于检查存储库之间的包文件大小差异。
添加对用户在这种情况下可能阅读的联机帮助页的引用。

git pack-objects 现在包含在其 man page 中:

<块引用>

配置

各种配置变量影响打包,见 git config(搜索“pack”和“delta”)。

值得注意的是,增量压缩不用于大于 core.bigFileThreshold 配置变量和带有 属性 delta 设置为 false。

git repack 现在包含在其 man page 中:

<块引用>

Delta 压缩不用于大于 core.bigFileThreshold 配置变量和带有 属性 delta 设置为 false。