每个 Git 提交对象都指向一个树对象。每个 commit-tree 对象是否将其所有条目一起存储,还是只添加新条目并仅包含与提交的父对象的增量?
例如,Linux 源代码有 100 万次提交和数千个对象(主分支有 70,000 个)。如果每个提交对象都包含所有对象的条目,则从长远来看需要大量空间。即使提交/推送了单行更改,也需要大量处理和传输。
我理解 Git 的哲学是为文件存储快照而不是增量,但在这种情况下,只有更改的文件被存储。
在下面的示例中,70951b429e0e1191a8c1d9e34248cd76453ef544 包含(或显示为包含)所有 5 个文件,即使只添加了单个文件。
例如,Linux 源代码有 100 万次提交和数千个对象(主分支有 70,000 个)。如果每个提交对象都包含所有对象的条目,则从长远来看需要大量空间。即使提交/推送了单行更改,也需要大量处理和传输。
我理解 Git 的哲学是为文件存储快照而不是增量,但在这种情况下,只有更改的文件被存储。
在下面的示例中,70951b429e0e1191a8c1d9e34248cd76453ef544 包含(或显示为包含)所有 5 个文件,即使只添加了单个文件。
[test]$ls
a.txt b.txt c.txt d.txt
[test]$echo r5 > e.txt
[test]$git add -A && git commit -m "r5"
[master 51f6941] r5
[test]$git cat-file -p 51f6941
tree 70951b429e0e1191a8c1d9e34248cd76453ef544
[test]$git cat-file -p 70951b429e0e1191a8c1d9e34248cd76453ef544
100644 blob 9a6c8d12dea8859b821b2ba705f7efd6cc914aa5 a.txt
100644 blob 9a6c8d12dea8859b821b2ba705f7efd6cc914aa5 b.txt
100644 blob b6693b64f528de38cde5533acd781fde743bc3df c.txt
100644 blob 91174caefafdc81d34e302874c86c6e4d5212075 d.txt
100644 blob 29f4cfc46ba3a0bde55bce8f44ac3590e2108da4 e.txt