根据我的理解,.git
包含所有blob
和commit
对象。因此它总是大于工作目录中的文件。
这怎么可能发生?因为回购包含许多小文件(小于块大小),所以git
会压缩它们吗?
任何人都可以详细解释吗?
实际上,回购协议使我感到困惑,是可可足master回购协议。此仓库用于存储 ios lib规范。当发布新版本的lib时,a new file添加到了此仓库(不编辑现有版本)。添加的新规范通常与以前的版本非常相似,也许只是版本被更改,这将在仓库中添加至少三个对象,一个Blob,一个树和一个提交。
使用du -d 1 h
,大小为
1.1G ./规格
729M ./。git
答案 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打包。