为什么.git的大小可以小于工作目录?

时间:2018-12-08 09:53:28

标签: git

根据我的理解,.git包含所有blobcommit对象。因此它总是大于工作目录中的文件。

这怎么可能发生?因为回购包含许多小文件(小于块大小),所以git会压缩它们吗?

任何人都可以详细解释吗?

更新以获取更多详细信息

实际上,回购协议使我感到困惑,是可可足master回购协议。此仓库用于存储 ios lib规范。当发布新版本的lib时,a new file添加到了此仓库(不编辑现有版本)。添加的新规范通常与以前的版本非常相似,也许只是版本被更改,这将在仓库中添加至少三个对象,一个Blob,一个树和一个提交。

使用du -d 1 h,大小为

  

1.1G ./规格

     

729M ./。git

1 个答案:

答案 0 :(得分:2)

  

因此它总是大于工作目录中的文件。

不。

为了理解,您需要了解git如何存储其数据。
Git使用启发式查找代码的相似部分。换句话说,当git找到相同的内容(整个文件或部分内容)时,它不会存储两次,而是存储一次,并使用指针o指向第一次出现的内容。这就是 hunks

无论何时执行git add,git都会抓取内容,“设置” 弓形,然后将它们存储在打包文件中。回到正轨,执行git add git抓取内容时,使用sha1sum,hash-object等对内容进行哈希处理,将其压缩并存储在.git / objects文件夹中。

文件的“真实”内容(稍后git将其打包)只是称为hunks的较小块,而git知道如何将它们编入原始文件中。


什么是大块头?

大块是补丁文件。您可以在执行git add -p时看到它们,然后如果在文件中的多个位置进行了多次更改,请选择s,您将看到它们

这些是您可以在add -p中进行的选择:

y - stage this hunk
n - do not stage this hunk
q - quit, do not stage this hunk nor any of the remaining ones
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see the previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

使用s后,它将选择可被视为独立更改的代码块。如果要拆分,甚至更多,则必须使用e编辑块,然后将其添加回舞台区域。


Git存储“补丁”,它们是您所做的更改的增量,但是git在其上添加了一些其他“层”。一旦“看到”它,就会重用相同的内容(使用启发式方法完成),并且在指向旧内容的同时仅添加“新”内容。

稍后git抓取内容并使用ZIP打包。


enter image description here