2011-03-29 51 views
3

Git在.git/objects/ab/cdefgh...中存儲單個對象,其中ab是SHA1摘要的第一個字節。Git包文件名 - 什麼是摘要?

但是,包文件不遵循相同的命名策略,並且我找不到有關它的命名方式的文檔。任何見解?

回答

7

包文件保存在objects/pack中,該文件記錄在gitrepository layout中。在該目錄中,它們被存儲爲對索引文件和包文件本身,調用,例如:

pack-a862cfa8b080773290073999c800a2e655ef9b5d.idx 
pack-a862cfa8b080773290073999c800a2e655ef9b5d.pack 

如何在這些文件名的SHA1SUM計算git-pack-objects文件(我的重點)中解釋說:

寫爲一對文件(.pack和.IDX),採用<鹼基名>,以確定所創建的文件的名稱。使用此選項時,這兩個文件將以<的基本名稱> - <SHA1>寫入。 <包,idx >文件。 <SHA1>是一個散列對象名稱的散列,根據包內容生成文件名並寫入命令的標準輸出。

object names是包文件內對象的SHA1sum。

+0

某些文件系統對單個目錄中的大量條目表現不佳。鬆散的對象「扇出」到'objects/[0-9a-f] [0-9a-f] /'中來限制每個目錄必須保存的條目數量。如果鬆散對象直接存儲在'objects /'下面,那麼在自動打包之前它最終可能會有數千個條目。 'objects/pack /'不會扇出,因爲它通常只需要存儲非常少量的文件。 – 2011-03-30 04:12:31

+0

在編寫本文時這是正確的,但在2013年發生了變化(https://github.com/git/git/commit/1190a1ac/ https://github.com/git/git/commit/40a4f5a7)。它現在是預告片校驗和(等於文件的最後20個字節的十六進制)。 – mgiuca 2016-04-01 10:08:02

0

答案是「整個包文件的SHA-1哈希值減去最後20個字節」或「最後20個字節的十六進制摘要」(兩者都相等)。

last 20 bytes of the file是「拖車校驗和」,它本身是一個SHA-1 hash of the entirety of the file(減去最後20個字節)。

這是changed in 2013(以前它是文件中所有哈希的SHA-1總和)。請注意,documentation現在簡單地讀取「是基於包內容的散列」。作者明確不能保證如何計算SHA-1(從commit log:「希望這會阻止讀者依賴舊計算或新計算」)。