簡體   English   中英

git cat-file -t 是怎么做的<object id>確定對象的類型?

[英]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 現在只需要解壓縮該數據的前幾個字節。 它們以四種對象類型字符串之一開頭: blobcommittagtree (后跟一個空格,然后是大小和 '\\0' 字節的十進制擴展在 ASCII 中)。

如果 Git 提取了整個對象-t代碼可以走捷徑並提前停止解壓——然后 Git 將驗證對象的字節,包括通過哈希函數反饋的標頭,生成用於檢索的密鑰物體。 如果 Git 停止(就像-t ),Git 會跳過驗證步驟。

鑒於 SHA1 是單向散列函數

那無關緊要。 SHA 沒有隱瞞任何事情。 相反。 將 SHA 視為地址。 該地址處的文件是可讀的並說明了類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM