如果我正确读取git将所有文件存储在blob中。如果修改文件,文件的修改版本会获得它自己的blob,因此它自己的sha?
答案 0 :(得分:6)
这是正确的 - 如果文件的内容甚至改变了一个位,它将有一个新的对象名(a.k.a. SHA1sum或hash)。如果要测试,可以看到文件与git hash-object
一起使用的对象名称:
$ git hash-object text.txt
9dbcaae0abd0d45c30bbb1a77410fb31aedda806
您可以在此处找到有关如何计算blob哈希值的更多信息:
答案 1 :(得分:5)
我想补充马克的答案。
虽然Subversion,CVS甚至Mercurial使用Delta Storage - 它们只存储提交之间的差异,但Git会在每次提交时获取树的快照。
当文件内容发生更改时,会将内容添加到对象库中。 Git只关心此时的内容,而不是文件名。通过树对象跟踪文件名和路径。当文件更改并添加到索引时,将创建内容的blob。当您提交(或使用git write-tree等低级命令)时,将更新树对象以使文件指向新内容。还需要注意的是,虽然对文件的每次更改都会为其创建新的blob,但具有相同内容的文件永远不会获得不同的blob。
那么,你的问题
如果你修改了一个文件,那就修改了 该文件的版本得到它自己的blob 因此它是自己的sha?
新内容获取新blob,文件指向新blob。而且,如果新内容与之前的某个blob相同,则仅指向旧内容。
PS:需要注意的是,Git将这些“松散的对象”“打包”到包文件中(当git存储从一个版本的文件到另一个版本的增量时),当周围有太多松散的对象时,如果{{ 1}}是手动运行,或者在推送到远程服务器时,因此可能是文件以delta存储的情况。有关详细信息,请参阅Pro-Git章节 - http://progit.org/book/ch9-4.html