タイトルが示すように、値は内部のすべてのツリーオブジェクトのコンテンツに基づいていますか(再帰的に)?
つまり、2つのツリーオブジェクトが同じハッシュ値を持っている場合、それらをまったく同じファイルツリー(すべてのサブディレクトリとファイルを含む)と見なすことができますか?
ツリーSHAの計算に使用されるものについての大まかな詳細はここで確認できます。
ツリーが格納されているバイナリ形式の詳細については、こちらをご覧ください。
使用される実際のSHAは、その詳細バージョンで説明されているバッファーのSHAです。
持ち帰る重要なポイントは、SHAが、含まれているすべてのオブジェクトまたはツリーのファイル名、それらのSHA、およびそれらの権限に依存していることです。それらのいずれかを変更すると、SHAが変更されます。2つのツリーが同じSHAを持っている場合、それらのコンポーネントはすべて一致する必要があります(ほぼ不可能であるため、衝突の可能性を除きます)。
オブジェクトファイルはリポジトリ内のハッシュによって名前が付けられているため、同じハッシュを持つ2つのツリーオブジェクトを持つことはできないと思います。また、2つのツリーオブジェクトが同じであるためには、ツリーオブジェクトがステージングされたファイルへのSHA-1参照を保持するため、コミットの状態がすべてのステージングされたファイルのコンテンツまで同じである必要があります。
この投稿はこれを明確にするのに役立つかもしれません。
お役に立てれば。
Michael Andersonの答えを少し拡張するために、ツリーオブジェクトのハッシュは、他のオブジェクトのハッシュと同じ方法で計算されます。H(object-content-include-header)です。ここで、Hはハッシュ関数(SHA-1、または現在はSHA-256)。ヘッダーを含むコンテンツには、リンクで説明されている形式があります。
オブジェクトのタイプ:リテラルテキスト「blob」、「tree」、「commit」、または「tag」(その後にスペースが続きます)。これらはASCIIまたはUTF-8です(ASCIIバイトのみで構成されているため、どちらの場合もバイト文字列にすぎません)。
オブジェクトのサイズのASCII表現(10進数)。たとえば、残りのデータの長さが16バイトの場合、ASCII文字1
と。を取得し6
ます。
ASCII NUL(ゼロバイト)。
オブジェクトの生データ。
ツリーオブジェクトの場合、生データは、モード、名前、ハッシュの3つのタプルが繰り返し出現する数です。モードは、ASCIIで表される、先行ゼロのない8進数です。名前とスペース(バイト値は10進数で32)で区切られます。名前は通常UTF-8バイトと見なされますが、有効なUTF-8であるかどうかのチェックはほとんどまたはまったくありません。/
ASCII文字またはNUL文字を含めることはできません。ASCIINULで終了します。ハッシュは、SHA-1を使用する場合は生の20バイトのハッシュID、SHA-256を使用する場合は32バイトのハッシュIDです。
これらの3つのタプルは、Gitのインデックスから生成され、Gitのインデックスは並べ替えられた順序で保持されます。つまり、 Gitと同じツリーオブジェクトデータを生成する場合は、同じ順序でエントリを生成する必要があります。ディレクトリを読み取り、ツリーオブジェクトに入るデータをここに収集するサンプルPythonコードがあります。