秀出指定檔案的git hash值

雖然知道git也是用sha1演算法產生hash code,但是一直覺得怎麼跟sha1sum指令產生出的結果不同,goolge後才知道git因為還有加入其他參數所以才會讓他和sha1sum產生出的結果不一樣。

下面的小程式是秀出指定檔案的git hash值

#!/usr/bin/python
import sys, os
from hashlib import sha1

# emulate the behavior
# > git hash-object <file-path>
def githash(filepath):
    filesize_bytes = os.path.getsize(filepath)
    s = sha1()
    s.update(("blob %u\0" % filesize_bytes).encode('utf-8'))
    with open(filepath, 'rb') as f:
        s.update(f.read())
    return s.hexdigest()

if __name__ == '__main__':
    argc = len(sys.argv)
    if argc<=1:
        print 'Should give at least one file path!'
        sys.exit(1)
    for f in sys.argv[1:]:
        print f,"\t",githash(f)

由於git show時內會顯示檔案的sha1sum,但是都我們自己打sha1sum 的結果不同,
原因是git得sha1會加上描述檔案類型的字串和檔案size在檔案內容前面,之後再計算sha1sum,所以數值才會不同



參考資料: https://ihower.tw/git/internal.html

留言