昨天,我開始自己實現 Git 的核心功能之一——具體來說,文件是如何存儲的、Git 對象是什么、以及哈希和壓縮的過程。我花了 4 個小時來開發,在這篇文章中,我將向您介紹我的思考過程和方法。
當您提交文件時會發生什么?
當您在 Git 中提交文件時,會在幕后發生幾個重要步驟:
文件壓縮:
使用 zlib 算法壓縮文件的內容以減小其大小。此壓縮內容存儲在 Git 對象數據庫中。
哈希計算:
從壓縮文件內容生成唯一的 SHA-1 哈希值。該哈希值用作 Git 對象數據庫中文件的標識符。
存儲對象:
目標文件存儲在 .mygit/objects 目錄中,按哈希值的前兩個字符組織。這種結構使得更容易有效地管理和檢索對象。
更新提交信息:
演示如何在 git 中存儲文件。
我已經實現了提交功能,考慮了一個文件
-
對于每個文件,我都計算了哈希值
在對象文件夾內,創建新文件夾,其名稱等于哈希的前兩個字符。
并在該文件夾內創建一個文件,以剩余的哈希值作為名稱。(該文件存儲提交文件的壓縮格式)
通過比較新計算的哈希值和文件最后計算的哈希值來檢測更改
檢測變化
我根據自己的方法實現了這個算法,但是 Git 對這些操作使用了更高效的算法。
-
從 oldContent 和 newContent 中提取行數組
創建了一個 Map 將行存儲為鍵,索引存儲為值
創建了兩個新數組來存儲oldContent和newContent中公共行的索引
4.例如:
OldCommonarray = [0 , 3] 那么刪除的行將是 [1,2]
GitHub 存儲庫
領英
非常感謝您的寶貴時間。