2017-06-21 91 views
2

从我所了解的当你git add一个文件,它只是在将文件添加到存储库之前对其进行分级,但为什么我可以在提交之前将它添加到git存储库中?为什么Git在将文件添加到临时区域时将文件存储在存储库中?

举例来说,如果我创建一个新的Git仓库,并创建一个名为foo新的文件和内容的“hello world”加进去,然后git add foo,我看到.git文件夹内的objects子目录一个新的项目。我甚至可以使用git cat-file -p命令查看objects文件中新文件的内容。

究竟是什么已被添加到.git/objects文件夹? 在技术上做什么文件升级?像在文件上运行git add之后发生的步骤一样?如果我知道步骤,也许我会更好地理解它。

+0

我的猜测是,你只是看到状态代表你当前分支的阶段。这并不意味着实际提交已经完成。 –

+0

我编辑了答案,添加了说明添加到.git/objects的内容的步骤。 – VonC

回答

3

分期对象的路径区域是存储库的一部分。

我认为你是困惑仓库的对象数据库与历史。只有提交是历史的一部分,但所有对象Git句柄都是对象数据库的一部分。

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

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,这是整合补丁(这只是在第一次合并经理)

是什么混帐补充的是,在一个文件

运行后会发生的步骤

虽然索引不包括任何文件内容时,.objects确实,松散(非填充)对象:

的步骤见Object Storage

  • Git构造一个头,该头以对象的类型开头,在这种情况下为blob。然后,它会添加一个空格,然后是内容大小,最后是空字节。Git会连接标头和原始内容,然后计算新内容的SHA-1校验和。
  • Git使用zlib压缩新内容,
  • 最后,Git将zlib压缩的内容写入磁盘上的对象。 Git的确定你想要写出来(的SHA-1的值作为子目录名的前两个字符,最后38个字符作为该目录中的文件名)
相关问题