git 会存储内容改变但从不改变大小的二进制文件的差异吗?

Tho*_*ess 4 git

我有兴趣在 git 中存储一个固定大小的 EEPROM HEX 文件。这些文件永远不会改变大小,但它们会经常改变内容。

如果我将一个 EEPROM 文件添加到 git 并提交它,然后我更改文件中的几个字节,git 会在数十或数百次提交中有效地存储此更改吗?

在我对这个问题的研究中,我对这个主题进行了一些彻底的讨论,但其中大多数似乎处理的是 PDF 和 MP3 之类的文件,没有人希望这些文件保持不变或在差异中具有可比性。我想知道 EEPROM HEX 文件是否会因为文件大小保持不变而被区别对待?

编辑(再次)

一些初步观察......(感谢 Krumelur 的“尝试一下”的鼓励!)

我正在测试的文件是一个 7MB 的 Intel HEX 文件。根据 git 的输出,它似乎将此文件视为文本文件:

$ git commit -m "Changed a single byte."
[master bc2958b] Changed a single byte.
1 file changed, 1 insertion(+), 1 deletion(-)
Run Code Online (Sandbox Code Playgroud)

diff 输出也匹配:

$ git show bc2958b
commit bc2958b[...]
Author: ThoughtProcess <blah@blah.com>
Date:   Wed Jul 31 11:53:41 2013 -0500

    Changed a single byte.

diff --git a/test.hex b/test.hex
index fbdeed4..04d19b6 100644
--- a/test.hex
+++ b/test.hex
@@ -58,7 +58,7 @@
 :20470000000000000000000000000000000000000000000000000000E001EDD0D9310D00E4
 :20472000400200000080000000000000000000000000000000000000E002EDD0CF310D000B
 :20474000400200000080000000000000000000000000000000000000E0036D0063040D00D3
-:2047600040020000008000000000000000000000000000000000000000A0FF2F06801B0FF9
+:2047600040020000008000000000000000000000000000000000000000A0FF2G06801B0FF9
 :2047800000E01D007A00820F3CFB000000000000000000000000000000A0FF8F06801B1FEC
 :2047A00000E01D006A00821F3CFB000000000000000000000000000000A0FF6F06801B8F7C
 :2047C00000E01D005A00821F3CFB000000000000000000000000000000A0FF8F06801BDFFC
Run Code Online (Sandbox Code Playgroud)

7 次提交后,存储库大小现在为 21MB。奇怪的是,我注意到存储库似乎随着每次提交而大致线性增长(2MB)。这就是 git 设计的工作方式吗?或者它没有像我期望的那样将增量差异存储为文本?

Sam*_*der 5

git 实际上是在某个地方存储了文件的新完整副本,.git/objects因此您的存储库确实会线性增长。您可以运行git gcgit 打包存储库。对于您的数据,git 应该能够真正有效地打包,并且您的存储库应该变得更小。(gitgit gc偶尔也会自动运行。)


Car*_*rum 1

如果您确实存储 Intel HEX 格式文件,则无需担心 - 它们文本文件。它们只是碰巧代表二进制数据。

来自维基百科条目

该格式是一个文本文件,每行包含编码数据序列及其起始偏移或绝对地址的十六进制值。

编者注:您在测试中所做的更改无效 -G不是十六进制数字,除此之外,您没有更新校验和。