1. ホーム
  2. git

[解決済み] Git の SHA1 をファイルに割り当てるには?

2022-05-17 21:23:37

質問

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

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

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

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

どのように解決するのですか?

これは、Gitがファイル(Git用語では"blob")に対してSHA1を計算する方法です。

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

というわけで、Gitをインストールしなくても自分で簡単に計算することができます。なお、" \0" はNULLバイトであり、2文字の文字列ではありません。

例えば、空のファイルのハッシュです。

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()