根据这个页面 http://www.eecs.harvard.edu/~cduan/technical/git/git-1.shtml
提交对象包含三件事:
- 一组文件,反映了给定时间点项目的状态.
- 对父提交对象的引用.
- SHA1名称,一个40个字符的字符串,用于唯一标识提交对象.该名称由提交的相关方面的哈希组成,因此相同的提交将始终具有相同的名称.
我的问题是关于第一点:如果我当前的项目大小是10MB,那么添加一个新的提交将需要另外10MB?因为根据第一点,每个提交包含反映项目状态的文件集.
我不确定其他答案是否真的完全解决了你的问题.
Git分别存储提交和实际文件内容.提交不包含文件 - 它包含对提交包含的文件哈希的引用.文件与提交分开存储,如果两个提交具有相同版本的文件,则这两个提交将引用相同的哈希,但文件本身不会重复.如果文件在提交之间发生更改,则文件将存储两次,文件的每个版本都有自己的哈希值,并且提交将引用不同的哈希值.
假设您从一个提交开始,该提交包含两个文件a.txt和b.txt,每个文件都散列为不同的值:
Commit 1:
Filename | Hash
---------------------
a.txt | abcdef111111
b.txt | ghijkl222222
Run Code Online (Sandbox Code Playgroud)
请注意,提交不包含文件内容.Git已经将文件的内容和哈希存储在其他地方.
File store:
Hash | File contents
---------------------------------
abcdef111111 | hello world
ghijkl222222 | int main()
Run Code Online (Sandbox Code Playgroud)
假设您更新a.txt,并进行新的提交.首先,Git将新版本的文件存储在其文件内容存储中:
File store:
Hash | File contents
---------------------------------
abcdef111111 | hello world
ghijkl222222 | int main()
zyxwvu999999 | goodbye world <-- new entry
Run Code Online (Sandbox Code Playgroud)
并且新提交将该哈希指向包含a.txt的内容:
Commit 2:
Filename | Hash
---------------------
a.txt | zyxwvu999999
b.txt | ghijkl222222
Run Code Online (Sandbox Code Playgroud)
由于b.txt没有改变,因此无需再次存储它.第二次提交仅引用与第一次提交相同的哈希.