2017-07-18 34 views
1

当您在工作目录中更改文件时,git确切知道文件发生了更改。它是如何知道的?git如何知道本地回购中有何变化?

Q1)它是否在提交时计算校验和并在事件驱动的更改中重新计算它,例如在工作目录中创建的新文件。 Q2)您的本地驱动器除了工作目录文件之外,是否将文件的其余部分保留在某个位置,这些位置随着包含更多项目而增长?我的驱动器似乎更完整C:\Users\<USER NAME>\Downloads\.git\objects与我试图跟踪的新文件夹的添加,现在我想撤消我试图跟踪的文件夹,如何回收该空间。 我试图做一些GIT的幻想喜欢跟踪我的本地项目文件和其他文件的变化,所以我看到已更改文件,并更新我的备份只有这些文件。

回答

5

Git根据文件内容计算散列并在提交时存储快照。散列既用作内容的标识符,又是将快照与更高版本进行比较的简单方法。

所以如果你有一个文件的提交版本和一个工作拷贝版本,那么所有Git所要做的就是计算工作文件的散列值,并将其与来自已提交快照的已经计算的散列值进行比较。如果哈希值不一样,那么它知道某些东西已经改变。此计算仅在您询问时才会发生(例如git statusgit diff)。它并不是经常自行检查。

Git将所有内容存储在存储库中。这通常位于项目根目录的.git/目录中。整个存储库的历史和内容都在里面,所以取决于你的历史包含的内容,有时它们确实很大。这实际上是依赖于项目的。 Git善于压缩内容,但如果你添加大的预压缩文件,它只能做很多事情来缩小它们。

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

制作git仓库很简单 - 只需删除.git文件夹即可。但是,这是一种无法撤消的破坏性行为。只有在丢失存储库历史记录的情况下才能删除它(或者,如果您已经在GitHub或备份副本等其他位置创建了副本,并且依赖于其他副本,则可以)。

相关问题