从git object model,文件和文件夹通过sha1哈希保存到.git文件夹中的位置。
git如何在内部知道文件是否已被删除,添加或编辑(具体来说,它如何计算您在键入git status
时看到的更改)?系统是否完全从sha1中确定此信息?
答案 0 :(得分:18)
答案有点太长,需要一段时间才能写完,所以这里是摘要。
简短的回答是git使用SHA-1
来检查跟踪更改,但文件名存储在其他位置。
内容存储在pack
(* 1-读下面)中,而名称存储在idx
中。
当你运行git status
时,git检查idx文件(元数据)中是否已经有这个路径,并根据结果判断它是否是新文件。
如果它不是新文件,请将SHA-1与跟踪更改进行比较。
执行git status
git搜索您的工作目录时,在idx文件和工作目录中的"已注册" 路径之间寻找匹配项。
当您使用mv
移动文件时,您的工作目录中没有"原始"由git存储的路径,因为git无法找到"注册的"路径,文件被标记为已删除。
但同时git会看到一个新文件,您刚刚将文件移动到新路径,因此新文件将被标记为新文件。
另一方面,当使用git mv
时,git会更新元数据以指向新名称,内容将标记为重命名。在这种情况下,git会更新idx文件中文件的注册路径
如果您移动并更新,它将被标记为重命名+修改。
使用git ls-tree
内部命令查找文件的SHA-1。
注意
当您将内容添加到暂存区域时,Git会开始跟踪内容 添加文件后,git将以下信息存储在文件
中[blob][1 white space][content length][null][content]
If you have a file with the string `hello` it will look like this:
blob 5\0Hello
现在git计算这个文件的SHA-1(使用sha1sumn
)用z-lib压缩它并用这个SHA-1保存文件作为`.git / objects'的名称。
当git打包存储库时,它将进入包文件。
由于文件是使用z-lib压缩的,因此我们有几个选项来获取内容:
并且为了表明git实际上使用了上面描述的内容,这里的命令与git在幕后执行的命令相同,以计算SHA-1
(http://shafiulazam.com/gitbook/1_the_git_object_model.html)