当本地回购发生变化时,git如何知道?

时间:2017-07-18 20:54:55

标签: git hash storage checksum

当您更改工作目录中的文件时,git确切地知道更改了哪个文件。怎么知道?

Q1)它是否在提交时计算校验和,并在事件驱动的更改时重新计算它,例如在工作目录中创建的新文件。

Q2)除了工作目录文件之外,本地驱动器是否将其余文件保留在某个位置,随着包含更多项目而增加?我的驱动器似乎更加全面C:\Users\<USER NAME>\Downloads\.git\objects添加了我试图跟踪的新文件夹,现在我想要撤消我试图跟踪的文件夹,如何回收该空间。 我试图用GIT做一些奇特的事情,比如跟踪我本地项目文件和其他文档的变化,这样我就可以看到已更改的文档并仅使用这些文件更新我的备份。

1 个答案:

答案 0 :(得分:5)

Git根据文件的内容计算哈希值,并在提交时存储快照。哈希既用作内容的标识符,也用于将快照与更高版本进行比较的简便方法。

因此,如果您有一个文件的提交版本和一个工作副本版本,Git所要做的就是计算工作文件的哈希值,并将其与提交的快照中已经计算的哈希值进行比较。如果哈希值不相同,那么它就知道某些事情发生了变化。只有在您提出要求时才会进行此计算(例如git statusgit diff)。它不是经常自行检查。

Git将所有内容存储在存储库中。这通常位于项目根目录的.git/目录中。整个存储库历史记录和内容都在内部,因此根据您的历史记录包含的内容,有时它们会变大。这实际上取决于项目。 Git擅长压缩内容,但是如果你要添加大量的预压缩文件,那么只能缩小它们。

您在问题中提到的.git/objects/目录是git存储库中的主要内容存储。所有文件快照和元数据(如目录结构,提交对象,标签)都存储在那里。所以它通常是存储库文件夹中最大的部分。

取消git存储库很简单 - 只需删除.git文件夹即可。但是,这是一种破坏性行为,您无法撤消。只有在您丢失存储库历史记录时才会将其删除(或者,如果您已经在其他地方制作了副本,例如GitHub或备份副本,并且您依赖其他副本就可以了。 )。