git commit占用了多少磁盘空间

Riz*_*rif 2 git

根据这个页面 http://www.eecs.harvard.edu/~cduan/technical/git/git-1.shtml

提交对象包含三件事:

  • 一组文件,反映了给定时间点项目的状态.
  • 对父提交对象的引用.
  • SHA1名称,一个40个字符的字符串,用于唯一标识提交对象.该名称由提交的相关方面的哈希组成,因此相同的提交将始终具有相同的名称.

我的问题是关于第一点:如果我当前的项目大小是10MB,那么添加一个新的提交将需要另外10MB?因为根据第一点,每个提交包含反映项目状态的文件集.

Mik*_*els 5

我不确定其他答案是否真的完全解决了你的问题.

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没有改变,因此无需再次存储它.第二次提交仅引用与第一次提交相同的哈希.