[英]How does git cat-file -t <object id> determine the type of object?
以下鏈接解釋了 Git 如何計算對象 ID(ruby 代碼片段)。 對象類型(blob、tree、commit)編碼在與內容連接的標頭中,並在連接的字符串上計算 SHA1。
https://git-scm.com/book/en/v2/Git-Internals-Git-Objects
可以使用git cat-file -t <object id>
來確定對象的類型(blob、tree、commit)。
我想知道鑒於 SHA1 是單向散列函數,此命令如何從對象 ID 中提取類型?
“你把它倒過來拿着。” 😀
雖然 SHA 確實是一種單向散列,但這不是問題:您自己提供散列,Git 將其用作鍵值數據庫中的鍵,從而允許 Git 檢索數據。 (如果您提供散列的一部分,而不是整個內容,Git 會查找與該前綴匹配的鍵;如果前綴是唯一的,Git 會假定生成的匹配鍵是正確的鍵。)
獲得數據(zlib 壓縮對象)后,Git 現在只需要解壓縮該數據的前幾個字節。 它們以四種對象類型字符串之一開頭: blob
、 commit
、 tag
或tree
(后跟一個空格,然后是大小和 '\\0' 字節的十進制擴展在 ASCII 中)。
如果 Git 提取了整個對象-t
代碼可以走捷徑並提前停止解壓——然后 Git 將驗證對象的字節,包括通過哈希函數反饋的標頭,生成用於檢索的密鑰物體。 如果 Git 停止(就像-t
),Git 會跳過驗證步驟。
鑒於 SHA1 是單向散列函數
那無關緊要。 SHA 沒有隱瞞任何事情。 相反。 將 SHA 視為地址。 該地址處的文件是可讀的並說明了類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.