当我将文件添加到临时区域时,为什么Git会将文件存储在存储库中?

时间:2017-06-21 05:51:19

标签: git git-add .git-folder

根据我对git add文件的理解,它只是在将文件添加到存储库之前对文件进行分级,但为什么在我提交文件之前我会将其添加到git存储库中?

例如,如果我创建一个新的git存储库并创建一个名为foo的新文件并将内容“hello world”添加到其中,然后git add foo,我会在其中看到一个新项目。 objects文件夹中的.git子目录。我甚至可以使用objects命令在git cat-file -p文件中查看新文件的内容。

究竟添加到.git/objects文件夹的内容是什么? 在技​​术上暂存文件有什么作用?就像在git add文件上运行后发生的步骤一样?如果我知道这些步骤,也许我会更好地理解它。

2 个答案:

答案 0 :(得分:3)

暂存区域是存储库的一部分。

我认为您将存储库的对象数据库与历史记录混淆。只有提交是历史记录的一部分,但Git处理的所有对象都是对象数据库的一部分。

考虑一下:Git不会驻留在内存中,那么它还会在哪里记录临时区域的内容而不是其对象数据库?

答案 1 :(得分:2)

  

我甚至可以使用git cat-file -p命令查看目标文件中新文件的内容。

git diff --cached

  

究竟是什么添加到.git/objects文件夹?

请参阅" Git Internals - Git Objects"

  

您可以在对象目录中查看文件。这就是Git最初存储内容的方式 - 作为每个内容的单个文件,以内容及其标题的SHA-1校验和命名。子目录以SHA-1的前2个字符命名,文件名为剩余的38个字符。

     

为什么我可以在我提交之前将其添加到git存储库中?

不要忘记使用git add -p--patch),您可以在提交之前添加文件的部分(hunks)。

索引的目标仍然是(在git add的上下文中)准备下一次提交 它反映了对Git, as created by Linus Torvalds in 2005的最初需求,即集成补丁(它最初只是一个合并经理)

  

在文件上运行git add之后会发生什么步骤

虽然索引不包含任何文件内容,但.objects会使用松散(非打包)对象:

请参阅Object Storage了解步骤

  
      
  • Git构造一个以对象类型开头的标题,在本例中为blob。然后,它添加一个空格,后跟内容的大小,最后是一个空字节
  •   
  • Git连接标题和原始内容,然后计算该新内容的SHA-1校验和。
  •   
  • Git使用zlib压缩新内容,
  •   
  • 最后,Git将zlib-deflated内容写入磁盘上的对象。 Git确定要写出的对象的路径(SHA-1值的前两个字符是子目录名称,最后38个字符是该目录中的文件名)
  •