根据此页面 http://www.eecs.harvard.edu/~cduan/technical/git/git-1.shtml
提交对象包含三件事:
- 一组文件,反映了在给定时间点项目的状态。
- 对父提交对象的引用。
- SHA1名称,一个40个字符的字符串,用于唯一标识提交 宾语。该名称由哈希组成 提交的相关方面,所以 相同的提交将永远有 同名。
我的问题是关于第一点: 如果我当前的项目大小是10MB,那么添加新的提交将需要另外10MB?因为根据第一点,每个提交包含反映项目状态的文件集。
答案 0 :(得分:5)
我不确定其他答案是否真的完全解决了你的问题。
Git分别存储提交和实际文件内容。提交不包含文件 - 它包含对提交包含的文件的哈希的引用。文件与提交分开存储,如果两个提交具有相同版本的文件,则这两个提交将引用相同的哈希,但文件本身不会重复。如果文件在提交之间发生变化,则文件存储两次,文件的每个版本都有自己的哈希值,提交将引用不同的哈希值。
假设您从一个提交开始,该提交包含两个文件a.txt和b.txt,每个文件都散列为不同的值:
Commit 1:
Filename | Hash
---------------------
a.txt | abcdef111111
b.txt | ghijkl222222
请注意,提交不包含文件内容。 Git已将文件的内容和哈希值存储在其他地方。
File store:
Hash | File contents
---------------------------------
abcdef111111 | hello world
ghijkl222222 | int main()
假设您更新a.txt,并进行新的提交。首先,Git将新版本的文件存储在其文件内容存储中:
File store:
Hash | File contents
---------------------------------
abcdef111111 | hello world
ghijkl222222 | int main()
zyxwvu999999 | goodbye world <-- new entry
新提交指向该哈希包含a.txt的内容:
Commit 2:
Filename | Hash
---------------------
a.txt | zyxwvu999999
b.txt | ghijkl222222
由于b.txt没有改变,因此无需再次存储。第二次提交只引用与第一次提交相同的哈希。
答案 1 :(得分:2)
没有。 Git提交仅包含对树的引用,父SHAs(包含历史记录)和其他信息(如作者,注释,时间戳等)。实际更改不存储在提交中。 this page中提供了一个很好的描述,并且来自同一篇文章:
请注意,提交本身不包含有关实际更改内容的任何信息;所有更改都是通过将此提交引用的树的内容与与其父项关联的树进行比较来计算的。
在SVN和相关的vcs中,它们存储同一文件的两个副本,一个在工作目录中,另一个在.svn/
中,用于差异和提交。因此,在大型项目中,回购的规模随着提交而大幅增加。例如,使用SVN整个Mozilla项目存储库大约为12 GB,而使用git [1]
答案 2 :(得分:2)
没有
提交包括一个快照源树的对象树,但是对象树会重用以前快照中未更改的对象。因此,每次提交只会为文件和目录添加更改对象,它不会存储整个状态。
除此之外,Git还会定期将松散的对象打包成“packfiles”,它会同时存储多个文件的内容,但是哪些文件可以引用彼此的部分(粗略的) )。这在消除冗余方面非常有效。
因此,包含多年历史记录的项目的.git
目录的总大小通常只是工作目录总大小的一小部分,只需检出当前状态。
作为一个极端的例子,我有一个存储库,我从生产数据库中提交SQL转储。这时,SQL转储文件是56MB。包含 377提交的.git
目录(即超过1年的备份)仅为32MB 。 (使用xz -Mmax -9
压缩此文件会将其减少到2.4MB,但370个此类文件仍然接近1GB /年。)所以我使用Git作为一种非常方便的压缩存档类型。
答案 3 :(得分:1)
没有。每个提交本身只是指向先前提交的指针和树状态的快照(以及提交消息等其他元数据)。每次提交都不会再将这些文件(实际上是文件的内容)添加到repo中。
当文件内容发生变化时,例如,新内容将添加到对象中,并且树将更新为该文件的新内容,并且提交将指向此新树状态。
执行git cat-file commit HEAD
,您可以了解提交的实际内容。
另外,请查看Git from bottom up
(免费)或Version Control with Git
本书,两者都对blob,树和提交的概念有一些很好的解释。
答案 4 :(得分:-2)
仅存储提交之间的delta。我知道存储增量的所有SCM。但是,如果考虑的文件包含二进制数据,则情况可能不同。然后,delta可能是不可能的。