Git を使わずにファイルに Git SHA1 を割り当てるにはどうすればいいですか? 質問する

Git を使わずにファイルに Git SHA1 を割り当てるにはどうすればいいですか? 質問する

私の理解では、Git がファイルに SHA1 ハッシュを割り当てる場合、この SHA1 はファイルの内容に基づいてファイルに固有のものになります。

その結果、ファイルがあるリポジトリから別のリポジトリに移動しても、その内容は変更されていないため、ファイルの SHA1 は同じままになります。

Git は SHA1 ダイジェストをどのように計算しますか? 圧縮されていないファイルの内容全体に対して計算しますか?

Git の外部で SHA1 の割り当てをエミュレートしたいと思います。

ベストアンサー1

Git は次のようにファイル (Git 用語では「blob」) の SHA1 を計算します。

sha1("blob " + filesize + "\0" + data)

したがって、Git をインストールしなくても、自分で簡単に計算できます。「\0」は 2 文字の文字列ではなく、NULL バイトであることに注意してください。

たとえば、空のファイルのハッシュ:

sha1("blob 0\0") = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"

$ touch empty
$ git hash-object empty
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

もう一つの例:

sha1("blob 7\0foobar\n") = "323fae03f4606ea9991df8befbb2fca795e648fa"

$ echo "foobar" > foo.txt
$ git hash-object foo.txt 
323fae03f4606ea9991df8befbb2fca795e648fa

以下は Python 実装です:

from hashlib import sha1
def githash(data):
    s = sha1()
    s.update("blob %u\0" % len(data))
    s.update(data)
    return s.hexdigest()

おすすめ記事