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