git重用blob吗?

awe*_*ndt 7 git version-control

假设我提交了一个二进制文件,然后稍后将其更改为几次提交,现在我在新提交中将其更改回来.

出于好奇,我想知道git是否为它创建了一个新的blob?或者它是否在历史中检测到并重复使用它?如果是这样,它如何检测到?校验?

pal*_*ain 8

Git将重用相同的blob.

我做了一个测试.我做了3次提交.首先我提交了一个二进制文件,然后我修改了二进制文件并再次提交.最后,我用第一次提交中使用的原始二进制文件覆盖了文件并再次提交.

第1和第3次提交中的二进制文件内容是相同的.每个提交都是以下分支的HEAD:

第一次提交:"第一次".第二次提交:"第二次".第3次提交:"主人"

然后,如果你运行"git cat-file -p FIRST ^ {tree}",它会显示二进制文件的哈希码.

$ git cat-file -p FIRST^{tree}
100644 blob ec049240a47b472bd7c31d1fa27118c4fe2f1229    test.db3
$ git cat-file -p SECOND^{tree}
100644 blob a47bb3727e5aefe3ec386bec5520f3e4ffb3a4c5    test.db3
$ git cat-file -p master^{tree}
100644 blob ec049240a47b472bd7c31d1fa27118c4fe2f1229    test.db3
Run Code Online (Sandbox Code Playgroud)

您会发现第1次和第3次提交的blob的哈希码是相同的.

git非常聪明,可以检查是否存在哈希代码的blob,如果找到则重用该blob.

  • 这是正确的答案.这里的关键是SHA1是文件的"密钥",就密钥/值数据库而言.SHA1是文件内容的加密校验和(加上一些独特的东西和大小信息).两个相同的文件将计算相同的校验和,因此存储一个单独的git对象,其名称为SHA-1校验和.计算校验和时无关紧要,只知道具有该校验和名称的文件是否在存储库中. (2认同)