快照記錄的是不是文件的每一個版的全部內(nèi)容吃型,而不是內(nèi)容的變更信息? 如果這樣,豈不是耗費很大的存儲空間吗浩?
答:
git在正確的抽象層次上處理存儲空間壓縮,使得程序比上代(如svn)和同時代(如bzr)的VCS大為簡化没隘。
之前的VCS從節(jié)省空間出發(fā)懂扼,想當然地把delta作為基礎數(shù)據(jù)結構。這樣的最大問題(遠不是唯一問題)是:delta設計時沒有考慮到的修改方式就無法表達右蒲。例如阀湿,svn早期版本及更早的VCS不能記錄文件rename/copy,所以只要重命名文件瑰妄,列出歷史時重命名之前的歷史就顯示不出來陷嘴。
git的存儲層(plumbing layer)提供的接口里,每個commit都記錄完整的目錄樹间坐。存儲空間壓縮問題完全在存儲層內(nèi)部解決:
- 邏輯上罩旋,存儲層是一個CAS(Content-Addressable Storage)。這意味著在一個commit中眶诈,所有沒改變的文件和目錄都不額外占用存儲空間。進一步瓜饥,兩個目錄中內(nèi)容相同的文件也只占用一份存儲空間逝撬;甚至,兩個文件的任意兩個歷史版本只要內(nèi)容相同乓土,就只占用一份存儲空間宪潮。這是基于delta的VCS做不到的。
- 而對于同一個文件的歷史版本的壓縮趣苏,git的做法是把全部文件的歷史版本統(tǒng)一處理狡相,把文件間相同的片段進行壓縮。這意味著兩個不相干的文件中相同的片段也可以被壓縮食磕。這是基于delta的VCS做不到的尽棕。