git status如何在内部工作?

时间:2016-04-28 17:59:16

标签: git

git object model,文件和文件夹通过sha1哈希保存到.git文件夹中的位置。

git如何在内部知道文件是否已被删除,添加或编辑(具体来说,它如何计算您在键入git status时看到的更改)?系统是否完全从sha1中确定此信息?

1 个答案:

答案 0 :(得分:18)

答案有点太长,需要一段时间才能写完,所以这里是摘要。

简短的回答是git使用SHA-1来检查跟踪更改,但文件名存储在其他位置。

内容存储在pack (* 1-读下面)中,而名称存储在idx中。
当你运行git status时,git检查idx文件(元数据)中是否已经有这个路径,并根据结果判断它是否是新文件。

如果它不是新文件,请将SHA-1与跟踪更改进行比较。

为什么我必须使用git mv来移动文件而不是简单的mv?

执行git status git搜索您的工作目录时,在idx文件和工作目录中的"已注册" 路径之间寻找匹配项。

当您使用mv移动文件时,您的工作目录中没有"原始"由git存储的路径,因为git无法找到"注册的"路径,文件被标记为已删除。

同时git会看到一个新文件,您刚刚将文件移动到路径,因此文件将被标记为新文件。

另一方面,当使用git mv时,git会更新元数据以指向新名称,内容将标记为重命名。在这种情况下,git会更新idx文件中文件的注册路径 如果您移动并更新,它将被标记为重命名+修改。

enter image description here enter image description here

如何找出文件的SHA-1是什么?

使用git ls-tree内部命令查找文件的SHA-1。

enter image description here

注意

当您将内容添加到暂存区域时,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元数据的情况下查看文件内容。

enter image description here

并且为了表明git实际上使用了上面描述的内容,这里的命令与git在幕后执行的命令相同,以计算SHA-1

enter image description here

这是提交及其如何处理文件名的说明。

http://shafiulazam.com/gitbook/1_the_git_object_model.htmlenter image description here